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

其他游戏

开发平台:

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_HK_POSE_H
  9. #define HK_HK_POSE_H
  10. #include <Animation/Animation/Rig/hkaSkeleton.h>
  11. #include <Common/Base/Container/LocalArray/hkLocalArray.h>
  12. /// This class may be used to store and manipulate poses, representing the state of an animation sample for both the transform and float data (where present).
  13. /// For the transform (bone) data it uses a dual representation of the poses : LOCAL SPACE, where the transform of each bone is relative to the transform
  14. /// of its parent, and MODEL SPACE, where the transform of each bone is absolute (respect to a global model space)
  15. /// Both representations are kept in sync lazily, using the hkaSkeleton hierachy.
  16. /// For the float data it simply has an array of 'float slot values' into which the float data can be sampled - the skeleton hierachy has no effect here.
  17. /// hkaPose objects are associated with skeletons on construction and can therefore only hold poses based on that skeleton.
  18. /// N.B. There is no necessity to use a hkaPose in order to get the results of sampling (you may simply pass
  19. /// pointers to reserved blocks of data for the sampling to write into) but this class facilitates model/local space syncing via the hkaSkelton
  20. /// associated with it.
  21. /// N.B. There is a requirement when using animation jobs for sampling on SPU that the float slot array
  22. /// be allocated to a size (number of bytes) which is a multiple of 16. The hkaPose class handles this automatically
  23. /// by setting the m_floatSlotValues array to have a *capacity* rounded up to a multiple of 4. If you do not use this class
  24. /// you may wish to use the helper method 
  25. /// hkaMultithreadedAnimationUtils::allocateFloatSlotsArrayRoundedUpToMultipleOf16()
  26. class hkaPose
  27. {
  28. public:
  29. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaPose );
  30. /*
  31. ** Construction
  32. */
  33. /// This enum is used for the construction of an hkaPose instance described either in model or in local space
  34. enum PoseSpace
  35. {
  36. MODEL_SPACE,
  37. LOCAL_SPACE
  38. };
  39. /// Constructor (Note : it doesn't initialize the pose).
  40. HK_FORCE_INLINE hkaPose (const hkaSkeleton* skeleton);
  41. /// Constructor; uses the specified preallocated memory for internal arrays (Note : it doesn't initialize the pose).
  42. /// Use the static method getRequiredMemorySize() to determine the required size of this buffer.
  43. HK_FORCE_INLINE hkaPose (const hkaSkeleton* skeleton, void* preallocatedMemory);
  44. /// Returns the memory size needed to hold an hkaPose object based on the given skeleton. 
  45. /// You can preallocate a buffer (possibly local) of this size and then use the hkaPose(skeleton, preallocatedMemory) constructor
  46. /// to create an hkaPose instance that doesn't dynamically allocate memory.
  47. HK_FORCE_INLINE static int getRequiredMemorySize (const hkaSkeleton* skeleton);
  48. /// Constructor; initializes the pose from an array of transforms in Local Space or Model Space (depending on the value of "space"). The float slots are set to 0.0.
  49. hkaPose (PoseSpace space, const hkaSkeleton* skeleton, const hkArray<hkQsTransform>& pose);
  50. /*
  51. ** Get/set/access methods
  52. */
  53. /// This enum is passes to methods that change a bone in model space, specifying whether the change propagates or not,
  54. /// i.e., whether the children keep their local (propagate) or model (don't propagate) transform.
  55. enum PropagateOrNot
  56. {
  57. DONT_PROPAGATE = 0,
  58. PROPAGATE = 1
  59. };
  60. /// Returns the skeleton associated with this pose.
  61. HK_FORCE_INLINE const hkaSkeleton* getSkeleton() const;
  62. /// Returns a const-reference to an array representing the pose in Local Space.
  63. const hkArray<hkQsTransform>& getSyncedPoseLocalSpace() const;
  64. /// Returns a const-reference to an array representing the pose in Model Space.
  65. const hkArray<hkQsTransform>& getSyncedPoseModelSpace() const;
  66. /// Returns a const-reference to an array representing the current values in the float slots.
  67. HK_FORCE_INLINE const hkArray<hkReal>& getFloatSlotValues() const;
  68. /// Overwrites this pose with a new one described as an array of transforms in Local Space.
  69. void setPoseLocalSpace (const hkArray<hkQsTransform>& poseLocal);
  70. /// Overwrites this pose with a new one described as an array of transforms in Model Space.
  71. void setPoseModelSpace (const hkArray<hkQsTransform>& poseModel);
  72. /// Overwrites the values in the float slots.
  73. HK_FORCE_INLINE void setFloatSlotValues (const hkArray<hkReal>& floatSlotValues);
  74. /// Retrieves the transform associated with one bone in Local Space.
  75. /// May synchronize ancestors in model space
  76. HK_FORCE_INLINE const hkQsTransform& getBoneLocalSpace (int boneIdx) const;
  77. /// Retrieves the transform associated with one bone in Model Space.
  78. /// May synchronize ancestors in model space
  79. HK_FORCE_INLINE const hkQsTransform& getBoneModelSpace (int boneIdx) const;
  80. /// Retrieves the value in a given float slot.
  81. HK_FORCE_INLINE hkReal getFloatSlotValue (int floatSlotIdx) const;
  82. /// Sets the transform of a particular bone in Local Space. The transform in Local Space of the descendants is kept (therefore their 
  83. /// transform in Model Space is not).
  84. HK_FORCE_INLINE void setBoneLocalSpace (int boneIdx, const hkQsTransform& boneLocal);
  85. /// Sets the transform of a particular bone in Model Space. The transform in Model Space of the descendants is kept,
  86. /// unless propagateOrNot is set to PROPAGATE. In that case, the Local Space transform of the descendants is kept (and the Model Space transform is not)
  87. HK_FORCE_INLINE void setBoneModelSpace (int boneIdx, const hkQsTransform& boneModel, PropagateOrNot propagateOrNot);
  88. /// Sets the value in a given float slot.
  89. HK_FORCE_INLINE void setFloatSlotValue (int floatSlotIdx, hkReal value);
  90. /// Ensures all Local Space transforms stored are in sync (since they are evaluated lazily, they may not always be in sync). It is useful if the
  91. /// application is going to repeatedly access most of these Local Space transforms (without modifying them in Model Space)
  92. void syncLocalSpace () const;
  93. /// Ensures all Model Space transforms stored are in sync (since they are evaluated lazily, they may not always be in sync). It is useful if the
  94. /// application is going to repeatedly access most of these Model Space transforms (without modifying them in Local Space)
  95. void syncModelSpace () const;
  96. /// Synchronizes both representations (calls both syncLocalSpace and syncModelSpace).
  97. inline void syncAll () const;
  98. /*
  99. ** Bone Pose Access methods, non-const : they sync one representation and dirty the other one. Use with caution.
  100. */
  101. /// Returns a non-const reference to the bone in local space. This reference should only be used for a limited scope (it shouldn't be used
  102. /// once the hkaPose is further modified). Useful in order to modify individual components of the transform without creating a temporary object.
  103. /// Use this method with caution.
  104. hkQsTransform& accessBoneLocalSpace (int boneIdx);
  105. /// Returns a non-const reference to the bone in model space. This reference should only be used for a limited scope (it shouldn't be used
  106. /// once the hkaPose is further modified). Useful in order to modify individual components of the transform without creating a temporary object.
  107. /// Usage of propagateOrNot is as in setBoneModelSpace(). Use this method with caution.
  108. hkQsTransform& accessBoneModelSpace (int boneIdx, PropagateOrNot propagateOrNot = DONT_PROPAGATE);
  109. /// Returns a non-const reference to the pose as an array of transforms in Local Space. It fully syncs the Local Space representation of the pose,
  110. /// and fully invalidates the Model Space representation. This is useful in order to pass the pose to methods that only modify this Local Space representation.
  111. /// No other methods in hkaPose should be called until this reference goes out of scope or is no longer used.
  112. hkArray<hkQsTransform>& accessSyncedPoseLocalSpace();
  113. /// Returns a non-const reference to the pose as an array of transforms in Model Space. It fully syncs the Model Space representation of the pose,
  114. /// and fully invalidates the Local Space representation. This is useful in order to pass the pose to methods that only modify this Model Space representation.
  115. /// No other methods in hkaPose should be called until this reference goes out of scope or is no longer used.
  116. hkArray<hkQsTransform>& accessSyncedPoseModelSpace();
  117. /*
  118. ** Write access methods, non-const: they don't sync the representation; the user (caller) is expected to ignore current values and set new values.
  119. */
  120. /// Returns a non-const reference to the pose as an array of transforms in local space. The caller is expected to set all of these transforms.
  121. /// These values should be only written to, not read.  No other methods
  122. /// in hkaPose should be called until this reference goes out of scope or is no longer used. Use this method with caution.
  123. hkArray<hkQsTransform>& accessUnsyncedPoseLocalSpace();
  124. /// Returns a non-const reference to the pose as an array of transforms in model space. The caller is expected to set all of these transforms.
  125. /// These values should only be written to, not read.  No other methods
  126. /// in hkaPose should be called until this reference goes out of scope or is no longer used. Use this method with caution.
  127. hkArray<hkQsTransform>& accessUnsyncedPoseModelSpace();
  128. /// Returns a non-const reference to the float slot values as an array of floats. 
  129. HK_FORCE_INLINE hkArray<hkReal>& getFloatSlotValues();
  130. /*
  131. ** Utility methods
  132. */
  133. /// Set the pose to be the reference pose (no reference pose data exits for the float slots, so they are set to 0.0. 
  134. void setToReferencePose ();
  135. /// Ensure that any bone constraint in the skeleton is enforced. Currently the only bone constraint is "lockTranslation".
  136. /// This method operates in local space.
  137. void enforceSkeletonConstraintsLocalSpace ();
  138. /// Ensure that any bone constraint in the skeleton is enforced. Currently the only bone constraint is "lockTranslation".
  139. /// This method operates in model space.
  140. void enforceSkeletonConstraintsModelSpace ();
  141. /// Returns the AABB in model space that contains all bones positions in the pose.
  142. void getModelSpaceAabb (class hkAabb& aabbOut) const;
  143. /*
  144. ** Operators
  145. */
  146. /// Assignment operator.
  147. inline hkaPose& operator= ( const hkaPose& other );
  148. private:
  149. typedef hkUint32 hkaPoseFlag;
  150. const hkaSkeleton* m_skeleton;
  151. mutable hkArray<hkQsTransform> m_localPose;
  152. mutable hkArray<hkQsTransform> m_modelPose;
  153. mutable hkArray<hkaPoseFlag> m_boneFlags;
  154. mutable hkBool m_modelInSync;
  155. mutable hkBool m_localInSync;
  156. hkArray<hkReal> m_floatSlotValues;
  157. // Bone Flags
  158. enum 
  159. {
  160. F_BONE_LOCAL_DIRTY = 0x1,
  161. F_BONE_MODEL_DIRTY = 0x2,
  162. F_BONE_INTERNAL_FLAG1 = 0x4, // internally used (enforceConstraints, makeAllChildrenLocal)
  163. F_BONE_INTERNAL_FLAG2 = 0x8, // internally used (calculateBoneModelSpace)
  164. F_BONE_INTERNAL_FLAG3 = 0x10, // internally used
  165. };
  166. // Masks
  167. enum
  168. {
  169. M_BONE_INTERNAL_FLAGS = F_BONE_INTERNAL_FLAG1 | F_BONE_INTERNAL_FLAG2 | F_BONE_INTERNAL_FLAG3
  170. };
  171. HK_FORCE_INLINE int isFlagOn (int boneIdx, hkaPoseFlag enumToCheck) const;
  172. HK_FORCE_INLINE void setFlag (int boneIdx, hkaPoseFlag enumToCheck) const;
  173. HK_FORCE_INLINE void clearFlag (int boneIdx, hkaPoseFlag enumToCheck) const;
  174. HK_FORCE_INLINE int isFlagOnExplicit (hkaPoseFlag flag, hkaPoseFlag enumToCheck) const;
  175. HK_FORCE_INLINE void setFlagExplicit (hkaPoseFlag& flag, hkaPoseFlag enumToCheck) const;
  176. HK_FORCE_INLINE void clearFlagExplicit (hkaPoseFlag& flag, hkaPoseFlag enumToCheck) const;
  177. HK_FORCE_INLINE void clearInternalFlags() const;
  178. HK_FORCE_INLINE void makeAllChildrenLocalSpace   (int boneIdx) const;
  179. HK_FORCE_INLINE void makeFirstChildrenModelSpace (int boneIdx) const;
  180. // These methods are called when the value stored is dirty
  181. const hkQsTransform& calculateBoneModelSpace (int boneIdx) const;
  182. // DEBUG ONLY METHODS
  183. void setNonInitializedFlags();
  184. hkBool checkInternalFlagIsClear(hkaPoseFlag flag) const;
  185. public:
  186. // For unit testing
  187. hkBool checkPoseValidity () const;
  188. };
  189. #include <Animation/Animation/Rig/hkaPose.inl>
  190. #endif
  191. /*
  192. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  193. * Confidential Information of Havok.  (C) Copyright 1999-2009
  194. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  195. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  196. * rights, and intellectual property rights in the Havok software remain in
  197. * Havok and/or its suppliers.
  198. * Use of this software for evaluation purposes is subject to and indicates
  199. * acceptance of the End User licence Agreement for this product. A copy of
  200. * the license is included with this software and is also available at www.havok.com/tryhavok.
  201. */