hkaSplineCompressedAnimation.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 HKANIMATION_ANIMATION_SPLINE_HKSPLINEANIMATION_XML_H
  9. #define HKANIMATION_ANIMATION_SPLINE_HKSPLINEANIMATION_XML_H
  10. #include <Animation/Animation/Animation/hkaAnimation.h>
  11. #include <Animation/Animation/Animation/Interleaved/hkaInterleavedUncompressedAnimation.h>
  12. #include <Animation/Internal/Compression/hkaCompression.h>
  13. #include <Common/Base/Container/Array/hkObjectArray.h>
  14. /// hkaSplineCompressedAnimation meta information
  15. extern const class hkClass hkaSplineCompressedAnimationClass;
  16. /// Compresses animation data using a spline approximation.
  17. /// See Animation Compression section of the Userguide for details.
  18. class hkaSplineCompressedAnimation : public hkaAnimation
  19. {
  20. public:
  21. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_COMPRESSED );
  22. HK_DECLARE_REFLECTION();
  23. static const int MAX_DEGREE = 3;
  24. static const int MAX_ORDER = MAX_DEGREE + 1;
  25. /// Compression settings for a single animation track
  26. struct TrackCompressionParams
  27. {
  28. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_COMPRESSED, hkaSplineCompressedAnimation::TrackCompressionParams );
  29. HK_DECLARE_REFLECTION();
  30. // Quantization enum declarations
  31. enum RotationQuantization
  32. {
  33. POLAR32 = 0, ///
  34. THREECOMP40 = 1, ///
  35. THREECOMP48 = 2, ///
  36. THREECOMP24 = 3, ///
  37. STRAIGHT16 = 4, ///
  38. UNCOMPRESSED = 5 ///
  39. }; ///
  40. enum ScalarQuantization
  41. {
  42. BITS8 = 0, ///
  43. BITS16 = 1 ///
  44. }; ///
  45. // Spline approximation (compression) settings
  46. hkReal m_rotationTolerance; ///
  47. hkReal m_translationTolerance; ///
  48. hkReal m_scaleTolerance; ///
  49. hkReal m_floatingTolerance; ///
  50. hkUint16 m_rotationDegree; ///
  51. hkUint16 m_translationDegree; ///
  52. hkUint16 m_scaleDegree; ///
  53. hkUint16 m_floatingDegree; ///
  54. // Quantization settings
  55. hkEnum< RotationQuantization, hkUint8 > m_rotationQuantizationType; ///
  56. hkEnum< ScalarQuantization, hkUint8 > m_translationQuantizationType; ///
  57. hkEnum< ScalarQuantization, hkUint8 > m_scaleQuantizationType; ///
  58. hkEnum< ScalarQuantization, hkUint8 > m_floatQuantizationType; ///
  59. static hkBool validQuantization( RotationQuantization ); ///
  60. static hkBool validQuantization( ScalarQuantization ); ///
  61. // Validity test
  62. hkBool isOk() const;
  63. // Approximate quantization accuracy
  64. static hkReal HK_CALL approximateQuantizationAccuracy( RotationQuantization );
  65. static hkReal HK_CALL approximateQuantizationAccuracy( ScalarQuantization );
  66. // Constructor
  67. TrackCompressionParams(); ///
  68. };
  69. struct AnimationCompressionParams
  70. {
  71. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_COMPRESSED, hkaSplineCompressedAnimation::AnimationCompressionParams );
  72. HK_DECLARE_REFLECTION();
  73. // Per-animation settings
  74. hkUint16 m_maxFramesPerBlock; ///
  75. hkBool m_enableSampleSingleTracks; ///
  76. // Constructor
  77. AnimationCompressionParams(); ///
  78. };
  79. /// This structure is used when specifying per track compression settings
  80. struct PerTrackCompressionParams
  81. {
  82. /// List of CompressionParams to enable per-bone compression settings
  83. /// On initialisation only a single element is allocated. 
  84. hkArray< struct hkaSplineCompressedAnimation::TrackCompressionParams > m_parameterPalette; ///
  85. /// An array of indices into the palette above 
  86. hkArray<int> m_trackIndexToPaletteIndex; ///
  87. hkArray<int> m_floatTrackIndexToPaletteIndex; ///
  88. /// Validity check
  89. hkBool isOk() const;
  90. };
  91. /// Constructor with uniform compression settins for each track
  92. hkaSplineCompressedAnimation(
  93. const hkaInterleavedUncompressedAnimation& raw,
  94. const TrackCompressionParams& trackParams,
  95. const AnimationCompressionParams& animationParams );
  96. /// Constructor allowing different compression settings for each track
  97. hkaSplineCompressedAnimation(
  98. const hkaInterleavedUncompressedAnimation& raw,
  99. const PerTrackCompressionParams& trackParams,
  100. const AnimationCompressionParams& animationParams );
  101. /// Get the tracks at a given time
  102. /// Note: If you are calling this method directly you may find some quantization error present in the rotations.
  103. /// The blending done in hkaAnimatedSkeleton is not sensitive to rotation error so rather than renormalize here
  104. /// we defer it until blending has been completed. If you are using this method directly you may want to call 
  105. /// hkaSkeletonUtils::normalizeRotations() on the results.
  106. virtual void sampleTracks(hkReal time, hkQsTransform* transformTracksOut, hkReal* floatTracksOut, hkaChunkCache* cache) const;
  107. /// Get a subset of the the first 'maxNumTracks' tracks of a pose at a given time (all tracks from 0 to maxNumTracks-1 inclusive).
  108. virtual void samplePartialTracks(hkReal time,
  109.  hkUint32 maxNumTransformTracks, hkQsTransform* transformTracksOut,
  110.  hkUint32 maxNumFloatTracks, hkReal* floatTracksOut,
  111.  hkaChunkCache* cache) const;
  112. /// Sample a individual animation tracks
  113. virtual void sampleIndividualTransformTracks( hkReal time, const hkInt16* tracks, hkUint32 numTracks, hkQsTransform* transformOut ) const;
  114. /// Sample a individual floating tracks
  115. virtual void sampleIndividualFloatTracks( hkReal time, const hkInt16* tracks, hkUint32 numTracks, hkReal* out ) const;
  116. /// Returns the number of original samples / frames of animation
  117. virtual int getNumOriginalFrames() const;
  118. /// Return the number of chunks of data required to sample a pose at time t
  119. virtual int getNumDataChunks(hkReal time) const;
  120. /// Return the chunks of data required to sample a pose at time t
  121. virtual void getDataChunks(hkReal time, DataChunk* dataChunks, int m_numDataChunks) const;
  122. /// Return the maximum total size of all combined chunk data which could be returned by getDataChunks for this animation.
  123. virtual int getMaxSizeOfCombinedDataChunks() const;
  124. /// Get a subset of the tracks a given time using data chunks. Sample is calculated using pose[frameIndex] * (1 - frameDelta) + pose[frameIndex+1] * frameDelta.
  125. static void HK_CALL samplePartialWithDataChunks(hkUint32 frameIndex, hkReal frameDelta, 
  126. hkUint32 maxNumTransformTracks, hkQsTransform* transformTracksOut,
  127. hkUint32 maxNumFloatTracks, hkReal* floatTracksOut,
  128. const DataChunk* dataChunks, int numDataChunks);
  129. public:
  130. /// Gets the total size in bytes of the spline compressed animation.
  131. int getSizeInBytes() const;
  132. public:
  133. // Constructor for initialisation of vtable fixup
  134. HK_FORCE_INLINE hkaSplineCompressedAnimation( hkFinishLoadedObjectFlag flag ) :
  135. hkaAnimation( flag ),
  136. m_blockOffsets( flag ),
  137. m_floatBlockOffsets( flag ),
  138. m_transformOffsets( flag ),
  139. m_floatOffsets( flag ),
  140. m_data( flag )
  141. {
  142. if ( flag.m_finishing ) handleEndian();
  143. }
  144. ~hkaSplineCompressedAnimation();
  145. private:
  146. // Sampling
  147. void sampleRotation( hkReal time, hkUint8 quantizedTime, hkUint8 mask, TrackCompressionParams::RotationQuantization type, const hkUint8*& dataInOut, hkQuaternion& out ) const;
  148. void sampleTranslation( hkReal time, hkUint8 quantizedTime, hkUint8 mask, TrackCompressionParams::ScalarQuantization type, const hkUint8*& dataInOut, hkVector4& out ) const;
  149. void sampleScale( hkReal time, hkUint8 quantizedTime, hkUint8 mask, TrackCompressionParams::ScalarQuantization type, const hkUint8*& dataInOut, hkVector4& out ) const;
  150. void sampleFloat( hkReal time, hkUint8 quantizedTime, hkUint8 mask, TrackCompressionParams::ScalarQuantization type, const hkUint8*& dataInOut, hkReal& out ) const;
  151. // Generic data I/O
  152. static void write8( hkUint8, hkArray< hkUint8 > & );
  153. static void write16( hkUint16, hkArray< hkUint8 > & );
  154. static void writeReal( hkReal, hkArray< hkUint8 > & );
  155. static void writeZeros( int, hkArray< hkUint8 > & );
  156. static void writeAlign( int, hkArray< hkUint8 > & );
  157. static void writeAlignQuaternion( TrackCompressionParams::RotationQuantization type, hkArray< hkUint8 > & );
  158. inline static hkUint8 read8( const hkUint8*& dataInOut );
  159. inline static hkUint16 read16( const hkUint8*& dataInOut );
  160. inline static hkReal readReal( const hkUint8*& dataInOut );
  161. inline static void readAlign( int, const hkUint8*& dataInOut );
  162. inline static void readAlignQuaternion( TrackCompressionParams::RotationQuantization type, const hkUint8*& dataInOut );
  163. inline static int bytesPerComponent( TrackCompressionParams::ScalarQuantization type );
  164. inline static int bytesPerQuaternion( TrackCompressionParams::RotationQuantization type );
  165. // NURBS Specific I/O
  166. void writeKnots( int n, int p, const hkArray< hkReal >& U );
  167. void writeRotation( hkUint8 mask, TrackCompressionParams::RotationQuantization type, const hkVector4& mean, int n, const hkArray< hkVector4 >& P );
  168. void writePoints( hkUint8 mask, TrackCompressionParams::ScalarQuantization type, const hkVector4& mean, const hkVector4& minp, const hkVector4& maxp, int n, hkArray< hkVector4 >& P );
  169. static void readNURBSCurve( const hkUint8*& dataInOut, hkUint8 quantizedTime, hkReal frameDuration, hkReal u, hkUint8 mask, TrackCompressionParams::ScalarQuantization scalarQuantizationType, hkVector4& I, hkVector4& out );
  170. static void readNURBSQuaternion( const hkUint8*& dataInOut, hkUint8 quantizedTime, hkReal frameDuration, hkReal u, hkUint8 mask, TrackCompressionParams::RotationQuantization type, hkQuaternion& out );
  171. static int readKnots( const hkUint8*& dataInOut, int& n, int& p, hkUint8 quantizedTime, hkReal frameDuration, hkReal U[ MAX_DEGREE * 2 ] );
  172. static void readPackedQuaternions( const hkUint8*& dataInOut, TrackCompressionParams::RotationQuantization type, int n, int p, int span, hkVector4 P[ MAX_ORDER ] );
  173. // NURBS Evaluation
  174. inline static int findSpan( int n, int p, hkUint8 u, const hkUint8* U );
  175. inline static void evaluate( hkReal time, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4 & );
  176. static void evaluateSimple( hkReal time, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4 & );
  177. #if !defined(HK_PLATFORM_SIM)
  178. static void evaluateSIMD( hkReal time, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4 & );
  179. #endif
  180. static void evaluateLinear( hkReal time, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4 & );
  181. inline void getBlockAndTime( hkReal time, int& blockOut, hkReal& blockTimeOut, hkUint8& quantizedTimeOut ) const;
  182. // Initialization
  183. void initialize( const hkaInterleavedUncompressedAnimation& raw, const PerTrackCompressionParams& trackParams, const AnimationCompressionParams& animationParams );
  184. static void deinterleaveTransform( const hkQsTransform* xform, int numTrack, int numFrames, int offset, int track, hkArray< hkVector4 >& tOut,  hkArray< hkVector4 >& qOut,  hkArray< hkVector4 >& sOut );
  185. static void deinterleaveFloat( const hkReal* data, int numTrack, int numFrames, int offset, int track, hkArray< hkVector4 >& out );
  186. // Packing, quantization and endian handling
  187. static hkUint8 packQuantizationTypes( TrackCompressionParams::ScalarQuantization position, TrackCompressionParams::RotationQuantization rotation, TrackCompressionParams::ScalarQuantization scale );
  188. inline static void unpackQuantizationTypes( hkUint8 packedQuatizationTypes, TrackCompressionParams::ScalarQuantization& translationQuantization, TrackCompressionParams::RotationQuantization& rotationQuantization, TrackCompressionParams::ScalarQuantization& scaleQuantization );
  189. static hkUint8 packMaskAndQuantizationType( hkUint8 mask, TrackCompressionParams::ScalarQuantization floatQuatization );
  190. inline static void unpackMaskAndQuantizationType( hkUint8 packedMaskAndQuatizationType, hkUint8& mask, TrackCompressionParams::ScalarQuantization& floatQuantization );
  191. static hkUint8 pack8( hkReal minp, hkReal maxp, hkReal val );
  192. inline static hkReal unpack8( hkReal minp, hkReal maxp, hkUint8 val );
  193. static hkUint16 pack16( hkReal minp, hkReal maxp, hkReal val );
  194. inline static hkReal unpack16( hkReal minp, hkReal maxp, hkUint16 val );
  195. static void packQuaternion( TrackCompressionParams::RotationQuantization type, const hkQuaternion* in, hkUint8* out );
  196. inline static void unpackQuaternion( TrackCompressionParams::RotationQuantization type, const hkUint8* in, hkQuaternion* out );
  197. static void handleEndianQuaternion( TrackCompressionParams::RotationQuantization type, hkUint8* dataInOut );
  198. static hkUint8 isStatic( const hkVector4& mean, const hkVector4& minp, const hkVector4& maxp, hkReal tol, const hkVector4& I );
  199. static hkVector4 getMean( const hkArray< hkVector4 >& P );
  200. static hkVector4 getMin( const hkArray< hkVector4 >& P );
  201. static hkVector4 getMax( const hkArray< hkVector4 >& P );
  202. inline static void recompose( hkUint8 mask, const hkVector4& S, const hkVector4& I, hkVector4& out );
  203. void handleEndian();
  204. static void reverseEndian( int bytes, hkUint8*& dataInOut );
  205. static void handleEndianScalar( hkUint8 mask, TrackCompressionParams::ScalarQuantization type, hkUint8*& dataInOut );
  206. static void handleEndianRotation( hkUint8 mask, TrackCompressionParams::RotationQuantization type, hkUint8*& dataInOut );
  207. static int  handleEndianKnots( hkUint8 mask, hkUint8*& dataInOut );
  208. static void handleEndianScalarControlPoints( hkUint8 mask, int n, TrackCompressionParams::ScalarQuantization type, hkUint8*& dataInOut );
  209. static void handleEndianRotationControlPoints( hkUint8 mask, int n, TrackCompressionParams::RotationQuantization type, hkUint8*& dataInOut );
  210. // Utility
  211. static void Linspace( int m, hkArray< hkReal >& ub, hkReal a, hkReal b );
  212. // Member variables
  213. // Full animation data
  214. int m_numFrames;
  215. // Block info
  216. int m_numBlocks;
  217. int m_maxFramesPerBlock;
  218. int m_maskAndQuantizationSize;
  219. hkReal m_blockDuration;
  220. hkReal m_blockInverseDuration;
  221. hkReal m_frameDuration;
  222. // Data buffers
  223. hkArray< hkUint32 > m_blockOffsets; /// Offset to data for block i, stream relative
  224. hkArray< hkUint32 > m_floatBlockOffsets; /// Offset to the first byte of float data for block i, block relative
  225. hkArray< hkUint32 > m_transformOffsets; /// Offset to transform data for track i, block relative, and in multiples of 4 bytes
  226. hkArray< hkUint32 > m_floatOffsets; /// Offset to float data for track i, block relative, and in multiples of 4 bytes
  227. hkArray< hkUint8 > m_data;
  228. // Endian
  229. int m_endian;
  230. };
  231. #include <Animation/Animation/Animation/SplineCompressed/hkaSplineCompressedAnimation.inl>
  232. #endif // HKANIMATION_ANIMATION_SPLINE_HKSPLINEANIMATION_XML_H
  233. /*
  234. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  235. * Confidential Information of Havok.  (C) Copyright 1999-2009
  236. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  237. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  238. * rights, and intellectual property rights in the Havok software remain in
  239. * Havok and/or its suppliers.
  240. * Use of this software for evaluation purposes is subject to and indicates
  241. * acceptance of the End User licence Agreement for this product. A copy of
  242. * the license is included with this software and is also available at www.havok.com/tryhavok.
  243. */