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

其他游戏

开发平台:

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. inline hkpRigidBody* hkGetRigidBody( const hkpCollidable* collidable )
  9. {
  10. if ( collidable->getType() == hkpWorldObject::BROAD_PHASE_ENTITY )
  11. {
  12. return static_cast<hkpRigidBody*>( hkGetWorldObject(collidable) );
  13. }
  14. return HK_NULL;
  15. }
  16. inline hkpMotion* hkpRigidBody::getRigidMotion() const
  17. {
  18. return const_cast<hkpMaxSizeMotion*>(&m_motion);
  19. }
  20. // Get the mass of the rigid body.
  21. inline hkReal hkpRigidBody::getMass() const
  22. {
  23. return getRigidMotion()->getMass();
  24. }
  25. inline hkReal hkpRigidBody::getMassInv() const
  26. {
  27. return getRigidMotion()->getMassInv();
  28. }
  29. // Get the inertia tensor in local space
  30. inline void hkpRigidBody::getInertiaLocal(hkMatrix3& inertia) const
  31. {
  32. getRigidMotion()->getInertiaLocal(inertia);
  33. }
  34. // Get the inertia tensor in world space
  35. inline void hkpRigidBody::getInertiaWorld(hkMatrix3& inertia) const
  36. {
  37. getRigidMotion()->getInertiaWorld(inertia);
  38. }
  39. // Get the inverse inertia tensor in local space
  40. void hkpRigidBody::getInertiaInvLocal(hkMatrix3& inertiaInv) const 
  41. {
  42. getRigidMotion()->getInertiaInvLocal(inertiaInv);
  43. }
  44. // Get the inverse inertia tensor in World space
  45. void hkpRigidBody::getInertiaInvWorld(hkMatrix3& inertiaInv) const 
  46. {
  47. getRigidMotion()->getInertiaInvWorld(inertiaInv);
  48. }
  49. // Explicit center of mass in local space
  50. const hkVector4& hkpRigidBody::getCenterOfMassLocal() const
  51. {
  52. return getRigidMotion()->getCenterOfMassLocal();
  53. }
  54. const hkVector4& hkpRigidBody::getCenterOfMassInWorld() const
  55. {
  56. return getRigidMotion()->getCenterOfMassInWorld();
  57. }
  58. /*
  59. ** UTILITIY
  60. */
  61. // Return the position (Local Space origin) for this rigid body, in World space.
  62. // Note: The center of mass is no longer necessarily the local space origin
  63. inline const hkVector4& hkpRigidBody::getPosition() const
  64. {
  65. return getRigidMotion()->getPosition();
  66. }
  67. // Returns the rotation from Local to World space for this rigid body.
  68. inline const hkQuaternion& hkpRigidBody::getRotation() const
  69. {
  70. return getRigidMotion()->getRotation();
  71. }
  72. // Returns the rigid body (local) to world transformation.
  73. inline const hkTransform& hkpRigidBody::getTransform() const
  74. {
  75. return getRigidMotion()->getTransform();
  76. }
  77. // Used by the graphics engine.
  78. // It only uses a simple lerp quaternion interpolation while 
  79. // hkSweptTransformUtil::lerp2() used for collision detection
  80. // uses the 'dobule-linear' interpolation 
  81. void hkpRigidBody::approxTransformAt( hkTime time, hkTransform& transformOut ) const
  82. {
  83. getRigidMotion()->approxTransformAt( time, transformOut );
  84. }
  85. void hkpRigidBody::approxCurrentTransform( hkTransform& transformOut ) const
  86. {
  87. HK_ASSERT2(0x3dd87047, m_world, "This function requires the body to be in an hkpWorld, in order to retrieve the current time.");
  88. getRigidMotion()->approxTransformAt( m_world->getCurrentTime(), transformOut );
  89. }
  90. /*
  91. ** VELOCITY ACCESS
  92. */
  93. // Return the linear velocity of the center of mass of the rigid body, in World space.
  94. inline const hkVector4& hkpRigidBody::getLinearVelocity() const
  95. {
  96. return getRigidMotion()->getLinearVelocity();
  97. }
  98. // Returns the angular velocity around the center of mass, in World space.
  99. inline const hkVector4& hkpRigidBody::getAngularVelocity() const
  100. {
  101. return getRigidMotion()->getAngularVelocity();
  102. }
  103. // Velocity of point p on the rigid body, in World space.
  104. void hkpRigidBody::getPointVelocity(const hkVector4& p, hkVector4& vecOut) const
  105. {
  106. HK_ASSERT2(0x49da7b54, p.isOk3(), "Point passed to hkpRigidBody::getPointVelocity is invalid.");
  107. getRigidMotion()->getPointVelocity(p, vecOut);
  108. }
  109. /*
  110. ** IMPULSE APPLICATION
  111. */
  112. // Apply an impulse to the center of mass.
  113. inline void hkpRigidBody::applyLinearImpulse(const hkVector4& imp)
  114. {
  115. HK_ASSERT2(0x1f476204, imp.isOk3(), "Impulse passed to hkpRigidBody::applyLinearImpulse is invalid.");
  116. activate();
  117. getRigidMotion()->applyLinearImpulse(imp);
  118. }
  119. // Apply an impulse at the point p in world space.
  120. inline void hkpRigidBody::applyPointImpulse(const hkVector4& imp, const hkVector4& p)
  121. {
  122. HK_ASSERT2(0x69b4b47f, imp.isOk3(), "Impulse passed to hkpRigidBody::applyLinearImpulse is invalid.");
  123. HK_ASSERT2(0x39557915, p.isOk3(), "Point passed to hkpRigidBody::applyPointImpulse is invalid.");
  124. activate();
  125. getRigidMotion()->applyPointImpulse(imp, p);
  126. }
  127. // Apply an instantaneous change in angular velocity around center of mass.
  128. inline void hkpRigidBody::applyAngularImpulse(const hkVector4& imp)
  129. {
  130. HK_ASSERT2(0x7659db28, imp.isOk3(), "Impulse passed to hkpRigidBody::applyAngularImpulse is invalid.");
  131. activate();
  132. getRigidMotion()->applyAngularImpulse(imp);
  133. }
  134. /*
  135. ** FORCE AND TORQUE APPLICATION
  136. */
  137. // Applies a force to the rigid body. The force is applied to the center of mass.
  138. inline void hkpRigidBody::applyForce(const hkReal deltaTime, const hkVector4& force)
  139. {
  140. HK_ASSERT2(0x5caf01a5, force.isOk3(), "Force passed to hkpRigidBody::applyForce is invalid.");
  141. activate();
  142. getRigidMotion()->applyForce(deltaTime, force);
  143. }
  144. // Applies a force to the rigid body at the point p in world space.
  145. inline void hkpRigidBody::applyForce(const hkReal deltaTime, const hkVector4& force, const hkVector4& p)
  146. {
  147. HK_ASSERT2(0x5817ffd7, force.isOk3(), "Force passed to hkpRigidBody::applyForce is invalid.");
  148. HK_ASSERT2(0x6f65e274, p.isOk3(), "Point passed to hkpRigidBody::applyForce is invalid.");
  149. activate();
  150. getRigidMotion()->applyForce(deltaTime, force, p);
  151. }
  152. // Applies the specified torque to the rigid body.
  153. inline void hkpRigidBody::applyTorque(const hkReal deltaTime, const hkVector4& torque)
  154. {
  155. HK_ASSERT2(0x32bce075, torque.isOk3(), "Torque passed to hkpRigidBody::applyTorque is invalid.");
  156. activate();
  157. getRigidMotion()->applyTorque(deltaTime, torque);
  158. }
  159. /*
  160. ** DAMPING
  161. */
  162. // Naive momentum damping
  163. inline hkReal hkpRigidBody::getLinearDamping() const
  164. {
  165. return getRigidMotion()->getLinearDamping();
  166. }
  167. inline hkReal hkpRigidBody::getAngularDamping() const
  168. {
  169. return getRigidMotion()->getAngularDamping();
  170. }
  171. inline void hkpRigidBody::setLinearDamping( hkReal d )
  172. {
  173. getRigidMotion()->setLinearDamping( d );
  174. }
  175. inline void hkpRigidBody::setAngularDamping( hkReal d )
  176. {
  177. getRigidMotion()->setAngularDamping( d );
  178. }
  179. inline hkReal hkpRigidBody::getGravityFactor( void ) const
  180. {
  181. return m_motion.m_gravityFactor;
  182. }
  183. inline void hkpRigidBody::setGravityFactor( hkReal f )
  184. {
  185. m_motion.m_gravityFactor = f;
  186. }
  187. inline hkReal hkpRigidBody::getMaxLinearVelocity() const
  188. {
  189. return getRigidMotion()->getMotionState()->m_maxLinearVelocity;
  190. }
  191. inline hkReal hkpRigidBody::getMaxAngularVelocity() const
  192. {
  193. return getRigidMotion()->getMotionState()->m_maxAngularVelocity;
  194. }
  195. inline void hkpRigidBody::setMaxLinearVelocity( hkReal maxVel )
  196. {
  197. getRigidMotion()->getMotionState()->m_maxLinearVelocity = maxVel;
  198. }
  199. inline void hkpRigidBody::setMaxAngularVelocity( hkReal maxVel )
  200. {
  201. getRigidMotion()->getMotionState()->m_maxAngularVelocity = maxVel;
  202. }
  203. inline enum hkpMotion::MotionType hkpRigidBody::getMotionType() const
  204. {
  205. return getRigidMotion()->getType();
  206. }
  207. inline hkReal hkpRigidBody::getFriction() const 
  208. return m_material.getFriction(); 
  209. }
  210. inline hkReal hkpRigidBody::getRestitution() const 
  211. {
  212. return m_material.getRestitution(); 
  213. }
  214. // Sets the linear velocity at the center of mass, in World space.
  215. void hkpRigidBody::setLinearVelocity(const hkVector4& newVel)
  216. {
  217. HK_ASSERT2(0x19142e8b, newVel.isOk3(), "Velocity passed to hkRigidbody::setLinearVelocity is invalid.");
  218. activate();
  219. getRigidMotion()->setLinearVelocity(newVel);
  220. }
  221. // Sets the angular velocity around the center of mass, in World space.
  222. void hkpRigidBody::setAngularVelocity(const hkVector4& newVel)
  223. {
  224. HK_ASSERT2(0x38c5ec40, newVel.isOk3(), "Velocity passed to hkRigidbody::setAngularVelocity is invalid.");
  225. activate();
  226. getRigidMotion()->setAngularVelocity(newVel);
  227. }
  228. hkUint32 hkpRigidBody::getCollisionFilterInfo() const
  229. {
  230. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RO );
  231. return getCollidable()->getBroadPhaseHandle()->getCollisionFilterInfo();
  232. }
  233. void hkpRigidBody::setCollisionFilterInfo( hkUint32 info )
  234. {
  235. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RW );
  236. getCollidableRw()->getBroadPhaseHandle()->setCollisionFilterInfo(info);
  237. }
  238. HK_FORCE_INLINE hkpCollidableQualityType hkpRigidBody::getQualityType() const
  239. {
  240. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RO );
  241. return hkpCollidableQualityType( getCollidable()->getBroadPhaseHandle()->m_objectQualityType );
  242. }
  243. HK_FORCE_INLINE void hkpRigidBody::setQualityType(hkpCollidableQualityType type)
  244. {
  245. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RW );
  246. getCollidableRw()->getBroadPhaseHandle()->m_objectQualityType = hkInt8(type);
  247. }
  248. HK_FORCE_INLINE hkReal hkpRigidBody::getAllowedPenetrationDepth() const
  249. {
  250. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RO );
  251. return getCollidable()->m_allowedPenetrationDepth;
  252. }
  253. HK_FORCE_INLINE void hkpRigidBody::setAllowedPenetrationDepth( hkReal val )
  254. {
  255. HK_ACCESS_CHECK_WITH_PARENT( m_world, HK_ACCESS_IGNORE, this, HK_ACCESS_RW );
  256. HK_ASSERT2(0xad45bd3d, val > HK_REAL_EPSILON, "Must use a non-zero ( > epsilon ) value when setting allowed penetration depth of bodies.");
  257. getCollidableRw()->m_allowedPenetrationDepth = val;
  258. }
  259. /*
  260. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  261. * Confidential Information of Havok.  (C) Copyright 1999-2009
  262. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  263. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  264. * rights, and intellectual property rights in the Havok software remain in
  265. * Havok and/or its suppliers.
  266. * Use of this software for evaluation purposes is subject to and indicates
  267. * acceptance of the End User licence Agreement for this product. A copy of
  268. * the license is included with this software and is also available at www.havok.com/tryhavok.
  269. */