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

其他游戏

开发平台:

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. template<typename T>
  9. static void hkKdTreeCheckCommandPointers (const T* commandPtr, int numCommands)
  10. {
  11. for (int i=0; i<numCommands; i++)
  12. {
  13. const T* command = &commandPtr[i];
  14. HK_ASSERT2( 0xaf3647fe, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "Command's m_results has to be set and 16 byte aligned." );
  15. }
  16. }
  17. template<typename T>
  18. static void hkKdTreeCheckCommandCapacity (const T* commandPtr, int numCommands)
  19. {
  20. for (int i=0; i<numCommands; i++)
  21. {
  22. const T* command = &commandPtr[i];
  23. HK_ASSERT2( 0xaf3638e2, command->m_resultsCapacity > 0 && command->m_resultsCapacity <= T::MAXIMUM_RESULTS_CAPACITY, "Command's m_resultsCapacity has to be > 0 and <= " << T::MAXIMUM_RESULTS_CAPACITY << "." );
  24. }
  25. }
  26. hkpCollisionQueryJob::hkpCollisionQueryJob( JobSubType subType, hkUint16 size )
  27. : hkJob( HK_JOB_TYPE_COLLISION_QUERY, subType, size, HK_JOB_SPU_TYPE_DISABLED ),
  28. m_semaphore(HK_NULL), m_jobDoneFlag(HK_NULL)
  29. {
  30. m_sharedJobHeaderOnPpu = HK_NULL;
  31. m_collisionInput = HK_NULL;
  32. }
  33. inline void hkpCollisionQueryJob::atomicIncrementAndReleaseSemaphore() const
  34. {
  35. if (m_jobDoneFlag)
  36. {
  37. hkCriticalSection::atomicExchangeAdd(m_jobDoneFlag, 1);
  38. }
  39. if (m_semaphore)
  40. {
  41. hkSemaphoreBusyWait::release(m_semaphore);
  42. }
  43. }
  44. // ===============================================================================================================================================================================================
  45. // PAIR LINEAR CAST
  46. // ===============================================================================================================================================================================================
  47. hkpPairLinearCastJob::hkpPairLinearCastJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpPairLinearCastCommand* commandArray, int numCommands, const hkpShapeCollectionFilter* filter, hkReal tolerance, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  48. : hkpCollisionQueryJob(COLLISION_QUERY_PAIR_LINEAR_CAST, sizeof(hkpPairLinearCastJob))
  49. {
  50. HK_ASSERT2( 0xaf136151, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  51. HK_ASSERT2( 0xaf1647f5, numCommands > 0, "numCommands has to be > 0." );
  52. HK_ASSERT2( 0xaf1647e0, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  53. HK_ASSERT2( 0xaf1647b4, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  54. #if defined(HK_DEBUG)
  55. // check memory allocated on commands
  56. {
  57. for (int i = 0; i < numCommands; i++)
  58. {
  59. hkpPairLinearCastCommand* command = const_cast<hkpPairLinearCastCommand*>( &commandArray[i] );
  60. HK_ASSERT2( 0xaf2647fe, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "hkpPairLinearCastCommand::m_results has to be set and 16 byte aligned." );
  61. HK_ASSERT2( 0xaf2638e2, command->m_resultsCapacity > 0 && command->m_resultsCapacity <= hkpPairLinearCastCommand::MAXIMUM_RESULTS_CAPACITY, "hkpPairLinearCastCommand::m_resultsCapacity has to be > 0 and <= " << hkpPairGetClosestPointsCommand::MAXIMUM_RESULTS_CAPACITY << "." );
  62. // m_startPointResults aren't required. These should still catch uninitialized memory, though.
  63. HK_ASSERT2( 0xaf2647fe, ((hkUlong)command->m_startPointResults & 0xf) == 0, "hkpPairLinearCastCommand::m_startPointResults has to be 16 byte aligned." );
  64. HK_ASSERT2( 0xaf2638e2, command->m_startPointResultsCapacity >= 0 && command->m_startPointResultsCapacity <= hkpPairLinearCastCommand::MAXIMUM_RESULTS_CAPACITY, "hkpPairLinearCastCommand::m_startPointResultsCapacity has to be >= 0 and <= " << hkpPairGetClosestPointsCommand::MAXIMUM_RESULTS_CAPACITY << "." );
  65. }
  66. }
  67. // This is a very simple and crude attempt to try to catch a common mistake where the user might
  68. // forget to actually advance the pointer to the results. Doing so could cause incorrect query results.
  69. // This check though will NOT catch trickier situations like e.g. partially overlapping results.
  70. if ( numCommands > 1 )
  71. {
  72. HK_ASSERT2(0xaf253413, commandArray[0].m_results != commandArray[1].m_results, "You are not allowed to re-use the same results buffer for two different query commands.");
  73. }
  74. #endif
  75. m_collisionInput = input;
  76. m_sharedJobHeaderOnPpu = jobHeader;
  77. m_tolerance = tolerance;
  78. m_numCommandsPerTask = numCommandsPerTask;
  79. m_semaphore = semaphore;
  80. m_commandArray = commandArray;
  81. m_numCommands = numCommands;
  82. m_filter = filter;
  83. m_maxExtraPenetration = HK_REAL_EPSILON;
  84. m_iterativeLinearCastEarlyOutDistance = 0.01f;
  85. m_iterativeLinearCastMaxIterations = 10;
  86. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  87. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  88. }
  89. hkpPairLinearCastJob::hkpPairLinearCastJob() : hkpCollisionQueryJob(COLLISION_QUERY_PAIR_LINEAR_CAST, sizeof(hkpPairLinearCastJob))
  90. {
  91. }
  92. hkJobQueue::JobPopFuncResult hkpPairLinearCastJob::popJobTask( hkpPairLinearCastJob& out )
  93. {
  94. //
  95. // split off a fully filled child job if there are more tasks left than one job can handle
  96. //
  97. if ( m_numCommands > m_numCommandsPerTask )
  98. {
  99. out.m_numCommands  = m_numCommandsPerTask;
  100. m_numCommands -= m_numCommandsPerTask;
  101. m_commandArray  = hkAddByteOffsetConst(m_commandArray, m_numCommandsPerTask * sizeof(hkpPairLinearCastCommand));
  102. return hkJobQueue::DO_NOT_POP_QUEUE_ENTRY;
  103. }
  104. return hkJobQueue::POP_QUEUE_ENTRY;
  105. }
  106. // ===============================================================================================================================================================================================
  107. //  WORLD LINEAR CAST
  108. // ===============================================================================================================================================================================================
  109. hkpWorldLinearCastJob::hkpWorldLinearCastJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpWorldLinearCastCommand* commandArray, int numCommands, const hkpBroadPhase* broadphase, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  110. : hkpCollisionQueryJob(COLLISION_QUERY_WORLD_LINEAR_CAST, sizeof(hkpWorldLinearCastJob))
  111. {
  112. HK_ASSERT2( 0xaf736152, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  113. HK_ASSERT2( 0xaf7647f6, numCommands > 0, "numCommands has to be > 0." );
  114. HK_ASSERT2( 0xaf7647f7, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  115. HK_ASSERT2( 0xaf7647f8, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  116. #if defined(HK_DEBUG)
  117. {
  118. for (int i=0; i<numCommands; i++)
  119. {
  120. const hkpWorldLinearCastCommand* command = &commandArray[i];
  121. HK_ASSERT2( 0xaf7647f9, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "hkpWorldLinearCastCommand::m_results has to be set and 16 byte aligned." );
  122. HK_ASSERT2( 0xaf7647fb, command->m_resultsCapacity > 0 && command->m_resultsCapacity <= hkpWorldLinearCastCommand::MAXIMUM_RESULTS_CAPACITY, "hkpWorldLinearCastCommand::m_resultsCapacity has to be > 0 and <= " << hkpWorldLinearCastCommand::MAXIMUM_RESULTS_CAPACITY << "." );
  123. #ifdef HK_PLATFORM_PS3_PPU
  124. const hkpShape* shape = command->m_collidable->getShape();
  125. if ( shape->getType() == HK_SHAPE_LIST )
  126. {
  127. const hkpListShape* list = static_cast<const hkpListShape*>(shape);
  128. {
  129. for (int childIdx = 0; childIdx < list->m_childInfo.getSize(); childIdx++)
  130. {
  131. const hkpListShape::ChildInfo& info = list->m_childInfo[childIdx];
  132. HK_ASSERT2(0xaf321fe3, info.m_shapeSize != 0, "You have to either add the entity using this hkpListShape to the world or manually call hkpEntity::setShapeSizeForSpu().");
  133. }
  134. }
  135. }
  136. #endif
  137. }
  138. }
  139. // This is a very simple and crude attempt to try to catch a common mistake where the user might
  140. // forget to actually advance the pointer to the results. Doing so could cause incorrect query results.
  141. // This check though will NOT catch trickier situations like e.g. partially overlapping results.
  142. if ( numCommands > 1 )
  143. {
  144. HK_ASSERT2(0xaf253414, commandArray[0].m_results != commandArray[1].m_results, "You are not allowed to re-use the same results buffer for two different query commands.");
  145. }
  146. #endif
  147. m_collisionInput = input;
  148. m_sharedJobHeaderOnPpu = jobHeader;
  149. m_numCommandsPerTask = numCommandsPerTask;
  150. m_semaphore = semaphore;
  151. m_commandArray = commandArray;
  152. m_numCommands = numCommands;
  153. m_broadphase = broadphase;
  154. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  155. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  156. }
  157. hkJobQueue::JobPopFuncResult hkpWorldLinearCastJob::popJobTask( hkpWorldLinearCastJob& out )
  158. {
  159. //
  160. // split off a fully filled child job if there are more commands left than one job can handle
  161. //
  162. if ( m_numCommands > m_numCommandsPerTask )
  163. {
  164. out.m_numCommands  = m_numCommandsPerTask;
  165. m_numCommands -= m_numCommandsPerTask;
  166. m_commandArray  = hkAddByteOffsetConst(m_commandArray, m_numCommandsPerTask * sizeof(hkpWorldLinearCastCommand));
  167. return hkJobQueue::DO_NOT_POP_QUEUE_ENTRY;
  168. }
  169. return hkJobQueue::POP_QUEUE_ENTRY;
  170. }
  171. // ===============================================================================================================================================================================================
  172. //  MOPP AABB
  173. // ===============================================================================================================================================================================================
  174. hkpMoppAabbJob::hkpMoppAabbJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpMoppAabbCommand* commandArray, int numCommands, const hkUint8* moppCodeData, const hkpMoppCode::CodeInfo& moppCodeInfo, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  175. : hkpCollisionQueryJob(COLLISION_QUERY_MOPP_AABB, sizeof(hkpMoppAabbJob))
  176. {
  177. m_jobSpuType = HK_JOB_SPU_TYPE_ENABLED;
  178. HK_ASSERT2( 0xaf236154, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned.");
  179. HK_ASSERT2( 0xaf3647d2, numCommands > 0, "numCommands has to be > 0." );
  180. HK_ASSERT2( 0xaf3647d3, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  181. HK_ASSERT2( 0xaf3647df, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  182. #if defined(HK_DEBUG)
  183. {
  184. for (int i=0; i<numCommands; i++)
  185. {
  186. const hkpMoppAabbCommand* command = &commandArray[i];
  187. HK_ASSERT2( 0xaf3647d5, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "hkpMoppAabbCommand::m_results has to be set and 16 byte aligned." );
  188. }
  189. }
  190. // This is a very simple and crude attempt to try to catch a common mistake where the user might
  191. // forget to actually advance the pointer to the results. Doing so could cause incorrect query results.
  192. // This check though will NOT catch trickier situations like e.g. partially overlapping results.
  193. if ( numCommands > 1 )
  194. {
  195. HK_ASSERT2(0xaf253415, commandArray[0].m_results != commandArray[1].m_results, "You are not allowed to re-use the same results buffer for two different query commands.");
  196. }
  197. #endif
  198. m_collisionInput = input;
  199. m_sharedJobHeaderOnPpu = jobHeader;
  200. m_moppCodeInfo = moppCodeInfo;
  201. m_moppCodeData = moppCodeData;
  202. m_numCommandsPerTask = numCommandsPerTask;
  203. m_semaphore = semaphore;
  204. m_commandArray = commandArray;
  205. m_numCommands = numCommands;
  206. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  207. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  208. }
  209. hkJobQueue::JobPopFuncResult hkpMoppAabbJob::popJobTask( hkpMoppAabbJob& out )
  210. {
  211. //
  212. // split off a fully filled child job if there are more commands left than one job can handle
  213. //
  214. if ( m_numCommands > m_numCommandsPerTask )
  215. {
  216. out.m_numCommands  = m_numCommandsPerTask;
  217. m_numCommands -= m_numCommandsPerTask;
  218. m_commandArray  = hkAddByteOffsetConst(m_commandArray, m_numCommandsPerTask * sizeof(hkpMoppAabbCommand));
  219. return hkJobQueue::DO_NOT_POP_QUEUE_ENTRY;
  220. }
  221. return hkJobQueue::POP_QUEUE_ENTRY;
  222. }
  223. // ===============================================================================================================================================================================================
  224. //  PAIR GET CLOSEST POINTS
  225. // ===============================================================================================================================================================================================
  226. hkpPairGetClosestPointsJob::hkpPairGetClosestPointsJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpPairGetClosestPointsCommand* commandArray, int numCommands, hkReal tolerance, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  227. : hkpCollisionQueryJob(COLLISION_QUERY_PAIR_GET_CLOSEST_POINTS,  sizeof(hkpPairGetClosestPointsJob))
  228. {
  229. HK_ASSERT2( 0xaf236151, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  230. HK_ASSERT2( 0xaf3647f5, numCommands > 0, "numCommands has to be > 0." );
  231. HK_ASSERT2( 0xaf3647e0, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  232. HK_ASSERT2( 0xaf3647b4, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  233. {
  234. for (int i = 0; i < numCommands; i++)
  235. {
  236. hkpPairGetClosestPointsCommand* command = const_cast<hkpPairGetClosestPointsCommand*>( &commandArray[i] );
  237. #if defined(HK_DEBUG)
  238. HK_ASSERT2( 0xaf1647fe, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "hkpPairGetClosestPointsCommand::m_results has to be set and 16 byte aligned." );
  239. HK_ASSERT2( 0xaf1638e2, command->m_resultsCapacity > 0 && command->m_resultsCapacity <= hkpPairGetClosestPointsCommand::MAXIMUM_RESULTS_CAPACITY, "hkpPairGetClosestPointsCommand::m_resultsCapacity has to be > 0 and <= " << hkpPairGetClosestPointsCommand::MAXIMUM_RESULTS_CAPACITY << "." );
  240. #endif
  241. command->m_indexIntoSharedResults = HK_NULL;
  242. }
  243. }
  244. #if defined(HK_DEBUG)
  245. // This is a very simple and crude attempt to try to catch a common mistake where the user might
  246. // forget to actually advance the pointer to the results. Doing so could cause incorrect query results.
  247. // This check though will NOT catch trickier situations like e.g. partially overlapping results.
  248. if ( numCommands > 1 )
  249. {
  250. HK_ASSERT2(0xaf253416, commandArray[0].m_results != commandArray[1].m_results, "You are not allowed to re-use the same results buffer for two different query commands.");
  251. }
  252. #endif
  253. m_collisionInput = input;
  254. m_sharedJobHeaderOnPpu = jobHeader;
  255. m_tolerance = tolerance;
  256. m_numCommandsPerTask = numCommandsPerTask;
  257. m_semaphore = semaphore;
  258. m_commandArray = commandArray;
  259. m_numCommands = numCommands;
  260. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  261. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  262. }
  263. hkpPairGetClosestPointsJob::hkpPairGetClosestPointsJob()
  264. : hkpCollisionQueryJob(COLLISION_QUERY_PAIR_GET_CLOSEST_POINTS, sizeof(hkpPairGetClosestPointsJob))
  265. {
  266. }
  267. hkJobQueue::JobPopFuncResult hkpPairGetClosestPointsJob::popJobTask( hkpPairGetClosestPointsJob& out )
  268. {
  269. //
  270. // split off a fully filled child job if there are more tasks left than one job can handle
  271. //
  272. if ( m_numCommands > m_numCommandsPerTask )
  273. {
  274. out.m_numCommands  = m_numCommandsPerTask;
  275. m_numCommands -= m_numCommandsPerTask;
  276. m_commandArray  = hkAddByteOffsetConst(m_commandArray, m_numCommandsPerTask * sizeof(hkpPairGetClosestPointsCommand));
  277. return hkJobQueue::DO_NOT_POP_QUEUE_ENTRY;
  278. }
  279. return hkJobQueue::POP_QUEUE_ENTRY;
  280. }
  281. // ===============================================================================================================================================================================================
  282. //  WORLD GET CLOSEST POINTS
  283. // ===============================================================================================================================================================================================
  284. hkpWorldGetClosestPointsJob::hkpWorldGetClosestPointsJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpWorldGetClosestPointsCommand* commandArray, int numCommands, hkpPairGetClosestPointsCommand* pairGetClosestPointsCommandBuffer, int pairGetClosestPointsCommandBufferCapacity, const hkpBroadPhase* broadphase, hkReal tolerance, hkSemaphoreBusyWait* semaphore) 
  285. : hkpCollisionQueryJob(COLLISION_QUERY_WORLD_GET_CLOSEST_POINTS, sizeof(hkpWorldGetClosestPointsJob))
  286. {
  287. HK_ASSERT2( 0xaf236152, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  288. HK_ASSERT2( 0xaf3647f6, numCommands > 0 && numCommands <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommands has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  289. HK_ASSERT2( 0xaf3647f7, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  290. HK_ASSERT2( 0xaf3647f8, ((hkUlong)pairGetClosestPointsCommandBuffer & 0xf) == 0, "pairGetClosestPointsCommandBuffer has to be either HK_NULL or 16 byte aligned." );
  291. {
  292. for (int i=0; i<numCommands; i++)
  293. {
  294. hkpWorldGetClosestPointsCommand* command = const_cast<hkpWorldGetClosestPointsCommand*>( &commandArray[i] );
  295. #if defined(HK_DEBUG)
  296. HK_ASSERT2( 0xaf3647f9, command->m_resultsCapacity > 0, "hkpWorldGetClosestPointsCommand::m_resultsCapacity has to be > 0." );
  297. HK_ASSERT2( 0xaf3647fb, command->m_results && ((hkUlong)command->m_results & 0xf) == 0, "hkpWorldGetClosestPointsCommand::m_results has to be set and 16 byte aligned." );
  298. #endif
  299. command->m_numResultsOut = 0;
  300. }
  301. }
  302. #if defined(HK_DEBUG)
  303. // This is a very simple and crude attempt to try to catch a common mistake where the user might
  304. // forget to actually advance the pointer to the results. Doing so could cause incorrect query results.
  305. // This check though will NOT catch trickier situations like e.g. partially overlapping results.
  306. if ( numCommands > 1 )
  307. {
  308. HK_ASSERT2(0xaf253417, commandArray[0].m_results != commandArray[1].m_results, "You are not allowed to re-use the same results buffer for two different query commands.");
  309. }
  310. #endif
  311. m_collisionInput = input;
  312. m_sharedJobHeaderOnPpu = jobHeader;
  313. m_broadphase = broadphase;
  314. m_tolerance = tolerance;
  315. m_semaphore = semaphore;
  316. m_commandArray = commandArray;
  317. m_numCommands = numCommands;
  318. m_pairGetClosestPointsCommandBuffer = pairGetClosestPointsCommandBuffer;
  319. m_pairGetClosestPointsCommandBufferCapacity = pairGetClosestPointsCommandBufferCapacity;
  320. m_sharedJobHeaderOnPpu->m_openJobs = OPEN_JOBS_PRESET;
  321. }
  322. // ===============================================================================================================================================================================================
  323. //  KD-TREE AABB QUERY
  324. // ===============================================================================================================================================================================================
  325. hkpKdTreeAabbJob::hkpKdTreeAabbJob(hkpCollisionQueryJobHeader* jobHeader, hkpKdTreeAabbCommand* commandArray, int numCommands, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  326. :  hkpCollisionQueryJob(COLLISION_QUERY_KD_TREE_AABB_QUERY_JOB, sizeof(hkpKdTreeAabbJob) )
  327. {
  328. HK_ASSERT2( 0xaf236152, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  329. HK_ASSERT2( 0xaf3647f6, numCommands > 0, "numCommands has to be > 0." );
  330. HK_ASSERT2( 0xaf3647f7, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  331. HK_ASSERT2( 0xaf3647fd, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  332. #if defined(HK_DEBUG)
  333. {
  334. hkKdTreeCheckCommandPointers<hkpKdTreeAabbCommand>(commandArray, numCommands);
  335. }
  336. #endif
  337. m_sharedJobHeaderOnPpu = jobHeader;
  338. m_numCommandsPerTask = numCommandsPerTask;
  339. m_semaphore = semaphore;
  340. m_aabbCommandArray = commandArray;
  341. m_numAabbCommands = numCommands;
  342. m_numTrees = 0;
  343. m_trees[0] = HK_NULL;
  344. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  345. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  346. m_jobSpuType = HK_JOB_SPU_TYPE_ENABLED; // all kd tree jobs run on the SPU
  347. }
  348. // ===============================================================================================================================================================================================
  349. //  KD-TREE LINEAR CAST
  350. // ===============================================================================================================================================================================================
  351. hkpKdTreeLinearCastJob::hkpKdTreeLinearCastJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, hkpWorldLinearCastCommand* commandArray, int numCommands, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask) 
  352. :  hkpCollisionQueryJob(COLLISION_QUERY_KD_TREE_LINEAR_CAST_JOB, sizeof(hkpKdTreeLinearCastJob) )
  353. {
  354. HK_ASSERT2( 0xaf236152, jobHeader && ((hkUlong)jobHeader & 0xf) == 0, "jobHeader has to be set and be 16 byte aligned." );
  355. HK_ASSERT2( 0xaf3647f6, numCommands > 0, "numCommands has to be > 0." );
  356. HK_ASSERT2( 0xaf3647f7, commandArray && ((hkUlong)commandArray & 0xf) == 0, "commandArray has to be set and 16 byte aligned." );
  357. HK_ASSERT2( 0xaf3647fd, numCommandsPerTask > 0 && numCommandsPerTask <= MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK, "numCommandsPerTask has to be > 0 and <= " << MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK << "." );
  358. #if defined(HK_DEBUG)
  359. {
  360. hkKdTreeCheckCommandPointers<hkpWorldLinearCastCommand>(commandArray, numCommands);
  361. hkKdTreeCheckCommandCapacity<hkpWorldLinearCastCommand>(commandArray, numCommands);
  362. }
  363. #endif
  364. m_sharedJobHeaderOnPpu = jobHeader;
  365. m_collisionInput = input;
  366. m_filter = HK_NULL;
  367. m_numCommandsPerTask = numCommandsPerTask;
  368. m_semaphore = semaphore;
  369. m_commandArray = commandArray;
  370. m_numCommands = numCommands;
  371. m_numTrees = 0;
  372. m_trees[0] = HK_NULL;
  373. // precalculate the total number of jobs that will be spawned from the original job (incl. the original)
  374. m_sharedJobHeaderOnPpu->m_openJobs = ((numCommands-1)/numCommandsPerTask) + 1;
  375. }
  376. /*
  377. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  378. * Confidential Information of Havok.  (C) Copyright 1999-2009
  379. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  380. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  381. * rights, and intellectual property rights in the Havok software remain in
  382. * Havok and/or its suppliers.
  383. * Use of this software for evaluation purposes is subject to and indicates
  384. * acceptance of the End User licence Agreement for this product. A copy of
  385. * the license is included with this software and is also available at www.havok.com/tryhavok.
  386. */