hkpSimulationIsland.h
上传用户: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. #ifndef HK_DYNAMICS2_SIMULATION_ISLAND_H
  9. #define HK_DYNAMICS2_SIMULATION_ISLAND_H
  10. #include <Common/Base/DebugUtil/DeterminismUtil/hkCheckDeterminismUtil.h>
  11. #include <Physics/ConstraintSolver/Accumulator/hkpVelocityAccumulator.h>
  12. #include <Physics/Dynamics/Entity/hkpEntity.h>
  13. #include <Physics/Dynamics/Constraint/hkpConstraintOwner.h>
  14. #include <Physics/Internal/Collide/Agent3/Machine/Nn/hkpAgentNnTrack.h>
  15. #include <Physics/Collide/Dispatch/BroadPhase/hkpBroadPhaseListener.h>
  16. class hkUnionFind;
  17. class hkpAction;
  18. class hkpEntity;
  19. class hkpConstraintInstance;
  20. class hkStepInfo;
  21. class hkpBroadPhase;
  22. class hkpWorld;
  23. class hkpCollisionDispatcher;
  24. struct hkpWorldDynamicsStepInfo;
  25. class hkpBroadPhaseHandlePair;
  26. struct hkpCollisionInput;
  27. struct hkpProcessCollisionOutput;
  28. /// These objects are internally managed by hkpWorld. They are created and destroyed continuously during simulation.
  29. /// At any one time, you can view the contents of the simulation islands, by calling hkpWorld::getActiveSimulationIslands
  30. /// and hkpWorld::getInactiveSimulationIslands. However you must NOT keep any handles to the simulation islands, and you
  31. /// must not alter anything in the simulation islands.
  32. class hkpSimulationIsland : public hkpConstraintOwner
  33. {
  34. public:
  35. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SIMISLAND);
  36. /// Get the list of entities in the simulation island
  37. inline const hkArray<hkpEntity*>& getEntities() const;
  38. /// Get the list of actions in the simulation island
  39. inline const hkArray<hkpAction*>& getActions() const;
  40. /// Returns true if the island was processed during the last frame. 
  41. /// 
  42. /// Deactivation happens at the beginning of a simulation step,
  43. /// therefore this property doesn't tell if the island will still be processed
  44. /// on the next frame.
  45. ///
  46. /// Also note that the fact that an island was processed during the last frame
  47. /// doesn't imply that it was fully solved and integrated -- it might had been 
  48. /// activated by a merge with another island during collision detection, or during a TOI.
  49. inline hkBool wasActiveLastFrame() const;
  50. /// Returns true is the island is fixed
  51. inline hkBool isFixed() const;
  52. /// Get the world
  53. inline hkpWorld* getWorld();
  54. /// Gets the memory usage required to complete the next integration step on this island.
  55. /// This function is called internally to prevent the memory usage breaching the critical memory limit in
  56. /// hkMemory.
  57. inline int getMemUsageForIntegration();
  58. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  59. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls) const;
  60. //
  61. // The remainder of the file is for Internal use only
  62. //
  63. protected:
  64. friend class hkpWorld;
  65. friend class hkpWorldOperationUtil;
  66. friend class hkpWorldCallbackUtil;
  67. friend class hkpSimulation;
  68. friend class hkpContinuousSimulation;
  69. hkpSimulationIsland( hkpWorld* world );
  70. ~hkpSimulationIsland();
  71. // Properly sets storage indices and pointers on the entity. Updates island's data with entity's motion info.
  72. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  73. void internalAddEntity(hkpEntity* entity);
  74. // Properly sets storage indices and pointers on the entity. Updates island's data with entity's motion info.
  75. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  76. void internalRemoveEntity(hkpEntity* entity);
  77. // hkpConstraintOwner interface implementation
  78. virtual void addConstraintToCriticalLockedIsland(      hkpConstraintInstance* constraint );
  79. virtual void removeConstraintFromCriticalLockedIsland( hkpConstraintInstance* constraint );
  80. /// ###ACCESS_CHECKS###( [constraint->getSimulationIsland()->getWorld(),HK_ACCESS_RW] );
  81. virtual void addCallbackRequest( hkpConstraintInstance* constraint, int request );
  82. #ifdef HK_DEBUG_MULTI_THREADING
  83. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  84. virtual void checkAccessRw();
  85. #endif
  86. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  87. void addAction( hkpAction* act );
  88. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  89. void removeAction( hkpAction* act );
  90. protected:
  91. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  92. hkBool isFullyConnected( hkUnionFind& checkConnectivityOut );
  93. public:
  94. inline int getStorageIndex();
  95. public:
  96. void markForWrite( );
  97. inline void unmarkForWrite();
  98. public:
  99. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  100. void isValid();
  101. void mergeConstraintInfo( hkpSimulationIsland& other );
  102. // helper functions for debugging multithreading
  103. inline void markAllEntitiesReadOnly() const;
  104. // helper functions for debugging multithreading
  105. inline void unmarkAllEntitiesReadOnly() const;
  106. hkMultiThreadCheck& getMultiThreadCheck() const { return m_multiThreadCheck; }
  107. public:
  108. hkpWorld* m_world;
  109. // The number of constraints in this island. This number could be more than 65k!
  110. int m_numConstraints;
  111. // Storage index of the island: either in hkpWorld::m_activeSimulationIslands or hkpWorld::m_inactiveSimulationIslands
  112. // depending on m_isInActiveIslandsArray
  113. hkObjectIndex m_storageIndex;
  114. // If the island is dirty, than the island is also stored in the hkpWorld::m_dirtySimulationIslands
  115. // dirty islands are cleaned up in hkpWorldOperationUtil::cleanupDirtyIslands
  116. hkObjectIndex m_dirtyListIndex;
  117. // A counter which is incremented each frame
  118. // only on every 7th frame we check for split or subisland deactivation
  119. hkUchar m_splitCheckFrameCounter;
  120. // set if a split is requested
  121. bool m_splitCheckRequested:2;
  122. // this is set if the island can be split into subislands, but it
  123. // is not done to avoid tiny islands.
  124. // See hkpWorldCinfo::m_minDesiredIslandSize for details
  125. bool m_sparseEnabled:2;
  126. // set if the action array need cleanup
  127. bool m_actionListCleanupNeeded:2;
  128. // for debugging multithreading
  129. bool m_allowIslandLocking:2;
  130. // see m_storageIndex
  131. bool m_isInActiveIslandsArray:2;
  132. // desired Activation State. Can only be deactivated if m_sparseEnabled is set to false
  133. bool m_activeMark:2;
  134. // if this is set to true, the island is integrated and cannot be modified, this is used for debugging multithreading only
  135. bool m_inIntegrateJob:2;
  136. protected:
  137. mutable hkMultiThreadCheck m_multiThreadCheck;
  138. public:
  139. hkReal m_timeSinceLastHighFrequencyCheck;
  140. hkReal m_timeSinceLastLowFrequencyCheck;
  141. hkArray<hkpAction*> m_actions;
  142. hkTime m_timeOfDeactivation;
  143. //
  144. // the next two 'objects' are both 16byte-aligned so we place them at the end of the class
  145. //
  146. // the entities (note: optimized for single entities)
  147. // for spus this must be 16 byte aligned (the constructor sets the initial capacity to 4
  148. // the maximum size of this inplace array must be one. Or the split simulation island code could generate an invalid dealloce, which
  149. // will be very difficult to track down.
  150. hkInplaceArray<hkpEntity*,1> m_entities;
  151. // for narrowphase collision agents
  152. hkpAgentNnTrack m_agentTrack;
  153. // This is a variable tag. At all times these are unique tags.
  154. HK_ON_DETERMINISM_CHECKS_ENABLED( hkUint32 m_uTag );
  155. };
  156. #include <Physics/Dynamics/World/hkpSimulationIsland.inl>
  157. #endif // HK_DYNAMICS2_SIMULATION_ISLAND_H
  158. /*
  159. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  160. * Confidential Information of Havok.  (C) Copyright 1999-2009
  161. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  162. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  163. * rights, and intellectual property rights in the Havok software remain in
  164. * Havok and/or its suppliers.
  165. * Use of this software for evaluation purposes is subject to and indicates
  166. * acceptance of the End User licence Agreement for this product. A copy of
  167. * the license is included with this software and is also available at www.havok.com/tryhavok.
  168. */