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

其他游戏

开发平台:

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_TRACK_ANALYSIS_H
  9. #define HK_TRACK_ANALYSIS_H
  10. #include <Animation/Animation/Animation/hkaAnimation.h>
  11. // INTERNAL
  12. class hkaTrackAnalysis
  13. {
  14. public:
  15. /// The input structure for analysing animation tracks
  16. /// Tolerances are conservative i.e. if both absolute and relative 
  17. /// tolerances are specified then the position must be within both
  18. struct AnalysisInput
  19. {
  20. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::AnalysisInput );
  21. const hkQsTransform* m_boneData;
  22. hkUint32 m_numberOfTransformTracks;
  23. hkUint32 m_numberOfPoses;
  24. hkReal m_absolutePositionTolerance; // Set to 0 to use only relative tolerance
  25. hkReal m_relativePositionTolerance; // Set to 0 to use only abs tolerance
  26. hkReal m_rotationTolerance;
  27. hkReal m_scaleTolerance;
  28. hkBool m_useThreeComponentQuaternions;
  29. };
  30. struct PerTransformTrackAnalysisInput
  31. {
  32. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::PerTransformTrackAnalysisInput );
  33. PerTransformTrackAnalysisInput()
  34. : m_boneData(HK_NULL), m_numberOfTransformTracks(0), m_numberOfPoses(0)
  35. {}
  36. const hkQsTransform* m_boneData;
  37. hkUint32 m_numberOfTransformTracks;
  38. hkUint32 m_numberOfPoses;
  39. hkArray<hkReal> m_absolutePositionTolerance; // Set to 0 to use only relative tolerance
  40. hkArray<hkReal> m_relativePositionTolerance; // Set to 0 to use only abs tolerance
  41. hkArray<hkReal> m_rotationTolerance;
  42. hkArray<hkReal> m_scaleTolerance;
  43. hkArray<hkBool> m_useThreeComponentQuaternions;
  44. };
  45. struct PerFloatTrackAnalysisInput
  46. {
  47. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::PerFloatTrackAnalysisInput );
  48. PerFloatTrackAnalysisInput()
  49. : m_floatData(HK_NULL), m_numberOfFloatTracks(0), m_numberOfPoses(0)
  50. {}
  51. const hkReal* m_floatData;
  52. hkUint32 m_numberOfFloatTracks;
  53. hkUint32 m_numberOfPoses;
  54. hkArray<hkReal> m_absoluteTolerance;
  55. };
  56. enum TrackType 
  57. {
  58. HK_TRACK_DYNAMIC = 0x00, // This track should use the dynamic value
  59. HK_TRACK_STATIC  = 0x01, // This track should use the static value
  60. HK_TRACK_CLEAR   = 0x02  // This track can be cleared / set to the identity
  61. };
  62. /// This method analyzes the input animation to find and 
  63. /// record static degrees of freedom in the animation.
  64. /// The method fills data into the arrays staticMask and staticDofs.
  65. /// Both must be preallocated. 
  66. /// The staticMask array must be m_numberOfTransformTracks long, 16 bits of mask
  67. /// info for each transform track as follows:
  68. /// Bits 0..1 = Track Type for Position
  69. /// Bits 2..3 = Track Type for Rotation
  70. /// Bits 4..5 = Track Type for Scale
  71. /// Bits 6..8 = Z,Y,X flags for dynamic positions 
  72. /// Bits 9..12 = W,Z,Y,X flags for dynamic rotations
  73. /// Bits 13..15 = Z,Y,X flags for dynamic scales
  74. /// The staticDofs array array should be 10*m_numberOfTransformTracks long as
  75. /// it may need to store 10 static values for each transform (of all 10 DOFs are static for
  76. /// every track).
  77. /// Sub-tracks (Position/Rotation/Scale) are considered Clear if *all* components are clear,
  78. /// Static if *all* are static, and Dynamic if *any* are dynamic.
  79. /// Individual DOFs can be either static (0) or dynamic (1).
  80. static void HK_CALL analyze( const AnalysisInput& input, hkUint16* staticMask, hkReal* staticDOFs );
  81. /// This version of the analysis function takes per-track settings, both for transform tracks and float tracks.
  82. static void HK_CALL analyze( const PerTransformTrackAnalysisInput& input, const PerFloatTrackAnalysisInput& finput, hkUint16* staticMask, hkReal* staticDOFs, hkBool displayStatsReport = true);
  83. /// An output structure used to gather statistics on an analysed track mask
  84. struct AnalysisStats
  85. {
  86. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::AnalysisStats );
  87. AnalysisStats()
  88. : m_staticPosDOF(0),
  89. m_staticRotDOF(0),
  90. m_staticSclDOF(0),
  91. m_staticFloatDOF(0),
  92. m_clearPosDOF(0),
  93. m_clearRotDOF(0),
  94. m_clearSclDOF(0),
  95. m_dynamicPosDOF(0),
  96. m_dynamicRotDOF(0),
  97. m_dynamicSclDOF(0),
  98. m_dynamicFloatDOF(0),
  99. m_numTransformDOFS(0),
  100. m_numFloatDOFS(0),
  101. m_ratio(0.0f) 
  102. {
  103. }
  104. void displayReport();
  105. // Number of static tracks
  106. hkUint32 m_staticPosDOF;
  107. hkUint32 m_staticRotDOF;
  108. hkUint32 m_staticSclDOF;
  109. hkUint32 m_staticFloatDOF;
  110. // Number of clear tracks
  111. hkUint32 m_clearPosDOF;
  112. hkUint32 m_clearRotDOF;
  113. hkUint32 m_clearSclDOF;
  114. // Number of dynamic degrees of freedom
  115. hkUint32 m_dynamicPosDOF;
  116. hkUint32 m_dynamicRotDOF;
  117. hkUint32 m_dynamicSclDOF;
  118. hkUint32 m_dynamicFloatDOF;
  119. hkUint32 m_numTransformDOFS;
  120. hkUint32 m_numFloatDOFS;
  121. // Ratio of total tracks to dynamic tracks
  122. hkReal  m_ratio; 
  123. };
  124. /// This method computes the statistics in the AnalysisStats struct for a given static mask.
  125. static void HK_CALL calcStats(const hkUint16* staticMaskT, const hkUint16* staticMaskF, hkUint32 numTracksT, hkUint32 numTracksF, AnalysisStats& out);
  126. /// This method computes information for the dynamic tracks
  127. static void HK_CALL calcDynamicStats(const hkUint16* staticMaskT, const hkUint16* staticMaskF, hkUint32 numTracksT, hkUint32 numFTracksF, AnalysisStats& out);
  128. struct AnalysisSplit
  129. {
  130. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::AnalysisSplit );
  131. AnalysisSplit()
  132. : m_data(HK_NULL), m_numberOfTransformTracks(0), m_floatData(HK_NULL), m_numberOfFloatTracks(0),
  133. m_numberOfPoses(0), m_channelAlign(0), m_staticMask(HK_NULL)
  134. {}
  135. const hkQsTransform* m_data;
  136. hkUint32 m_numberOfTransformTracks;
  137. const hkReal* m_floatData;
  138. hkUint32 m_numberOfFloatTracks;
  139. hkUint32 m_numberOfPoses;
  140. hkUint32 m_channelAlign;
  141. const hkUint16* m_staticMask;
  142. };
  143. static void HK_CALL channelSplit(const AnalysisSplit& input, hkReal* channelData);
  144. struct AnalysisCompose
  145. {
  146. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTrackAnalysis::AnalysisCompose );
  147. hkUint32 m_numberOfTransformTracks;
  148. hkUint32 m_numberOfFloatTracks;
  149. const hkUint16* m_staticMaskTransform;
  150. const hkUint16* m_staticMaskFloat;
  151. const hkReal* m_staticDOFsTransform;
  152. const hkReal* m_staticDOFsFloat;
  153. const hkReal* m_dynamicDOFsTransform;
  154. const hkReal* m_dynamicDOFsFloat;
  155. };
  156. static void HK_CALL recompose(const AnalysisCompose& input, hkQsTransform* outputPose, hkReal* outputFloatTracks);
  157. private:
  158. /// This method computes the *qstransform only* statistics in the AnalysisStats struct for a given static mask, 
  159. static void HK_CALL calcStatsQsTransform(const hkUint16* staticMask, hkUint32 numTracks, AnalysisStats& out);
  160. /// This method computes information for the *qstransform only* dynamic tracks
  161. static void HK_CALL calcDynamicStatsQsTransform(const hkUint16* staticMask, hkUint32 numTracks, AnalysisStats& out);
  162. /// This version of the analysis function takes per-track settings, for *qstransform only* tracks.
  163. static void HK_CALL analyzeQsTransform( const PerTransformTrackAnalysisInput& input, hkUint16* staticMask, hkReal* staticDOFs, hkBool displayStatsReport = true);
  164. };
  165. #endif // HK_TRACK_ANALYSIS_H
  166. /*
  167. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  168. * Confidential Information of Havok.  (C) Copyright 1999-2009
  169. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  170. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  171. * rights, and intellectual property rights in the Havok software remain in
  172. * Havok and/or its suppliers.
  173. * Use of this software for evaluation purposes is subject to and indicates
  174. * acceptance of the End User licence Agreement for this product. A copy of
  175. * the license is included with this software and is also available at www.havok.com/tryhavok.
  176. */