hkpSaveContactPointsUtil.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_UTILITIES2_SAVE_CONTACT_POINTS_UTIL_H
  9. #define HK_UTILITIES2_SAVE_CONTACT_POINTS_UTIL_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Physics/Internal/Collide/Agent3/Machine/Nn/hkpAgentNnTrack.h>
  12. #include <Physics/Utilities/Dynamics/SaveContactPoints/hkpSerializedAgentNnEntry.h>
  13. class hkpPhysicsSystemWithContacts;
  14. /// This utility saves and loads contact points an entire scene or for individual collision agents.
  15. ///
  16. /// The utility only supports hkCollisionAgents using the streaming agents technology. Most commonly used agents have
  17. /// their 'streaming' version now. However older agents e.g. capsule-capsule are not supported. Don't register such 
  18. /// agents, and use more general streaming agents like Gsk instead.
  19. ///
  20. /// Note that the utility saves 'raw' data from agent streams and as the result, the hkpCollisionDispatcher must 
  21. /// be initialized with the same collision agents when points are both saved and loaded. Also that raw agent data 
  22. /// cannot be versioned.
  23. ///
  24. /// To allow cross-platform usability, hkpSaveContactPointsEndianUtil fixes endiness of serialized data. 
  25. class hkpSaveContactPointsUtil
  26. {
  27. public:
  28. //
  29. // Top level functions
  30. //
  31. typedef hkUlong (HK_CALL *GetIdForEntityFunc)( const hkpEntity* entity );
  32. typedef hkpEntity* (HK_CALL *GetEntityFromIdFunc)( hkUlong id );
  33. struct SavePointsInput
  34. {
  35. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpSaveContactPointsUtil::SavePointsInput );
  36. //
  37. // Identifying enities
  38. //
  39. /// Uses entity id's returned by user's callback, rather than hkpEntity pointers 
  40. /// to bind contact data to a colliding pair.
  41. bool m_useEntityIds;
  42. /// Callback function used to get entity id to be stored with contact points. 
  43. /// Must be assigned valid if m_useEntityIds is true;
  44. GetIdForEntityFunc m_getIdForEntity;
  45. SavePointsInput() : m_useEntityIds(false), m_getIdForEntity(HK_NULL) {}
  46. };
  47. /// Saves contact points of the entire world
  48. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] );
  49. static void HK_CALL saveContactPoints( const hkpSaveContactPointsUtil::SavePointsInput& input, const hkpWorld* world, hkpPhysicsSystemWithContacts* sys );
  50. /// Saves contact points of selected entities.
  51. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] );
  52. static void HK_CALL saveContactPoints( const hkpSaveContactPointsUtil::SavePointsInput& input, const hkpEntity** entities, int numEntities, hkpPhysicsSystemWithContacts* sys );
  53. /// Saves contact points from selected agents.
  54. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RO] );
  55. static void HK_CALL saveContactPoints( const hkpSaveContactPointsUtil::SavePointsInput& input, const hkpAgentNnEntry** agentEntries, int numEntries, hkpPhysicsSystemWithContacts* sys );
  56. struct LoadPointsInput
  57. {
  58. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpSaveContactPointsUtil::LoadPointsInput );
  59. /// Remove a serialized entry from the physics system, after it is deserialized.
  60. /// When saved contact points are deserialized, a copy of the data is created, and the saved contact points
  61. /// can be destroyed, unless you're planning to reused them. Set this flag, to remove all saved agents,
  62. /// right after they're successfully deserialized.
  63. bool m_removeSerializedAgentsWhenLoaded;
  64. /// This zeros userData in hkpContactPointProperties.
  65. /// May be useful if you use it to store pointers to custom data structures.
  66. bool m_zeroUserDataInContactPointProperties;
  67. //
  68. // Identifying enities
  69. //
  70. /// Callback function used to get hkpEntity pointers when deserializing contact points. Must be valid 
  71. /// if stored contact points were saved with entity id's rather than hkpEntity pointers
  72. GetEntityFromIdFunc m_getEntityFromId;
  73. //
  74. // Collision callback settings
  75. //
  76. /// Fire or suppress contact point added callbacks.
  77. bool m_fireContactPointAddedCallbacks;
  78. /// Fire or suppress contact point confirmed callbacks.
  79. /// Note that, regardless of this setting, this callback will not be called
  80. /// for contact points that had existed for several frames when they were saved.
  81. /// This callback is only triggered once for a contact point -- when it's
  82. /// passed to the constraint solver for the first time.
  83. bool m_fireContactPointConfirmedCallbacks;
  84. /// Pass hkpCollidable pointers in callback events, or pass HK_NULL otherwise.
  85. /// When loading contact points, the callbacks don't have access to the original hkCdBodies (child shapes)
  86. /// that they relate to. You may decide to pass HK_NULL, or the top level hkpCollidable instead. 
  87. ///
  88. /// Note that passing top level hkCollidables may cause problems, if you have collision listeners, 
  89. /// that assume that they track bodies of certain type. 
  90. /// E.g. you may have a listener connected to Mopp shapes, and have it assume that when it
  91. /// gets a callback, it can query the shapeKey of the passed hkCdBodies.
  92. bool m_passCollidablePointersInCollisionCallbacks;
  93. LoadPointsInput() : m_removeSerializedAgentsWhenLoaded(false),
  94.                 m_zeroUserDataInContactPointProperties(false), 
  95. m_getEntityFromId(HK_NULL),
  96. m_fireContactPointAddedCallbacks(true),
  97. m_fireContactPointConfirmedCallbacks(true),
  98. m_passCollidablePointersInCollisionCallbacks(false)
  99. {
  100. }
  101. };
  102. /// Loads contact points for the entire world.
  103. static void HK_CALL loadContactPoints( const hkpSaveContactPointsUtil::LoadPointsInput& input, hkpPhysicsSystemWithContacts* sys, hkpWorld* world );
  104. /// Loads contact points for selected entities.
  105. static void HK_CALL loadContactPoints( const hkpSaveContactPointsUtil::LoadPointsInput& input, hkpPhysicsSystemWithContacts* sys, hkpEntity** entities, int numEntities );
  106. //
  107. // New internal functions
  108. //
  109. class EntitySelector
  110. {
  111. public:
  112. virtual ~EntitySelector() { }
  113. virtual hkBool32 isEntityOk(const hkpEntity* entity) = 0;
  114. };
  115. private:
  116. /// ###ACCESS_CHECKS###( [world,HK_ACCESS_RW] );
  117. static inline void HK_CALL loadContactPointsInternal( const hkpSaveContactPointsUtil::LoadPointsInput& input, hkpPhysicsSystemWithContacts* sys, hkpWorld* world, hkpSaveContactPointsUtil::EntitySelector& selector );
  118. static hkResult HK_CALL serializeCollisionEntry( const SavePointsInput& input, const hkpAgentNnEntry* entry, const hkpProcessCollisionInput* collisionInput, hkpSerializedAgentNnEntry& serializedEntryOut );
  119. static hkResult HK_CALL deserializeCollisionEntry( const LoadPointsInput& input, const hkpSerializedAgentNnEntry& serializedEntryIn, hkpEntity* entityA, hkpEntity* entityB, const hkpProcessCollisionInput* collisionInput, hkpAgentNnEntry* entry );
  120. static hkResult HK_CALL serializeEntry( const hkpAgentEntry* entry, hkBool isNnEntry, const hkpProcessCollisionInput* input, int& sizeOfThisEntryOut, enum hkpSerializedAgentNnEntry::SerializedAgentType& agentTypeOut, const hkpAgent1nTrack*& agent1nTrackOut, hkpSerializedTrack1nInfo& trackInfoOut );
  121. static hkResult HK_CALL destroyOldEntry( const hkpSerializedAgentNnEntry::SerializedAgentType agentType, const hkpProcessCollisionInput* input, hkpDynamicsContactMgr* mgr, hkpConstraintOwner* constraintOwner, hkpAgentNnEntry* entryInOut );
  122. //this is only used for nn entries
  123. static hkResult HK_CALL deserializeEntry( const hkpSerializedAgentNnEntry& serializedEntryIn, const hkpSerializedAgentNnEntry::SerializedAgentType agentType, const hkpSerializedTrack1nInfo& serializedTrack, const hkpProcessCollisionInput* input, hkpAgentNnEntry* entryInOut );
  124. static hkResult HK_CALL serialize1nTrack( const hkArray<hkpAgent1nSector*>& sectorsIn, const hkpProcessCollisionInput* input, hkpSerializedTrack1nInfo& trackInfoOut);
  125. static hkResult HK_CALL deserialize1nTrack( const hkpSerializedTrack1nInfo& serializedTrack, const hkpProcessCollisionInput* input, hkArray<hkpAgent1nSector*>& sectorsOut);
  126. //
  127. // New helper functions
  128. //
  129. static hkpSerializedAgentNnEntry::SerializedAgentType HK_CALL getSerializedAgentType(hkAgent3::ProcessFunc func);
  130. friend class hkpSaveContactPointsEndianUtil;
  131. };
  132. #endif // HK_UTILITIES2_SAVE_CONTACT_POINTS_UTIL_H
  133. /*
  134. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  135. * Confidential Information of Havok.  (C) Copyright 1999-2009
  136. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  137. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  138. * rights, and intellectual property rights in the Havok software remain in
  139. * Havok and/or its suppliers.
  140. * Use of this software for evaluation purposes is subject to and indicates
  141. * acceptance of the End User licence Agreement for this product. A copy of
  142. * the license is included with this software and is also available at www.havok.com/tryhavok.
  143. */