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

其他游戏

开发平台:

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_KD_TREE_JOBS_H
  9. #define HK_KD_TREE_JOBS_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Geometry/Aabb/hkAabb.h>
  12. #include <Common/Base/Thread/Semaphore/hkSemaphoreBusyWait.h>
  13. #include <Common/Base/Thread/JobQueue/hkJobQueue.h>
  14. #include <Physics/Collide/Shape/Compound/Tree/hkpBvTreeShape.h>
  15. #include <Physics/Dynamics/World/hkpWorld.h>
  16. #include <Physics/Collide/hkpCollide.h>
  17. #include <Physics/Collide/Agent/Collidable/hkpCollidable.h>
  18. #include <Physics/Collide/Query/CastUtil/hkpWorldRayCastInput.h>
  19. #include <Physics/Collide/Query/CastUtil/hkpLinearCastInput.h>
  20. #include <Physics/Collide/Shape/Query/hkpShapeRayCastInput.h>
  21. #include <Physics/Collide/Shape/Query/hkpShapeRayCastOutput.h>
  22. #include <Physics/Collide/Query/Multithreaded/RayCastQuery/hkpRayCastQueryJobs.h>
  23. #include <Physics/Internal/Collide/Mopp/Code/hkpMoppCode.h>
  24. #include <Common/Internal/KdTree/Build/hkKdTreeBuilder.h>
  25. #include <Common/Internal/KdTree/Build/hkKdTreeBuildingUtils.h>
  26. #include <Common/Base/hkBase.h>
  27. #include <Physics/Collide/Shape/Query/hkpShapeRayBundleCastInput.h>
  28. class hkpBroadPhase;
  29. class hkpWorld;
  30. struct hkpWorldRayCastOutput;
  31. #include <Physics/Collide/Query/Multithreaded/CollisionQuery/hkpCollisionQueryJobs.h>
  32. typedef hkpCollisionQueryJobHeader hkpRayCastQueryJobHeader;
  33. //
  34. // The base class for all collision query jobs
  35. //
  36. struct hkpRayCastQueryJob : public hkJob
  37. {
  38. public:
  39. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpRayCastQueryJob );
  40. // Kd tree subtypes start at 128 to keep them separate from other pathfinding jobs
  41. enum JobSubType
  42. {
  43. // Query jobs
  44. RAYCAST_QUERY_SHAPE_RAYCAST,
  45. RAYCAST_QUERY_WORLD_RAYCAST,
  46. RAYCAST_QUERY_KD_TREE_RAYCAST,
  47. // Build jobs
  48. RAYCAST_QUERY_KD_TREE_BUILD_FAST,
  49. RAYCAST_QUERY_KD_TREE_BUILD_FAST_DISTRIBUTED_JOB,
  50. RAYCAST_QUERY_KD_TREE_BUILD_FAST_DISTRIBUTED_SUBJOB,
  51. RAYCAST_QUERY_KD_TREE_BUILD_SETUP_JOB,
  52. // Build coordination job, sets up other build jobs
  53. RAYCAST_QUERY_KD_TREE_BUILD_COORDINATOR_JOB,
  54. RAYCAST_QUERY_JOB_END
  55. };
  56. void atomicIncrementAndReleaseSemaphore() const;
  57. protected:
  58. HK_FORCE_INLINE hkpRayCastQueryJob( JobSubType subType, hkUint16 size );
  59. public:
  60. // This semaphore is released once the original job (and all its spawned children) has finished.
  61. hkSemaphoreBusyWait* m_semaphore;
  62. // this header must be set for all jobs that potentially spawn additional jobs or that have been spawned by other jobs
  63. hkpRayCastQueryJobHeader* m_sharedJobHeaderOnPpu;
  64. // The variable at this location will be incremented (atomically) when the job is done.
  65. hkUint32* m_jobDoneFlag;
  66. // Needed by raycast jobs, and by kdtree building
  67. const hkpProcessCollisionInput* m_collisionInput;
  68. };
  69. // ===============================================================================================================================================================================================
  70. //  SHAPE RAYCAST
  71. // ===============================================================================================================================================================================================
  72. /// An hkpShapeRayCastCommand can be used to cast exactly one ray against an arbitrary number of collidables. Depending on how many hits you want
  73. /// to be reported you have to supply a large enough m_results output array. Once this array has reached its capacity, the furthest
  74. /// hit will be dropped.
  75. struct hkpShapeRayCastCommand
  76. {
  77. public:
  78. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShapeRayCastCommand );
  79. enum { MAXIMUM_RESULTS_CAPACITY = 96 }; // the capacity has to be limited as we need to allocate this array on the SPU stack
  80. enum { MAXIMUM_NUM_COLLIDABLES = 64 }; // the maximum number of collidables to cast the ray against has to be limited as we need to allocate a hkpCollidable pointer array on the SPU stack
  81. public:
  82. // ===================================================================
  83. // Input
  84. // ===================================================================
  85. /// The ray's input data.
  86. hkpShapeRayCastInput m_rayInput;
  87. /// Type of the filter referenced by m_rayInput.m_rayShapeCollectionFilter.
  88. /// Must be assigned in order for the filter to work on SPU.
  89. hkUint32 m_filterType; // type is: hkpFilterType
  90. /// Size of the filter referenced by m_rayInput.m_rayShapeCollectionFilter.
  91. /// Must be assigned in order for the filter to work on SPU.
  92. hkInt32 m_filterSize;
  93. /// Pointer to an array of hkpCollidable pointers. The ray will be cast against these collidables.
  94. /// This array has to be 16byte aligned.
  95. /// PLAYSTATION(R)3 note: this array will be dma'd to SPU and therefore must not be allocated on PPU stack.
  96. const hkpCollidable** m_collidables;
  97. /// Number of collidables in the m_collidables array.
  98. int m_numCollidables;
  99. // ===================================================================
  100. // Output
  101. // ===================================================================
  102. /// Pointer to a hkpShapeRayCastOutput array. The user has to pre-allocate this manually. Once the job has finished, this array will hold the results.
  103. /// PLAYSTATION(R)3 note: this array will be dma'd from SPU and therefore must not be allocated on PPU stack.
  104. hkpWorldRayCastOutput* m_results;
  105. /// The maximum number of results pre-allocated in m_results.
  106. int m_resultsCapacity;
  107. /// The number of results. Remains untouched until the command has been finished.
  108. /// You can use this to check manually whether the command already has been completed.
  109. int m_numResultsOut;
  110. /// When a collector is not used, only one point per hkpCollidable can be returned.
  111. hkBool                                                  m_useCollector;
  112. };
  113. /// An hkpShapeRayCastJob will take an arbitrary number of hkShapeRayCastCommands and perform the raycasts. The job is able
  114. /// to split itself into two jobs if it holds more commands than the maximum allowed number that can be executed in one go.
  115. /// Jobs will be processed multithreaded (i.e. in parallel by different PPU and/or SPU threads, if available).
  116. struct hkpShapeRayCastJob : public hkpRayCastQueryJob
  117. {
  118. public:
  119. friend struct hkpRayCastQueryJobQueueUtils;
  120. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShapeRayCastJob );
  121. enum { MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK = 90 };
  122. public:
  123. /// When creating an hkpShapeRayCastJob you have to pass in an unique jobHeader as well as an array of commands.
  124. /// The supplied semaphore is released once all commands of this job have been completed and the job has been removed from the job queue.
  125. /// The number of commands that are grouped into one task is customizable.
  126. /// PLAYSTATION(R)3 note: the jobHeader and the commandArray will be dma'd to SPU and therefore must not be allocated on PPU stack.
  127. HK_FORCE_INLINE hkpShapeRayCastJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpShapeRayCastCommand* commandArray, int numCommands, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask = MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK);
  128. /// Only necessary on PLAYSTATION(R)3. 
  129. /// Use this method to assign this job to be processed on the SPU or PPU. This is automatically set depending on what the job references.
  130. /// If it references objects which are not supported on the spu
  131. /// this function will produce a warning (in debug) and the job will be processed on PPU. 
  132. void setRunsOnSpuOrPpu();
  133. public:
  134. HK_FORCE_INLINE hkJobQueue::JobPopFuncResult popJobTask( hkpShapeRayCastJob& out );
  135. int m_numCommandsPerTask; // maximum # of commands per task; once this limit is breached a subjob is spawned
  136. const hkpShapeRayCastCommand* m_commandArray;
  137. int m_numCommands;
  138. };
  139. // ===============================================================================================================================================================================================
  140. //  WORLD RAYCAST
  141. // ===============================================================================================================================================================================================
  142. /// An hkpWorldRayCastCommand can be used to cast exactly one ray through the broadphase. Depending on how many hits you want
  143. /// to be reported you have to supply a large enough m_results output array. Once this array has reached its capacity, the furthest
  144. /// hit will be dropped.
  145. /// Performance note: when supplying a m_results array-size of exactly 1, the broadphase will use an early-out algorithm to significantly
  146. /// speedup things. With an array-size > 1 this speedup will be lost.
  147. struct hkpWorldRayCastCommand
  148. {
  149. public:
  150. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpWorldRayCastCommand );
  151. enum { MAXIMUM_RESULTS_CAPACITY = 32 }; // the capacity has to be limited as we need to allocate this array on the SPU stack
  152. public:
  153. // ===================================================================
  154. // Input
  155. // ===================================================================
  156. /// The ray's input data.
  157. hkpWorldRayCastInput m_rayInput;
  158. // ===================================================================
  159. // Output
  160. // ===================================================================
  161. /// Pointer to a hkpWorldRayCastOutput array. The user has to pre-allocate this manually. Once the job has finished, this array will hold the results.
  162. /// PLAYSTATION(R)3 note: this array will be dma'd from SPU and therefore must not be allocated on PPU stack.
  163. hkpWorldRayCastOutput* m_results;
  164. /// The maximum number of results pre-allocated in m_results.
  165. int m_resultsCapacity;
  166. /// The number of results.
  167. /// This value is only valid after the job's semaphore has been released.
  168. int m_numResultsOut;
  169. /// When a collector is not used, only one point per hkpCollidable can be returned.
  170. hkBool                                                  m_useCollector;
  171. };
  172. /// An hkpWorldRayCastJob will take an arbitrary number of hkWorldRayCastCommands and perform the raycasts. The job is able
  173. /// to split itself into two jobs if it holds more commands than the maximum allowed number that can be executed in one go.
  174. /// Jobs will be processed multithreaded (i.e. in parallel by different PPU and/or SPU threads, if available).
  175. struct hkpWorldRayCastJob : public hkpRayCastQueryJob
  176. {
  177. public:
  178. friend struct hkpRayCastQueryJobQueueUtils;
  179. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpWorldRayCastJob );
  180. enum { MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK = 170 };
  181. public:
  182. /// When creating an hkpWorldRayCastJob you have to pass in an unique jobHeader as well as an array of commands.
  183. /// The supplied broadphase is used to limit the number of possible object pairs and thus helps increasing performance.
  184. /// The supplied semaphore is released once all commands of this job have been completed and the job has been removed from the job queue.
  185. /// The number of commands that are grouped into one task is customizable.
  186. /// PLAYSTATION(R)3 note: the jobHeader and the commandArray will be dma'd to SPU and therefore must not be allocated on PPU stack.
  187. HK_FORCE_INLINE hkpWorldRayCastJob( const hkpProcessCollisionInput* input, hkpCollisionQueryJobHeader* jobHeader, const hkpWorldRayCastCommand* commandArray, int numCommands, const hkpBroadPhase* broadphase, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask = MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK);
  188. /// Only necessary on PLAYSTATION(R)3. 
  189. /// Use this method to assign this job to be processed on the SPU or PPU. This is automatically set depending on what the job references.
  190. /// If it references objects which are not supported on the spu
  191. /// this function will produce a warning (in debug) and the job will be processed on PPU. 
  192. void setRunsOnSpuOrPpu();
  193. protected:
  194. HK_FORCE_INLINE hkJobQueue::JobPopFuncResult popJobTask( hkpWorldRayCastJob& out );
  195. public:
  196. // Inputs
  197. int m_numCommandsPerTask; // maximum # of commands per task; once this limit is breached a subjob is spawned
  198. const hkpWorldRayCastCommand* m_commandArray;
  199. int m_numCommands;
  200. const hkpBroadPhase* m_broadphase;
  201. };
  202. // ===============================================================================================================================================================================================
  203. //  KD-TREE WORLD RAYCAST
  204. // ===============================================================================================================================================================================================
  205. /// An hkKdTreeRayCastCommand can be used to cast exactly one ray through the scene. Depending on how many hits you want
  206. /// to be reported you have to supply a large enough m_results output array. Once this array has reached its capacity, the furthest
  207. /// hit will be dropped.
  208. /// Performance note: when supplying a m_results array-size of exactly 1, the tree will use an early-out algorithm to significantly
  209. /// speedup things. With an array-size > 1 this speedup will be lost.
  210. struct hkKdTreeRayCastCommand
  211. {
  212. public:
  213. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkKdTreeRayCastCommand );
  214. enum { MAXIMUM_RESULTS_CAPACITY = 16 }; // the capacity has to be limited as we need to allocate this array on the SPU stack
  215. public:
  216. // ===================================================================
  217. // Input
  218. // ===================================================================
  219. /// The ray's input data.
  220. hkpWorldRayCastInput m_rayInput;
  221. /// Whether or not the raycast should terminate after the first (not necessarily closest) hit
  222. /// This can speed up queries such as line-of-sight checks, when you only care if the path is clear or not.
  223. hkBool m_stopAfterFirstHit;
  224. // ===================================================================
  225. // Output
  226. // ===================================================================
  227. /// Pointer to a hkpWorldRayCastOutput array. The user has to pre-allocate this manually. Once the job has finished, this array will hold the results.
  228. /// PLAYSTATION(R)3 note: this array will be dma'd from SPU and therefore must not be allocated on PPU stack.
  229. hkpWorldRayCastOutput* m_results;
  230. /// The maximum number of results pre-allocated in m_results.
  231. int m_resultsCapacity;
  232. /// The number of results.
  233. /// This value is only valid after the job's semaphore has been released.
  234. int m_numResultsOut;
  235. };
  236. /// An hkKdTreeRayCastBundleCommand can be used to cast four rays through the scene. Only the closest hit for each ray is kept.
  237. /// Bundling the rays together can be significantly faster than casting them individually, as long as they are close together.
  238. struct hkKdTreeRayCastBundleCommand
  239. {
  240. public:
  241. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkKdTreeRayCastBundleCommand );
  242. public:
  243. // ===================================================================
  244. // Input
  245. // ===================================================================
  246. /// The rays' input data.
  247. hkpWorldRayCastInput m_rayInput[4];
  248. /// Whether or not the raycast should terminate after the first (not necessarily closest) hit
  249. /// This can speed up queries such as line-of-sight checks, when you only care if the path is clear or not.
  250. hkBool m_stopAfterFirstHit;
  251. // ===================================================================
  252. // Output
  253. // ===================================================================
  254. /// Pointer to a hkpWorldRayCastOutput array. The user has to pre-allocate this manually. Once the job has finished, this array will hold the results.
  255. /// PLAYSTATION(R)3 note: this array will be dma'd from SPU and therefore must not be allocated on PPU stack.
  256. /// The size of this array is assumed to be 4.
  257. hkpWorldRayCastOutput* m_results;
  258. /// The number of results.
  259. /// This value is only valid after the job's semaphore has been released.
  260. HK_ALIGN16(int m_numResultsOut[4]);
  261. };
  262. /// An hkpKdTreeRayCastJob will take an arbitrary number of hkKdTreeRayCastCommand and perform the raycasts. The job is able
  263. /// to split itself into two jobs if it holds more commands than the maximum allowed number that can be executed in one go.
  264. struct hkpKdTreeRayCastJob : public hkpRayCastQueryJob
  265. {
  266. public:
  267. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeRayCastJob );
  268. enum { MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK = 256 };
  269. public:
  270. /// When creating an hkpWorldRayCastJob you have to pass in an unique jobHeader as well as an array of commands.
  271. /// The supplied semaphore is released once all commands of this job have been completed and the job has been removed from the job queue.
  272. /// The number of commands that are grouped into one task is customizable.
  273. /// PLAYSTATION(R)3 note: the jobHeader and the commandArray will be dma'd to SPU and therefore must not be allocated on PPU stack.
  274. HK_FORCE_INLINE hkpKdTreeRayCastJob(hkpRayCastQueryJobHeader* jobHeader, const hkKdTreeRayCastCommand* commandArray, int numCommands, hkSemaphoreBusyWait* semaphore, int numCommandsPerTask = MAXIMUM_NUMBER_OF_COMMANDS_PER_TASK);
  275. /// Use this method to find out onto which queue the job is supposed to go and pass the returned value to the queue's addJob() function.
  276. // hkJobQueue::JobType getJobType();
  277. HK_FORCE_INLINE hkJobQueue::JobPopFuncResult popJobTask( hkpKdTreeRayCastJob& out );
  278. public:
  279. enum {MAX_NUM_TREES = 4};
  280. // Inputs
  281. int m_numCommandsPerTask; // maximum # of commands per task; once this limit is breached a subjob is spawned
  282. const hkKdTreeRayCastCommand* m_rayCastCommandArray;
  283. int m_numRayCastCommands;
  284. const hkKdTreeRayCastBundleCommand* m_rayCastBundleCommandArray;
  285. int m_numRayCastBundleCommands;
  286. int m_numTrees;
  287. const class hkKdTree* m_trees[MAX_NUM_TREES];
  288. const class hkpCollisionFilter* m_filter;
  289. };
  290. // ===============================================================================================================================================================================================
  291. //   KD-TREE BUILDING
  292. // ===============================================================================================================================================================================================
  293. struct hkpKdTreeBuildJobFast: public hkpRayCastQueryJob
  294. {
  295. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeBuildJobFast );
  296. HK_FORCE_INLINE hkpKdTreeBuildJobFast();
  297. HK_FORCE_INLINE hkpKdTreeBuildJobFast(hkKdTree* tree);
  298. /// Use this method to find out onto which queue the job is supposed to go and pass the returned value to the queue's addJob() function.
  299. //hkJobQueue::JobType getJobType();
  300. int m_numCollidables;
  301. class hkKdTreeNode* m_treeOut;
  302. struct hkKdTreeBuildInput::ProjectedEntry* m_projEntOut;
  303. int* m_treeDepthOut;
  304. int m_nodeArraySize;
  305. int m_numAvailableEmptyNodes;
  306. hkKdTreeBuildInput::ProjectedEntry* m_entriesIn;
  307. hkKdTreeBuildInput::ProjectedEntry* m_entriesOut;
  308. };
  309. struct hkpKdTreeBuildDistributedJob: public hkpRayCastQueryJob
  310. {
  311. public:
  312. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeBuildDistributedJob );
  313. /// PLAYSTATION(R)3 note: the jobHeader and the m_colldiables and m_treeOut will be dma'd to SPU and therefore must not be allocated on PPU stack.
  314. HK_FORCE_INLINE hkpKdTreeBuildDistributedJob(hkpRayCastQueryJobHeader* jobHeader);
  315. HK_FORCE_INLINE hkpKdTreeBuildDistributedJob(hkpRayCastQueryJobHeader* jobHeader, hkKdTree* tree);
  316. /// Use this method to find out onto which queue the job is supposed to go and pass the returned value to the queue's addJob() function.
  317. //hkJobQueue::JobType getJobType();
  318. hkKdTreeBuildInput::ProjectedEntry* m_primitivesIn; // Should point to an aligned buffer in main memory of size numCollidables * sizeof(KdTreeBuilder::ProjectedEntry) 
  319. hkKdTreeBuildInput::ProjectedEntry* m_primitivesOut; // Should point to an aligned buffer in main memory of size numCollidables * sizeof(KdTreeBuilder::ProjectedEntry) 
  320. class hkKdTreeNode* m_treeOut;
  321. struct hkKdTreeBuildInput::ProjectedEntry* m_projEntOut;
  322. // depths of the 4 distributed branches
  323. int* m_branchDepthsOut;
  324. int* m_subJobSizes;
  325. int m_numPrimitives;
  326. int m_nodeArraySize;
  327. int m_numAvailableEmptyNodes;
  328. };
  329. // Creates 4 hkKdTreeBuildSetupJobs
  330. // The last hkpKdTreeBuildSetupJob to finish creates an hkpKdTreeBuildDistributedJob and adds it to the queue
  331. // The hkpKdTreeBuildDistributedJob creates 4 hkKdTreeBuildDistributedSubJobs
  332. struct hkpKdTreeBuildCoordinatorJob: public hkpKdTreeBuildDistributedJob
  333. {
  334. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeBuildCoordinatorJob );
  335. HK_FORCE_INLINE hkpKdTreeBuildCoordinatorJob(hkpRayCastQueryJobHeader* jobHeader, const hkpWorld* world);
  336. // Needed for hkpKdTreeBuildSetupJob
  337. // hkKdTreeBuildSetupJobs will use hkpKdTreeBuildCoordinatorJob::m_primitivesIn for their m_entriesOut
  338. const hkpCollidable** m_collidables;
  339. };
  340. struct hkpKdTreeBuildSetupJob: public hkpKdTreeBuildDistributedJob
  341. {
  342. public:
  343. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeBuildSetupJob );
  344. HK_FORCE_INLINE hkpKdTreeBuildSetupJob();
  345. HK_FORCE_INLINE ~hkpKdTreeBuildSetupJob() {}
  346. /// Use this method to find out onto which queue the job is supposed to go and pass the returned value to the queue's addJob() function.
  347. //hkJobQueue::JobType getJobType();
  348. const hkpCollidable** m_collidables;
  349. hkKdTreeBuildInput::ProjectedEntry* m_entriesOut;
  350. int m_startIdx;
  351. int m_endIdx;
  352. // Whether or not to spawn a new job when the last hkpKdTreeBuildSetupJob finishes
  353. int m_spawnBuildDistributedJob;
  354. };
  355. // This job is spawned internally by the hkpKdTreeBuildDistributedJob
  356. struct hkpKdTreeBuildDistributedSubJob: public hkpRayCastQueryJob
  357. {
  358. public:
  359. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpKdTreeBuildDistributedSubJob );
  360. HK_FORCE_INLINE hkpKdTreeBuildDistributedSubJob();
  361. /// Use this method to find out onto which queue the job is supposed to go and pass the returned value to the queue's addJob() function.
  362. //hkJobQueue::JobType getJobType();
  363. class hkKdTreeNode* m_treeOut;
  364. struct hkKdTreeBuildInput::ProjectedEntry* m_projEntOut;
  365. int m_currentNodeIdx;
  366. hkKdTreeBuildInput::ProjectedEntry* m_primitivesIn;
  367. hkKdTreeBuildInput::ProjectedEntry* m_primitivesOut;
  368. int m_startPrimIdx;
  369. int m_endPrimIdx;
  370. hkKdTreeBuildInput::ProjectedEntry m_bounds;
  371. int* m_branchDepthOut;
  372. int m_nodeArraySize;
  373. int m_numAvailableEmptyNodes;
  374. }; 
  375. inline void hkSetupKdTreeBuildSubJob( const hkpKdTreeBuildDistributedJob& jobIn, const hkKdTreeBuildInput::BuildRecursiveInput& splitJob, hkpKdTreeBuildDistributedSubJob& subJobOut )
  376. {
  377. subJobOut.m_sharedJobHeaderOnPpu = jobIn.m_sharedJobHeaderOnPpu;
  378. subJobOut.m_primitivesIn  = splitJob.m_buffers->m_entriesIn;
  379. subJobOut.m_primitivesOut = splitJob.m_buffers->m_entriesOut;
  380. subJobOut.m_currentNodeIdx = splitJob.m_currentNodeIdx;
  381. subJobOut.m_nodeArraySize = splitJob.m_maxNodeIdx;
  382. subJobOut.m_startPrimIdx = splitJob.m_startPrimIdx;
  383. subJobOut.m_endPrimIdx = splitJob.m_endPrimIdx;
  384. subJobOut.m_bounds = splitJob.m_bounds;
  385. subJobOut.m_semaphore = jobIn.m_semaphore;
  386. subJobOut.m_projEntOut = jobIn.m_projEntOut;
  387. }
  388. // Copy between hkpKdTreeBuildDistributedJob
  389. // Note that the size and subType aren't copied, so that we can go between subclasses
  390. inline void hkInitKdTreeBuildJob( const hkpKdTreeBuildDistributedJob& jobIn, hkpKdTreeBuildDistributedJob& subJobOut)
  391. {
  392. subJobOut.m_sharedJobHeaderOnPpu = jobIn.m_sharedJobHeaderOnPpu;
  393. subJobOut.m_collisionInput = jobIn.m_collisionInput;
  394. subJobOut.m_semaphore = jobIn.m_semaphore;
  395. subJobOut.m_primitivesIn = jobIn.m_primitivesIn;
  396. subJobOut.m_primitivesOut = jobIn.m_primitivesOut;
  397. subJobOut.m_numPrimitives = jobIn.m_numPrimitives;
  398. subJobOut.m_treeOut = jobIn.m_treeOut;
  399. subJobOut.m_projEntOut = jobIn.m_projEntOut;
  400. subJobOut.m_branchDepthsOut = jobIn.m_branchDepthsOut;
  401. subJobOut.m_nodeArraySize = jobIn.m_nodeArraySize;
  402. subJobOut.m_subJobSizes = jobIn.m_subJobSizes;
  403. subJobOut.m_numAvailableEmptyNodes = jobIn.m_numAvailableEmptyNodes;
  404. }
  405. #include <Physics/Collide/Query/Multithreaded/RayCastQuery/hkpRayCastQueryJobs.inl>
  406. #endif // HK_COLLISION_JOBS_H
  407. /*
  408. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  409. * Confidential Information of Havok.  (C) Copyright 1999-2009
  410. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  411. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  412. * rights, and intellectual property rights in the Havok software remain in
  413. * Havok and/or its suppliers.
  414. * Use of this software for evaluation purposes is subject to and indicates
  415. * acceptance of the End User licence Agreement for this product. A copy of
  416. * the license is included with this software and is also available at www.havok.com/tryhavok.
  417. */