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

其他游戏

开发平台:

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. hkpContactMgrFactory* hkpCollisionDispatcher::getContactMgrFactory(int responseA, int responseB) const
  9. {
  10. HK_ASSERT2(0x34f4a8bd,  unsigned(responseA) < HK_MAX_RESPONSE_TYPE, "Response Type A is outside [ 0 .. " << HK_MAX_RESPONSE_TYPE-1 << "]" );
  11. HK_ASSERT2(0x28956f94,  unsigned(responseB) < HK_MAX_RESPONSE_TYPE, "Response Type B is outside [ 0 .. " << HK_MAX_RESPONSE_TYPE-1 << "]" );
  12. return m_contactMgrFactory[ responseA ] [ responseB ];
  13. }
  14. hkpCollisionDispatcher::CreateFunc hkpCollisionDispatcher::getCollisionAgentCreationFunction( hkpShapeType typeA, hkpShapeType typeB, hkpCollisionDispatcher::IsAgentPredictive predictive ) const
  15. {
  16. HK_ASSERT2(0x632d17d0,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  17. HK_ASSERT2(0x40304d2d,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  18. int idx = (predictive ? m_agent2TypesPred : m_agent2Types)[typeA][typeB];
  19. return m_agent2Func[idx].m_createFunc;
  20. }
  21. hkpCollisionDispatcher::GetPenetrationsFunc hkpCollisionDispatcher::getGetPenetrationsFunc( hkpShapeType typeA, hkpShapeType typeB ) const
  22. {
  23. HK_ASSERT2(0x3bb42402,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  24. HK_ASSERT2(0x5f31c19f,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  25. int idx = m_agent2Types[typeA][typeB];
  26. return m_agent2Func[idx].m_getPenetrationsFunc;
  27. }
  28. hkpCollisionDispatcher::GetClosestPointsFunc hkpCollisionDispatcher::getGetClosestPointsFunc( hkpShapeType typeA, hkpShapeType typeB ) const
  29. {
  30. HK_ASSERT2(0x18e676ad,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  31. HK_ASSERT2(0x5e9be6aa,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  32. int idx = m_agent2Types[typeA][typeB];
  33. return m_agent2Func[idx].m_getClosestPointFunc;
  34. }
  35. hkpCollisionDispatcher::LinearCastFunc hkpCollisionDispatcher::getLinearCastFunc( hkpShapeType typeA, hkpShapeType typeB ) const
  36. {
  37. HK_ASSERT2(0x76474747,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  38. HK_ASSERT2(0x1921f43f,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  39. int idx = m_agent2Types[typeA][typeB];
  40. return m_agent2Func[idx].m_linearCastFunc;
  41. }
  42. hkBool hkpCollisionDispatcher::getIsFlipped( hkpShapeType typeA, hkpShapeType typeB ) const
  43. {
  44. HK_ASSERT2(0x76474747,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  45. HK_ASSERT2(0x1921f43f,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  46. int idx = m_agent2Types[typeA][typeB];
  47. return m_agent2Func[idx].m_isFlipped;
  48. }
  49. hkAgent3::CreateFunc   hkpCollisionDispatcher::getAgent3CreateFunc  ( hkAgent3::AgentType type )
  50. {
  51. return m_agent3Func[type ].m_createFunc;
  52. }
  53. hkAgent3::DestroyFunc  hkpCollisionDispatcher::getAgent3DestroyFunc ( hkAgent3::AgentType type )
  54. {
  55. return m_agent3Func[type ].m_destroyFunc;
  56. }
  57. hkAgent3::CleanupFunc  hkpCollisionDispatcher::getAgent3CleanupFunc ( hkAgent3::AgentType type )
  58. {
  59. return m_agent3Func[type ].m_cleanupFunc;
  60. }
  61. hkAgent3::RemovePointFunc  hkpCollisionDispatcher::getAgent3RemovePointFunc ( hkAgent3::AgentType type )
  62. {
  63. return m_agent3Func[type ].m_removePointFunc;
  64. }
  65. hkAgent3::CommitPotentialFunc  hkpCollisionDispatcher::getAgent3CommitPotentialFunc ( hkAgent3::AgentType type )
  66. {
  67. return m_agent3Func[type ].m_commitPotentialFunc;
  68. }
  69. hkAgent3::CreateZombieFunc  hkpCollisionDispatcher::getAgent3CreateZombieFunc ( hkAgent3::AgentType type )
  70. {
  71. return m_agent3Func[type ].m_createZombieFunc;
  72. }
  73. hkAgent3::ProcessFunc  hkpCollisionDispatcher::getAgent3ProcessFunc ( hkAgent3::AgentType type )
  74. {
  75. HK_ASSERT2(0xad873433, type >= 0 && type < HK_MAX_AGENT3_TYPES, "Invalid agent type");
  76. return m_agent3Func[type ].m_processFunc;
  77. }
  78. hkAgent3::SepNormalFunc hkpCollisionDispatcher::getAgent3SepNormalFunc( hkAgent3::AgentType type )
  79. {
  80. return m_agent3Func[type ].m_sepNormalFunc;
  81. }
  82. hkAgent3::Symmetric     hkpCollisionDispatcher::getAgent3Symmetric( hkAgent3::AgentType type )
  83. {
  84. return m_agent3Func[type ].m_symmetric;
  85. }
  86. hkAgent3::AgentType hkpCollisionDispatcher::getAgent3Type( hkpShapeType typeA, hkpShapeType typeB, hkBool32 predictive ) const
  87. {
  88. if ( predictive )
  89. {
  90. return m_agent3TypesPred[typeA] [ typeB ];
  91. }
  92. return m_agent3Types[typeA] [ typeB ];
  93. }
  94. hkAgent3::UpdateFilterFunc  hkpCollisionDispatcher::getAgent3UpdateFilterFunc ( hkAgent3::AgentType type ) const
  95. {
  96. return m_agent3Func[type ].m_updateFilterFunc;
  97. }
  98. hkAgent3::CalcStatisticsFunc  hkpCollisionDispatcher::getAgent3CalcStatisticsFunc ( hkAgent3::AgentType type ) const
  99. {
  100. return m_agent3Func[type ].m_calcStatisticsFunc;
  101. }
  102. hkAgent3::InvalidateTimFunc  hkpCollisionDispatcher::getAgent3InvalidateTimFunc ( hkAgent3::AgentType type )
  103. {
  104. return m_agent3Func[type ].m_invalidateTimFunc;
  105. }
  106. hkAgent3::WarpTimeFunc  hkpCollisionDispatcher::getAgent3WarpTimeFunc ( hkAgent3::AgentType type )
  107. {
  108. return m_agent3Func[type ].m_warpTimeFunc;
  109. }
  110. hkpCollisionAgent* hkpCollisionDispatcher::getNewCollisionAgent(const hkpCdBody& collA,  const hkpCdBody& collB,
  111.   const hkpCollisionInput& environment, hkpContactMgr* mgr) const
  112. {
  113. const hkpShapeType typeA = collA.getShape()->getType();
  114. const hkpShapeType typeB = collB.getShape()->getType();
  115. HK_ASSERT2(0x7f1a216c,  unsigned(typeA) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  116. HK_ASSERT2(0x6ecac429,  unsigned(typeB) < HK_MAX_SHAPE_TYPE, "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  117. //CreateFunc f = m_agentCreationTable[ typeA ] [ typeB ];
  118. hkpCollisionDispatcher::IsAgentPredictive predictive = static_cast<hkpCollisionDispatcher::IsAgentPredictive>((int)environment.m_createPredictiveAgents.val());
  119. CreateFunc f = getCollisionAgentCreationFunction(typeA, typeB, predictive);
  120. return f(collA, collB, environment, mgr);
  121. }
  122. hkBool32 hkpCollisionDispatcher::hasAlternateType( hkpShapeType type, hkpShapeType alternateType )
  123. {
  124. HK_ASSERT2(0x4fa8c66f,  unsigned(type) < sizeof(m_hasAlternateType)/sizeof(m_hasAlternateType[0]), "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  125. HK_ASSERT2(0x135739e6,  unsigned(alternateType) < sizeof(m_hasAlternateType)/sizeof(m_hasAlternateType[0]), "You can only access types between [0.." << HK_MAX_SHAPE_TYPE-1 << "]");
  126. return ( m_hasAlternateType[type] & (1<<alternateType) );
  127. }
  128. hkpCollisionDispatcher::CollisionQualityIndex hkpCollisionDispatcher::getCollisionQualityIndex( hkpCollidableQualityType a, hkpCollidableQualityType b)
  129. {
  130. HK_ASSERT2(0xf056aef3,  unsigned(a) < HK_COLLIDABLE_QUALITY_MAX, "You can only use types between [0.." << HK_COLLIDABLE_QUALITY_MAX-1 << "]");
  131. HK_ASSERT2(0xf056aef4,  unsigned(b) < HK_COLLIDABLE_QUALITY_MAX, "You can only use types between [0.." << HK_COLLIDABLE_QUALITY_MAX-1 << "]");
  132. return m_collisionQualityTable[a][b];
  133. }
  134. hkpCollisionQualityInfo* hkpCollisionDispatcher::getCollisionQualityInfo( CollisionQualityIndex index)
  135. {
  136. HK_ASSERT2(0xf056aef4,  unsigned(index) < HK_MAX_COLLISION_QUALITIES, "You can only use types between [0.." << HK_MAX_COLLISION_QUALITIES-1 << "]");
  137. return &m_collisionQualityInfo[index];
  138. }
  139. /*
  140. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  141. * Confidential Information of Havok.  (C) Copyright 1999-2009
  142. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  143. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  144. * rights, and intellectual property rights in the Havok software remain in
  145. * Havok and/or its suppliers.
  146. * Use of this software for evaluation purposes is subject to and indicates
  147. * acceptance of the End User licence Agreement for this product. A copy of
  148. * the license is included with this software and is also available at www.havok.com/tryhavok.
  149. */