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

其他游戏

开发平台:

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. static hkBool testValidForDMA( char* name, const void* srcInMainMemory, int size)
  9. {
  10. if(size == 0)
  11. {
  12. return true;
  13. }
  14. return true;
  15. }
  16. hkaAnimationJob::hkaAnimationJob( hkaAnimationJob::JobSubType subType, hkUint16 size )
  17. : hkJob(HK_JOB_TYPE_ANIMATION, subType, size), m_bufferSize(DEFAULT_MAX_COMPRESSED_ANIM_DATA)
  18. {
  19. }
  20. hkBool hkaSampleAnimationJob::isValid() const
  21. {
  22. hkBool valid = true;
  23. for(int i = 0; i < m_numAnims; i++)
  24. {
  25. valid = valid & m_animData[i].isValid();
  26. if(!valid) return false;
  27. }
  28. return true;
  29. }
  30. hkaAnimationSampleAndCombineJob::hkaAnimationSampleAndCombineJob() : hkaAnimationJob(ANIMATION_JOB_SAMPLE_AND_COMBINE, sizeof(hkaAnimationSampleAndCombineJob))
  31. {
  32. m_animatedSkeletonOnCPU = HK_NULL;
  33. m_animationControls = HK_NULL;
  34. m_referencePose = HK_NULL;
  35. m_referencePoseWeightThreshold = 0.0f;
  36. m_numSkeletonBones = 0;
  37. m_parentIndices = HK_NULL;
  38. m_maxBone = 0;
  39. m_maxFloatSlot = 0;
  40. m_numAnimationControls = 0;
  41. m_maxTransformTracksInAllAnimations = 0;
  42. m_maxFloatTracksInAllAnimations = 0;
  43. m_cache = HK_NULL;
  44. m_poseOut = HK_NULL;
  45. m_jobDoneSemaphore= HK_NULL;
  46. m_jobDoneFlag = 0;
  47. }
  48. hkBool hkaAnimationSampleAndCombineJob::isValid() const
  49. {
  50. hkBool valid = true;
  51. // DMA: SC0
  52. if((m_referencePose) && (m_referencePoseWeightThreshold > 0.0f))
  53. {
  54. valid = valid & testValidForDMA("reference pose", m_referencePose,  sizeof(hkQsTransform) * m_maxBone);
  55. if(!valid) return false;
  56. }
  57. // Parentindices handled differently - alignment not assumed
  58. // DMA: SC6
  59. if(m_maxBone != 0)
  60. {
  61. valid = valid & testValidForDMA("pose transforms out", m_poseOut,  sizeof(hkQsTransform) * m_maxBone);
  62. if(!valid) return false;
  63. }
  64. // DMA: SC7
  65. if(m_maxFloatSlot != 0)
  66. {
  67. const int sizeRoundedUp = HK_NEXT_MULTIPLE_OF( 16, sizeof(hkReal) * m_maxFloatSlot);
  68. valid = valid & testValidForDMA("pose floats out", m_floatSlotsOut,  sizeRoundedUp);
  69. if(!valid) return false;
  70. }
  71. return true;
  72. }
  73. hkaSampleAnimationJob::hkaSampleAnimationJob() : hkaAnimationJob(ANIMATION_JOB_SAMPLE_ANIMATION, sizeof(hkaSampleAnimationJob))
  74. {
  75. m_animData = HK_NULL;
  76. m_numAnims = 0;
  77. m_cache = HK_NULL;
  78. m_jobDoneSemaphore = HK_NULL;
  79. m_jobDoneFlag = 0;
  80. }
  81. hkaSampleAnimationJob::AnimationData::AnimationData()
  82. {
  83. init();
  84. }
  85. void hkaSampleAnimationJob::AnimationData::init()
  86. {
  87. m_frameIndex = 0;
  88. m_frameDelta = 0.0f; 
  89. m_maxTransformTrack = 0;
  90. m_maxFloatTrack = 0;
  91. m_animationOnCPU = HK_NULL;
  92. m_animationType = hkaAnimation::HK_UNKNOWN_ANIMATION;
  93. m_numValidChunks = 0;
  94. m_poseOut = HK_NULL;
  95. m_floatSlotsOut = HK_NULL;
  96. for(int i = 0; i < HK_MAX_NUM_DATA_CHUNKS; i++)
  97. {
  98. m_chunks[i].init();
  99. }
  100. }
  101. hkBool hkaSampleAnimationJob::AnimationData::isValid() const
  102. {
  103. hkBool valid = true;
  104. // Test frame delta
  105. {
  106. valid = valid && ((m_frameDelta >= 0.0f) && (m_frameDelta <= 1.0f));
  107. HK_ASSERT2(0x73a3d963, valid, "m_frameDelta not in range [0.0f, 1.0f]");
  108. if(!valid) return false;
  109. }
  110. // Test chunks
  111. {
  112. valid = valid && (m_numValidChunks <= HK_MAX_NUM_DATA_CHUNKS);
  113. HK_ASSERT2(0x7df92210, valid, "Num valid chunks is > HK_MAX_NUM_DATA_CHUNKS");
  114. if(!valid) return false;
  115. for(int i = 0; i < m_numValidChunks; i++)
  116. {
  117. const hkaAnimation::DataChunk& chunk = m_chunks[i];
  118. // Size
  119. {
  120. valid = valid && (chunk.m_size > 0);
  121. HK_ASSERT2(0x2434dfd1, valid, "Chunk " << i << " has invalid size (" << chunk.m_size << ")" );
  122. if(!valid) return false;
  123. }
  124. // Alignment
  125. {
  126. valid = valid && (((hkUlong)chunk.m_data & 0xf) == 0);
  127. HK_ASSERT2(0x5fb9d262, valid, "Chunk " << i << " has unaligned data (" << chunk.m_data << ")" );
  128. if(!valid) return false;
  129. }
  130. // Offset
  131. {
  132. valid = valid && (chunk.m_offset < 16);
  133. HK_ASSERT2(0x4d25db6b, valid, "Chunk " << i << " has offset outside range [0,15] (" << chunk.m_offset<< ")" );
  134. if(!valid) return false;
  135. }
  136. }
  137. }
  138. // Test DMA validity
  139. // DMA: SA1
  140. if(m_maxTransformTrack != 0)
  141. {
  142. valid = valid & testValidForDMA("pose transforms out", m_poseOut,  sizeof(hkQsTransform) * m_maxTransformTrack);
  143. if(!valid) return false;
  144. }
  145. // DMA: SA2
  146. if(m_maxFloatTrack != 0)
  147. {
  148. const int sizeRoundedUp = HK_NEXT_MULTIPLE_OF( 16, sizeof(hkReal) * m_maxFloatTrack);
  149. valid = valid & testValidForDMA("pose floats out", m_floatSlotsOut,  sizeRoundedUp);
  150. if(!valid) return false;
  151. }
  152. return valid;
  153. }
  154. hkaAnimationSampleAndCombineJob::ControlData::ControlData()
  155. {
  156. init();
  157. }
  158. void hkaAnimationSampleAndCombineJob::ControlData::init()
  159. {
  160. m_frameIndex = 0;
  161. m_frameDelta = 0.0f; 
  162. m_weight = 0.0f;
  163. m_animationType = hkaAnimation::HK_UNKNOWN_ANIMATION;
  164. m_numValidChunks = 0;
  165. m_transformTrackWeights = HK_NULL;
  166. m_numTransformTrackWeights = 0;
  167. m_floatTrackWeights = HK_NULL;
  168. m_numFloatTrackWeights = 0;
  169. for(int i = 0; i < HK_MAX_NUM_DATA_CHUNKS; i++)
  170. {
  171. m_chunks[i].init();
  172. }
  173. }
  174. hkBool hkaAnimationSampleAndCombineJob::ControlData::isValid() const
  175. {
  176. hkBool valid = true;
  177. // Test frame delta
  178. {
  179. valid = valid && ((m_frameDelta >= 0.0f) && (m_frameDelta <= 1.0f));
  180. HK_ASSERT2(0x0, valid, "m_frameDelta not in range [0.0f, 1.0f]");
  181. if(!valid) return false;
  182. }
  183. // Test chunks
  184. {
  185. valid = valid && (m_numValidChunks <= HK_MAX_NUM_DATA_CHUNKS);
  186. HK_ASSERT2(0x0, valid, "Num valid chunks is > HK_MAX_NUM_DATA_CHUNKS");
  187. if(!valid) return false;
  188. for(int i = 0; i < m_numValidChunks; i++)
  189. {
  190. const hkaAnimation::DataChunk& chunk = m_chunks[i];
  191. // Size
  192. {
  193. valid = valid && (chunk.m_size <= 1024 * 256);
  194. HK_ASSERT2(0x42385842, valid, "Chunk " << i << " has invalid size (" << chunk.m_size << ")" );
  195. if(!valid) return false;
  196. }
  197. // Alignment
  198. {
  199. valid = valid && (((hkUlong)chunk.m_data & 0xf) == 0);
  200. HK_ASSERT2(0x5f3aec86, valid, "Chunk " << i << " has unaligned data (" << chunk.m_data << ")" );
  201. if(!valid) return false;
  202. }
  203. // Offset
  204. {
  205. valid = valid && (chunk.m_offset < 16);
  206. HK_ASSERT2(0x20731b63, valid, "Chunk " << i << " has offset outside range [0,15] (" << chunk.m_offset<< ")" );
  207. if(!valid) return false;
  208. }
  209. }
  210. }
  211. // DMA: SC1
  212. if(m_binding.m_numTransformTrackToBoneIndices != 0)
  213. {
  214. const int bindingSize = HK_NEXT_MULTIPLE_OF(16, m_binding.m_numTransformTrackToBoneIndices * sizeof(hkInt16) );
  215. valid = valid & testValidForDMA("transform track binding indices", m_binding.m_transformTrackToBoneIndices,  bindingSize);
  216. if(!valid) return false;
  217. }
  218. // DMA: SC2
  219. if(m_binding.m_numFloatTrackToFloatSlotIndices != 0)
  220. {
  221. const int bindingSize = HK_NEXT_MULTIPLE_OF(16, m_binding.m_numFloatTrackToFloatSlotIndices * sizeof(hkInt16) );
  222. valid = valid & testValidForDMA("float track binding indices", m_binding.m_floatTrackToFloatSlotIndices,  bindingSize);
  223. if(!valid) return false;
  224. }
  225. // DMA: SC3
  226. if(m_numTransformTrackWeights != 0)
  227. {
  228. const int trackWeightSize = HK_NEXT_MULTIPLE_OF(16, m_numTransformTrackWeights * sizeof(hkUint8) );
  229. valid = valid & testValidForDMA("transform track weights", m_transformTrackWeights,  trackWeightSize);
  230. if(!valid) return false;
  231. }
  232. // DMA: SC4
  233. if(m_numFloatTrackWeights != 0)
  234. {
  235. const int trackWeightSize = HK_NEXT_MULTIPLE_OF(16, m_numFloatTrackWeights * sizeof(hkUint8) );
  236. valid = valid & testValidForDMA("float track weights", m_floatTrackWeights,  trackWeightSize);
  237. if(!valid) return false;
  238. }
  239. return valid;
  240. }
  241. /*
  242. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  243. * Confidential Information of Havok.  (C) Copyright 1999-2009
  244. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  245. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  246. * rights, and intellectual property rights in the Havok software remain in
  247. * Havok and/or its suppliers.
  248. * Use of this software for evaluation purposes is subject to and indicates
  249. * acceptance of the End User licence Agreement for this product. A copy of
  250. * the license is included with this software and is also available at www.havok.com/tryhavok.
  251. */