llmotion.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmotion.cpp
  3.  * @brief Implementation of LLMotion class.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. //-----------------------------------------------------------------------------
  33. // Header Files
  34. //-----------------------------------------------------------------------------
  35. #include "linden_common.h"
  36. #include "llmotion.h"
  37. #include "llcriticaldamp.h"
  38. //-----------------------------------------------------------------------------
  39. //-----------------------------------------------------------------------------
  40. // LLMotion class
  41. //-----------------------------------------------------------------------------
  42. //-----------------------------------------------------------------------------
  43. //-----------------------------------------------------------------------------
  44. // LLMotion()
  45. // Class Constructor
  46. //-----------------------------------------------------------------------------
  47. LLMotion::LLMotion( const LLUUID &id ) :
  48. mStopped(TRUE),
  49. mActive(FALSE),
  50. mID(id),
  51. mActivationTimestamp(0.f),
  52. mStopTimestamp(0.f),
  53. mSendStopTimestamp(F32_MAX),
  54. mResidualWeight(0.f),
  55. mFadeWeight(1.f),
  56. mDeactivateCallback(NULL),
  57. mDeactivateCallbackUserData(NULL)
  58. {
  59. for (int i=0; i<3; ++i)
  60. memset(&mJointSignature[i][0], 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS);
  61. }
  62. //-----------------------------------------------------------------------------
  63. // ~LLMotion()
  64. // Class Destructor
  65. //-----------------------------------------------------------------------------
  66. LLMotion::~LLMotion()
  67. {
  68. }
  69. //-----------------------------------------------------------------------------
  70. // fadeOut()
  71. //-----------------------------------------------------------------------------
  72. void LLMotion::fadeOut()
  73. {
  74. if (mFadeWeight > 0.01f)
  75. {
  76. mFadeWeight = lerp(mFadeWeight, 0.f, LLCriticalDamp::getInterpolant(0.15f));
  77. }
  78. else
  79. {
  80. mFadeWeight = 0.f;
  81. }
  82. }
  83. //-----------------------------------------------------------------------------
  84. // fadeIn()
  85. //-----------------------------------------------------------------------------
  86. void LLMotion::fadeIn()
  87. {
  88. if (mFadeWeight < 0.99f)
  89. {
  90. mFadeWeight = lerp(mFadeWeight, 1.f, LLCriticalDamp::getInterpolant(0.15f));
  91. }
  92. else
  93. {
  94. mFadeWeight = 1.f;
  95. }
  96. }
  97. //-----------------------------------------------------------------------------
  98. // addJointState()
  99. //-----------------------------------------------------------------------------
  100. void LLMotion::addJointState(const LLPointer<LLJointState>& jointState)
  101. {
  102. mPose.addJointState(jointState);
  103. S32 priority = jointState->getPriority();
  104. if (priority == LLJoint::USE_MOTION_PRIORITY)
  105. {
  106. priority = getPriority();
  107. }
  108. U32 usage = jointState->getUsage();
  109. // for now, usage is everything
  110. mJointSignature[0][jointState->getJoint()->getJointNum()] = (usage & LLJointState::POS) ? (0xff >> (7 - priority)) : 0;
  111. mJointSignature[1][jointState->getJoint()->getJointNum()] = (usage & LLJointState::ROT) ? (0xff >> (7 - priority)) : 0;
  112. mJointSignature[2][jointState->getJoint()->getJointNum()] = (usage & LLJointState::SCALE) ? (0xff >> (7 - priority)) : 0;
  113. }
  114. void LLMotion::setDeactivateCallback( void (*cb)(void *), void* userdata )
  115. {
  116. mDeactivateCallback = cb;
  117. mDeactivateCallbackUserData = userdata;
  118. }
  119. //virtual
  120. void LLMotion::setStopTime(F32 time)
  121. {
  122. mStopTimestamp = time;
  123. mStopped = TRUE;
  124. }
  125. BOOL LLMotion::isBlending()
  126. {
  127. return mPose.getWeight() < 1.f;
  128. }
  129. //-----------------------------------------------------------------------------
  130. // activate()
  131. //-----------------------------------------------------------------------------
  132. void LLMotion::activate(F32 time)
  133. {
  134. mActivationTimestamp = time;
  135. mStopped = FALSE;
  136. mActive = TRUE;
  137. onActivate();
  138. }
  139. //-----------------------------------------------------------------------------
  140. // deactivate()
  141. //-----------------------------------------------------------------------------
  142. void LLMotion::deactivate()
  143. {
  144. mActive = FALSE;
  145. mPose.setWeight(0.f);
  146. if (mDeactivateCallback)
  147. {
  148. (*mDeactivateCallback)(mDeactivateCallbackUserData);
  149. mDeactivateCallback = NULL; // only call callback once
  150. mDeactivateCallbackUserData = NULL;
  151. }
  152. onDeactivate();
  153. }
  154. BOOL LLMotion::canDeprecate()
  155. {
  156. return TRUE;
  157. }
  158. // End