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

其他游戏

开发平台:

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_GSK_BASE_AGENT_H
  9. #define HK_COLLIDE2_GSK_BASE_AGENT_H
  10. #include <Physics/Collide/Agent/Util/LinearCast/hkpIterativeLinearCastAgent.h>
  11. #include <Physics/Internal/Collide/Gjk/hkpGskCache.h>
  12. class hkpCollisionDispatcher;
  13. struct hkpExtendedGskOut;
  14. class hkpGsk;
  15. /// A gsk agent (all classes deriving from this class) handles collisions between pairs of hkConvexShapes using the GSK algorithm.
  16. /// For all shape pairs, where no direct implementation is available, the collision detection falls back
  17. /// to this hkpGskBaseAgent agent. 
  18. /// As this agent has no clue about the real surface of the shape, it only can try to sample
  19. /// (hkpConvexShape::getSupportingVertex()) the shapes involved.
  20. /// This is quite a slow process (bad), however this agent can use frame coherency very very effectively.
  21. /// As a result we get a number of properties:
  22. ///   - The first or uncached call to this agent is quite expensive (2-5 times the cached non first call)
  23. ///   - If caching is used and the objects don't penetrate, than the performance is good,
  24. ///     typically only 1.5-3 times slower than a specialized agent   (e.g. box-box or sphere-sphere) 
  25. ///   - If the objects penetrate, than a slower algorithm gets started (about 2-5 times slower than the non penetrating one)
  26. ///   - To do caching effectively, quite some memory is needed (the size of this agent is roughly 64 Bytes)
  27. ///   - If you use caching and the distance between the two objects is big, than the algorithm has an
  28. ///     early out (called tim) which is really fast (as fast as a sphere-sphere check).
  29. /// In real game scenarios the following is
  30. ///   - If two convex objects collide, this agent behaves pretty well. As the number of convex-convex object
  31. ///     pairs in a scene are often limited, memory is no big issue.
  32. ///   - if a convex object hits a triangle landscape, quite some triangle can become potential collision partners.
  33. ///     E.g. if a ragdoll with 10 bones falls onto a flowerpot with 100 individual triangles, 10 * 100 agents are
  34. ///     created, resulting in ~80 kBytes of memory consumption. If you are low on memory, you have to be very
  35. ///     careful when designing your collision geometry
  36. ///  The hkpGskBaseAgent serves as a base for all different variants of GSK agents and
  37. ///  implements all functions but the process collision call
  38. class hkpGskBaseAgent : public hkpIterativeLinearCastAgent
  39. {
  40. public:
  41. // hkpCollisionAgent interface implementation. this is not implemented and asserts
  42. virtual void processCollision(const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpProcessCollisionInput& input, hkpProcessCollisionOutput& result);
  43. // hkpCollisionAgent interface implementation.
  44. virtual void getPenetrations( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdBodyPairCollector& collector );
  45. // hkpCollisionAgent interface implementation.
  46. static void HK_CALL staticGetPenetrations( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpCdBodyPairCollector& collector );
  47. // hkpCollisionAgent interface implementation.
  48. virtual void getClosestPoints( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, class hkpCdPointCollector& collector  );
  49. // hkpCollisionAgent interface implementation.
  50. static void HK_CALL staticGetClosestPoints( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, class hkpCdPointCollector& collector  );
  51. // hkpCollisionAgent interface implementation.
  52. virtual void cleanup( hkCollisionConstraintOwner& constraintOwner );
  53. public:
  54. //
  55. // Note: to use the next two inline functions include the .inl file
  56. //
  57. /// Constructor, called by the createGskConvexConvexAgent() function.
  58. hkpGskBaseAgent(const hkpCdBody& bodyA, const hkpCdBody& bodyB, hkpContactMgr* mgr);
  59. private:
  60. friend class hkpConvexListAgent;
  61. /// Constructor, called by the createGskConvexConvexAgent() function.
  62. hkpGskBaseAgent(hkpContactMgr* mgr): hkpIterativeLinearCastAgent(mgr){}
  63. protected:
  64. HK_FORCE_INLINE hkBool _getClosestPoint( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpExtendedGskOut& output);
  65. static void HK_CALL calcSeparatingNormal( const hkpCdBody& bodyA, const hkpCdBody& bodyB, hkReal earlyOutTolerance, hkpGsk& gsk, hkVector4& separatingNormalOut );
  66. /// get the closest point
  67. hkBool getClosestPoint( const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpExtendedGskOut& output );
  68. static HK_FORCE_INLINE hkBool staticGetClosestPoint(  const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkTransform& aTb, const hkpCollisionInput& input, hkpGskCache& cache, struct hkpExtendedGskOut& output);
  69. // hkpCollisionAgent interface implementation.
  70. virtual void invalidateTim( const hkpCollisionInput& input);
  71. // hkpCollisionAgent interface implementation.
  72. virtual void warpTime(hkTime oldTime, hkTime newTime, const hkpCollisionInput& input);
  73. /// Destructor, called by cleanup().
  74. ~hkpGskBaseAgent(){}
  75. protected:
  76. hkpGskCache  m_cache;
  77. hkTime      m_timeOfSeparatingNormal;
  78. hkReal     m_allowedPenetration; // only used by the hkpPredGskfAgent
  79. hkVector4 m_separatingNormal;
  80. // not used in this class, but otherwise data would be padded and lost
  81. };
  82. #endif // HK_COLLIDE2_GSK_BASE_AGENT_H
  83. /*
  84. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  85. * Confidential Information of Havok.  (C) Copyright 1999-2009
  86. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  87. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  88. * rights, and intellectual property rights in the Havok software remain in
  89. * Havok and/or its suppliers.
  90. * Use of this software for evaluation purposes is subject to and indicates
  91. * acceptance of the End User licence Agreement for this product. A copy of
  92. * the license is included with this software and is also available at www.havok.com/tryhavok.
  93. */