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

其他游戏

开发平台:

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. inline hkpContactPointAddedEvent::hkpContactPointAddedEvent( hkpDynamicsContactMgr* contactMgr,
  9. const hkpProcessCollisionInput* collisionInput,
  10. hkpProcessCollisionOutput* collisionOutput,
  11. const hkpCdBody* a, const hkpCdBody* b,
  12. hkContactPoint* ccp, 
  13. const hkpGskCache* gskCache,
  14. hkpContactPointProperties* dcp, 
  15. hkReal projectedVelocity,
  16. Type pointType )
  17. : m_bodyA( a ),
  18. m_bodyB( b ),
  19. m_type( pointType ),
  20. m_contactPoint( ccp ),
  21. m_gskCache(gskCache),
  22. m_contactPointProperties( dcp ),
  23. m_projectedVelocity( projectedVelocity ),
  24. m_internalContactMgr( contactMgr ),
  25. m_collisionInput( collisionInput ),
  26. m_collisionOutput( collisionOutput )
  27. {
  28. m_status = HK_CONTACT_POINT_ACCEPT;
  29. }
  30. inline hkpToiPointAddedEvent::hkpToiPointAddedEvent( hkpDynamicsContactMgr* contactMgr,
  31. const hkpProcessCollisionInput* collisionInput,
  32. hkpProcessCollisionOutput* collisionOutput,
  33. const hkpCdBody* a, const hkpCdBody* b, 
  34. hkContactPoint* cp,  const hkpGskCache* gskCache, hkpContactPointProperties* cpp, 
  35. hkTime toi, hkReal projectedVelocity)
  36. :   hkpContactPointAddedEvent(  contactMgr, collisionInput, collisionOutput, a, b, cp, gskCache, cpp, projectedVelocity, TYPE_TOI), m_toi(toi)
  37. {
  38. }
  39. inline hkpManifoldPointAddedEvent::hkpManifoldPointAddedEvent( hkContactPointId contactPointId, 
  40. hkpDynamicsContactMgr* contactMgr,
  41. const hkpProcessCollisionInput* collisionInput,
  42. hkpProcessCollisionOutput* collisionOutput,
  43. const hkpCdBody* a, const hkpCdBody* b, 
  44. hkContactPoint* cp,   const hkpGskCache* gskCache, hkpContactPointProperties* cpp, 
  45. hkReal projectedVelocity)
  46. :   hkpContactPointAddedEvent(  contactMgr, collisionInput, collisionOutput, a, b, cp, gskCache, cpp, projectedVelocity, TYPE_MANIFOLD ), m_contactPointId( contactPointId )
  47. {
  48. m_nextProcessCallbackDelay = 0;
  49. }
  50. inline hkpContactPointConfirmedEvent::hkpContactPointConfirmedEvent( hkpContactPointAddedEvent::Type type,
  51. const hkpCollidable* a, const hkpCollidable* b, 
  52. const hkpSimpleContactConstraintData* data,
  53. hkContactPoint* cp, hkpContactPointProperties* cpp, 
  54. hkReal rotateNormal,
  55. hkReal projectedVelocity)
  56. :   m_collidableA(a), m_collidableB(b),
  57. m_contactPoint(cp), m_contactPointProperties( cpp ),
  58. m_rotateNormal(rotateNormal),
  59. m_projectedVelocity( projectedVelocity ),
  60. m_type(type), m_contactData(data)
  61. {
  62. }
  63. hkpContactPointRemovedEvent::hkpContactPointRemovedEvent( hkContactPointId contactPointId, 
  64. hkpDynamicsContactMgr* contactMgr,
  65. hkpConstraintOwner* constraintOwner,
  66. hkpContactPointProperties* prop, 
  67. hkpEntity* ca,
  68. hkpEntity* cb)
  69. : m_contactPointId(contactPointId),
  70. m_contactPointProperties(prop),
  71. m_entityA(ca),
  72. m_entityB(cb),
  73. m_internalContactMgr(contactMgr),
  74. m_constraintOwner( constraintOwner )
  75. {
  76. }
  77. hkpContactProcessEvent::hkpContactProcessEvent( hkpDynamicsContactMgr* contactMgr, const hkpCollidable* ca, const hkpCollidable* cb, hkpProcessCollisionData* data)
  78. : m_collidableA(ca),
  79. m_collidableB(cb),
  80. m_collisionData( data ),
  81. m_internalContactMgr(contactMgr)
  82. {
  83. }
  84. inline hkBool hkpContactPointRemovedEvent::isToi()
  85. {
  86. return m_contactPointId == HK_INVALID_CONTACT_POINT;
  87. }
  88. inline hkpToiPointAddedEvent& hkpContactPointAddedEvent::asToiEvent()
  89. {
  90. HK_ASSERT2( 0xf043dea2, m_type == this->TYPE_TOI, "Invalid upcast from hkpContactPointAddedEvent to hkpToiPointAddedEvent" );
  91. return static_cast<hkpToiPointAddedEvent&>(*this);
  92. }
  93. inline hkBool hkpContactPointAddedEvent::isToi() const
  94. {
  95. return m_type == this->TYPE_TOI;
  96. }
  97. inline hkpManifoldPointAddedEvent& hkpContactPointAddedEvent::asManifoldEvent()
  98. {
  99. HK_ASSERT2( 0xf043dea2, m_type == this->TYPE_MANIFOLD, "Invalid upcast from hkpContactPointAddedEvent to hkpManifoldPointAddedEvent" );
  100. return static_cast<hkpManifoldPointAddedEvent&>(*this);
  101. }
  102. inline hkBool hkpContactPointConfirmedEvent::isToi() const 
  103. {
  104. return m_type == hkpContactPointAddedEvent::TYPE_TOI;
  105. }
  106. #define getEntityIndex_BODY(contactMgr) 
  107. HK_ASSERT2(0xad875caa, contactMgr->getType() == hkpContactMgr::TYPE_SIMPLE_CONSTRAINT_CONTACT_MGR, "Unsupported manager type.");
  108. const hkpSimpleConstraintContactMgr* mgr = static_cast<const hkpSimpleConstraintContactMgr*>(contactMgr);
  109. return ( mgr->m_constraint.getEntityA() == entity ) ? 0 : 1;
  110. int hkpContactPointAddedEvent    ::getEntityIndex( const hkpEntity* entity ) const { getEntityIndex_BODY(m_internalContactMgr) }
  111. int hkpContactPointConfirmedEvent::getEntityIndex( const hkpEntity* entity ) const { getEntityIndex_BODY(getContactMgr()) }
  112. int hkpContactProcessEvent       ::getEntityIndex( const hkpEntity* entity ) const { getEntityIndex_BODY(m_internalContactMgr) }
  113. int hkpContactPointRemovedEvent  ::getEntityIndex( const hkpEntity* entity ) const { getEntityIndex_BODY(m_internalContactMgr) }
  114. #undef getEntityIndex_BODY
  115. #define getAtom_BODY(contactMgr) 
  116. HK_ASSERT2(0xad875caa, contactMgr->getType() == hkpContactMgr::TYPE_SIMPLE_CONSTRAINT_CONTACT_MGR, "Unsupported manager type.");
  117. return static_cast<const hkpSimpleConstraintContactMgr*>(contactMgr)->getAtom();
  118. const hkpSimpleContactConstraintAtom* hkpContactPointAddedEvent    ::getAtom() const { getAtom_BODY(m_internalContactMgr) }
  119. const hkpSimpleContactConstraintAtom* hkpContactPointConfirmedEvent::getAtom() const { getAtom_BODY(getContactMgr()) }
  120. const hkpSimpleContactConstraintAtom* hkpContactProcessEvent       ::getAtom() const { getAtom_BODY(m_internalContactMgr) }
  121. const hkpSimpleContactConstraintAtom* hkpContactPointRemovedEvent  ::getAtom() const { getAtom_BODY(m_internalContactMgr) }
  122. #undef getAtom_BODY
  123. #define getNumExtendedUserDatas_BODY 
  124. int bodyIndex = getEntityIndex(entity);
  125. const hkpSimpleContactConstraintAtom* atom = getAtom();
  126. return hkpContactPointProperties::getNumExtendedUserDatas(atom, bodyIndex);
  127. int hkpContactPointAddedEvent    ::getNumExtendedUserDatas(const hkpEntity* entity) const { getNumExtendedUserDatas_BODY }
  128. int hkpContactPointConfirmedEvent::getNumExtendedUserDatas(const hkpEntity* entity) const { getNumExtendedUserDatas_BODY }
  129. int hkpContactProcessEvent::getNumExtendedUserDatas(const hkpEntity* entity) const { getNumExtendedUserDatas_BODY }
  130. int hkpContactPointRemovedEvent  ::getNumExtendedUserDatas(const hkpEntity* entity) const { getNumExtendedUserDatas_BODY }
  131. #undef getNumExtendedUserDatas_BODY
  132. #define getExtendedUserDatas_BODY 
  133. int bodyIndex = getEntityIndex(entity);
  134. const hkpSimpleContactConstraintAtom* atom = getAtom();
  135. HK_ASSERT2(0xad67343a, numDatas == m_contactPointProperties->getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  136. for (int i = 0; i < numDatas; i++)
  137. {
  138. *datasOut = m_contactPointProperties->getExtendedUserData(atom, bodyIndex, i);
  139. datasOut++;
  140. }
  141. void hkpContactPointAddedEvent    ::getExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasOut, int numDatas) const { getExtendedUserDatas_BODY }
  142. void hkpContactPointConfirmedEvent::getExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasOut, int numDatas) const { getExtendedUserDatas_BODY }
  143. void hkpContactPointRemovedEvent  ::getExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasOut, int numDatas) const { getExtendedUserDatas_BODY }
  144. #undef getExtendedUserDatas_BODY
  145. #define setExtendedUserDatas_BODY 
  146. int bodyIndex = getEntityIndex(entity);
  147. const hkpSimpleContactConstraintAtom* atom = getAtom();
  148. HK_ASSERT2(0xad67343a, numDatas == m_contactPointProperties->getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  149. for (int i = 0; i < numDatas; i++)
  150. {
  151. m_contactPointProperties->getExtendedUserData(atom, bodyIndex, i) = *datasIn;
  152. datasIn++;
  153. }
  154. void hkpContactPointAddedEvent::setExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasIn, int numDatas) const { setExtendedUserDatas_BODY }
  155. void hkpContactPointConfirmedEvent::setExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasIn, int numDatas) const { setExtendedUserDatas_BODY }
  156. void hkpContactPointRemovedEvent::setExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasIn, int numDatas) const { setExtendedUserDatas_BODY }
  157. #undef setExtendedUserDatas_BODY
  158. void hkpContactProcessEvent::getExtendedUserDatas(int contactPointIndex, const hkpEntity* entity, hkpContactPointProperties::UserData* datasOut, int numDatas) const
  159. {
  160. int bodyIndex = getEntityIndex(entity);
  161. const hkpSimpleContactConstraintAtom* atom = getAtom();
  162. HK_ASSERT2(0xad67343a, numDatas == m_contactPointProperties[contactPointIndex]->getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  163. for (int i = 0; i < numDatas; i++)
  164. {
  165. *datasOut = m_contactPointProperties[contactPointIndex]->getExtendedUserData(atom, bodyIndex, i);
  166. datasOut++;
  167. }
  168. }
  169. void hkpContactProcessEvent::setExtendedUserDatas(int contactPointIndex, const hkpEntity* entity, hkpContactPointProperties::UserData* datasIn, int numDatas) const
  170. {
  171. int bodyIndex = getEntityIndex(entity);
  172. const hkpSimpleContactConstraintAtom* atom = getAtom();
  173. HK_ASSERT2(0xad67343a, numDatas == m_contactPointProperties[contactPointIndex]->getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  174. for (int i = 0; i < numDatas; i++)
  175. {
  176. m_contactPointProperties[contactPointIndex]->getExtendedUserData(atom, bodyIndex, i) = *datasIn;
  177. datasIn++;
  178. }
  179. }
  180. void hkpContactProcessEvent::getToiExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasOut, int numDatas) const
  181. {
  182. int bodyIndex = getEntityIndex(entity);
  183. const hkpSimpleContactConstraintAtom* atom = getAtom();
  184. HK_ASSERT2(0xad67343a, numDatas == m_collisionData->getToiProperties().getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  185. for (int i = 0; i < numDatas; i++)
  186. {
  187. *datasOut = m_collisionData->getToiProperties().getExtendedUserData(atom, bodyIndex, i);
  188. datasOut++;
  189. }
  190. }
  191. void hkpContactProcessEvent::setToiExtendedUserDatas(const hkpEntity* entity, hkpContactPointProperties::UserData* datasIn, int numDatas) const
  192. {
  193. int bodyIndex = getEntityIndex(entity);
  194. const hkpSimpleContactConstraintAtom* atom = getAtom();
  195. HK_ASSERT2(0xad67343a, numDatas == m_collisionData->getToiProperties().getNumExtendedUserDatas(atom, bodyIndex), "Buffer size doesn't match extended data size.");
  196. for (int i = 0; i < numDatas; i++)
  197. {
  198. m_collisionData->getToiProperties().getExtendedUserData(atom, bodyIndex, i) = *datasIn;
  199. datasIn++;
  200. }
  201. }
  202. /*
  203. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  204. * Confidential Information of Havok.  (C) Copyright 1999-2009
  205. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  206. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  207. * rights, and intellectual property rights in the Havok software remain in
  208. * Havok and/or its suppliers.
  209. * Use of this software for evaluation purposes is subject to and indicates
  210. * acceptance of the End User licence Agreement for this product. A copy of
  211. * the license is included with this software and is also available at www.havok.com/tryhavok.
  212. */