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

其他游戏

开发平台:

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_WORLD_UTIL_H
  9. #define HK_DYNAMICS2_WORLD_UTIL_H
  10. #include <Physics/Dynamics/World/hkpWorld.h>
  11. #include <Physics/Dynamics/Motion/hkpMotion.h>
  12. class hkpConstraintInstance;
  13. class hkpEntity;
  14. struct hkpAgentNnTrack;
  15. class hkpContinuousSimulation;
  16. /// Class hkpWorldOperationUtil
  17. class hkpWorldOperationUtil
  18. {
  19. public://private:
  20. enum FireCallbacks
  21. {
  22. // this is only used in addEntity and removeEntity, when they're called from hkpRigidBody::setMotionType()
  23. DO_NOT_FIRE_CALLBACKS_AND_SUPPRESS_EXECUTION_OF_PENDING_OPERATIONS,
  24. DO_FIRE_CALLBACKS
  25. };
  26. public:
  27. //
  28. // WARNING: Those are internal functions and should never be called directly.
  29. //
  30. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [entity,HK_ACCESS_RW] );
  31. static void HK_CALL    addEntityBP ( hkpWorld* world, hkpEntity* entity );
  32. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [entity,HK_ACCESS_RW] );
  33. static void HK_CALL removeEntityBP ( hkpWorld* world, hkpEntity* entity );
  34. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [entity,HK_ACCESS_RW] );
  35. static void HK_CALL updateEntityBP ( hkpWorld* world, hkpEntity* entity );
  36. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [phantom,HK_ACCESS_RW] );
  37. static void HK_CALL    addPhantomBP( hkpWorld* world, hkpPhantom* phantom);
  38. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [phantom,HK_ACCESS_RW] );
  39. static void HK_CALL removePhantomBP( hkpWorld* world, hkpPhantom* phantom);
  40. /// When islands are enabled, creates an activated/deactivated island for the entity.
  41. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [entity,HK_ACCESS_RW] );
  42. static void HK_CALL addEntitySI ( hkpWorld* world, hkpEntity* entity, hkpEntityActivation initialActivationState );
  43. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [entity,HK_ACCESS_RW] );
  44. static void HK_CALL removeEntitySI ( hkpWorld* world, hkpEntity* entity );
  45. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] [constraint->getEntityA()->getSimulationIsland(),HK_ACCESS_RW] [constraint->getEntityB()->getSimulationIsland(),HK_ACCESS_RW] );
  46. static void HK_CALL addConstraintToCriticalLockedIsland( hkpWorld* world, hkpConstraintInstance* constraint  );
  47. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] [constraint->getEntityA()->getSimulationIsland(),HK_ACCESS_RW] [constraint->getEntityB()->getSimulationIsland(),HK_ACCESS_RW] );
  48. static void HK_CALL removeConstraintFromCriticalLockedIsland( hkpWorld* world, hkpConstraintInstance* constraint  );
  49. static hkpConstraintInstance*
  50. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  51. HK_CALL addConstraintImmediately   ( hkpWorld* world, hkpConstraintInstance* constraint, FireCallbacks fireCallbacks = DO_FIRE_CALLBACKS );
  52. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] [world,HK_ACCESS_RW] );
  53. static void HK_CALL removeConstraintImmediately( hkpWorld* world, hkpConstraintInstance* constraint, FireCallbacks fireCallbacks = DO_FIRE_CALLBACKS );
  54. //
  55. // Island handling
  56. //
  57. /// activate an island. Note this function might merge the island with another island, a valid island is returned
  58. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  59. static hkpSimulationIsland* HK_CALL internalActivateIsland  ( hkpWorld* world, hkpSimulationIsland* island, hkBool allowIslandMerges = false );
  60. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  61. static void HK_CALL internalDeactivateIsland( hkpWorld* world, hkpSimulationIsland* island );
  62. static HK_FORCE_INLINE void
  63. /// ###ACCESS_CHECKS###( [entityA->getWorld(),HK_ACCESS_RO] );
  64. HK_CALL mergeIslandsIfNeeded(                 hkpEntity* entityA, hkpEntity* entityB);
  65. // Ask for two simulation islands to be merged (merge will be delayed if necessary)
  66. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  67. static void HK_CALL mergeIslands    ( hkpWorld* world, hkpEntity* entityA, hkpEntity* entityB);
  68. static hkpSimulationIsland*
  69. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  70. HK_CALL internalMergeTwoIslands ( hkpWorld* world, hkpSimulationIsland* islandA, hkpSimulationIsland* islandB );
  71. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  72. static void HK_CALL removeIsland    ( hkpWorld* world, hkpSimulationIsland* island );
  73. // split a single island, internal function use splitSimulationIslands() instead,
  74. // if oldEntitiesOut is set, than the original entity array will be stored into oldEntitiesOut;
  75. static void HK_CALL splitSimulationIsland( hkpSimulationIsland* currentIsland, hkpWorld* world, hkArray<hkpSimulationIsland*>& newIslandsOut, hkArray<hkpEntity*>* oldEntitiesOut = HK_NULL );
  76. // split any possible active or inactive simulation islands
  77. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  78. static void HK_CALL splitSimulationIslands( hkpWorld* world );
  79. // split a single island
  80. static void HK_CALL splitSimulationIsland( hkpWorld* world, hkpSimulationIsland* currentIsland );
  81. static void HK_CALL validateIsland  ( hkpWorld* world, hkpSimulationIsland* island );
  82. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] );
  83. static void HK_CALL validateWorld   ( hkpWorld* world );
  84. //
  85. // Internal, only used by hkpRigidBody::setMotionType
  86. //
  87. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  88. static void HK_CALL removeAttachedActionsFromFixedIsland  ( hkpWorld* world, hkpEntity* entity, hkArray<hkpAction*>& actionsToBeMoved );
  89. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  90. static void HK_CALL removeAttachedActionsFromDynamicIsland( hkpWorld* world, hkpEntity* entity, hkArray<hkpAction*>& actionsToBeMoved );
  91. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  92. static void HK_CALL addActionsToEntitysIsland             ( hkpWorld* world, hkpEntity* entity, hkArray<hkpAction*>& actionsToBeMoved );
  93. //
  94. //
  95. //
  96. /// ###ACCESS_CHECKS###( [body->getWorld(),HK_ACCESS_RW] );
  97. static void HK_CALL setRigidBodyMotionType( hkpRigidBody* body, hkpMotion::MotionType newState, hkpEntityActivation initialActivationState, hkpUpdateCollisionFilterOnEntityMode queryBroadPhaseForNewPairs);
  98. private:
  99. // used for setEntityMotionType
  100. // Used by setMotionType
  101. // This stores dynamic motion and collidable's quality type when switching to fixed or keyframed motion.
  102. /// ###ACCESS_CHECKS###( [body->getWorld(),HK_ACCESS_RW] );
  103. static void HK_CALL replaceMotionObject(hkpRigidBody* body, hkpMotion::MotionType newState, hkBool newStateNeedsInertia, hkBool oldStateNeedsInertia, hkpWorld* world );
  104. static HK_FORCE_INLINE void HK_CALL sortBigIslandToFront( hkpWorld* world, hkpSimulationIsland* island );
  105. // Used by setMotionType
  106. // Function name ends with Plus, because it also does sth else.
  107. //  - if the agent connects entities in two separeate dynamic islands it
  108. //    moves the agentEntries to the dynamic island, which is not going to be changed to fixed. .. blah
  109. /// ###ACCESS_CHECKS###( [entity->getWorld(),HK_ACCESS_RW] );
  110. static void HK_CALL removeAttachedAgentsConnectingTheEntityAndAFixedPartnerEntityPlus( hkpAgentNnTrack& trackToScan, hkpEntity* entity, hkpAgentNnTrack& agentsRemoved, hkpMotion::MotionType newMotionType);
  111. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  112. static void HK_CALL removeAttachedConstraints( hkpEntity* entity, hkArray<hkpConstraintInstance*>& constraintsToBeMoved );
  113. public:
  114. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  115. static void HK_CALL cleanupDirtyIslands( hkpWorld* world );
  116. // marks an island for deactivation. Only call this when you have single threaded rw access to the world
  117. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  118. static void HK_CALL markIslandInactive( hkpWorld* world, hkpSimulationIsland* island );
  119. // marks an island for deactivation. Only call this when you have multithreaded read only access to the world
  120. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] );
  121. static void HK_CALL markIslandInactiveMt( hkpWorld* world, hkpSimulationIsland* island );
  122. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] [island,HK_ACCESS_RW] );
  123. static void HK_CALL markIslandActive( hkpWorld* world, hkpSimulationIsland* island );
  124. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  125. static void HK_CALL removeIslandFromDirtyList( hkpWorld* world, hkpSimulationIsland* island);
  126. // calculates a size information which can be used for canIslandBeSparse(world,size)
  127. HK_FORCE_INLINE static int  HK_CALL estimateIslandSize( int numEntities, int numConstraints );
  128. // returns true if the island defined by the given size (by estimateIslandSize) would be a candidate for a sparseEnabled island.
  129. // These are islands which hold lots of independent objects. See hkpWorldCinfo::m_minDesiredIslandSize for details
  130. HK_FORCE_INLINE static bool HK_CALL canIslandBeSparse( hkpWorld* world, int islandSize );
  131. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] [island,HK_ACCESS_RW] );
  132. HK_FORCE_INLINE static void HK_CALL putIslandOnDirtyList( hkpWorld* world, hkpSimulationIsland* island);
  133. };
  134. #include <Physics/Dynamics/World/Util/hkpWorldOperationUtil.inl>
  135. #endif // HK_DYNAMICS2_WORLD_UTIL_H
  136. /*
  137. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  138. * Confidential Information of Havok.  (C) Copyright 1999-2009
  139. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  140. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  141. * rights, and intellectual property rights in the Havok software remain in
  142. * Havok and/or its suppliers.
  143. * Use of this software for evaluation purposes is subject to and indicates
  144. * acceptance of the End User licence Agreement for this product. A copy of
  145. * the license is included with this software and is also available at www.havok.com/tryhavok.
  146. */