hkpSimulation.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_H
  9. #define HK_DYNAMICS2_SIMULATION_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/DebugUtil/DeterminismUtil/hkCheckDeterminismUtil.h>
  12. #include <Physics/Dynamics/World/hkpWorld.h>
  13. class hkpConstraintQueryIn;
  14. class hkpSimulationIsland;
  15. struct hkpWorldDynamicsStepInfo;
  16. struct hkpProcessCollisionInput;
  17. struct hkpProcessCollisionOutput;
  18. class hkpBroadPhase;
  19. class hkpWorld;
  20. class hkStepInfo;
  21. class hkpEntity;
  22. struct hkpAgentNnEntry;
  23. extern const hkClass hkpSimulationClass;
  24. /// Base class for simulations, performs simulation at discrete physical time steps.
  25. class hkpSimulation: public hkReferencedObject
  26. {
  27. public:
  28. //+serializable(false)
  29. HK_DECLARE_REFLECTION();
  30. hkpSimulation( hkpWorld* world );
  31. hkpSimulation( hkFinishLoadedObjectFlag flag ) : hkReferencedObject(flag) {}
  32. ~hkpSimulation();
  33. //
  34. // Synchronous interface
  35. //
  36. // Implemented method of hkpSimulation
  37. virtual hkpStepResult stepDeltaTime( hkReal physicsDeltaTime );
  38. // Advance the state of bodies in time.
  39. virtual hkpStepResult integrate( hkReal physicsDeltaTime );
  40. // Perform collision detection.
  41. virtual hkpStepResult collide();
  42. // Advance the current time
  43. virtual hkpStepResult advanceTime();
  44. //
  45. // Asynchronous interface (used in conjunction with the methods above)
  46. //
  47. // Schedule an asynchronous step, given a frame delta time
  48. void setFrameTimeMarker( hkReal frameDeltaTime );
  49. // Returns true if m_currentTime is earlier than the frame time
  50. bool isSimulationAtMarker();
  51. // Returns true if m_currentTime is equal to m_currentPsiTime
  52. bool isSimulationAtPsi() const;
  53. //
  54. // Time accessors
  55. //
  56. inline hkReal getCurrentTime() { return m_currentTime; }
  57. inline hkReal getCurrentPsiTime() { return m_currentPsiTime; }
  58. inline hkReal getSimulateUntilTime() { return m_simulateUntilTime; }
  59. inline hkReal getPhysicsDeltaTime() { return m_physicsDeltaTime; }
  60. //
  61. // Utility methods
  62. //
  63. enum FindContacts
  64. {
  65. FIND_CONTACTS_DEFAULT = 0,
  66. FIND_CONTACTS_EXTRA
  67. };
  68. /// Calculates contact information by performing discrete collision detection.
  69. /// It uses hkTransform from hkMotionState and ignores hkSweptTransform, therefore by default it will
  70. /// perform collision detection at m_timeOfNextPsi, unless the user changes hkTransforms of bodies.
  71. /// Note: in case of hkPredGsk, final position will be used always.
  72. /// This should be only performed for bodies that have just been added, activated, or moved in the world,
  73. /// and have a 'stationary' sweptTransform (with the same start & end positions).
  74. virtual void collideEntitiesDiscrete( hkpEntity** entities, int numEntities, hkpWorld* world, const hkStepInfo& stepInfo, FindContacts findExtraContacts  );
  75. // Update the broadphase for a set of entities
  76. static void collideEntitiesBroadPhaseDiscrete( hkpEntity** entities, int numEntities, hkpWorld* world );
  77. // Just calls processAgentsOfEntities
  78. void collideEntitiesNarrowPhaseDiscrete( hkpEntity** entities, int numEntities, const hkpProcessCollisionInput& input, FindContacts findExtraContacts );
  79. enum ResetCollisionInformation
  80. {
  81. RESET_TOI = 1,
  82. RESET_TIM = 2,
  83. RESET_AABB = 4,
  84. RESET_ALL = 7
  85. };
  86. // Invalidates TIMs and removes contact points from manifolds.
  87. virtual void resetCollisionInformationForEntities( hkpEntity** entities, int numEntities, hkpWorld* world, enum ResetCollisionInformation resetInfo = RESET_ALL );
  88. // Checks that there is no simulation-scope information relating to the entities.
  89. // Checks for Toi Events in hkpContinuousSimulation.
  90. virtual void assertThereIsNoCollisionInformationForEntities( hkpEntity** entities, int numEntities, hkpWorld* world ) {}
  91. // Removes simulation's collision information related to the agent. This is empty here, as no simulation-scope information
  92. // is stored in hkpSimulation. (This is overridden for hkpContinuousSimulation.)
  93. virtual void removeCollisionInformationForAgent( hkpAgentNnEntry* agent ) {}
  94. // Asserts when collision information related to the agent is found.
  95. virtual void assertThereIsNoCollisionInformationForAgent( hkpAgentNnEntry* agent ) {}
  96. protected:
  97. friend class hkpWorld;
  98. friend class hkpWorldOperationQueue;
  99. // See hkpWorld::reintegrateAndRecollideEntities
  100. virtual void reintegrateAndRecollideEntities( hkpEntity** entityBatch, int numEntities, hkpWorld* world, int reintegrateRecollideMode );
  101. protected:
  102. //
  103. // Helper step methods
  104. //
  105. // Asserts if the time step changes dramatically from step to step
  106. void checkDeltaTimeIsOk( hkReal deltaTime );
  107. // Utility function
  108. hkpStepResult reCollideAfterStepFailure();
  109. // Collide discrete
  110. virtual void collideInternal( const hkStepInfo& stepInfoIn );
  111. // Integrate discrete
  112. void integrateInternal( const hkStepInfo& stepInfoIn );
  113. // Apply all actions of the world
  114. void applyActions();
  115. // Called from integrate()
  116. static HK_FORCE_INLINE void integrateIsland( hkpSimulationIsland* isle, const hkpWorldDynamicsStepInfo& stepInfo, hkpConstraintQueryIn& constraintQueryIn );
  117. // Called from collide()
  118. static HK_FORCE_INLINE void collideIslandNarrowPhaseDiscrete( hkpSimulationIsland* isle, const hkpProcessCollisionInput& input);
  119. // Helper called from advanceTime()
  120. hkReal snapSimulateTimeAndGetTimeToAdvanceTo();
  121. //
  122. // Agent processing sub methods
  123. //
  124. // Defines a callback function type to be called by processAgentsOfEntities (below)
  125. typedef void (hkpSimulation::*AgentEntryProcessFunction)(hkpAgentNnEntry*, const hkpProcessCollisionInput&, hkpProcessCollisionOutput&);
  126. // Iterates through agents, processes each only once, and calls processingFunction for it.
  127. void processAgentsOfEntities( hkpEntity** entities, int numEntities, const hkpProcessCollisionInput& input, AgentEntryProcessFunction processingFunction, FindContacts findExtraContacts );
  128. // The standard implementation of the callback function for hkpSimulation. Runs discrete collision detection for an agent entry.
  129. void processAgentCollideDiscrete(hkpAgentNnEntry* entry, const hkpProcessCollisionInput& processInput, hkpProcessCollisionOutput& processOutput);
  130. // Callback function which invalidates TIM's and contact points in the contact manfold.
  131. void processAgentResetCollisionInformation(hkpAgentNnEntry* entry, const hkpProcessCollisionInput& processInput, hkpProcessCollisionOutput& processOutput);
  132. public:
  133. /// Adds deltaTime's value to whatever time-related variables are stored in hkpSimulation.
  134. virtual void warpTime( hkReal deltaTime ) {}
  135. public:
  136. // Internal use only
  137. void setCurrentTime( hkTime time ) { m_currentTime = time; }
  138. // Internal use only
  139. void setCurrentPsiTime( hkTime time ) { m_currentPsiTime = time; }
  140. // Internal use only
  141. void setSimulateUntilTime ( hkTime time ) { m_simulateUntilTime = time; }
  142. hkpWorld* getWorld(){ return m_world; }
  143. public:
  144. // helper counter to check for determinism;
  145. hkUint32 m_determinismCheckFrameCounter;
  146. protected:
  147. class hkpWorld* m_world;
  148. enum LastProcessingStep
  149. {
  150. INTEGRATE,
  151. COLLIDE
  152. };
  153. // Used for debug checks that integrate and collide are called consecutively
  154.         hkEnum<LastProcessingStep,hkUint8> m_lastProcessingStep;
  155. // Current time of the simulation. (Not the same as the time of the last simulation step.)
  156. // All TOIs up to this time have been processed.
  157. // Note: that the simulation's global time is not the absolute time from the beginning of the simulation. The time is
  158. // reset in the whole simulation every once in a while to avoid floating-point precision problems.
  159. hkTime m_currentTime;
  160. // Current "PSI" time of the simulation. This is always greater than or equal to m_currentTime.
  161. // PSIs are stepped "ahead" and then verified by solving TOIs up to that time.
  162. hkTime m_currentPsiTime;
  163. // Current delta time being simulated
  164. hkReal m_physicsDeltaTime;
  165. // Current asynchronous marker (-1 if not set)
  166. hkTime m_simulateUntilTime;
  167. hkReal m_frameMarkerPsiSnap;
  168.         hkUint32 m_previousStepResult; // should be hkEnum<hkpStepResult,hkUint8>, but serialization breaks
  169. };
  170. #endif // HK_DYNAMICS2_SIMULATION_H
  171. /*
  172. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  173. * Confidential Information of Havok.  (C) Copyright 1999-2009
  174. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  175. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  176. * rights, and intellectual property rights in the Havok software remain in
  177. * Havok and/or its suppliers.
  178. * Use of this software for evaluation purposes is subject to and indicates
  179. * acceptance of the End User licence Agreement for this product. A copy of
  180. * the license is included with this software and is also available at www.havok.com/tryhavok.
  181. */