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

其他游戏

开发平台:

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_ENTITY_H
  9. #define HK_DYNAMICS2_ENTITY_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Physics/Dynamics/World/hkpWorldObject.h>
  12. #include <Physics/Dynamics/Common/hkpMaterial.h>
  13. #include <Physics/Dynamics/Constraint/hkpConstraintInstance.h>
  14. #include <Physics/Dynamics/Motion/Rigid/hkpKeyframedRigidMotion.h>
  15. class hkpEntityListener;
  16. class hkpEntityActivationListener;
  17. class hkpCollisionListener;
  18. class hkpMotion;
  19. class hkpSimulationIsland;
  20. class hkpWorld;
  21. class hkpConstraintInstance;
  22. class hkpAction;
  23. class hkpDynamicsContactMgr;
  24. class hkSpuCollisionCallbackUtil;
  25. class hkLocalFrame;
  26. class hkpBreakableBody;
  27. class hkdBreakableBody;
  28. extern const hkClass hkpEntityClass;
  29. /// This class represents the core "physical object" elements in the dynamics system, such
  30. /// as rigid bodies.
  31. class hkpEntity : public hkpWorldObject
  32. {
  33. public:
  34. // +version(1)
  35. HK_DECLARE_REFLECTION();
  36. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_ENTITY);
  37. enum SpuCollisionCallbackEventFilter
  38. {
  39. SPU_SEND_NONE = 0x00,
  40. SPU_SEND_CONTACT_POINT_ADDED = 0x01,
  41. SPU_SEND_CONTACT_POINT_PROCESS = 0x02,
  42. SPU_SEND_CONTACT_POINT_REMOVED = 0x04,
  43. SPU_SEND_CONTACT_POINT_ADDED_OR_PROCESS = SPU_SEND_CONTACT_POINT_ADDED|SPU_SEND_CONTACT_POINT_PROCESS
  44. };
  45. public:
  46. // Destructor.
  47. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  48. virtual ~hkpEntity();
  49. //
  50. // Event Handling
  51. //
  52. /// Adds an entity listener to the entity.
  53. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  54. void addEntityListener( hkpEntityListener* el);
  55. /// Removes an entity listener from the entity.
  56. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  57. void removeEntityListener( hkpEntityListener* el);
  58. /// Adds an entity activation listener to the entity.
  59. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  60. void addEntityActivationListener( hkpEntityActivationListener* el);
  61. /// Removes an entity activation listener from the entity.
  62. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  63. void removeEntityActivationListener( hkpEntityActivationListener* el);
  64. /// Adds a collision listener to the entity.
  65. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  66. void addCollisionListener( hkpCollisionListener* cl );
  67. /// Removes a collision listener from the entity.
  68. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  69. void removeCollisionListener( hkpCollisionListener* cl);
  70. /// Get const access to the array of entity listeners.
  71. inline const hkSmallArray<hkpEntityListener*>& getEntityListeners() const;
  72. /// Get const access to the array of entity activation listeners.
  73. inline const hkSmallArray<hkpEntityActivationListener*>& getEntityActivationListeners() const;
  74. /// Get const access to the array of entity listeners.
  75. inline const hkSmallArray<hkpCollisionListener*>& getCollisionListeners() const;
  76. /// Simple thread safe check free function to see if any collision listener is attached
  77. inline bool areCollisionListenersAdded() const;
  78. /// Gets the process contact callback delay.
  79. inline hkUint16 getProcessContactCallbackDelay() const;
  80. /// Sets the process contact callback delay.
  81. /// This value is used to determine how often a callback is raised for the
  82. /// "process contact" collision event.
  83. /// A value of 0 means the callback is called every step, whereas a value of 4 means
  84. /// that a callback is raised every 5th step.
  85. /// Process contact callbacks can be used to change properties of contact points, such
  86. /// as the friction of a sliding contact.
  87. inline void setProcessContactCallbackDelay( hkUint16 delay );
  88. //
  89. // Utility functions
  90. //
  91. /// Gets the material used by this entity.
  92. /// If the entity has no collision detection representation,
  93. /// the material is not used.
  94. inline hkpMaterial& getMaterial();
  95. /// Gets the material used by this entity.
  96. /// If the entity has no collision detection representation,
  97. /// the material is not used.
  98. inline const hkpMaterial& getMaterial() const;
  99. /// A utility function to determine if the entity is fixed.
  100. inline hkBool isFixed() const;
  101. /// Checks whether the body's velocity cannot be influenced by physics directly.
  102. /// Uses a cached variable to avoid referencing hkpMotion object.
  103. inline hkBool isFixedOrKeyframed() const;
  104. /// Get's the entity's unique id. The uid is assigned in the entity's constructor and
  105. /// is also updated when your deserialize objects.
  106. inline hkUint32 getUid() const;
  107. /// Find the contact manager between 'this' and the supplied entity.
  108. ///
  109. /// Returns HK_NULL if no contact manager exists between 'this' and the supplied entity.
  110. hkpDynamicsContactMgr* findContactMgrTo(const hkpEntity* entity) const;
  111. /// Returns a pointer to the attached hkdBreakableBody. Returns HK_NULL if none exists.
  112. hkdBreakableBody* getBreakableBody() const;
  113. //
  114. // Deactivation
  115. //
  116. /// Activates the specified entity and its island.
  117. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  118. void activate();
  119. /// Deactivates the specified entity and its island.
  120. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RW] [this,HK_ACCESS_RW] );
  121. void deactivate();
  122. /// Activates the specified entity and its island. Uses postponed operations queue if the world is locked for critical operations.
  123. void activateAsCriticalOperation();
  124. /// Deactivates the specified entity and its island. Uses postponed operations queue if the world is locked for critical operations.
  125. void deactivateAsCriticalOperation();
  126. /// Returns whether the entity is active. This method returns false if the entity
  127. /// has not yet been added to a hkpWorld object.
  128. hkBool isActive() const;
  129. //
  130. // Attached action and constraint accessors
  131. //
  132. /// Get the number of actions added to the world which reference this entity
  133. inline int getNumActions() const;
  134. /// Get the ith action added to the world which references this entity
  135. inline hkpAction* getAction(int i);
  136. /// Returns the number of constraints attached to this entity
  137. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RO] );
  138. int getNumConstraints() const;
  139. /// Returns the ith constraint attached to this entity
  140. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RW] );
  141. hkpConstraintInstance* getConstraint( int i );
  142. /// Returns all constraints of the body in a single array.
  143. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RO] );
  144. void getAllConstraints(hkArray<hkpConstraintInstance*>& constraints);
  145. /// Returns the ith constraint attached to this entity (const version)
  146. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RO] );
  147. const hkpConstraintInstance* getConstraint( int i ) const;
  148. /// Returns read only access to the internal constraint master list
  149. inline const hkSmallArray<struct hkConstraintInternal>&  getConstraintMasters() const;
  150. /// Returns read write access to the internal constraint master list
  151. inline hkSmallArray<struct hkConstraintInternal>&  getConstraintMastersRw();
  152. /// Returns read only access to the internal constraint master list
  153. inline const hkArray<class hkpConstraintInstance*>&  getConstraintSlaves() const;
  154. // Calculate the memory usage of this entity
  155. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  156. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls) const;
  157. /// Initialize cached AABB memory and SPU data (if available).
  158. void setCachedShapeData(const hkpWorld* world, const hkpShape* shape);
  159. /// Recalculate the cached AABB.
  160. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  161. void updateCachedAabb();
  162. protected:
  163. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RO] );
  164. const hkSmallArray<struct hkConstraintInternal>& getConstraintMastersImpl() const;
  165. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RW] );
  166. hkSmallArray<struct hkConstraintInternal>& getConstraintMastersRwImpl();
  167. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [m_simulationIsland,HK_ACCESS_RO] );
  168. const hkArray<class hkpConstraintInstance*>& getConstraintSlavesImpl() const;
  169. hkpEntity( const hkpShape* shape );
  170. public:
  171. //
  172. // INTERNAL FUNCTIONS
  173. //
  174. hkpEntity( class hkFinishLoadedObjectFlag flag );
  175. // Simulation units use this interface.
  176. inline hkpMotion* getMotion();
  177. // Get the simulation island, is HK_NULL for entities not in simulation.
  178. inline hkpSimulationIsland* getSimulationIsland() const;
  179. // Deallocates internal arrays if size 0.
  180. // Called internal by hkpWorld::removeEntity. Over
  181. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  182. virtual void deallocateInternalArrays();
  183. virtual hkMotionState* getMotionState(){ return HK_NULL; }
  184. //
  185. // MEMBERS
  186. //
  187. protected:
  188. // The entity's material, only used if the collision detection is enabled.
  189. class hkpMaterial m_material;
  190. protected:
  191. friend class hkpWorldConstraintUtil;
  192. public:
  193. // this is just a quick workaround helper class for serialization
  194. public:
  195. class SmallArraySerializeOverrideType
  196. {
  197. public:
  198. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpEntity::SmallArraySerializeOverrideType );
  199. HK_DECLARE_REFLECTION();
  200. void* m_data;
  201. hkUint16 m_size;
  202. hkUint16 m_capacityAndFlags;
  203. };
  204.     public:     void* m_limitContactImpulseUtil; //+serialized(false)
  205. /// A property used by Havok Destruction indicating how much damage an object will cause on another object
  206. hkReal m_damageMultiplier; //+default(1)
  207.                 hkpBreakableBody* m_breakableBody; //+nosave
  208. // the next three elements store constraint information (note: they are owned by the simulation island
  209. // offset into the accumulators
  210.     public:     hkUint32                                    m_solverData;                   //+serialized(false)
  211. public:  hkObjectIndex m_storageIndex; //+overridetype(hkUint16)
  212. protected: hkUint16 m_processContactCallbackDelay;
  213.     protected:  hkSmallArray<struct hkConstraintInternal>   m_constraintsMaster;            //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  214.     protected:  hkArray<hkpConstraintInstance*>             m_constraintsSlave;             //+serialized(false)
  215. // ------------------ 2nd CacheLine128 (rarely accessed data ) -------------------------
  216. protected:
  217.         hkArray<hkUint8> m_constraintRuntime;   //+serialized(false)
  218. // The entity's simulation island.
  219.         hkpSimulationIsland* m_simulationIsland; //+nosave
  220. public:
  221. /// See: hkpRigidBodyCinfo::m_autoRemoveLevel
  222. hkInt8  m_autoRemoveLevel;
  223. /// See: hkpRigidBodyCinfo::m_numUserDatasInContactPointProperties
  224. hkUint8 m_numUserDatasInContactPointProperties;
  225. // hkpWorld-unique Id
  226. hkUint32 m_uid; //+default(0xffffffff)
  227. public:
  228. struct SpuCollisionCallback
  229. {
  230. public:
  231. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpEntity::SpuCollisionCallback );
  232. HK_DECLARE_REFLECTION();
  233. SpuCollisionCallback():
  234. m_util(HK_NULL),
  235. m_capacity(0),
  236. m_eventFilter(SPU_SEND_CONTACT_POINT_ADDED_OR_PROCESS),
  237. m_userFilter(0x01)
  238. {
  239. }
  240. // only entities with a callback util will send events from spu to ppu; each event will only be fired once for each util
  241.             hkSpuCollisionCallbackUtil* m_util; // +nosave
  242. // the maximum buffer size (counted in 16byte blocks) for events to be sent from spu to ppu; this value is set by setSpuCollisionCallbackUtil()
  243.             hkUint16 m_capacity; //+serialized(false)
  244. // used to filter what events to send from spu to ppu
  245. hkUint8 m_eventFilter;
  246. // free to be set by the user; note that events will only be sent from spu to ppu for entities whose userFilter both have at least one matching bit set
  247. hkUint8 m_userFilter;
  248. SpuCollisionCallback(hkFinishLoadedObjectFlag flag) {}
  249. };
  250. // this class was created to keep the entity size <= 512
  251. struct ExtendedListeners
  252. {
  253. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpEntity::ExtendedListeners );
  254. HK_DECLARE_REFLECTION();
  255. hkSmallArray<hkpEntityActivationListener*> m_activationListeners; //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  256. hkSmallArray<hkpEntityListener*> m_entityListeners; //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  257. };
  258. public:
  259. struct SpuCollisionCallback m_spuCollisionCallback;
  260.     protected:  mutable ExtendedListeners* m_extendedListeners; //+serialized(false)
  261. // The motion of the object
  262. public: class hkpMaxSizeMotion m_motion;//+hk.DataObjectType("hkpMotion")
  263. protected:
  264. //
  265. // Rarely used members
  266. //
  267. friend class hkpEntityCallbackUtil;
  268. friend class hkpWorldCallbackUtil;
  269. friend class hkpWorld;
  270. friend class hkpSimulationIsland;
  271. friend class hkpWorldOperationUtil;
  272.         hkSmallArray<hkpCollisionListener*>         m_collisionListeners;   //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  273. protected:
  274.         hkSmallArray<hkpAction*>                        m_actions;              //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  275. public:
  276. /// A hierarchy of local frames attached to the entity.
  277. hkRefPtr<hkLocalFrame> m_localFrame;
  278. };
  279. #include <Physics/Dynamics/Entity/hkpEntity.inl>
  280. #endif // HK_DYNAMICS2_ENTITY_H
  281. /*
  282. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  283. * Confidential Information of Havok.  (C) Copyright 1999-2009
  284. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  285. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  286. * rights, and intellectual property rights in the Havok software remain in
  287. * Havok and/or its suppliers.
  288. * Use of this software for evaluation purposes is subject to and indicates
  289. * acceptance of the End User licence Agreement for this product. A copy of
  290. * the license is included with this software and is also available at www.havok.com/tryhavok.
  291. */