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

其他游戏

开发平台:

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_AGENT_H
  9. #define HK_COLLIDE2_COLLISION_AGENT_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Physics/ContactPoint/hkContactPoint.h>
  12. class hkpCdBody;
  13. struct hkpCollisionInput;
  14. struct hkpProcessCollisionInput;
  15. struct hkpProcessCollisionOutput;
  16. struct hkpLinearCastCollisionInput;
  17. #ifndef hkCollisionConstraintOwner
  18. class hkpConstraintOwner;
  19. # define hkCollisionConstraintOwner hkpConstraintOwner
  20. #endif
  21. class hkpCdPointCollector;
  22. class hkpCdBodyPairCollector;
  23. class hkpContactMgr;
  24. /// The base class for all collision agents, which are used for pair-wise narrowphase collision detection between shapes.
  25. /// To create and query a collision agent you need to have two hkpCollidable objects
  26. /// (which wrap the hkpShape objects together with associated transforms),
  27. /// and you need to create the agent via the hkpCollisionDispatcher.
  28. /// The collision agent provides 3 queries:
  29. /// - getPenetations (for simply determining whether two hkpCollidable objects are overlapping)
  30. /// - getClosestPoints (to determine the closest point(s) between two hkpCollidable object)
  31. /// - linearCast (to determine the contact point when casting one hkpCollidable against the other)
  32. /// Most implementations of this hkpCollisionAgent also provide static versions of these three functions.
  33. /// This allows for querying objects without an agent, however you have to use the hkpCollisionDispatcher
  34. /// to lookup the right static function.
  35. /// Note that the interface takes hkpCdBody objects. However, if you are calling the hkpCollisionAgent at the user level, you must use hkpCollidable objects
  36. /// as input (which inherit from hkpCdBody).
  37. class hkpCollisionAgent : public hkReferencedObject
  38. {
  39. public:
  40. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_AGENT);
  41. /// Checks whether the two objects are penetrating.
  42. /// The hkpCdBodyPairCollector passed in will receive a callback for each overlapping pair of shapes. You can get many callbacks
  43. /// from this call, if either of the shapes in bodyA or bodyB is a hkpShape collection.
  44. virtual void getPenetrations( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdBodyPairCollector& collector ) = 0;
  45. /// Get the closest distances between two objects.
  46. /// For each collision between leaf shapes which is a smaller distance than the collision tolerance (specified in the "input" parameter)
  47. /// the collector will receive a callback. You can get many callbacks from this call, if either of the shapes in bodyA or bodyB is a hkpShape collection.
  48. virtual void getClosestPoints( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdPointCollector& collector  ) = 0;
  49. /// Report time of impact between two objects in range [0..1].
  50. /// For each pair of child shapes that hit in the linear cast, the "castCollector" will receive a callback
  51. /// You can also supply an optional "startCollector" object which, if not HK_NULL, will receive a callback for each point at the start position
  52. /// for the two cd bodies. (In effect this is the same functionality as calling getClosestPoints, but without the overhead of making two calls).
  53. /// Note that shape radius is considered - you may want to set the radius of the cast shape to zero.
  54. virtual void linearCast( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpLinearCastCollisionInput& input, hkpCdPointCollector& castCollector, hkpCdPointCollector* startCollector ) = 0;
  55. public:
  56. /// This function is used internally by hkdynamics
  57. virtual void processCollision( const hkpCdBody& a, const hkpCdBody& b, const hkpProcessCollisionInput& input, hkpProcessCollisionOutput& result ) = 0;
  58. /// Called if the agent is no longer being used
  59. virtual void cleanup(hkCollisionConstraintOwner& info) = 0;
  60. virtual void updateShapeCollectionFilter( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkCollisionConstraintOwner& constraintOwner ) {}
  61. virtual void invalidateTim( const hkpCollisionInput& input);
  62. virtual void warpTime(hkTime oldTime, hkTime newTime, const hkpCollisionInput& input);
  63. //
  64. // Functions needed to get welding working: see hkAgent3.h file
  65. //
  66. /// remove a cached contact point. This implementation should not call any hkpContactMgr functions
  67. virtual void removePoint( hkContactPointId idToRemove );
  68. /// Convert the last invalid contact point to a real one. This implementation should not call any hkpContactMgr functions
  69. virtual void commitPotential( hkContactPointId newId );
  70. /// Flag a contact point to die at the next frame
  71. virtual void createZombie( hkContactPointId idTobecomeZombie );
  72. protected:
  73. /// The destructor is protected and must be called by the cleanup function.
  74. inline virtual ~hkpCollisionAgent();
  75. /// The constructor is protected and is called by a static creation function that is registered with the hkpCollisionDispatcher.
  76. inline hkpCollisionAgent( hkpContactMgr* contactMgr );
  77. protected:
  78. // Note: on PLAYSTATION(R)3 spu this contact mgr points to the ppu. The hkCollisionOutput has a pointer to the local copy
  79. hkpContactMgr* m_contactMgr;
  80. public:
  81. inline hkpContactMgr* getContactMgr();
  82. };
  83. #include <Physics/Collide/Agent/hkpCollisionAgent.inl>
  84. #endif // HK_COLLIDE2_COLLISION_AGENT_H
  85. /*
  86. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  87. * Confidential Information of Havok.  (C) Copyright 1999-2009
  88. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  89. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  90. * rights, and intellectual property rights in the Havok software remain in
  91. * Havok and/or its suppliers.
  92. * Use of this software for evaluation purposes is subject to and indicates
  93. * acceptance of the End User licence Agreement for this product. A copy of
  94. * the license is included with this software and is also available at www.havok.com/tryhavok.
  95. */