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

其他游戏

开发平台:

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_DYNAMICS2_WORLD_OPERATION_QUEUE_H
  9. #define HK_DYNAMICS2_WORLD_OPERATION_QUEUE_H
  10. #include <Physics/Dynamics/World/hkpWorld.h>
  11. #include <Physics/Dynamics/Motion/hkpMotion.h>
  12. #include <Physics/Dynamics/World/Util/hkpBodyOperation.h>
  13. class hkAabb;
  14. class hkpRigidBody;
  15. class hkpWorldObject;
  16. class hkpConstraintInstance;
  17. class hkpShape;
  18. class hkpConstraintCollisionFilter;
  19. namespace hkWorldOperation
  20. {
  21. enum Type
  22. {
  23. OPERATION_ID_ANY     = 0,
  24. OPERATION_ID_INVALID = 0,
  25. ENTITY_ADD,
  26. ENTITY_REMOVE,
  27. ENTITY_UPDATE_BROAD_PHASE,
  28. RIGIDBODY_SET_MOTION_TYPE,
  29. WORLD_OBJECT_SET_SHAPE,
  30. ENTITY_BATCH_ADD,
  31. ENTITY_BATCH_REMOVE,
  32. CONSTRAINT_ADD,
  33. CONSTRAINT_REMOVE,
  34. ACTION_ADD,
  35. ACTION_REMOVE,
  36. ISLAND_MERGE,       
  37. PHANTOM_ADD,
  38. PHANTOM_REMOVE,
  39. PHANTOM_BATCH_ADD,
  40. PHANTOM_BATCH_REMOVE,
  41. PHANTOM_UPDATE_BROAD_PHASE,
  42. UPDATE_FILTER_ENTITY,
  43. UPDATE_FILTER_ENTITY_PAIR,
  44. UPDATE_FILTER_PHANTOM,
  45. UPDATE_FILTER_WORLD,
  46. UPDATE_MOVED_BODY_INFO,
  47. ENTITY_BATCH_REINTEGRATE_AND_RECOLLIDE,
  48. RIGIDBODY_SET_POSITION_AND_ROTATION,
  49. RIGIDBODY_SET_LINEAR_VELOCITY,
  50. RIGIDBODY_SET_ANGULAR_VELOCITY,
  51. RIGIDBODY_APPLY_LINEAR_IMPULSE,
  52. RIGIDBODY_APPLY_POINT_IMPULSE,
  53. RIGIDBODY_APPLY_ANGULAR_IMPULSE,
  54. WORLD_OBJECT_ADD_REFERENCE,
  55. WORLD_OBJECT_REMOVE_REFERENCE,
  56. ACTIVATE_REGION,
  57. ACTIVATE_ENTITY,
  58. DEACTIVATE_ENTITY,
  59. CONSTRAINT_FILTER_BROKEN_EVENT,
  60. USER_CALLBACK
  61. };
  62. class UserCallback : public hkReferencedObject
  63. {
  64. public:
  65. virtual void worldOperationUserCallback(hkUlong userData) = 0;
  66. };
  67. // !! This is defined in hkpWorldObject.h
  68. // enum Result
  69. // {
  70. // DONE,
  71. // POSTPONED
  72. // };
  73. struct BaseOperation
  74. {
  75. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, BaseOperation );
  76. BaseOperation(Type type) : m_type(type) {}
  77. hkEnum<Type, hkUint8> m_type;
  78. private:
  79. BaseOperation();
  80. };
  81. struct AddEntity : public BaseOperation
  82. {
  83. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddEntity );
  84. AddEntity() : BaseOperation(ENTITY_ADD) {}
  85. hkpEntity* m_entity;
  86. hkpEntityActivation m_activation;
  87. };
  88. struct RemoveEntity : public BaseOperation
  89. {
  90. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemoveEntity );
  91. RemoveEntity() : BaseOperation(ENTITY_REMOVE) {}
  92. hkpEntity* m_entity;
  93. };
  94. struct SetRigidBodyMotionType : public BaseOperation
  95. {
  96. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, SetRigidBodyMotionType );
  97. SetRigidBodyMotionType() : BaseOperation(RIGIDBODY_SET_MOTION_TYPE) {}
  98. hkpRigidBody* m_rigidBody;
  99. hkEnum<hkpMotion::MotionType, hkUint8>       m_motionType;
  100. hkEnum<hkpEntityActivation, hkUint8>         m_activation;
  101. hkEnum<hkpUpdateCollisionFilterOnEntityMode, hkUint8> m_collisionFilterUpdateMode;
  102. hkEnum<hkpUpdateCollectionFilterMode, hkUint8> m_updateShapeCollections;
  103. };
  104. struct SetWorldObjectShape : public BaseOperation
  105. {
  106. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, SetWorldObjectShape );
  107. SetWorldObjectShape() : BaseOperation(WORLD_OBJECT_SET_SHAPE) {}
  108. hkpWorldObject* m_worldObject;
  109. const hkpShape* m_shape;
  110. };
  111. struct AddEntityBatch : public BaseOperation
  112. {
  113. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddEntityBatch );
  114. AddEntityBatch() : BaseOperation(ENTITY_BATCH_ADD) {}
  115. hkpEntity** m_entities;
  116. hkObjectIndex m_numEntities;
  117. hkEnum<hkpEntityActivation, hkUint8> m_activation;
  118. };
  119. struct RemoveEntityBatch : public BaseOperation
  120. {
  121. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemoveEntityBatch );
  122. RemoveEntityBatch() : BaseOperation(ENTITY_BATCH_REMOVE) {}
  123. hkpEntity** m_entities;
  124. hkObjectIndex m_numEntities;
  125. };
  126. struct AddConstraint : public BaseOperation
  127. {
  128. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddConstraint );
  129. AddConstraint() : BaseOperation(CONSTRAINT_ADD) {}
  130. hkpConstraintInstance* m_constraint;
  131. };
  132. struct RemoveConstraint : public BaseOperation
  133. {
  134. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemoveConstraint );
  135. RemoveConstraint() : BaseOperation(CONSTRAINT_REMOVE) {}
  136. hkpConstraintInstance* m_constraint;
  137. };
  138. struct AddAction : public BaseOperation
  139. {
  140. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddAction );
  141. AddAction() : BaseOperation(ACTION_ADD) {}
  142. hkpAction* m_action;
  143. };
  144. struct RemoveAction : public BaseOperation
  145. {
  146. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemoveAction );
  147. RemoveAction() : BaseOperation(ACTION_REMOVE) {}
  148. hkpAction* m_action;
  149. };
  150. struct MergeIslands : public BaseOperation
  151. {
  152. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, MergeIslands );
  153. MergeIslands() : BaseOperation(ISLAND_MERGE) {}
  154. hkpEntity* m_entities[2];
  155. };
  156. struct AddPhantom : public BaseOperation
  157. {
  158. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddPhantom );
  159. AddPhantom() : BaseOperation(PHANTOM_ADD) {}
  160. hkpPhantom* m_phantom;
  161. };
  162. struct RemovePhantom : public BaseOperation
  163. {
  164. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemovePhantom );
  165. RemovePhantom() : BaseOperation(PHANTOM_REMOVE) {}
  166. hkpPhantom* m_phantom;
  167. };
  168. struct AddPhantomBatch : public BaseOperation
  169. {
  170. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddPhantomBatch );
  171. AddPhantomBatch() : BaseOperation(PHANTOM_BATCH_ADD) {}
  172. hkpPhantom** m_phantoms;
  173. hkObjectIndex m_numPhantoms;
  174. };
  175. struct RemovePhantomBatch : public BaseOperation
  176. {
  177. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemovePhantomBatch );
  178. RemovePhantomBatch() : BaseOperation(PHANTOM_BATCH_REMOVE) {}
  179. hkpPhantom** m_phantoms;
  180. hkObjectIndex m_numPhantoms;
  181. };
  182. struct UpdateEntityBP : public BaseOperation
  183. {
  184. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateEntityBP );
  185. UpdateEntityBP() : BaseOperation(ENTITY_UPDATE_BROAD_PHASE) {}
  186. hkpEntity* m_entity;
  187. };
  188. struct UpdatePhantomBP : public BaseOperation
  189. {
  190. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdatePhantomBP );
  191. UpdatePhantomBP() : BaseOperation(PHANTOM_UPDATE_BROAD_PHASE) {}
  192. hkpPhantom* m_phantom;
  193. hkAabb* m_aabb;
  194. };
  195. struct UpdateFilterOnEntity : public BaseOperation
  196. {
  197. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateFilterOnEntity );
  198. UpdateFilterOnEntity() : BaseOperation(UPDATE_FILTER_ENTITY) {}
  199. hkpEntity* m_entity;
  200. hkEnum<hkpUpdateCollisionFilterOnEntityMode, hkUint8> m_collisionFilterUpdateMode;
  201. hkEnum<hkpUpdateCollectionFilterMode, hkUint8>  m_updateShapeCollections;
  202. };
  203. struct UpdateFilterOnEntityPair : public BaseOperation
  204. {
  205. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateFilterOnEntityPair );
  206. UpdateFilterOnEntityPair() : BaseOperation(UPDATE_FILTER_ENTITY_PAIR) {}
  207. hkpEntity* m_entityA;
  208. hkpEntity* m_entityB;
  209. };
  210. struct UpdateFilterOnPhantom : public BaseOperation
  211. {
  212. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateFilterOnPhantom );
  213. UpdateFilterOnPhantom() : BaseOperation(UPDATE_FILTER_PHANTOM) {}
  214. hkpPhantom* m_phantom;
  215. hkEnum<hkpUpdateCollectionFilterMode, hkUint8>  m_updateShapeCollections;
  216. };
  217. struct UpdateFilterOnWorld : public BaseOperation
  218. {
  219. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateFilterOnWorld );
  220. UpdateFilterOnWorld() : BaseOperation(UPDATE_FILTER_WORLD) {}
  221. hkEnum<hkpUpdateCollisionFilterOnWorldMode, hkUint8>      m_collisionFilterUpdateMode;
  222. hkEnum<hkpUpdateCollectionFilterMode, hkUint8>  m_updateShapeCollections;
  223. };
  224. struct ReintegrateAndRecollideEntityBatch : public BaseOperation
  225. {
  226. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ReintegrateAndRecollideEntityBatch );
  227. ReintegrateAndRecollideEntityBatch() : BaseOperation(ENTITY_BATCH_REINTEGRATE_AND_RECOLLIDE) {}
  228. hkpEntity**   m_entities;
  229. hkObjectIndex m_numEntities;
  230. hkUint8       m_mode;
  231. hkEnum<hkpEntityActivation, hkUint8> m_activation;
  232. };
  233. struct UpdateMovedBodyInfo : public BaseOperation
  234. {
  235. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UpdateMovedBodyInfo );
  236. UpdateMovedBodyInfo() : BaseOperation(UPDATE_MOVED_BODY_INFO) {}
  237. hkpEntity* m_entity;
  238. };
  239. struct SetRigidBodyPositionAndRotation : public BaseOperation
  240. {
  241. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, SetRigidBodyPositionAndRotation );
  242. SetRigidBodyPositionAndRotation() : BaseOperation(RIGIDBODY_SET_POSITION_AND_ROTATION) {}
  243. hkpRigidBody* m_rigidBody;
  244. hkVector4* m_positionAndRotation; // performs and external allocation
  245. };
  246. struct SetRigidBodyLinearVelocity : public BaseOperation
  247. {
  248. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, SetRigidBodyLinearVelocity );
  249. SetRigidBodyLinearVelocity() : BaseOperation(RIGIDBODY_SET_LINEAR_VELOCITY) {}
  250. hkpRigidBody* m_rigidBody;
  251. hkReal m_linearVelocity[3];
  252. };
  253. struct SetRigidBodyAngularVelocity : public BaseOperation
  254. {
  255. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, SetRigidBodyAngularVelocity );
  256. SetRigidBodyAngularVelocity() : BaseOperation(RIGIDBODY_SET_ANGULAR_VELOCITY) {}
  257. hkpRigidBody* m_rigidBody;
  258. hkReal m_angularVelocity[3];
  259. };
  260. struct ApplyRigidBodyLinearImpulse : public BaseOperation
  261. {
  262. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ApplyRigidBodyLinearImpulse );
  263. ApplyRigidBodyLinearImpulse() : BaseOperation(RIGIDBODY_APPLY_LINEAR_IMPULSE) {}
  264. hkpRigidBody* m_rigidBody;
  265. hkReal m_linearImpulse[3];
  266. };
  267. struct ApplyRigidBodyPointImpulse : public BaseOperation
  268. {
  269. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ApplyRigidBodyPointImpulse );
  270. ApplyRigidBodyPointImpulse() : BaseOperation(RIGIDBODY_APPLY_POINT_IMPULSE) {}
  271. hkpRigidBody* m_rigidBody;
  272. hkVector4* m_pointAndImpulse; // performs and external allocation
  273. };
  274. struct ApplyRigidBodyAngularImpulse : public BaseOperation
  275. {
  276. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ApplyRigidBodyAngularImpulse );
  277. ApplyRigidBodyAngularImpulse() : BaseOperation(RIGIDBODY_APPLY_ANGULAR_IMPULSE) {}
  278. hkpRigidBody* m_rigidBody;
  279. hkReal m_angularImpulse[3];
  280. };
  281. // This is a 'special' operation which actually is not postponed, but merely uses operationQueue's critical section to guarantee inter-thread safety.
  282. struct AddReference : public BaseOperation
  283. {
  284. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, AddReference );
  285. AddReference() : BaseOperation(WORLD_OBJECT_ADD_REFERENCE) {}
  286. hkpWorldObject* m_worldObject;
  287. };
  288. // This is a 'special' operation which actually is not postponed, but merely uses operationQueue's critical section to guarantee inter-thread safety.
  289. struct RemoveReference : public BaseOperation
  290. {
  291. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, RemoveReference );
  292. RemoveReference() : BaseOperation(WORLD_OBJECT_REMOVE_REFERENCE) {}
  293. hkpWorldObject* m_worldObject;
  294. };
  295. struct ActivateRegion : public BaseOperation
  296. {
  297. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ActivateRegion );
  298. ActivateRegion() : BaseOperation(ACTIVATE_REGION) {}
  299. hkAabb* m_aabb;
  300. };
  301. struct ActivateEntity : public BaseOperation 
  302. {
  303. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, ActivateEntity );
  304. ActivateEntity() : BaseOperation(ACTIVATE_ENTITY) {}
  305. hkpEntity* m_entity;
  306. };
  307. struct DeactivateEntity : public BaseOperation 
  308. {
  309. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, DeactivateEntity );
  310. DeactivateEntity() : BaseOperation(DEACTIVATE_ENTITY) {}
  311. hkpEntity* m_entity;
  312. };
  313. struct ConstraintCollisionFilterConstraintBroken: public BaseOperation
  314. {
  315. ConstraintCollisionFilterConstraintBroken() : BaseOperation( CONSTRAINT_FILTER_BROKEN_EVENT ){}
  316. hkpConstraintCollisionFilter* m_filter;
  317. hkpConstraintInstance* m_constraintInstance;
  318. hkBool    m_constraintBroken;
  319. };
  320. struct UserCallbackOperation : public BaseOperation
  321. {
  322. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, UserCallbackOperation );
  323. UserCallbackOperation() : BaseOperation(USER_CALLBACK) {}
  324. UserCallback* m_userCallback;
  325. hkUlong m_userData; // +default(0)
  326. };
  327. struct BiggestOperation : public BaseOperation
  328. {
  329. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, BiggestOperation );
  330. BiggestOperation() : BaseOperation(OPERATION_ID_INVALID) {}
  331. hkUlong dummy[3 + 1];
  332. };
  333. }
  334. struct hkpBodyOperationEntry
  335. {
  336. hkpEntity*                       m_entity;
  337. hkpBodyOperation*                m_operation;
  338. int                              m_priority;
  339. hkpBodyOperation::ExecutionState m_hint;
  340. };
  341. class hkpWorldOperationQueue
  342. {
  343. public:
  344. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_WORLD, hkpWorldOperationQueue ); 
  345. hkpWorldOperationQueue(hkpWorld* world);
  346. ~hkpWorldOperationQueue();
  347. void queueOperation(const hkWorldOperation::BaseOperation& operation);
  348. void executeAllPending();
  349. HK_FORCE_INLINE void purgeAllPending() { m_pending.clear(); }
  350. void queueBodyOperation(hkpEntity* breakingBody, hkpBodyOperation* operation, int priority, hkpBodyOperation::ExecutionState hint);
  351. void executeAllPendingBodyOperations();
  352. public:
  353. hkArray<hkWorldOperation::BiggestOperation> m_pending;
  354. hkpWorld* m_world;
  355. hkArray<hkWorldOperation::BiggestOperation> m_islandMerges;
  356. hkArray<hkpBodyOperationEntry> m_pendingBodyOperations;
  357. private:
  358. hkpWorldOperationQueue(){}
  359. };
  360. struct hkpDebugInfoOnPendingOperationQueues
  361. {
  362. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_WORLD, hkpDebugInfoOnPendingOperationQueues ); 
  363. hkpDebugInfoOnPendingOperationQueues(hkArray<hkWorldOperation::BiggestOperation>* pending) : 
  364. m_pending(pending), 
  365. m_nextPendingOperationIndex(0),
  366. m_nextQueue(HK_NULL),
  367. m_prevQueue(HK_NULL)
  368. {
  369. }
  370. hkArray<hkWorldOperation::BiggestOperation>* m_pending;
  371. int m_nextPendingOperationIndex;
  372. hkpDebugInfoOnPendingOperationQueues* m_nextQueue;
  373. hkpDebugInfoOnPendingOperationQueues* m_prevQueue;
  374. // This struct is only used by the debug code.
  375. HK_ON_DEBUG 
  376. (
  377. static void HK_CALL init(hkpWorld* world);
  378. static void HK_CALL cleanup(hkpWorld* world);
  379. static void HK_CALL updateNextPendingOperationIndex(hkpWorld* world, int index);
  380. static void HK_CALL addNextPendingOperationQueue(hkpWorld* world, hkArray<hkWorldOperation::BiggestOperation>* tmpOldPending);
  381. static void HK_CALL removeLastPendingOperationQueue(hkpWorld* world, hkArray<hkWorldOperation::BiggestOperation>* tmpOldPending);
  382. static int  HK_CALL getNumPendingOperationQueues(hkpWorld* world);
  383. static hkpDebugInfoOnPendingOperationQueues*  HK_CALL getLastQueue(hkpDebugInfoOnPendingOperationQueues* queue)
  384. {
  385. while(queue->m_nextQueue)
  386. {
  387. queue = queue->m_nextQueue;
  388. }
  389. return queue;
  390. }
  391. // Searching through pending lists:
  392. //   gotoTheLastOne
  393. //   start from the nextPendingOperationIndex and process till end
  394. //     goto previousQueue and repeat
  395. //   while previousQueue != HK_NULL
  396. static const hkWorldOperation::BaseOperation* findFirstPendingIslandMerge(hkpWorld* world, hkpSimulationIsland* isleA, hkpSimulationIsland* isleB);
  397. static const hkBool areEmpty(hkpWorld* world);
  398. )
  399. };
  400. #include <Physics/Dynamics/World/Util/hkpWorldOperationQueue.inl>
  401. #endif // HK_DYNAMICS2_WORLD_OPERATION_QUEUE_H
  402. /*
  403. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  404. * Confidential Information of Havok.  (C) Copyright 1999-2009
  405. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  406. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  407. * rights, and intellectual property rights in the Havok software remain in
  408. * Havok and/or its suppliers.
  409. * Use of this software for evaluation purposes is subject to and indicates
  410. * acceptance of the End User licence Agreement for this product. A copy of
  411. * the license is included with this software and is also available at www.havok.com/tryhavok.
  412. */