hkaAnimationJobs.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_ANIMATION_JOBS_H
  9. #define HK_ANIMATION_JOBS_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Thread/Semaphore/hkSemaphoreBusyWait.h>
  12. #include <Common/Base/Thread/JobQueue/hkJobQueue.h>
  13. #include <Animation/Animation/Animation/hkaAnimationBinding.h>
  14. #include <Animation/Animation/Animation/hkaAnimation.h>
  15. class hkaAnimatedSkeleton;
  16. /// The base class for all animation jobs
  17. // CONSERVATIVE 70k max space for animation buffer. 
  18. // Use either:
  19. // hkaAnimation::getMaxSizeOfCombinedDataChunks() for sample-only jobs , or
  20. // hkaMultithreadedAnimationUtils::getMaxSizeRequiredForSampleAndCombineJobBuffer() and
  21. // getConservativeMaxSizeRequiredForSampleAndCombineJobBuffer() for sample-and-combine jobs
  22. // to get a better estimate of how large this actually needs to be.
  23. const int DEFAULT_MAX_COMPRESSED_ANIM_DATA = 70 * 1024 ; 
  24. const int HK_MAX_NUM_DATA_CHUNKS = 10;
  25. /// Base class for all 'animation' jobs.
  26. class hkaAnimationJob : public hkJob
  27. {
  28. public:
  29. /// Types enum.
  30. enum JobSubType
  31. {
  32. /// Sample only (no blending)
  33. ANIMATION_JOB_SAMPLE_ANIMATION,
  34. /// Sample and combine (blending)
  35. ANIMATION_JOB_SAMPLE_AND_COMBINE,
  36. //
  37. ANIMATION_JOB_END // just a marker marking the end of the animation job id range
  38. };
  39. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaAnimationJob );
  40. protected:
  41. HK_FORCE_INLINE hkaAnimationJob( JobSubType type, hkUint16 size );
  42. public:
  43. /// The buffer allowable/available for decompressing data. You can use getMaxSizeOfCombinedDataChunks() to ensure this is large enough.
  44. hkUint32 m_bufferSize;      
  45. };
  46. /// A job which samples a set of animations - See AnimationAnimationPlaybackMultithreadedhkaAnimationJobs.h for details.
  47. /// If more than one animation is specified then DMA cost is hidden through double buffering.
  48. class hkaSampleAnimationJob : public hkaAnimationJob
  49. {
  50. public:
  51. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaSampleAnimationJob);
  52. HK_FORCE_INLINE hkaSampleAnimationJob();
  53. HK_FORCE_INLINE ~hkaSampleAnimationJob() {}
  54. inline hkBool isValid() const; // Only exists on PPU for error checking
  55. /// Helper structure for data needed to sample a single animation
  56. struct AnimationData
  57. {
  58. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaSampleAnimationJob::AnimationData);
  59. /// Constructor.
  60. HK_FORCE_INLINE AnimationData();        // Only exists on PPU for error checking
  61. HK_FORCE_INLINE ~AnimationData() {}
  62. /// Init all members.
  63. HK_FORCE_INLINE void init();
  64. /// Test if all members are valid (alignment, size etc.).
  65. inline hkBool isValid() const;  // Only exists on PPU for error checking
  66. /* Sample inputs */
  67. /// The frame number such that local time for the sample is between m_frameIndex and m_frameIndex+1.
  68. HK_ALIGN16(hkUint32 m_frameIndex);
  69. /// The delta between frames, in range [0,1). You can use getFrameAndDelta() to calculate this and m_frameIndex for a given time.
  70. hkReal m_frameDelta;
  71. /// The highest transfrom track to sample to - used for LOD sampling.
  72. hkUint32 m_maxTransformTrack;
  73. /// The highest floattrack to sample to - used for LOD sampling.
  74. hkUint32 m_maxFloatTrack;
  75. /* Animation Data */
  76. /// Pointer to original animated skeleton - used only in shared memory architectures, otherwise ignored.
  77. const hkaAnimation* m_animationOnCPU;
  78. /// The type of animation data stored in the chunks
  79. hkaAnimation::AnimationType m_animationType;  
  80. /// The static animation data required to sample at 'localTime', given by m_frameIndex and m_frameDelta.
  81. hkaAnimation::DataChunk m_chunks[HK_MAX_NUM_DATA_CHUNKS]; 
  82. /// The number of chunks that contain valid data.
  83. int m_numValidChunks;
  84. /* Output Data */
  85. /// The transfrom/bone results are placed in this buffer in main memory.
  86. hkQsTransform* m_poseOut;
  87. /// The float results are placed in this buffer in main memory.
  88. hkReal* m_floatSlotsOut;
  89. };
  90. /* Animation Data */
  91. /// The array of animations to sample.
  92. AnimationData* m_animData;
  93. /// The number of animations to sample.
  94. int m_numAnims;
  95. /// Optional cache - used only in shared memory architectures, otherwise ignored.
  96. hkaChunkCache* m_cache;
  97. /// This semaphore is released when the work is finished.
  98. /// Can be set to HK_NULL if you don't need to wait on a specific job
  99. hkSemaphoreBusyWait* m_jobDoneSemaphore;
  100. /// This flag is incremented when the work is finished.
  101. /// Can be set to HK_NULL if you don't need to wait on a specific job
  102. hkUint32* m_jobDoneFlag;
  103. };
  104. /// A job which does all the decompression and blending for an animated skeleton - See AnimationAnimationPlaybackMultithreadedhkaAnimationJobs.h for details.
  105. class hkaAnimationSampleAndCombineJob : public hkaAnimationJob
  106. {
  107. public:
  108. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaAnimationSampleAndCombineJob);
  109. HK_FORCE_INLINE hkaAnimationSampleAndCombineJob();
  110. HK_FORCE_INLINE ~hkaAnimationSampleAndCombineJob() {}
  111. inline hkBool isValid() const;
  112. public:
  113. /// Helper structure for data needed to sample and blend a single animation control.
  114. struct ControlData
  115. {
  116. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaAnimationSampleAndCombineJob::ControlData);
  117. HK_FORCE_INLINE ControlData(); // Only exists on PPU for error checking
  118. HK_FORCE_INLINE ~ControlData() {}
  119. HK_FORCE_INLINE void init();
  120. inline hkBool isValid() const; // Only exists on PPU for error checking
  121. /// The frame number such that local time for the sample is between m_frameIndex and m_frameIndex+1.
  122. HK_ALIGN16(hkUint32 m_frameIndex);
  123. /// The delta between frames, in range [0,1). You can use getFrameAndDelta() to calculate this and m_frameIndex for a given time.
  124. hkReal m_frameDelta;
  125. /// The master weight for blending this animation.
  126. hkReal m_weight;
  127. /// The binding for this animation.
  128. hkaAnimationBinding m_binding;
  129. /// The type of animation data stored in the chunks.
  130. hkaAnimation::AnimationType m_animationType;
  131.  /// The animation data required to sample at 'localTime', given by m_frameIndex and m_frameDelta
  132. hkaAnimation::DataChunk m_chunks[HK_MAX_NUM_DATA_CHUNKS];
  133. /// The number of chunks that contain valid data.
  134. hkInt32 m_numValidChunks;
  135. /// The per track weights for this control.
  136. const hkUint8* m_transformTrackWeights;
  137. /// Set to 0 if no per track weight are required.
  138. hkInt32 m_numTransformTrackWeights;
  139. /// The per track weights for this control
  140. const hkUint8* m_floatTrackWeights;  
  141. /// Set to 0 if no per track weight are required.
  142. hkInt32 m_numFloatTrackWeights; 
  143. };
  144. /* Sample inputs */
  145. /// Pointer to original animated skeleton - used only in shared memory architectures, otherwise ignored.
  146. const hkaAnimatedSkeleton* m_animatedSkeletonOnCPU;
  147. /// Point to the reference pose or HK_NULL for no filling.
  148. class hkQsTransform* m_referencePose;
  149. /// The fill threshold (see hkaAnimatedSkeleton).
  150. hkReal m_referencePoseWeightThreshold;
  151. /// The total number of bones in the output skeleton - used only if local-to-model space conversion is required.
  152. hkUint32 m_numSkeletonBones;
  153. /// The parent indices array - used only if local-to-model space conversion is required.
  154. const hkInt16* m_parentIndices;
  155. /// The highest number of bones to sample.
  156. hkUint32 m_maxBone;
  157. /// The highest number of float slots to sample.
  158. hkUint32 m_maxFloatSlot;
  159. /* Animation Control Data */
  160. /// Note: The control data here is expected to be ordered by blend hint. Normal blending comes first followed by additive.
  161. ControlData* m_animationControls;
  162. /// Number of controls.
  163. hkUint32 m_numAnimationControls;
  164. /// Required to aid reserving of stack space for track sample data.
  165. hkUint16 m_maxTransformTracksInAllAnimations;
  166. /// Required to aid reserving of stack space for track sample data.
  167. hkUint16 m_maxFloatTracksInAllAnimations; 
  168. /// Optional cache - used only in shared memory architectures, otherwise ignored.
  169. hkaChunkCache* m_cache;
  170. /* Output Data */
  171. /// The transform/bone results are placed in this buffer in main memory. If m_parentIndices == HK_NULL, these are in local space, otherwise they are in model space.
  172. hkQsTransform* m_poseOut;
  173. /// The float results are placed in this buffer in main memory.
  174. hkReal* m_floatSlotsOut;
  175. /// This semaphore is released when the work is finished.
  176. /// Can be set to HK_NULL if you don't need to wait on a specific job
  177. hkSemaphoreBusyWait* m_jobDoneSemaphore;
  178. /// This flag is incremented when the work is finished.
  179. /// Can be set to HK_NULL if you don't need to wait on a specific job
  180. hkUint32* m_jobDoneFlag;
  181. };
  182. #include <Animation/Animation/Playback/Multithreaded/hkaAnimationJobs.inl>
  183. #endif // HK_ANIMATION_JOBS_H
  184. /*
  185. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  186. * Confidential Information of Havok.  (C) Copyright 1999-2009
  187. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  188. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  189. * rights, and intellectual property rights in the Havok software remain in
  190. * Havok and/or its suppliers.
  191. * Use of this software for evaluation purposes is subject to and indicates
  192. * acceptance of the End User licence Agreement for this product. A copy of
  193. * the license is included with this software and is also available at www.havok.com/tryhavok.
  194. */