hkaSkeletonUtils.h
上传用户: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. #ifndef HK_SKELETON_UTILS_H
  9. #define HK_SKELETON_UTILS_H
  10. /// A user definable function useful for filtering strings before a name-matching operations.
  11. /// This is easily implemented to remove/replace prefixes, replace characters, etc.
  12. /// An implementation should return 0 if the strings should match
  13. typedef int (HK_CALL* hkStringCompareFunc)(const char*, const char*);
  14. class hkaSkeleton;
  15. /// This utility class contains many static methods related to the manipulation of poses and skeletons
  16. class hkaSkeletonUtils
  17. {
  18. public:
  19. /// Converts a local space pose to a pose in model space
  20. /// This routine is alias safe if the indices are parent first order i.e. (parentIndices[i] < i)
  21. static void HK_CALL transformLocalPoseToModelPose ( int numTransforms, const hkInt16* parentIndices, const hkQsTransform* poseLocal, hkQsTransform* poseModelOut);
  22. /// Converts a bone transform from a local space to model space.
  23. static void HK_CALL transformLocalBoneToModelBone( int boneIndex, const hkInt16* parentIndices, const hkQsTransform* poseLocal, hkQsTransform& boneModelOut );
  24. /// Converts a model space pose to a pose in local space
  25. /// This routine is not alias safe.
  26. static void HK_CALL transformModelPoseToLocalPose ( int numTransforms, const hkInt16* parentIndices, const hkQsTransform* poseModel, hkQsTransform* poseLocalOut);
  27. /// Converts a model space pose to a pose in world space
  28. /// This simply multiplies through the model pose by the reference frame.
  29. /// The worldFromModel transform gives the reference frame in world space.
  30. static void HK_CALL transformModelPoseToWorldPose ( int numTransforms, const hkQsTransform& worldFromModel, const hkQsTransform* poseModel, hkQsTransform* poseWorldOut);
  31. /// Converts a world space pose to a pose in model space
  32. /// This simply multiplies through the world pose by the inverse of the reference frame.
  33. /// The worldFromModel transform gives the reference frame in world space.
  34. static void HK_CALL transformWorldPoseToModelPose ( int numTransforms, const hkQsTransform& worldFromModel, const hkQsTransform* poseWorld, hkQsTransform* poseModelOut);
  35. /// Converts a local space pose to a pose in world space
  36. /// This first converts to model space and then to world space using the reference frame
  37. /// The worldFromModel transform gives the reference frame in world space.
  38. /// This routine is alias safe if the indices are parent first order i.e. (parentIndices[i] < i)
  39. static void HK_CALL transformLocalPoseToWorldPose ( int numTransforms, const hkInt16* parentIndices, const hkQsTransform& worldFromModel, const hkQsTransform* poseLocal, hkQsTransform* poseWorldOut);
  40. /// Converts a local space pose to a pose in world space
  41. /// This first converts to model space and then to local space using the reference frame
  42. /// The worldFromModel transform gives the reference frame in world space.
  43. /// This routine is not alias safe.
  44. static void HK_CALL transformWorldPoseToLocalPose ( int numTransforms, const hkInt16* parentIndices, const hkQsTransform& worldFromModel, const hkQsTransform* poseWorld, hkQsTransform* poseLocalOut);
  45. /// Blends two (usually local) poses using per-bone weight array (0.0 = A, 1.0 = B)
  46. static void HK_CALL blendPoses( hkUint32 numBones, const hkQsTransform* poseA, const hkQsTransform* poseB, const hkReal* weights, hkQsTransform* poseOut );
  47. /// Blends two (usually local) poses using a single weight, where 0.0 = A and 1.0 = B
  48. static void HK_CALL blendPoses( hkUint32 numBones, const hkQsTransform* poseA, const hkQsTransform* poseB, const hkReal weight, hkQsTransform* poseOut );
  49. /// Blends two bone chain (usually local) poses using a single weight, where 0.0 = A and 1.0 = B
  50. static void HK_CALL blendPartialPoses( hkUint32 numBones, hkInt16* bones, const hkQsTransform* poseA, const hkQsTransform* poseB, const hkReal weight, hkQsTransform* poseOut );
  51. /// Given a local space pose, it will ensure that any bone constraint in the skeleton are enforced
  52. /// Currently the only bone constraint is "lockTranslation"
  53. /// This ensures the pose translations match the translations in the skeleton reference pose.
  54. static void HK_CALL enforceSkeletonConstraintsLocalSpace(const hkaSkeleton& skeleton, hkQsTransform* poseLocalInOut);
  55. /// Given a model space pose, it will ensure that any bone constraint in the skeleton are enforced
  56. /// Currently the only bone constraint is "lockTranslation"
  57. /// This ensures the pose translations match the translations in the skeleton reference pose.
  58. static void HK_CALL enforceSkeletonConstraintsModelSpace(const hkaSkeleton& skeleton, hkQsTransform* poseModelInOut);
  59. /// Given a model space pose, it will ensure that any bone constraint in the skeleton are enforced
  60. /// Currently the only bone constraint is "lockTranslation"
  61. /// This ensures the pose translations match the translations in the constraint pose (given in local space).
  62. static void HK_CALL enforcePoseConstraintsLocalSpace (const hkaSkeleton& skeleton, const hkQsTransform* constraintsLocal, hkQsTransform* poseInOut);
  63. /// Given a model space pose, it will ensure that any bone constraint in the skeleton are enforced
  64. /// Currently the only bone constraint is "lockTranslation"
  65. /// This ensures the pose translations match the translations in the constraint pose (given in local space).
  66. static void HK_CALL enforcePoseConstraintsModelSpace (const hkaSkeleton& skeleton, const hkQsTransform* constraintsLocal, hkQsTransform* poseModelInOut);
  67. /// Looks for a bone with the specified name (possibly filtering it). Returns -1 if not found, or the bone ID if found
  68. static hkInt16 HK_CALL findBoneWithName (const hkaSkeleton& skeleton, const char* name, hkStringCompareFunc compare = HK_NULL);
  69. /// Locks the translation of all bones in the given skeleton (except roots)
  70. static void HK_CALL lockTranslations (const hkaSkeleton& skeleton, hkBool exceptRoots = true);
  71. /// Unlocks all the translations for the given skeleton
  72. static void HK_CALL unlockTranslations (const hkaSkeleton& skeleton);
  73. /// Fills bonesOut with the chain between start bone and end bone (where end bone is deeper in the hierarchy)
  74. /// Returns false if there is no possible chain - NOTE :L The array will be modified anyway
  75. /// This methods possibly allocates space in the array (since its length is unknown by the caller)
  76. static hkBool HK_CALL getBoneChain(const hkaSkeleton& skeleton, hkInt16 startBone, hkInt16 endBone, hkArray<hkInt16>& bonesOut);
  77. /// Fills bonesOut with the id of all bones descending from the given bone
  78. /// This methods possibly allocates space in the array (since its length is unknown by the caller)
  79. static void HK_CALL getDescendants(const hkaSkeleton& skeleton, hkInt16 startBone, hkArray<hkInt16>& bonesOut, bool includeStart = false );
  80. /// Given an array of boolean skeleton->m_numBones big, the array will be marked true for all bones which are
  81. /// descendants of the start bone and false otherwise.
  82. static void HK_CALL markDescendants( const hkaSkeleton* skeleton, int startBone, bool* out, bool includeStart = false );
  83. /// Fills bonesOut with the id of all bones in the given skeleton with no children
  84. static void HK_CALL getLeaves(const hkaSkeleton& skeleton, hkArray<hkInt16>& leavesOut);
  85. /// This method checks the mapping in the binding and returns true if all bone indices are valid for this skeleton
  86. static hkBool HK_CALL isBindingOk( const hkaSkeleton& skeleton, const class hkaAnimationBinding& binding );
  87. /// Given a local pose, gets the scale in model space of the associated bone
  88. static void HK_CALL getModelSpaceScale (const hkaSkeleton& skeleton, const hkQsTransform* poseLocal, int boneId, hkVector4& scaleOut);
  89. /// This method iterates through the array and normalizes the quaternions in the array of hkQsTransforms
  90. static void HK_CALL normalizeRotations(hkQsTransform* transformsInOut, int numTransforms );
  91. /// This method uses the bone names from a skeleton and animation track names from an animation 
  92. /// to fill in the animation track to bone mapping for an animation binding.
  93. /// A string comparison routine is passed which allows you to strip prefixes etc. the strings are passed in the order (bone name , track name)
  94. /// The m_transformTrackToBoneIndices array must be appropriately initialized 
  95. /// (remember to set m_numTransformTrackToBoneIndices and allocate memory)
  96. static hkResult HK_CALL bindByName(const hkaSkeleton& skeleton, const class hkaAnimation& anim, hkStringCompareFunc compare, class hkaAnimationBinding& bindingOut);
  97. };
  98. #endif // HK_SKELETON_UTILS_H
  99. /*
  100. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  101. * Confidential Information of Havok.  (C) Copyright 1999-2009
  102. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  103. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  104. * rights, and intellectual property rights in the Havok software remain in
  105. * Havok and/or its suppliers.
  106. * Use of this software for evaluation purposes is subject to and indicates
  107. * acceptance of the End User licence Agreement for this product. A copy of
  108. * the license is included with this software and is also available at www.havok.com/tryhavok.
  109. */