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

其他游戏

开发平台:

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_COLLIDE2_COLLISION_DISPATCHER_H
  9. #define HK_COLLIDE2_COLLISION_DISPATCHER_H
  10. #include <Physics/Collide/Agent/Collidable/hkpCdBody.h>
  11. #include <Physics/Collide/Shape/hkpShape.h>
  12. #include <Physics/Internal/Collide/Agent3/hkpAgent3.h>
  13. #include <Physics/Collide/Agent/Collidable/hkpCollidableQualityType.h>
  14. #include <Physics/Collide/Agent/hkpCollisionQualityInfo.h>
  15. #include <Physics/Collide/Agent/hkpCollisionInput.h>
  16. class hkpCollidable;
  17. class hkpCollisionAgent;
  18. class hkpContactMgr;
  19. struct hkpCollisionInput;
  20. class hkpContactMgrFactory;
  21. class hkpCdPointCollector;
  22. enum hkpShapeType;
  23. class hkpCdPointCollector;
  24. class hkpCdBodyPairCollector;
  25. struct hkpLinearCastCollisionInput;
  26. enum hkpCollisionDispatcherAgentType
  27. {
  28. HK_AGENT_TYPE_NULL = 0,
  29. HK_AGENT_TYPE_BRIDGE = 1
  30. };
  31. /// This class is used to find the correct function which performs collision detection between pairs of shapes.
  32. /// It's based on the following rules:
  33. ///  - Each shapes has a type
  34. ///  - For each pair of types, there must be a function registered to handle this pair of types
  35. ///
  36. /// However implementing all combinations would be quite complex. Therefore we allow for:
  37. ///  - shapes to actually subclass other more basic shapes (e.g. a box is a convex shape)
  38. ///    and then reuse a common base function
  39. ///  - functions, which work on a pair of shapes, where only one shape type is used (e.g. hkpTransformShape, hkpBvTreeShape)
  40. ///    and the other ignored (HK_SHAPE_ALL).
  41. ///    in this case we have to register a function with a pair of types ( HK_SHAPE_MY_TYPE, HK_SHAPE_ALL )
  42. /// 
  43. /// To implement this behavior, the user has to
  44. ///  - first declare the shape inheritance hierarchy by calling registerAlternateShapeType for each inheritance link
  45. ///  - register all functions which handle collisions between two shape types.
  46. /// 
  47. /// Note: You still cannot call registerAlternateShapeType after you registered your first agent
  48. /// <br>
  49. /// Also this class can dispatch hkpContactMgrFactory s. This dispatch is quite simple as there is no inheritance.
  50. /// Also this class combines two hkCollidableQualityTypes into a hkCdInteractionQualtityType
  51. /// <br>
  52. /// In addition to that, this class also dispatches a pair of hkpCollidableQualityType into a hkpCollisionQualityInfo structure
  53. class hkpCollisionDispatcher : public hkReferencedObject
  54. {
  55. public:
  56. enum {
  57. HK_MAX_RESPONSE_TYPE = 8,
  58. HK_MAX_SHAPE_TYPE    = 32,
  59. HK_MAX_AGENT2_TYPES  = 64,
  60. HK_MAX_AGENT3_TYPES = 16,
  61. HK_MAX_COLLISION_QUALITIES = 8
  62. };
  63. public:
  64. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CDINFO);
  65. /// A function to create a collision agent
  66. typedef hkpCollisionAgent* (HK_CALL *CreateFunc)(const hkpCdBody& collA, const hkpCdBody& collB, const hkpCollisionInput& env, hkpContactMgr* mgr);
  67. /// A function to check whether two objects are penetrating
  68. typedef void (HK_CALL *GetPenetrationsFunc)     (const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdBodyPairCollector& collector );
  69. /// A function to find the closest points
  70. typedef void (HK_CALL *GetClosestPointsFunc)   (const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdPointCollector& output );
  71. /// A function to do linear casts
  72. typedef void (HK_CALL *LinearCastFunc)         (const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpLinearCastCollisionInput& input, hkpCdPointCollector& castCollector, hkpCdPointCollector* startCollector );
  73. /// For backward compatibility
  74. typedef CreateFunc CollisionAgentCreationFunction;
  75. typedef hkChar CollisionQualityIndex;
  76. /// A helper struct, which is used as an input to registerCollisionAgent
  77. struct AgentFuncs
  78. {
  79. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, AgentFuncs );
  80. /// The agent creation functions
  81. CreateFunc           m_createFunc;
  82. /// A static penetration function
  83. GetPenetrationsFunc  m_getPenetrationsFunc;
  84. /// A static get closest distance functions
  85. GetClosestPointsFunc m_getClosestPointFunc;
  86. /// A static linear cast function
  87. LinearCastFunc       m_linearCastFunc;
  88. /// A flag telling the system, whether a symmetric agent is involved.
  89. /// If the collision detector sees the flag to be set to true, it tries
  90. /// to swap objectA with objectB
  91. hkBool  m_isFlipped;
  92. /// A flag indicating whether the object can handle continuous collision
  93. hkBool  m_isPredictive;
  94. AgentFuncs() : m_isFlipped(false), m_isPredictive(false) {}
  95. };
  96. /// A helper struct, which is used as an input to registerCollisionAgent
  97. /// for streamed agents. Read hkAgent3 for details
  98. struct Agent3Funcs
  99. {
  100. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, Agent3Funcs );
  101. Agent3Funcs() : m_isPredictive(false), m_ignoreSymmetricVersion(false), m_reusePreviousEntry(false)
  102. {
  103. m_updateFilterFunc = HK_NULL;
  104. m_calcStatisticsFunc= HK_NULL;
  105. m_invalidateTimFunc = HK_NULL;
  106. m_warpTimeFunc = HK_NULL;
  107. m_sepNormalFunc = HK_NULL;
  108. }
  109. HK_ALIGN16(hkAgent3::CreateFunc      m_createFunc);
  110. // Called when the agent is destoyed
  111. hkAgent3::DestroyFunc     m_destroyFunc;
  112. // Called when the agent has all points removed.
  113. // Info: This is only used when you have Tim's -- and there fore m_sepNormalFunc assigned.
  114. hkAgent3::CleanupFunc     m_cleanupFunc;
  115. // Point remove/commit/zombie functions used for welding
  116. hkAgent3::RemovePointFunc m_removePointFunc;
  117. hkAgent3::CommitPotentialFunc m_commitPotentialFunc;
  118. hkAgent3::CreateZombieFunc  m_createZombieFunc;
  119. // Should be implemented for all agents
  120. hkAgent3::UpdateFilterFunc  m_updateFilterFunc;
  121. hkAgent3::CalcStatisticsFunc  m_calcStatisticsFunc;
  122. hkAgent3::InvalidateTimFunc m_invalidateTimFunc;
  123. hkAgent3::WarpTimeFunc      m_warpTimeFunc;
  124. // Only needed if the agent uses Tim's
  125. hkAgent3::SepNormalFunc     m_sepNormalFunc;
  126. hkAgent3::ProcessFunc       m_processFunc;
  127. hkBool m_isPredictive;
  128. hkBool m_ignoreSymmetricVersion;
  129. hkBool m_reusePreviousEntry;
  130. };
  131. struct InitCollisionQualityInfo
  132. {
  133. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, InitCollisionQualityInfo );
  134. hkReal m_gravityLength;
  135. hkReal m_collisionTolerance;
  136. hkReal m_minDeltaTime;
  137. hkReal m_maxLinearVelocity;
  138. hkReal m_numToisTillAllowedPenetrationSimplifiedToi;
  139. hkReal m_numToisTillAllowedPenetrationToi;
  140. hkReal m_numToisTillAllowedPenetrationToiHigher;
  141. hkReal m_numToisTillAllowedPenetrationToiForced;
  142. hkUint16 m_defaultConstraintPriority;
  143. hkUint16 m_toiConstraintPriority;
  144. hkUint16 m_toiHigherConstraintPriority;
  145. hkUint16 m_toiForcedConstraintPriority;
  146. hkBool m_wantContinuousCollisionDetection;
  147. hkBool m_enableNegativeManifoldTims;
  148. hkBool m_enableNegativeToleranceToCreateNon4dContacts;
  149. hkBool m_enableToiWeldRejection;
  150. };
  151. enum TableType
  152. {
  153. TABLE_TYPE_AGENT2,
  154. TABLE_TYPE_AGENT2_PRED,
  155. TABLE_TYPE_AGENT3,
  156. TABLE_TYPE_AGENT3_PRED
  157. };
  158. enum IsAgentPredictive
  159. {
  160. IS_NOT_PREDICTIVE,
  161. IS_PREDICTIVE
  162. };
  163. public:
  164. /// create the collision dispatcher
  165. hkpCollisionDispatcher( CreateFunc defaultCreationFunction, hkpContactMgrFactory* defaultContactMgrFactory );
  166. /// delete it
  167. ~hkpCollisionDispatcher();
  168. //
  169. // Shape Types
  170. //
  171. /// register a shape type and a possible alternative shape type, which
  172. /// is used if the first type does not give a valid answer
  173. /// Note: you should register all alternate shapes BEFORE you can register the collision
  174. /// agent creation functions (otherwise it gets very CPU intensive).<br>
  175. /// <br>
  176. /// Background:<br>
  177. /// Since havok2.2, the inheritance of shapes is defined in the collision dispatcher,
  178. /// not in the shapes. That means before registering agents, all shape types and their
  179. /// alternate(=superClass) type needs to be registered.
  180. /// - Example: A triangle is a convex shape, so in order for the convex agent to 
  181. ///   pick up a triangle the following lines must precede the registration of the convex
  182. ///   agent: dispatcher->registerAlternateShapeTypes( HK_SHAPE_TRIANGLE, HK_SHAPE_CONVEX );
  183. void registerAlternateShapeType( hkpShapeType primaryType, hkpShapeType alternateType );
  184. /// returns true, if type has a path to alternateType or type == alternateType
  185. /// Note: This function is really fast
  186. inline hkBool32 hasAlternateType( hkpShapeType type, hkpShapeType alternateType );
  187. //
  188. // Agents
  189. //
  190. /// register an agent for a given pair of shape types, use HK_SHAPE_ALL for one type if you want to register
  191. /// the other type with all agents.
  192. /// Later calls to this functions override existing values, that means later calls automatically have a higher priority.
  193. ///  - Note: You should register all shape alternate Types before you call registerCollisionAgent()
  194. ///  - Note: A call to this function is slow
  195. ///  - Note: Agent using the streaming technology must be registered just after the non
  196. ///          streaming version is registered
  197. /// 
  198. /// Build in checks:<br>
  199. /// Example: Say you register a fast sphere-sphere agent first and than you register a slow convex-convex agent.
  200. ///  As later registrations overrides earlier, the convex-convex agent will actually override the
  201. ///  sphere-sphere one (given that there is a rule that a sphere is a convex object). Bad :-( <br>
  202. ///          Unfortunately this  wrong registration is usually difficult to find.<br>
  203. ///
  204. /// Solution:
  205. ///  - Currently the program checks, if a more general agent overrides an more specialized agent and asserts.
  206. ///    However in some cases the check does not work, so you can disable it by calling setEnableChecks(false). 
  207. ///  - Call debugPrintTable() to get a text file which shows you check the contents of the table by hand
  208. void registerCollisionAgent( AgentFuncs& f, hkpShapeType typeA, hkpShapeType typeB );
  209. /// Register an agent with the collision dispatcher. Does not register bridge agent.
  210. /// This means this agent will only be used
  211. /// - if static collision queries are used or
  212. /// - if agent is used by a phantom or
  213. /// - if the agent is owned by a transform agent
  214. void registerCollisionAgent2( AgentFuncs& f, hkpShapeType typeA, hkpShapeType typeB );
  215. /// disable checks if you want to force override existing entries when calling registerCollisionAgent.
  216. /// Don't forget to re-enabling the checks, once you have done your unchecked operations.
  217. void setEnableChecks( hkBool checkEnabled);
  218. /// Debug print of the current table entries
  219. void debugPrintTable();
  220. /// Disables debugging. This should be done at the end of registering all agents to save some memory.
  221. /// Note: Checking is only enabled in debug
  222. void disableDebugging();
  223. /// returns a new collision agent for a collidable pair
  224. HK_FORCE_INLINE hkpCollisionAgent* getNewCollisionAgent( const hkpCdBody& a, const hkpCdBody& b, const hkpCollisionInput& env, hkpContactMgr* mgr) const;
  225. /// get the agent creation function registered for a given pair. 
  226. HK_FORCE_INLINE CreateFunc getCollisionAgentCreationFunction( hkpShapeType typeA, hkpShapeType typeB, IsAgentPredictive predictive ) const;
  227. /// get the functions, which allows you to query two collision collidables for penetration cases
  228. HK_FORCE_INLINE GetPenetrationsFunc getGetPenetrationsFunc( hkpShapeType typeA, hkpShapeType typeB ) const;
  229. /// get the functions, which allows you to query two collision collidables for penetration cases
  230. HK_FORCE_INLINE GetClosestPointsFunc getGetClosestPointsFunc( hkpShapeType typeA, hkpShapeType typeB ) const;
  231. /// get the functions, which allows you to query two collision collidables for penetration cases
  232. HK_FORCE_INLINE LinearCastFunc getLinearCastFunc( hkpShapeType typeA, hkpShapeType typeB ) const;
  233. HK_FORCE_INLINE hkBool getIsFlipped( hkpShapeType typeA, hkpShapeType typeB ) const;
  234. /// Same as registerCollisionAgent, but for the hkAgent3 technology
  235. /// if reusePreviousEntry is set to true, than f is ignored and the f of previous call to registerAgent3 is used
  236. int registerAgent3( Agent3Funcs& f, hkpShapeType typeA, hkpShapeType typeB );
  237. HK_FORCE_INLINE hkAgent3::AgentType getAgent3Type( hkpShapeType typeA, hkpShapeType typeB, hkBool32 predicitve ) const;
  238. HK_FORCE_INLINE hkAgent3::CreateFunc           getAgent3CreateFunc  ( hkAgent3::AgentType type );
  239. HK_FORCE_INLINE hkAgent3::DestroyFunc          getAgent3DestroyFunc ( hkAgent3::AgentType type );
  240. HK_FORCE_INLINE hkAgent3::CleanupFunc          getAgent3CleanupFunc ( hkAgent3::AgentType type );
  241. HK_FORCE_INLINE hkAgent3::RemovePointFunc      getAgent3RemovePointFunc ( hkAgent3::AgentType type );
  242. HK_FORCE_INLINE hkAgent3::CommitPotentialFunc  getAgent3CommitPotentialFunc ( hkAgent3::AgentType type );
  243. HK_FORCE_INLINE hkAgent3::CreateZombieFunc     getAgent3CreateZombieFunc ( hkAgent3::AgentType type );
  244. HK_FORCE_INLINE hkAgent3::UpdateFilterFunc     getAgent3UpdateFilterFunc ( hkAgent3::AgentType type ) const;
  245. HK_FORCE_INLINE hkAgent3::CalcStatisticsFunc   getAgent3CalcStatisticsFunc ( hkAgent3::AgentType type ) const;
  246. HK_FORCE_INLINE hkAgent3::InvalidateTimFunc    getAgent3InvalidateTimFunc ( hkAgent3::AgentType type );
  247. HK_FORCE_INLINE hkAgent3::WarpTimeFunc        getAgent3WarpTimeFunc ( hkAgent3::AgentType type );
  248. HK_FORCE_INLINE hkAgent3::ProcessFunc          getAgent3ProcessFunc ( hkAgent3::AgentType type );
  249. HK_FORCE_INLINE hkAgent3::SepNormalFunc        getAgent3SepNormalFunc( hkAgent3::AgentType type );
  250. HK_FORCE_INLINE hkAgent3::Symmetric            getAgent3Symmetric( hkAgent3::AgentType type );
  251. //
  252. // Contact Mgrs
  253. //
  254. /// register a contact factory
  255. void registerContactMgrFactory( hkpContactMgrFactory*, int responseA, int responseB );
  256. /// Get a contact manager factory - used to create a contact manager.
  257. HK_FORCE_INLINE hkpContactMgrFactory* getContactMgrFactory(int responseA, int responseB) const;
  258. /// register a contact factory with all other types: Note overrides existing entries
  259. void registerContactMgrFactoryWithAll( hkpContactMgrFactory*, int responseA );
  260. //
  261. // hkpCollisionQualityInfo
  262. //
  263. HK_FORCE_INLINE CollisionQualityIndex getCollisionQualityIndex( hkpCollidableQualityType a, hkpCollidableQualityType b);
  264. HK_FORCE_INLINE hkpCollisionQualityInfo* getCollisionQualityInfo( CollisionQualityIndex index );
  265. void initCollisionQualityInfo( InitCollisionQualityInfo& input );
  266. // hkReferencedObject interface implementation
  267. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls ) const;
  268. public:
  269. struct ShapeInheritance
  270. {
  271. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, ShapeInheritance );
  272. hkpShapeType m_primaryType;
  273. hkpShapeType m_alternateType;
  274. };
  275. struct AgentEntry
  276. {
  277. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, AgentEntry );
  278. hkpShapeType m_typeA;
  279. hkpShapeType m_typeB;
  280. hkBool m_checkEnabled;
  281. AgentFuncs  m_createFunc;
  282. };
  283. struct Agent3Entry
  284. {
  285. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, Agent3Entry );
  286. hkpShapeType m_typeA;
  287. hkpShapeType m_typeB;
  288. hkBool m_checkEnabled;
  289. Agent3Funcs  m_funcs;
  290. };
  291. // A helper struct, which is used as an input to registerFullAgent
  292. struct Agent3FuncsIntern: public Agent3Funcs
  293. {
  294. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, Agent3FuncsIntern );
  295. hkAgent3::Symmetric       m_symmetric;
  296. };
  297. struct DebugEntry
  298. {
  299. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, DebugEntry );
  300. /// Shape Type A
  301. char m_typeA;
  302. /// Shape Type B
  303. char m_typeB;
  304. /// The sum of all shape rules which have to be applied to get to this entry.
  305. /// E.g. we have two spheres (m_typeAB = HK_SHAPE_SPHERE)
  306. ///  - if we register a hkSphereSphere Agent, no indirections are needed and the priority is 0
  307. ///  - if we register a hkSphereConvex Agent, 1 indirections is needed and the priority is 1
  308. ///  - if we register a hkConvexConvex Agent, 2 indirections are needed and the priority is 2
  309. ///  - if we register a hkSphere-All Agent, 1 indirections is needed and the priority is 1
  310. char m_priority;
  311. };
  312. typedef DebugEntry DebugTable[HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE];
  313. protected:
  314. void internalRegisterCollisionAgent( hkUchar agentTypesTable[HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE], int agentType, hkpShapeType typeA, hkpShapeType typeB, hkpShapeType origA, hkpShapeType origB, DebugTable *debugTable, int recursionDepth );
  315. void updateHasAlternateType( hkpShapeType primaryType, hkpShapeType alternateType, int depth );
  316. void resetCreationFunctions();
  317. public:
  318. /// Collision quality setting for a collision between a pair of objects
  319. // values must be corresponding to hkpConstraintInstance::ConstraintPriority
  320. enum CollisionQualityLevel
  321. {
  322. /// Invalid.
  323. COLLISION_QUALITY_INVALID,
  324. /// Use this to get discrete stepping behavior or for fixed objects.
  325. COLLISION_QUALITY_PSI,
  326. /// Use this to avoid fast-moving debris object penetrating through the ground and other static objects.
  327. /// This only backsteps the debris objects.
  328. COLLISION_QUALITY_SIMPLIFIED_TOI,
  329. /// Application: Ensure non-penetration between pairs of non-fixed objects
  330. /// Use this if you want to prevent bullet through paper
  331. COLLISION_QUALITY_TOI,
  332. /// Same as above.
  333. /// Application: Ensure non-penetration between moving objects & fixed objects
  334. /// Tech. Info: This ensures constraints to be treated as 'higher-priority' in PSI solver
  335. COLLISION_QUALITY_TOI_HIGHER,
  336. /// Application: Ensure and monitor non-penetration between moving objects & fixed objects.
  337. ///              You receive callbacks when penetration occurs.
  338. /// Tech. Info: This ensures constraints to be treated as 'higher-priority' in PSI & TOI solvers
  339. ///             plus 'forced' during TOI handling
  340. COLLISION_QUALITY_TOI_FORCED,
  341. /// This quality is the same as COLLISION_QUALITY_TOI_FORCED with some additional tolerances
  342. /// set to enable more accurate generation of contact points.
  343. COLLISION_QUALITY_CHARACTER,
  344. /// Only used internally for expanding contact manifold in hkpContinuousSimulation::updateManifold().
  345. /// Will try to collect as many contact points as possible.
  346. COLLISION_QUALITY_TMP_EXPAND_MANIFOLD
  347. };
  348. CreateFunc m_defaultCollisionAgent;
  349. hkpContactMgrFactory* m_contactMgrFactory[HK_MAX_RESPONSE_TYPE][HK_MAX_RESPONSE_TYPE];
  350. /// for each shapeType T,  m_hasAlternateType[T] has a bit set for each superclass
  351. HK_ALIGN16(hkUint32 m_hasAlternateType[ HK_MAX_SHAPE_TYPE ]);
  352. /// CollidableType x collidableType x {0, Pred} -> agentType dispatching for agent2 & agent3 technology.
  353. ///  - m_agent2Types hold the proper agent's index for a given collision pair for non predictive collision detection
  354.     ///  - m_agent2TypesPred .................................................... for predictive collision detection
  355. int m_numAgent2Types;
  356. HK_ALIGN16(hkUchar     m_agent2Types    [HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE]);
  357. hkUchar     m_agent2TypesPred[HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE];
  358. AgentFuncs m_agent2Func     [ HK_MAX_AGENT2_TYPES ];
  359. int m_numAgent3Types;
  360. HK_ALIGN16(hkUchar m_agent3Types    [HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE]);
  361. HK_ALIGN16(hkUchar m_agent3TypesPred[HK_MAX_SHAPE_TYPE][HK_MAX_SHAPE_TYPE]);
  362. Agent3FuncsIntern       m_agent3Func     [ HK_MAX_AGENT3_TYPES ];
  363. /// CollidableQuality x collidableQuality -> collisionQuality dispatching
  364. HK_ALIGN16(hkChar m_collisionQualityTable[ HK_COLLIDABLE_QUALITY_MAX][HK_COLLIDABLE_QUALITY_MAX]);
  365. HK_ALIGN16(hkpCollisionQualityInfo  m_collisionQualityInfo[ HK_MAX_COLLISION_QUALITIES ]);
  366. /// This is set to true if there is at least one call to registerCollisionAgent() made
  367. hkBool m_collisionAgentRegistered;
  368. hkBool m_agent3Registered;
  369. hkBool m_midphaseAgent3Registered;
  370. /// If set, produces an Assert whenever a more-general agent overrides a more-specific agent in dispatch tables.
  371. hkBool m_checkEnabled;
  372. /// All alternate shape rules (a simple collection of all registerAlternateShapeType() calls )
  373. hkArray<ShapeInheritance> m_shapeInheritance;
  374. /// Additional information to the main tables. This allows for debugging 
  375. /// a wrong order of registering agents, see DebugEntry
  376. DebugTable *m_debugAgent2Table;
  377. DebugTable *m_debugAgent2TablePred;
  378. DebugTable *m_debugAgent3Table;
  379. DebugTable *m_debugAgent3TablePred;
  380. public:
  381. //
  382. // The following two members are only used when you call hkpWorld::getCinfo(...)
  383. // They're set upon dispatcher initialization.
  384. //
  385. hkReal m_expectedMaxLinearVelocity;
  386. hkReal m_expectedMinPsiDeltaTime;
  387. };
  388. #include <Physics/Collide/Dispatch/hkpCollisionDispatcher.inl>
  389. #endif // HK_COLLIDE2_COLLISION_DISPATCHER_H
  390. /*
  391. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  392. * Confidential Information of Havok.  (C) Copyright 1999-2009
  393. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  394. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  395. * rights, and intellectual property rights in the Havok software remain in
  396. * Havok and/or its suppliers.
  397. * Use of this software for evaluation purposes is subject to and indicates
  398. * acceptance of the End User licence Agreement for this product. A copy of
  399. * the license is included with this software and is also available at www.havok.com/tryhavok.
  400. */