hkaMirroredSkeleton.h
上传用户: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. #ifndef HKANIMATION_ANIMATION_HKMIRROREDSKELETON_H
  9. #define HKANIMATION_ANIMATION_HKMIRROREDSKELETON_H
  10. #include <Common/Base/Container/StringMap/hkStringMap.h>
  11. #include <Animation/Animation/Animation/hkaAnimation.h>
  12. #include <Animation/Animation/Rig/hkaSkeleton.h>
  13. class hkaSkeleton;
  14. /// This is a helper class for the hkaMirroredAnimation which encapsulates the 'mirroring' functionality
  15. /// and works at a per-bone level (rather than the per-track level of a hkaAnimation).
  16. class hkaMirroredSkeleton : public hkReferencedObject
  17. {
  18. public:
  19. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RIG );
  20. /// Constructor for hkaMirroredAnimation
  21. /// param skeleton Rig hierarchy
  22. hkaMirroredSkeleton( const hkaSkeleton *skeleton );
  23. /// Destructor
  24. ~hkaMirroredSkeleton();
  25. // MIRRORING
  26. /// Replaces qInOut with its mirrored equivalent for non-additive animations
  27. void mirrorRegularBone( hkQsTransform &qInOut, int bone ) const;
  28. /// Replaces qInOut with its mirrored equivalent for additive animations
  29. void mirrorAdditiveBone( hkQsTransform &qInOut, int bone ) const;
  30.   /// Replaces qInOut with its mirrored equivalent for extracted motion
  31. void mirrorExtractedMotion( hkQsTransform &qInOut ) const;
  32.   /// Replaces qInOut with its mirrored equivalent
  33. void mirrorPairedBone( hkQsTransform &qInOut, int bone, bool isAdditive ) const;
  34. // MIRRORING SETUP
  35. /// Given a worldAxis (typically X=[1,0,0,0] Y=[0,1,0,0]
  36. /// Z=[0,0,1,0]) and an initially symmetric reference pose,
  37. /// compute all necessary mirroring setup.  Note that bone
  38. /// pairing setup must be complete before this function
  39. /// should be called.
  40. void setAllBoneInvariantsFromReferencePose( const hkQuaternion& worldAxis, hkReal tolerance );
  41. /// Given a worldAxis (typically X=[1,0,0,0] Y=[0,1,0,0]
  42. /// Z=[0,0,1,0]) and an initially symmetric pose, compute all
  43. /// necessary mirroring setup.  Note that bone pairing setup
  44. /// must be complete before this function should be called.
  45. void setAllBoneInvariantsFromSymmetricPose( const hkQuaternion& worldAxis, hkReal tolerance, const class hkaPose & );
  46. /// Given a worldAxis (typically X=[1,0,0,0] Y=[0,1,0,0]
  47. /// Z=[0,0,1,0]) and an initially symmetric pose, compute all
  48. /// necessary mirroring setup.  Note that bone pairing setup
  49. /// must be complete before this function should be called.
  50. void setAllBoneInvariantsFromSymmetricPose( const hkQuaternion& worldAxis, hkReal tolerance, const hkQsTransform *poseModelSpace );
  51. /// Low-level access to the bone invariants
  52. const hkQuaternion& getBoneInvariant( int bone ) const;
  53. /// Low-level access to the bone invariants.  Typically computed
  54. /// by calling one of the setAllBoneInvariants*() member
  55. /// functions on a symmetric example pose.
  56. void setBoneInvariant( int bone, const hkQuaternion& axis );
  57. // BONE PAIRING
  58. /// Allows the user to set bone pairing information
  59. /// param bi Bone to pair with bj
  60. /// param bj Bone to pair with bi
  61. void setBonePair( hkInt16 bi, hkInt16 bj );
  62. /// Allows the user to set all of the bone pairing information at once
  63. /// param bonePairMap The mapping of bones to their mirrored partners
  64. void setBonePairMap( hkInt16* bonePairMap, int numBonePairMap );
  65. /// Allows the user to query bone pairing information
  66. /// return The paired bone for bi
  67. /// param bi Bone to query pair information for
  68. hkInt16 getBonePair( hkInt16 bi ) const;
  69. // ANNOTATION PAIRING
  70. /// Set annotation pair
  71. /// param ai Annotation to pair with aj
  72. /// param aj Annotation to pair with ai
  73. void setAnnotationPair( hkaAnnotationTrack::Annotation* ai, hkaAnnotationTrack::Annotation* aj );
  74. /// Set annotation name pair, strings must persist throughout the scope of this class
  75. /// param ai Name of annotation to pair with aj
  76. /// param aj Name of annotation to pair with ai
  77. void setAnnotationNamePair( const char* namei, const char* namej );
  78. /// Allows the user to query annotation pairing information
  79. /// return The paired annotation
  80. const char* getAnnotationNamePair( const char* ) const;
  81. /// Clears all existing annotation pairs
  82. void clearAllAnnotationPairs();
  83. /// Computes bone pairing information from unique substrings of bone names
  84. /// param ltag Array of strings uniquely identifying left bones
  85. /// param ltag Array of strings uniquely identifying right bones
  86. void computeBonePairingFromNames( const hkObjectArray< hkString > &ltag, const hkObjectArray< hkString > &rtag );
  87. /// Computes bone pairing information from unique substrings of bone names
  88. /// param ltag Array of strings uniquely identifying left bones
  89. /// param ltag Array of strings uniquely identifying right bones
  90. /// param skeleton The skeleton that is being mirrored
  91. /// param bonePairMap The buffer for the resultant bone map
  92. static void HK_CALL computeBonePairingFromNames( 
  93. const hkObjectArray< hkString > &ltag, 
  94. const hkObjectArray< hkString > &rtag,
  95. const hkaSkeleton* skeleton,
  96. hkInt16* bonePairMap );
  97. // NOT FOR USER USE Accessors for static method hkaMirroredAnimation::samplePartialWithDataChunks
  98. static int HK_CALL getNumDataChunks();
  99. void getDataChunks( hkaAnimation::DataChunk* chunksOut ) const;
  100. static const hkaMirroredSkeleton* HK_CALL convertDataChunks( hkaAnimation::DataChunk* chunksInOut );
  101. private:
  102. /// Returns the parent bone index
  103. int getBoneParent( int bone ) const;
  104. /// Sets all bone axes to canonical (multiples of pi/2) rotations
  105.     void canonicalize( hkQuaternion &qInOut, hkReal tolerance );
  106. /// Bone pairing information
  107. hkInt16* m_bonePairMap;
  108. /// Returns the number of bones
  109. int numBones() const;
  110. /// Skeleton, used to get the parent bone information
  111. const hkaSkeleton *m_skeleton;
  112. /// Parent indices from the original skeleton
  113. /// This pointer points to the values in the original skeleton.
  114. /// No new memory is allocated (motivated by data chunks).
  115. const hkInt16 *m_parentIndices; // = m_skeleton->m_parentIndices
  116. /// Number of bones from the original skeleton
  117. hkInt32 m_numBones; // = m_skeleton->m_numBones
  118. /// Rotations for each bone
  119. hkQuaternion* m_boneInvariants;
  120. /// Map of mirrored annotation names
  121. hkStringMap< const char* > m_annotationNameMap;
  122. };
  123. #endif // HKANIMATION_ANIMATION_HKMIRROREDSKELETON_H
  124. /*
  125. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  126. * Confidential Information of Havok.  (C) Copyright 1999-2009
  127. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  128. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  129. * rights, and intellectual property rights in the Havok software remain in
  130. * Havok and/or its suppliers.
  131. * Use of this software for evaluation purposes is subject to and indicates
  132. * acceptance of the End User licence Agreement for this product. A copy of
  133. * the license is included with this software and is also available at www.havok.com/tryhavok.
  134. */