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

其他游戏

开发平台:

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_CONTACT_IMPULSE_LIMIT_BREACHED_LISTENER_H
  9. #define HK_DYNAMICS2_CONTACT_IMPULSE_LIMIT_BREACHED_LISTENER_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintInstance.h>
  11. #include <Physics/Dynamics/Collide/hkpSimpleConstraintContactMgr.h>
  12. class hkpContactPointProperties;
  13. class hkContactPointMaterial;
  14. /// Data used to identify breached contact points.
  15. /// This does not store any hkpShapeKey information,
  16. /// You have to retrieve the hkpShapeKey by using the userDataField in the hkContactPointMaterial structure
  17. class hkpContactImpulseLimitBreachedListenerInfo
  18. {
  19. public:
  20. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpContactImpulseLimitBreachedListenerInfo );
  21. /// Returns the contact mgr
  22. hkpSimpleConstraintContactMgr* getContactMgr() const;
  23. /// returns the array of all contact point properties
  24. HK_FORCE_INLINE hkpContactPointProperties* getContactPointProperties() const;
  25. HK_FORCE_INLINE hkContactPoint* getContactPoint() const;
  26. hkpRigidBody* getBodyA() const { return m_data.m_single.m_constraintInstance->getRigidBodyA(); }
  27. hkpRigidBody* getBodyB() const { return m_data.m_single.m_constraintInstance->getRigidBodyB(); }
  28. const hkpConstraintInstance* getConstraintInstance() const { return m_data.m_solver.m_constraintInstance; }
  29. HK_FORCE_INLINE void set( hkpConstraintInstance* constraintInstance, hkpContactPointProperties* properties, hkContactPoint* cp, bool isToi );
  30. HK_FORCE_INLINE hkBool isToi() const { return m_data.m_single.m_type == 2; }
  31. HK_FORCE_INLINE hkBool isContact() const { return m_data.m_solver.m_isContact == 1; }
  32. protected:
  33. struct SingleImpulseElem
  34. {
  35. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpContactImpulseLimitBreachedListenerInfo::SingleImpulseElem );
  36. HK_ALIGN16(hkUint16 m_type); // 1
  37. hkUint16 m_isContact;
  38. hkpConstraintInstance* m_constraintInstance;
  39. hkpContactPointProperties* m_properties;
  40. hkContactPoint* m_contactPoint;
  41. };
  42. union ListenerData
  43. {
  44. hkpImpulseLimitBreachedElem m_solver;
  45. SingleImpulseElem          m_single;
  46. };
  47. ListenerData m_data;
  48. };
  49. /// This 
  50. class hkpContactImpulseLimitBreachedListener
  51. {
  52. public:
  53. virtual ~hkpContactImpulseLimitBreachedListener(){}
  54. virtual void contactImpulseLimitBreachedCallback( const hkpContactImpulseLimitBreachedListenerInfo* breachedContacts, int numBreachedContacts ) = 0;
  55. };
  56. HK_FORCE_INLINE hkpSimpleConstraintContactMgr* hkpContactImpulseLimitBreachedListenerInfo::getContactMgr() const
  57. {
  58. const hkUlong offset = hkUlong(-HK_OFFSET_OF( hkpSimpleConstraintContactMgr, m_constraint ));
  59. return (hkpSimpleConstraintContactMgr*)hkAddByteOffset( m_data.m_single.m_constraintInstance, offset );
  60. }
  61. hkpContactPointProperties *hkpContactImpulseLimitBreachedListenerInfo::getContactPointProperties() const
  62. {
  63. if ( m_data.m_single.m_type != 0)
  64. {
  65. return m_data.m_single.m_properties;
  66. }
  67. return static_cast<hkpContactPointProperties*>( m_data.m_solver.m_solverResult );
  68. }
  69. hkContactPoint *hkpContactImpulseLimitBreachedListenerInfo::getContactPoint() const
  70. {
  71. if ( m_data.m_single.m_type != 0)
  72. {
  73. return m_data.m_single.m_contactPoint;
  74. }
  75. hkpSimpleConstraintContactMgr* mgr = getContactMgr();
  76. hkpSimpleContactConstraintAtom* atom = mgr->m_contactConstraintData.m_atom;
  77. const hkpContactPointPropertiesStream* cpp = reinterpret_cast<hkpContactPointPropertiesStream*>( m_data.m_solver.m_solverResult );
  78. hkUlong contactIndex = hkGetByteOffset(atom->getContactPointPropertiesStream(), cpp) / atom->getContactPointPropertiesStriding() ;
  79. hkContactPoint* cp = &atom->getContactPoints()[contactIndex];
  80. return cp;
  81. }
  82. void hkpContactImpulseLimitBreachedListenerInfo::set(hkpConstraintInstance* constraintInstance, hkpContactPointProperties* properties, hkContactPoint* cp, bool toi)
  83. {
  84. m_data.m_single.m_type = 1 + toi;
  85. m_data.m_single.m_isContact = true;
  86. m_data.m_single.m_constraintInstance = constraintInstance;
  87. m_data.m_single.m_contactPoint = cp;
  88. m_data.m_single.m_properties = properties;
  89. }
  90. #endif // HK_DYNAMICS2_CONTACT_IMPULSE_LIMIT_BREACHED_LISTENER_H
  91. /*
  92. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  93. * Confidential Information of Havok.  (C) Copyright 1999-2009
  94. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  95. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  96. * rights, and intellectual property rights in the Havok software remain in
  97. * Havok and/or its suppliers.
  98. * Use of this software for evaluation purposes is subject to and indicates
  99. * acceptance of the End User licence Agreement for this product. A copy of
  100. * the license is included with this software and is also available at www.havok.com/tryhavok.
  101. */