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

其他游戏

开发平台:

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 const hkpProcessCollisionInput* hkpWorld::getCollisionInput() const
  9. {
  10. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  11. return m_collisionInput;
  12. }
  13. inline hkpSolverInfo* hkpWorld::getSolverInfo()
  14. {
  15. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  16. return &m_dynamicsStepInfo.m_solverInfo;
  17. }
  18. inline hkpProcessCollisionInput* hkpWorld::getCollisionInputRw()
  19. {
  20. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  21. return m_collisionInput;
  22. }
  23. inline hkpBroadPhase* hkpWorld::getBroadPhase() 
  24. {
  25. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  26. return m_broadPhase;
  27. }
  28. inline const hkpBroadPhase* hkpWorld::getBroadPhase() const
  29. {
  30. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  31. return m_broadPhase;
  32. }
  33. inline hkpCollisionDispatcher* hkpWorld::getCollisionDispatcher() const
  34. {
  35. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  36. return m_collisionDispatcher;
  37. }
  38. inline const hkVector4& hkpWorld::getGravity() const
  39. {
  40. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  41. return m_gravity;
  42. }
  43. hkpRigidBody* hkpWorld::getFixedRigidBody()
  44. {
  45. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  46. return m_fixedRigidBody;
  47. }
  48. const hkpRigidBody* hkpWorld::getFixedRigidBody() const
  49. {
  50. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  51. return m_fixedRigidBody;
  52. }
  53. inline const hkpSimulationIsland* hkpWorld::getFixedIsland() const
  54. {
  55. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  56. return m_fixedIsland;
  57. }
  58. inline const hkArray<hkpSimulationIsland*>& hkpWorld::getInactiveSimulationIslands() const
  59. {
  60. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  61. return m_inactiveSimulationIslands;
  62. }
  63. const hkArray<hkpSimulationIsland*>& hkpWorld::getActiveSimulationIslands() const
  64. {
  65. #ifdef HK_DEBUG_MULTI_THREADING
  66. checkAccessGetActiveSimulationIslands();
  67. #endif
  68. return m_activeSimulationIslands;
  69. }
  70. inline const hkArray<hkpPhantom*>& hkpWorld::getPhantoms() const
  71. {
  72. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  73. return m_phantoms;
  74. }
  75. inline const hkpCollisionFilter* hkpWorld::getCollisionFilter() const
  76. {
  77. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  78. return m_collisionFilter;
  79. }
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. //
  82. //  Locking the world, and delaying worldOperations
  83. //
  84. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. void hkpWorld::lockCriticalOperations()
  86. {
  87. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  88. m_criticalOperationsLockCount++;
  89. HK_ASSERT2(0xad000203, m_criticalOperationsLockCount <= 100, "Internal Error: m_criticalOperationsLockCount corrupted (count went above 100)");
  90. }
  91. void hkpWorld::unlockCriticalOperations()
  92. {
  93. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  94. m_criticalOperationsLockCount--;
  95. HK_ASSERT2(0xad000202, m_criticalOperationsLockCount >= 0, "Internal Error: m_criticalOperationsLockCount corrupted (count went below 0)");
  96. }
  97. int hkpWorld::areCriticalOperationsLocked( ) const
  98. {
  99. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  100. HK_ASSERT2(0xad000200, m_criticalOperationsAllowed, "Warning: areCriticalOperationsLocked() queried while critical operations are disallowed (... and this query is (very probably) only performed when executing critical operations)");
  101. return m_criticalOperationsLockCount;
  102. }
  103. int hkpWorld::areCriticalOperationsLockedUnchecked( ) const
  104. {
  105. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  106. return m_criticalOperationsLockCount;
  107. }
  108. void hkpWorld::lockCriticalOperationsForPhantoms()
  109. {
  110. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  111. m_criticalOperationsLockCountForPhantoms++;
  112. HK_ASSERT2(0, m_criticalOperationsLockCountForPhantoms == -1 || m_criticalOperationsLockCountForPhantoms == 0, "Internal Error: m_criticalOperationsLockCountForPhantoms corrupted.");
  113. }
  114. void hkpWorld::unlockCriticalOperationsForPhantoms()
  115. {
  116. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  117. m_criticalOperationsLockCountForPhantoms--;
  118. HK_ASSERT2(0, m_criticalOperationsLockCountForPhantoms == -1 || m_criticalOperationsLockCountForPhantoms == 0, "Internal Error: m_criticalOperationsLockCountForPhantoms corrupted.");
  119. }
  120. int hkpWorld::areCriticalOperationsLockedForPhantoms() const
  121. {
  122. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RO );
  123. HK_ASSERT2(0xad000200, m_criticalOperationsAllowed, "Warning: areCriticalOperationsLocked() queried while critical operations are disalloed (... and this query is (very probably) only performed when executing critical operations)");
  124. HK_ASSERT(0, m_criticalOperationsLockCount + m_criticalOperationsLockCountForPhantoms >= 0);
  125. return m_criticalOperationsLockCount + m_criticalOperationsLockCountForPhantoms;
  126. }
  127. void hkpWorld::blockExecutingPendingOperations(hkBool block)
  128. {
  129. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  130. HK_ASSERT2(0xad000400, m_blockExecutingPendingOperations ^ block, "Internal Error: blocking/unblocking executing pending operations performed multiple times...");
  131. m_blockExecutingPendingOperations = block;
  132. }
  133. void hkpWorld::attemptToExecutePendingOperations( bool executeBodyOperations )
  134. {
  135. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  136. if (/*!areCriticalOperationsLocked()*/ !m_criticalOperationsLockCount && !m_blockExecutingPendingOperations )
  137. {
  138. if ( m_pendingOperationsCount )
  139.     {
  140.     internal_executePendingOperations();
  141.     }
  142. // only perform execution of body operations after the criticalOperation *recursive* queue is cleared completely !!
  143. if (m_pendingOperationQueueCount == 1 && executeBodyOperations )
  144. {
  145. if ( m_pendingBodyOperationsCount )
  146. {
  147. internal_executePendingBodyOperations();
  148. }
  149. }
  150. }
  151. }
  152. void hkpWorld::unlockAndAttemptToExecutePendingOperations()
  153. {
  154. unlockCriticalOperations();
  155. attemptToExecutePendingOperations();
  156. }
  157. //
  158. // Debugging utility: monitoring of critical operations executions
  159. //
  160. void hkpWorld::allowCriticalOperations(hkBool allow)
  161. {
  162. HK_ACCESS_CHECK_OBJECT( this, HK_ACCESS_RW );
  163. HK_ASSERT2(0xad000201, m_criticalOperationsAllowed ^ allow, "Internal Error: disabled/enabled critical operations multiple times...");
  164. m_criticalOperationsAllowed = allow;
  165. }
  166. void hkpWorld::setMultithreadedAccessChecking( MtAccessChecking accessCheckState )
  167. {
  168. if ( MT_ACCESS_CHECKING_ENABLED == accessCheckState )
  169. {
  170. m_multiThreadCheck.enableChecks();
  171. }
  172. else
  173. {
  174. m_multiThreadCheck.disableChecks();
  175. }
  176. }
  177. hkpWorld::MtAccessChecking hkpWorld::getMultithreadedAccessChecking() const
  178. {
  179. if ( m_multiThreadCheck.isCheckingEnabled() )
  180. {
  181. return MT_ACCESS_CHECKING_ENABLED;
  182. }
  183. else
  184. {
  185. return MT_ACCESS_CHECKING_DISABLED;
  186. }
  187. }
  188. #if !defined(HK_DEBUG_MULTI_THREADING)
  189. inline void hkpWorld::markForRead( ) const
  190. {
  191. }
  192. inline void hkpWorld::markForWrite( )
  193. {
  194. }
  195. inline void hkpWorld::unmarkForRead( ) const
  196. {
  197. }
  198. inline void hkpWorld::unmarkForWrite()
  199. {
  200. }
  201. #endif
  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. */