hkpMotion.inl
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. hkMotionState* hkpMotion::getMotionState() 
  9. {
  10. return &m_motionState;
  11. }
  12. const hkMotionState* hkpMotion::getMotionState() const
  13. {
  14. return &m_motionState;
  15. }
  16. // Get the mass inv of the rigid body.
  17. hkSimdReal hkpMotion::getMassInv() const
  18. {
  19. return m_inertiaAndMassInv.getSimdAt(3);
  20. }
  21. const hkVector4& hkpMotion::getCenterOfMassLocal() const
  22. {
  23. return m_motionState.getSweptTransform().m_centerOfMassLocal;
  24. }
  25. const hkVector4& hkpMotion::getCenterOfMassInWorld() const
  26. {
  27. return m_motionState.getSweptTransform().m_centerOfMass1;
  28. }
  29. // Return the position (Local Space origin) for this rigid body, in World space.
  30. // Note: The center of mass is no longer necessarily the local space origin
  31. const hkVector4& hkpMotion::getPosition() const
  32. {
  33. return m_motionState.getTransform().getTranslation();
  34. }
  35. // Returns the rotation from Local to World space for this rigid body.
  36. const hkQuaternion& hkpMotion::getRotation() const
  37. {
  38. return m_motionState.getSweptTransform().m_rotation1;
  39. }
  40. // Returns the rigid body (local) to world transformation.
  41. const hkTransform& hkpMotion::getTransform() const
  42. {
  43. return m_motionState.getTransform();
  44. }
  45. /*
  46. ** VELOCITY ACCESS
  47. */
  48. const hkVector4& hkpMotion::getLinearVelocity() const
  49. {
  50. return m_linearVelocity;
  51. }
  52. const hkVector4& hkpMotion::getAngularVelocity() const
  53. {
  54. return m_angularVelocity;
  55. }
  56. void hkpMotion::getPointVelocity(const hkVector4& p, hkVector4& pointVelOut) const
  57. {
  58. // CODE IS getLinearVelocity() + getAngularVelocity().cross(p - centerOfMassWorld);
  59. hkVector4 relPos; relPos.setSub4( p, getCenterOfMassInWorld() );
  60. pointVelOut.setCross( m_angularVelocity, relPos);
  61. pointVelOut.add4( m_linearVelocity );
  62. }
  63. /*
  64. ** DAMPING
  65. */
  66. hkReal hkpMotion::getLinearDamping()
  67. {
  68. return m_motionState.m_linearDamping;
  69. }
  70. hkReal hkpMotion::getAngularDamping()
  71. {
  72. return m_motionState.m_angularDamping;
  73. }
  74. void hkpMotion::setLinearDamping( hkReal d )
  75. {
  76. m_motionState.m_linearDamping = d;
  77. }
  78. void hkpMotion::setAngularDamping( hkReal d )
  79. {
  80. m_motionState.m_angularDamping = d;
  81. }
  82. void hkpMotion::setWorldSelectFlagsNeg(int worldFlag0, int worldFlag1, int worldDeactivationIntegrateCounter)
  83. {
  84. HK_ASSERT2(0xad7654df, (worldFlag0 & 0xfffffffc) == 0, "World's deactivation flag must be 0 or 1.");
  85. HK_ASSERT2(0xad7654de, (worldFlag1 & 0xfffffffc) == 0, "World's deactivation flag must be 0 or 1.");
  86. if ((((unsigned)worldDeactivationIntegrateCounter)%4) < (((unsigned)m_deactivationIntegrateCounter)%4))
  87. {
  88. worldFlag0 = (~worldFlag0) << 14;
  89. }
  90. else
  91. {
  92. worldFlag0 <<= 14;
  93. }
  94. if (worldDeactivationIntegrateCounter < m_deactivationIntegrateCounter)
  95. {
  96. worldFlag1 = (~worldFlag1) << 14;
  97. }
  98. else
  99. {
  100. worldFlag1 <<= 14;
  101. }
  102. m_deactivationNumInactiveFrames[0] = hkUint16((m_deactivationNumInactiveFrames[0] & 0x3fff) | worldFlag0); 
  103. m_deactivationNumInactiveFrames[1] = hkUint16((m_deactivationNumInactiveFrames[1] & 0x3fff) | worldFlag1);
  104. }
  105. /*
  106. * SOLVER LEVEL DEACTIVATION
  107. */
  108. int hkpMotion::getDeactivationClass()
  109. {
  110. return m_motionState.m_deactivationClass;
  111. }
  112. void hkpMotion::enableDeactivation( bool value, int randomNumber, int worldFlag0, int worldFlag1, int worldDeactivationIntegrateCounter)
  113. {
  114. if ( value )
  115. {
  116. m_deactivationIntegrateCounter = hkUint8(0xf & randomNumber);
  117. setWorldSelectFlagsNeg(worldFlag0, worldFlag1, worldDeactivationIntegrateCounter);   
  118. }
  119. else
  120. {
  121. m_deactivationIntegrateCounter = 0xff;
  122. m_deactivationNumInactiveFrames[0] = 0;
  123. m_deactivationNumInactiveFrames[1] = 0;
  124. }
  125. }
  126. bool hkpMotion::isActivationEnabled() const
  127. {
  128. return m_deactivationIntegrateCounter != 0xff;
  129. }
  130. int hkpMotion::getNumInactiveFrames(int select)
  131. {
  132. return m_deactivationNumInactiveFrames[select] & 0x7f;
  133. }
  134. int hkpMotion::getNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag)
  135. {
  136. int dc = m_deactivationNumInactiveFrames[select]; // must be atomic
  137. int motionDeactivationFlag = dc >> 14;
  138. HK_ASSERT2(0xad7654da, (worldDeactivationNumInactiveFramesSelectFlag & 0xfffffffc) == 0, "World's deactivation flag must be 0 or 1.");
  139. //int numInactiveFrames = dc >> (7*(1 - (worldDeactivationNumInactiveFramesSelectFlag ^ motionDeactivationFlag)));
  140. int numInactiveFrames;
  141. if (worldDeactivationNumInactiveFramesSelectFlag != motionDeactivationFlag)
  142. {
  143. numInactiveFrames = dc & 0x7f;
  144. }
  145. else
  146. {
  147. numInactiveFrames = (dc >> 7) & 0x7f;
  148. }
  149. return numInactiveFrames & 0x7f;
  150. }
  151. void hkpMotion::incrementNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag)
  152. {
  153. HK_ASSERT2(0xad7654db, (worldDeactivationNumInactiveFramesSelectFlag & 0xfffffffc) == 0, "World's deactivation flag must be 0 or 1.");
  154. HK_ON_DEBUG(int numInactiveFrames = getNumInactiveFramesMt(select, worldDeactivationNumInactiveFramesSelectFlag) );
  155. int dc = m_deactivationNumInactiveFrames[select];
  156. HK_ON_DEBUG( int motionDeactivationFlag = dc >> 14);
  157. HK_ASSERT2(0xad8155dd, motionDeactivationFlag != worldDeactivationNumInactiveFramesSelectFlag, "Flags match -- deactivation run for the 2nd time?");
  158. dc = dc & 0x7f;
  159. int newdc = dc + 1 - (dc>>6);
  160. dc = newdc | (dc<<7) | (worldDeactivationNumInactiveFramesSelectFlag<<14);
  161. m_deactivationNumInactiveFrames[select] = hkUint16(dc); // must be atomic
  162. HK_ASSERT2(0xad8555dd, numInactiveFrames == getNumInactiveFramesMt(select, worldDeactivationNumInactiveFramesSelectFlag), "Num inactive frames changed.");
  163. }
  164. void hkpMotion::zeroNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag)
  165. {
  166. //HK_ASSERT2(0xad7654dc, unsigned(worldDeactivationNumInactiveFramesSelectFlag) <= 1, "World's deactivation flag must be 0 or 1.");
  167. HK_ON_DEBUG(int numInactiveFrames = getNumInactiveFramesMt(select, worldDeactivationNumInactiveFramesSelectFlag) );
  168. int dc = m_deactivationNumInactiveFrames[select];
  169. HK_ON_DEBUG( int motionDeactivationFlag = dc >> 14);
  170. HK_ASSERT2(0xad8455dd, motionDeactivationFlag != worldDeactivationNumInactiveFramesSelectFlag, "Flags match -- deactivation run for the 2nd time?");
  171. dc = dc & 0x7f;
  172. dc = (dc<<7) | (worldDeactivationNumInactiveFramesSelectFlag<<14);
  173. m_deactivationNumInactiveFrames[select] = hkUint16(dc); // must be atomic
  174. HK_ASSERT2(0xad8756dd, numInactiveFrames == getNumInactiveFramesMt(select, worldDeactivationNumInactiveFramesSelectFlag), "Num inactive frames changed.");
  175. }
  176. /*
  177. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  178. * Confidential Information of Havok.  (C) Copyright 1999-2009
  179. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  180. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  181. * rights, and intellectual property rights in the Havok software remain in
  182. * Havok and/or its suppliers.
  183. * Use of this software for evaluation purposes is subject to and indicates
  184. * acceptance of the End User licence Agreement for this product. A copy of
  185. * the license is included with this software and is also available at www.havok.com/tryhavok.
  186. */