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

其他游戏

开发平台:

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. #ifndef HK_DYNAMICS2_MOTION_H
  9. #define HK_DYNAMICS2_MOTION_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Physics/MotionState/hkMotionState.h>
  12. extern const hkClass hkpMotionClass;
  13. /// This class is used internally.
  14. /// An object's hkpMotion stores all the information relating to
  15. /// how it moves, including its mass, position, and velocity.
  16. /// A hkpMotion is owned by exactly one object, usually a hkpEntity
  17. /// or another hkpMotion.
  18. /// Each hkpRigidBody has an hkpMotion that stores transform, velocity, and mass information
  19. /// for the object.
  20. /// Do not access this class directly - use hkpRigidBody functions instead.
  21. class hkpMotion : public hkReferencedObject
  22. {
  23. public:
  24. // +version(1)
  25. HK_DECLARE_REFLECTION();
  26. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MOTION);
  27. /// A list of all motion types. The motion type of a hkpRigidBody determines what
  28. /// happens when the rigid body is simulated. 
  29. enum MotionType
  30. {
  31. /// 
  32. MOTION_INVALID,
  33. /// A fully-simulated, movable rigid body. At construction time the engine checks
  34. /// the input inertia and selects MOTION_SPHERE_INERTIA or MOTION_BOX_INERTIA as
  35. /// appropriate.
  36. MOTION_DYNAMIC,
  37. /// Simulation is performed using a sphere inertia tensor. (A multiple of the
  38. /// Identity matrix). The highest value of the diagonal of the rigid body's
  39. /// inertia tensor is used as the spherical inertia.
  40. MOTION_SPHERE_INERTIA,
  41. /// This is the same as MOTION_SPHERE_INERTIA, except that simulation of the rigid
  42. /// body is "softened", which produces more stable results in large constrained
  43. /// systems.
  44. MOTION_STABILIZED_SPHERE_INERTIA,
  45. /// Simulation is performed using a box inertia tensor. The non-diagonal elements
  46. /// of the inertia tensor are set to zero. This is slower than the
  47. /// MOTION_SPHERE_INERTIA motions, however it can produce more accurate results,
  48. /// especially for long thin objects.
  49. MOTION_BOX_INERTIA,
  50. /// This is the same as MOTION_BOX_INERTIA, except that simulation of  the rigid
  51. /// body is "softened", which produces more stable results in large constrained
  52. /// systems.
  53. MOTION_STABILIZED_BOX_INERTIA,
  54. /// Simulation is not performed as a normal rigid body. During a simulation step,
  55. /// the velocity of the rigid body is used to calculate the new position of the
  56. /// rigid body, however the velocity is NOT updated. The user can keyframe a rigid
  57. /// body by setting the velocity of the rigid body to produce the desired keyframe
  58. /// positions. The hkpKeyFrameUtility class can be used to simply apply keyframes
  59. /// in this way. The velocity of a keyframed rigid body is NOT changed by the
  60. /// application of impulses or forces. The keyframed rigid body has an infinite
  61. /// mass when viewed by the rest of the system.
  62. MOTION_KEYFRAMED,
  63. /// This motion type is used for the static elements of a game scene, e.g. the
  64. /// landscape. Fixed rigid bodies are treated in a special way by the system. They
  65. /// have the same effect as a rigid body with a motion of type MOTION_KEYFRAMED
  66. /// and velocity 0, however they are much faster to use, incurring no simulation
  67. /// overhead, except in collision with moving bodies.
  68. MOTION_FIXED,
  69. /// A box inertia motion which is optimized for thin boxes and has less stability problems
  70. MOTION_THIN_BOX_INERTIA,
  71. /// A specialized motion used for character controllers
  72. /// Not currently used
  73. MOTION_CHARACTER,
  74. /// 
  75. MOTION_MAX_ID
  76. };
  77. public:
  78. inline MotionType getType() const { return m_type; }
  79. /// Default constructor - sets initial velocity to zero.
  80. hkpMotion(const hkVector4& position, const hkQuaternion& rotation, bool wantDeactivation = false);
  81. /// Get the mass of the rigid body (Note: it is better to use getMassInv if possible).
  82. hkReal getMass() const;
  83. /// Get the inverse mass.
  84. inline hkSimdReal getMassInv() const;
  85. /// Set the mass of the rigid body. (Note: it is better to use setMassInv if possible).
  86. virtual void setMass(hkReal m);
  87. /// Set the inverse mass of the rigid body. 
  88. virtual void setMassInv(hkReal mInv);
  89. /// Get the inertia tensor of the rigid body in local space.
  90. virtual void getInertiaLocal(hkMatrix3& inertiaOut) const = 0;
  91. /// Get the inertia tensor of the rigid body in world space.
  92. virtual void getInertiaWorld(hkMatrix3& inertiaOut) const = 0;
  93. /// Sets the inertia tensor of the rigid body in local space. Advanced use only.
  94. virtual void setInertiaLocal(const hkMatrix3& inertia) = 0;
  95. /// Sets the inertia tensor of the rigid body by supplying its inverse. Advanced use only.
  96. virtual void setInertiaInvLocal(const hkMatrix3& inertiaInv) = 0;
  97. /// Get the inverse inertia tensor in local space.
  98. virtual void getInertiaInvLocal(hkMatrix3& inertiaInvOut) const = 0;
  99. /// Get the inverse inertia tensor in local space.
  100. virtual void getInertiaInvWorld(hkMatrix3& inertiaInvOut) const = 0;
  101. /// Explicitly set the center of mass of the rigid body in local space.
  102. /// This does not change the position of the rigid body.
  103. virtual void setCenterOfMassInLocal(const hkVector4& centerOfMass);
  104. /// Get the center of mass in local space.
  105. inline const hkVector4& getCenterOfMassLocal() const;
  106. /// Get the center of mass of the rigid body in world space.
  107. inline const hkVector4& getCenterOfMassInWorld() const;
  108. inline hkMotionState* getMotionState();
  109. /// Get access to it's internal motion state
  110. inline const hkMotionState* getMotionState() const;
  111. //
  112. // POSITION ACCESS
  113. //
  114. /// Return the position (Local Space origin) for this rigid body, in World space.
  115. /// Note: The center of mass is not necessarily the local space origin.
  116. inline const hkVector4& getPosition() const;
  117. /// Set the position (Local Space origin) of this rigid body, in World space.
  118. virtual void setPosition(const hkVector4& position);
  119. /// Returns the rotation from Local to World space for this rigid body.
  120. inline const hkQuaternion& getRotation() const;
  121. /// Set the rotation from Local to World Space for this rigid body.
  122. virtual void setRotation(const hkQuaternion& rotation);
  123. /// Set the position and rotation of the rigid body, in World space.
  124. virtual void setPositionAndRotation(const hkVector4& position, const hkQuaternion& rotation);
  125. /// Returns the rigid body (local) to world transformation.
  126. inline const hkTransform& getTransform() const;
  127. /// approximate a transform for any given time T<br>
  128. /// If T is between t0 and t1 of the motion state than the algorithm is doing in interpolation
  129. /// otherwise the result is an extrapolation.
  130. /// Note: This function has a lower accuracy than hkSweptTransformUtil::lerp2 as used by Havoks collision detection
  131. /// and should be used when you care about speed not accuracy (e.g. graphics)
  132. void approxTransformAt( hkTime time, hkTransform& transformOut );
  133. /// Sets the rigid body (local) to world transformation.
  134. virtual void setTransform(const hkTransform& transform);
  135. //
  136. // VELOCITY ACCESS
  137. //
  138. /// Return the linear velocity of the center of mass of the rigid body, in world space.
  139. inline const hkVector4& getLinearVelocity() const;
  140. /// Sets the linear velocity at the center of mass, in World space.
  141. virtual void setLinearVelocity(const hkVector4& newVel);
  142. /// Returns the angular velocity around the center of mass, in world space.
  143. inline const hkVector4& getAngularVelocity() const;
  144. /// Sets the angular velocity around the center of mass, in world space.
  145. virtual void setAngularVelocity(const hkVector4& newVel);
  146. /// Velocity of point p on the rigid body in World space.
  147. HK_FORCE_INLINE void getPointVelocity(const hkVector4& p, hkVector4& vecOut) const;
  148. /// Velocity and inverse virtual mass of point p along the supplied normal.
  149. virtual void getProjectedPointVelocity(const hkVector4& p, const hkVector4& normal, hkReal& velOut, hkReal& invVirtMassOut) const = 0;
  150. //
  151. // IMPULSE APPLICATION
  152. //
  153. /// Apply an impulse (in world space) to the center of mass.
  154. virtual void applyLinearImpulse(const hkVector4& imp);
  155. /// Apply an impulse (in world space) at the point p in world space.
  156. virtual void applyPointImpulse(const hkVector4& imp, const hkVector4& p) = 0;
  157. /// Apply an instantaneous change in angular velocity (in world space) around
  158. /// center of mass.
  159. virtual void applyAngularImpulse(const hkVector4& imp) = 0;
  160. //
  161. // FORCE AND TORQUE APPLICATION
  162. //
  163. /// Applies a force (in world space) to the rigid body. The force is applied to the
  164. /// center of mass.
  165. virtual void applyForce(const hkReal deltaTime, const hkVector4& force) = 0;
  166. /// Applies a force (in world space) to the rigid body at the point p in world space.
  167. virtual void applyForce(const hkReal deltaTime, const hkVector4& force, const hkVector4& p) = 0;
  168. /// Applies the specified torque (in world space) to the rigid body. (Note: the inline
  169. /// is for internal use only).
  170. virtual void applyTorque(const hkReal deltaTime, const hkVector4& torque) = 0;
  171. //
  172. // DAMPING
  173. //
  174. /// Naive momentum damping.
  175. inline hkReal getLinearDamping();
  176. /// Naive momentum damping.
  177. inline void setLinearDamping( hkReal d );
  178. /// Naive momentum damping.
  179. inline hkReal getAngularDamping();
  180. /// Naive momentum damping.
  181. inline void setAngularDamping( hkReal d );
  182. //
  183. // SOLVER DEACTIVATION SETTINGS
  184. //
  185. /// get the deactivation class as defined in hkpSolverInfo::DeactivationClass
  186. inline int getDeactivationClass();
  187. /// set the deactivation class as defined in hkpSolverInfo::DeactivationClass
  188. void setDeactivationClass(int deactivationClass);
  189. /// enables deactivation for this motion. Random number should be a random number.
  190. /// This helps to evenly distribute the workload over several frames
  191. inline void enableDeactivation( bool value, int randomNumber = 0, int worldFlag0 = 0, int worldFlag1 = 0, int worldDeactivationIntegrateCounter = 0);
  192. inline bool isActivationEnabled() const;
  193. public:
  194. //
  195. // INTERNAL FUNCTIONS
  196. //
  197. // serialization constructor. Note that the time in the motion state may 
  198. // be wrong (commonly reset in world addEntity etc)
  199. hkpMotion( class hkFinishLoadedObjectFlag flag ) : hkReferencedObject(flag) { if ( flag.m_finishing ) { m_gravityFactor = 1.f; } }
  200. // This method updates a given motion with the dynamic properties of the current motion, namely
  201. // m_linearVelocity, m_angularVelocity, m_rotation, m_oldCenterOfMassInWorld, m_centerOfMassInWorld and m_localToWorld.
  202. virtual void getMotionStateAndVelocitiesAndDeactivationType(hkpMotion* motionOut);
  203. // Gets number of frames during which the body movement was withing the 'inactive' threshold.
  204. inline int getNumInactiveFrames(int select);
  205. // Gets number of frames during which the body movement was withing the 'inactive' threshold.
  206. // This is used by the engine when querying numInactiveFrame, while other jobs modify the counters.
  207. // This is used by split-island job.
  208. inline int getNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag);
  209. // This sets the deactivation counters and synchronizes them with the world's deactivation counters.
  210. inline void setWorldSelectFlagsNeg(int worldFlag0, int worldFlag1, int worldDeactivationIntegrateCounter);
  211. // Increases the numInactiveFrames counter in a multithreading-safe way.
  212. inline void incrementNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag);
  213. // Zeroes the numInactiveFrames counter in a multithreading-safe way.
  214. inline void zeroNumInactiveFramesMt(int select, int worldDeactivationNumInactiveFramesSelectFlag);
  215. public:
  216. enum { NUM_INACTIVE_FRAMES_TO_DEACTIVATE = 5 };
  217. public:
  218. hkEnum<MotionType, hkUint8> m_type;
  219. // a counter reducing the frequency of deactivation checks.
  220. // The counter is incremented every time the body is integrated.
  221. // Every time the lower 2 bits of the count are 0 (every 4th frame), a deactivation
  222. // check (index=0) is performed. If the 4 lower bits are 0 (every 16th frame), a deactivation
  223. // check (index=1) is performed.
  224. // if the counter is 0xff, no check will performed
  225. hkUint8 m_deactivationIntegrateCounter;
  226. // the number of frames this object is inactive
  227. hkUint16 m_deactivationNumInactiveFrames[2];
  228. class hkMotionState m_motionState;
  229. // inverted inertia (xyz) and inverted mass (w)
  230. hkVector4 m_inertiaAndMassInv;
  231. // ------------------ 2nd CacheLine64 -------------------------
  232. // velocity data (used by buildAccumulator)
  233. hkVector4 m_linearVelocity;
  234. hkVector4 m_angularVelocity;
  235. // the reference position for the deactivator. .w component is the max velocity squared since last setting this position
  236. // to deactivate deactivation, simply set m_deactivationIntegrateCounter to 0xff
  237. hkVector4 m_deactivationRefPosition[ 2 ];
  238. // the packed m_deactivationRefOrientation (stored in the motionState motion (so that sizeof(hkpEntity) < 512))
  239. hkUint32 m_deactivationRefOrientation[2];
  240. // Stored _DYNAMIC_ motion
  241. class hkpMaxSizeMotion* m_savedMotion; //+hk.DataObjectType("hkpMotion")
  242. // Stored quality type of the rigid body, which refers to its saved _DYNAMIC_ motion.
  243. hkUint16 m_savedQualityTypeIndex;
  244. // Scale the world gravity to disable gravity or reverse the direction
  245. class hkHalf m_gravityFactor;
  246. };
  247. class hkpRigidMotion: public hkpMotion
  248. {
  249. hkpRigidMotion( class hkFinishLoadedObjectFlag flag ): hkpMotion(flag) { }
  250. };
  251. #include <Physics/Dynamics/Motion/hkpMotion.inl>
  252. #endif // HK_DYNAMICS2_MOTION_H
  253. /*
  254. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  255. * Confidential Information of Havok.  (C) Copyright 1999-2009
  256. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  257. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  258. * rights, and intellectual property rights in the Havok software remain in
  259. * Havok and/or its suppliers.
  260. * Use of this software for evaluation purposes is subject to and indicates
  261. * acceptance of the End User licence Agreement for this product. A copy of
  262. * the license is included with this software and is also available at www.havok.com/tryhavok.
  263. */