hkaAnimation.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 HKANIMATION_ANIMATION_HKSKELETALANIMATION_XML_H
  9. #define HKANIMATION_ANIMATION_HKSKELETALANIMATION_XML_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Animation/Animation/Animation/hkaAnnotationTrack.h>
  12. #include <Animation/Animation/Motion/hkaAnimatedReferenceFrame.h>
  13. class hkaChunkCache;
  14. /// hkaAnimation meta information
  15. extern const class hkClass hkaAnimationClass;
  16. /// The base class for animation storage.
  17. /// All skeletal animation have a finite period specified in seconds.
  18. /// The interface implies that each implementation can be sampled continuously over the period.
  19. class hkaAnimation : public hkReferencedObject
  20. {
  21. public:
  22. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_UNCOMPRESSED );
  23. HK_DECLARE_REFLECTION();
  24. /// Default constructor
  25. inline hkaAnimation();
  26. /// Type information 
  27. enum AnimationType {
  28. ///
  29. HK_UNKNOWN_ANIMATION = 0,
  30. /// Interleaved
  31. HK_INTERLEAVED_ANIMATION,
  32. /// Delta compressed
  33. HK_DELTA_COMPRESSED_ANIMATION,
  34. /// Wavelet compressed
  35. HK_WAVELET_COMPRESSED_ANIMATION,
  36. /// Mirrored
  37. HK_MIRRORED_ANIMATION,
  38. /// Spline
  39. HK_SPLINE_COMPRESSED_ANIMATION
  40. };
  41. /// Get AnimationType.
  42. HK_FORCE_INLINE hkaAnimation::AnimationType getType() const;
  43. /// Get the pose at a given time
  44. virtual void sampleTracks(hkReal time, hkQsTransform* transformTracksOut, hkReal* floatTracksOut, hkaChunkCache* cache) const = 0;
  45. /// Get a subset of the the first 'maxNumTracks' transform tracks (all tracks from 0 to maxNumTracks-1 inclusive), and the first 'maxNumFloatTracks' float tracks of a pose at a given time.
  46. virtual void samplePartialTracks(hkReal time,
  47.  hkUint32 maxNumTransformTracks, hkQsTransform* transformTracksOut,
  48.  hkUint32 maxNumFloatTracks, hkReal* floatTracksOut,
  49.  hkaChunkCache* cache) const;
  50. /// Clear the cache of all keys associated with this animation - use to 'unload' an animation from the cache
  51. virtual void clearAllCacheKeys(hkaChunkCache* cache) const;
  52. /// Sample a single animation track.
  53. inline void sampleSingleTransformTrack( hkReal time, hkInt16 track, hkQsTransform* transformOut ) const;
  54. /// Sample a single floating track.
  55. inline void sampleSingleFloatTrack( hkReal time, hkInt16 track, hkReal* out ) const;
  56. /// Sample individual animation tracks.
  57. virtual void sampleIndividualTransformTracks( hkReal time, const hkInt16* tracks, hkUint32 numTracks, hkQsTransform* transformOut ) const = 0;
  58. /// Sample a individual floating tracks.
  59. virtual void sampleIndividualFloatTracks( hkReal time, const hkInt16* tracks, hkUint32 numTracks, hkReal* out ) const = 0;
  60. /// Returns the number of original samples / frames of animation.
  61. virtual int getNumOriginalFrames() const = 0;
  62. /*
  63. * Block decompression
  64. */
  65. // INTERNAL
  66. struct DataChunk
  67. {
  68. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_ANIM_RUNTIME, DataChunk);
  69. const void* m_data;
  70. hkUint32 m_size;
  71. hkUint8     m_offset; // the amount we need to add to the data to bring it to the "real" data
  72. DataChunk() : m_data(HK_NULL), m_size(0), m_offset(0) {} // Only exisits on PPU for error checking
  73. inline void setDataChunkWith16ByteAlignmentCorrection(const void* dataPtrIn, int numBytes)
  74. {
  75. hkUlong actualStart = (hkUlong) dataPtrIn;
  76. m_offset = hkUint8(actualStart & 0xF);
  77. actualStart &= 0xFFFFFFF0;
  78. m_data = (const void*) actualStart;
  79. m_size = numBytes;
  80. m_size += m_offset;
  81. m_size = HK_NEXT_MULTIPLE_OF(16, m_size);
  82. }
  83. inline void init()
  84. {
  85. m_data = HK_NULL;
  86. m_size = 0;
  87. m_offset = 0;
  88. }
  89. };
  90. /// Return the number of chunks of data required to sample a pose at time t
  91. virtual int getNumDataChunks(hkReal time) const;
  92. /// Return the chunks of data required to sample a pose at time t
  93. virtual void getDataChunks(hkReal time, DataChunk* dataChunks, int m_numDataChunks) const;
  94. /// Return the maximum total size of all combined chunk data which could be returned by getDataChunks for this animation.
  95. virtual int getMaxSizeOfCombinedDataChunks() const;
  96. /// Returns the motion stored (previously extracted from the animation) at time t.
  97. /// This motion represents the absolute offset from the start of the animation.
  98. virtual void getExtractedMotionReferenceFrame(hkReal time, hkQsTransform& motionOut) const;
  99. /// Returns the change in reference frame between two times for extracted motion.
  100. virtual void getExtractedMotionDeltaReferenceFrame( hkReal time, hkReal nextTime, int loops, hkQsTransform& deltaMotionOut ) const;
  101. /// Test for presence of extracted motion
  102. hkBool hasExtractedMotion() const;
  103. /// Set the extracted motion of this animation
  104. void setExtractedMotion( const hkaAnimatedReferenceFrame* extractedMotion );
  105. /// Get the frame/sample index and delta between frames. So 0 <= frameOut < getNumOriginalFrames() and 0 <= delta < 1.0
  106. inline void getFrameAndDelta(hkReal time, hkUint32& frameOut, hkReal& deltaOut) const;
  107. /*
  108.  * Annotation support
  109.  */
  110. /// A structure to hold annotation results
  111. /// The ID is remaped from an animation track ID to a skelton bone ID
  112. /// This class MUST have the same declaration as hkaAnimatedSkeleton::BoneAnnotation
  113. struct TrackAnnotation
  114. {
  115. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaAnimation::TrackAnnotation );
  116. /// The bone which is annotated
  117. hkUint16 m_trackID;
  118. /// Annotation data
  119. hkaAnnotationTrack::Annotation m_annotation;
  120. };
  121. /// Get the number of annotations for which: startTime <= annotation < startTime + deltaTime
  122. /// Useful for allocating correctly-sized output arrays (see getAnnotations)
  123. virtual hkUint32 getNumAnnotations( hkReal startTime, hkReal deltaTime ) const;
  124. /// Get all annotations for which: startTime <= annotation < startTime + deltaTime
  125. /// param annotations Output array.  Must be pre-allocated to at least maxAnnotations in size, (see getNumAnnotations)
  126. /// param maxAnnotations maximum number of annotations to find
  127. /// return The number of annoatations found
  128. virtual hkUint32 getAnnotations( hkReal startTime, hkReal deltaTime, TrackAnnotation* annotationsOut, hkUint32 maxAnnotations = HK_INT32_MAX ) const;
  129. protected:
  130. /// AnimationType.
  131. hkEnum<hkaAnimation::AnimationType, hkInt32> m_type;
  132. public:
  133. /// The length of the animation cycle in seconds
  134. hkReal m_duration;
  135. /// The number of bone tracks to be animated.
  136. int m_numberOfTransformTracks;
  137. /// The number of float tracks to be animated
  138. int m_numberOfFloatTracks;
  139. protected:
  140. /// An hkaAnimatedReferenceFrame instance containing extracted motion.
  141. const hkaAnimatedReferenceFrame* m_extractedMotion;
  142. public:
  143. /// The animation tracks associated with this skeletal animation.
  144. hkaAnnotationTrack** m_annotationTracks;
  145. /// Size of m_annotationTracks array.
  146. hkInt32 m_numAnnotationTracks;
  147. // Constructor for initialisation of vtable fixup
  148. HK_FORCE_INLINE hkaAnimation( hkFinishLoadedObjectFlag flag ) : hkReferencedObject(flag) {}
  149. };
  150. #include <Animation/Animation/Animation/hkaAnimation.inl>
  151. #endif // HKANIMATION_ANIMATION_HKSKELETALANIMATION_XML_H
  152. /*
  153. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  154. * Confidential Information of Havok.  (C) Copyright 1999-2009
  155. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  156. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  157. * rights, and intellectual property rights in the Havok software remain in
  158. * Havok and/or its suppliers.
  159. * Use of this software for evaluation purposes is subject to and indicates
  160. * acceptance of the End User licence Agreement for this product. A copy of
  161. * the license is included with this software and is also available at www.havok.com/tryhavok.
  162. */