hkpWorldObject.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_OBJECT_H
  9. #define HK_DYNAMICS2_WORLD_OBJECT_H
  10. #include <Physics/Internal/Collide/Agent3/Machine/Nn/hkpLinkedCollidable.h>
  11. #include <Common/Base/DebugUtil/MultiThreadCheck/hkMultiThreadCheck.h>
  12. #include <Physics/Collide/Shape/hkpShape.h>
  13. #include <Physics/Dynamics/Common/hkpProperty.h>
  14. class hkpWorld;
  15. class hkpShape;
  16. class hkpPhantom;
  17. class hkpRigidBody;
  18. extern const hkClass hkpWorldObjectClass;
  19. // This namespace refers to the operation postponing framework in hkpWorldOperationQueue.h
  20. namespace hkWorldOperation
  21. {
  22. // A result value informing whether a critical operation was performed immediately
  23. // or postponed ( -- e.g. when requested in a callback during collision detection phase, 
  24. // when the hkpWorld is locked).
  25. enum Result
  26. {
  27. POSTPONED,
  28. DONE
  29. };
  30. }
  31. /// This is the base class for hkpEntity and hkpPhantom. It contains a list of hkpProperty key-value pairs
  32. /// and also a hkpCollidable object.
  33. class hkpWorldObject : public hkReferencedObject
  34. {
  35. public:
  36. HK_DECLARE_REFLECTION();
  37. /// Adds a property to the entity. Properties must be unique. 
  38. /// You can use properties to add additional information to an entity - e.g.
  39. /// for using your own collision filters or backlinks into your game.
  40. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  41. void addProperty( hkUint32 key, hkpPropertyValue value );
  42. /// Removes the property of the specified type. This function returns the property
  43. /// removed, or 0 if there is no property of the given type.
  44. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  45. hkpPropertyValue removeProperty( hkUint32 key );
  46. /// Should multithreading checks enabled or disabled
  47. enum MtChecks
  48. {
  49. MULTI_THREADING_CHECKS_ENABLE, ///
  50. MULTI_THREADING_CHECKS_IGNORE ///
  51. };
  52. /// Updates the property with a new value. The property's key must already exist.
  53. /// Note: you can set a mtCheck to MULTI_THREADING_CHECKS_IGNORE, if you are sure to only call getProperty(), hasProperty() and editProperty()
  54. /// when accessing the engine from multiple threads.
  55. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] [plock,HK_ACCESS_RW] [this,HK_ACCESS_RW] );
  56. void editProperty( hkUint32 key, hkpPropertyValue value, MtChecks mtCheck = MULTI_THREADING_CHECKS_ENABLE );
  57. /// Returns the property specified, or 0 if there is no property of the given type.
  58. /// Note: you can set a mtCheck to MULTI_THREADING_CHECKS_IGNORE, if you are sure to only call getProperty(), hasProperty() and editProperty()
  59. /// when accessing the engine from multiple threads.
  60. inline hkpPropertyValue getProperty( hkUint32 key, MtChecks mtCheck = MULTI_THREADING_CHECKS_ENABLE ) const;
  61. /// Returns whether a property of this type has been set for the entity.
  62. /// Note: you can set a mtCheck to MULTI_THREADING_CHECKS_IGNORE, if you are sure to only call getProperty(), hasProperty() and editProperty()
  63. /// when accessing the engine from multiple threads.
  64. inline bool hasProperty( hkUint32 key, MtChecks mtCheck = MULTI_THREADING_CHECKS_ENABLE ) const;
  65. /// locks all property field of all entities, allows for
  66. /// calling editProperty even if you only have 'read only' access for this entity.
  67. /// Warning: If you use this function in a multi threaded environment, you most likely 
  68. /// end up with a nondeterministic behavior.
  69. void lockProperty( hkUint32 key );
  70. /// unlocks a given locked property
  71. void unlockProperty( hkUint32 key );
  72. /// Call this function if you wish to add properties to an hkpWorldObject
  73. /// that has been loaded from a packfile.  If you call this, then you
  74. /// need to call clearAndDeallocateProperties before you deallocate
  75. /// the packfile memory. See the user guide serialization section for
  76. /// details on how arrays are handled by packfile loading.
  77. inline void unlockPropertiesFromLoadedObject();
  78. /// Clear and deallocate the properties of this world object.
  79. inline void clearAndDeallocateProperties();
  80. /// Gets the collidable owned by this world object.
  81. /// If the object has no collision detection representation, 
  82. /// the shape in the collidable will be HK_NULL.
  83. inline hkpCollidable* getCollidableRw();
  84. /// Gets the collidable owned by this world object.
  85. /// If the object has no collision detection representation, the shape in the collidable will be HK_NULL.
  86. inline const hkpCollidable* getCollidable() const;
  87. inline hkpLinkedCollidable* getLinkedCollidable();
  88. inline const hkpLinkedCollidable* getLinkedCollidable() const;
  89. inline const hkpLinkedCollidable* getCollidableMtUnchecked() const;
  90. /// Returns true if this object is added to a world
  91. inline hkBool isAddedToWorld() const;
  92. /// Get the world that owns this object. This is HK_NULL if the object has not been added to the world
  93. inline hkpWorld* getWorld() const;
  94. /// Get a user data pointer for the world object
  95. inline hkUlong getUserData() const;
  96. /// Set a user data pointer for the world object
  97. inline void setUserData( hkUlong data );
  98. /// Get the name of this world object.
  99. inline const char* getName() const;
  100. /// Set the name of this world object.
  101. /// IMPORTANT: This data will not be cleaned up by the hkpWorldObject destructor. You are required to track it yourself.
  102. inline void setName( const char* name );
  103. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls ) const;
  104. /// Set the shape of an hkpEntity or an hkpPhantom.
  105. virtual hkWorldOperation::Result setShape( const hkpShape* shape );
  106. /// Lock this class and all child classes for read only access for this thread
  107. /// Note: This is only for debugging and does not wait to get exclusive access, 
  108. /// but simply assert if another thread locked the hkpWorld. You must read the
  109. /// user guide about multithreading to use this.
  110. inline void markForRead( );
  111. /// Lock this class and all child classes for read write access for this thread
  112. /// Note: This is only for debugging and does not wait to get exclusive access, 
  113. /// but simply assert if another thread locked the hkpWorld. You must read the
  114. /// user guide about multithreading to use this.
  115. inline void markForWrite( );
  116. // implementation of above function
  117. void markForWriteImpl( );
  118. /// Undo lockForRead
  119. /// Note: This is only for debugging and does not wait to get exclusive access, 
  120. /// but simply assert if another thread locked the hkpWorld. You must read the
  121. /// user guide about multithreading to use this.
  122. inline void unmarkForRead( );
  123. /// Unlock For write
  124. /// Note: This is only for debugging and does not wait to get exclusive access, 
  125. /// but simply assert if another thread locked the hkpWorld. You must read the
  126. /// user guide about multithreading to use this.
  127. inline void unmarkForWrite();
  128. /// Check for read write access
  129. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  130. void checkReadWrite();
  131. /// Check for read only access
  132. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  133. void checkReadOnly() const;
  134. public:
  135. /// Broadphase types.
  136. enum BroadPhaseType
  137. {
  138. /// 
  139. BROAD_PHASE_INVALID,
  140. /// hkpEntity.
  141. BROAD_PHASE_ENTITY,
  142. /// hkpPhantom.
  143. BROAD_PHASE_PHANTOM,
  144. /// hkpBroadPhaseBorder's objects (aabb phantoms).
  145. BROAD_PHASE_BORDER,
  146. /// 
  147. BROAD_PHASE_MAX_ID
  148. };
  149. protected:
  150. friend class hkpWorld;
  151. friend class hkpWorldOperationUtil;
  152. inline void setWorld( hkpWorld* world );
  153. hkpWorldObject( const hkpShape* shape, BroadPhaseType type ); 
  154. inline virtual ~hkpWorldObject(); // virtual for the sake of serialization flags
  155. public:
  156. // gets the motion state 
  157. virtual class hkMotionState* getMotionState() = 0;
  158. inline hkMultiThreadCheck& getMultiThreadCheck();
  159. inline const hkMultiThreadCheck& getMultiThreadCheck() const;
  160. inline void copyProperties( const hkpWorldObject* otherObj );
  161. class hkaiObjectData* getAiObjectData() const; 
  162. void setAiObjectData( hkaiObjectData* data );
  163. protected:
  164. hkpWorld* m_world; //+nosave
  165. hkUlong m_userData; //+default(0)
  166. protected: 
  167. // the collidable, which can only be accessed from hkpEntity / hkpPhantom
  168. // note: this member needs to be 16 byte aligned on PLAYSTATION(R)3
  169. class hkpLinkedCollidable m_collidable;
  170. protected:
  171. class hkMultiThreadCheck m_multiThreadCheck;
  172. const char* m_name;
  173. hkArray<class hkpProperty> m_properties;
  174. private:
  175. class hkReferencedObject* m_aiData; //+nosave
  176. public:
  177. hkpWorldObject( class hkFinishLoadedObjectFlag flag );
  178. };
  179. /// Helper function that returns the hkpWorldObject pointer for a hkpCollidable
  180. inline hkpWorldObject* hkGetWorldObject(const hkpCollidable* collidable)
  181. {
  182. return reinterpret_cast<hkpWorldObject*>( const_cast<void*>(collidable->getOwner()) );
  183. }
  184. #include <Physics/Dynamics/World/hkpWorldObject.inl>
  185. #endif //HK_DYNAMICS2_WORLD_OBJECT_H
  186. /*
  187. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  188. * Confidential Information of Havok.  (C) Copyright 1999-2009
  189. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  190. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  191. * rights, and intellectual property rights in the Havok software remain in
  192. * Havok and/or its suppliers.
  193. * Use of this software for evaluation purposes is subject to and indicates
  194. * acceptance of the End User licence Agreement for this product. A copy of
  195. * the license is included with this software and is also available at www.havok.com/tryhavok.
  196. */