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

其他游戏

开发平台:

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_CONSTRAINT_H
  9. #define HK_DYNAMICS2_CONSTRAINT_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintData.h>
  11. class hkpConstraintData;
  12. class hkpEntity;
  13. class hkpRigidBody;
  14. class hkpConstraintOwner;
  15. class hkpSimulationIsland;
  16. class hkpConstraintListener;
  17. class hkpWorld;
  18. extern const hkClass hkpConstraintInstanceClass;
  19. /// An opaque piece of memory, where constraints can store instance related data
  20. /// Note: the constraint runtime is not 16 byte aligned
  21. typedef void hkpConstraintRuntime;
  22. /// The base class for constraints.
  23. class hkpConstraintInstance : public hkReferencedObject
  24. {
  25. public:
  26. // +version(1)
  27. HK_DECLARE_REFLECTION();
  28. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT );
  29. /// Specifies the priority for each constraint.
  30. /// Values must be corresponding to hkpCollisionDispatcher::CollisionQualityLevel
  31. enum ConstraintPriority
  32. {
  33. /// Invalid priority.
  34. PRIORITY_INVALID,
  35. /// Constraint is only solved at regular physics time steps (==PSIs)
  36. PRIORITY_PSI, 
  37. /// This is an unused value -- it corresponds to COLLISION_QUALITY_SIMPLIFIED_TOI. It's put here, because the ordering and values of this enum must match those
  38. /// of collidable qualities and of collisionQualityInfos in the hkpCollisionDispatcher.
  39. PRIORITY_SIMPLIFIED_TOI_UNUSED,
  40. /// Constraint is also touched at time of impact events.(TOI).
  41. PRIORITY_TOI,
  42. /// For internal use only! Higher quality. Warning: Use this quality only for contact constraints between moving and fixed objects.
  43. /// Info: Higher priority constraints have higher priority in the solver in PSI steps. They are actually processed as normal PRIORITY_TOI
  44. ///       constraints in TOI events.
  45. PRIORITY_TOI_HIGHER,
  46. /// For internal use only! Enforced quality. Warning: Use this quality only for contact constraints between critical and fixed objects.
  47. /// Info: Forced priority constraints have higher priority in the solver in PSI steps. They have also higher priority in the solver in TOI steps.
  48. ///       Additionally extra CPU time is used at the end of TOI event in attempt to enforce those constraints (with the cost of ignoring the state
  49. ///       of other -- non-forced -- constraints).
  50. PRIORITY_TOI_FORCED,
  51. };
  52. /// Constraint instance's type is queried by the engine to check whether the constraint is a 
  53. /// 'normal' constraint connecting two entities, or whether it's of a different kind requiring 
  54. /// special handling. (This is used e.g. when adding/removing constraints to the world.)
  55. enum InstanceType
  56. {
  57. // Standard constraint linking two bodies
  58. TYPE_NORMAL,
  59. // Chain of constraints. See hkpConstraintChainInstance
  60. TYPE_CHAIN
  61. };
  62. enum AddReferences
  63. {
  64. DO_NOT_ADD_REFERENCES,
  65. DO_ADD_REFERENCES
  66. };
  67. enum CloningMode
  68. {
  69. CLONE_INSTANCES_ONLY,
  70. CLONE_DATAS_WITH_MOTORS
  71. };
  72. /// Flags only used for Havok destruction
  73. enum OnDestructionRemapInfo
  74. {
  75. ON_DESTRUCTION_REMAP = 0, ///
  76. ON_DESTRUCTION_REMOVE = 1, ///
  77. ON_DESTRUCTION_RESET_REMOVE = 2, ///
  78. };
  79. //
  80. // Construction, destruction and cloning.
  81. //
  82. /// Construct a constraint instance between A and B, with the data
  83. /// for the constraint provided. The meaning of the Priority is given in
  84. /// the enum definition. EntityA can not be NULL, EntityB is allowed to be
  85. /// NULL and it will be replaced by the world fixed body upon addition to the 
  86. /// world. 
  87. hkpConstraintInstance(hkpEntity* entityA, hkpEntity* entityB, hkpConstraintData* data, ConstraintPriority priority = PRIORITY_PSI);
  88. /// Destructor removes references from entities A and B if set.
  89. ~hkpConstraintInstance();
  90. /// The fast construction is used by the serialization to
  91. /// init the vtables and do any extra init (but ONLY of non-serialized members).
  92. hkpConstraintInstance(hkFinishLoadedObjectFlag f) : hkReferencedObject(f) { }
  93. /// Clone the constraint, sharing as much as possible (ie: the constraint data
  94. /// if it can). In the default CLONE_INSTANCES_ONLY mode, this will NOT allow you to use different 
  95. /// motor targets for the original and cloned instances.
  96. /// 
  97. /// To allow for different motor targets for the original and cloned instances use the CLONE_DATAS_WITH_MOTORS mode.
  98. hkpConstraintInstance* clone(hkpEntity* newEntityA, hkpEntity* newEntityB, CloningMode mode = CLONE_INSTANCES_ONLY) const;
  99. protected:
  100. /// Internal constructor used by hkpSimpleConstraintContactMgr only 
  101. hkpConstraintInstance(ConstraintPriority priority);
  102. public:
  103. //
  104. // Accessors
  105. //
  106. /// Gets the first constrained entity.
  107. inline hkpEntity* getEntityA() const;
  108. /// Gets the entity at the requested index.
  109. inline hkpEntity* getEntity( int index ) const;
  110. /// Detaches the constraint from the oldEntity and reattaches it to a new one.
  111. void replaceEntity(hkpEntity* oldEntity, hkpEntity* newEntity);
  112. /// Gets the second constrained entity.
  113. inline hkpEntity* getEntityB() const;
  114. /// Gets the first constrained body.
  115. inline hkpRigidBody* getRigidBodyA() const;
  116. /// Gets the second constrained body.
  117. inline hkpRigidBody* getRigidBodyB() const;
  118. /// Gets either entity A or B which is not entity
  119. inline hkpEntity* getOtherEntity( const hkpEntity* entity ) const;
  120. /// Gets the non fixed island of either entityA or entityB
  121. hkpSimulationIsland* getSimulationIsland();
  122. /// Get the const hkpConstraintData object.
  123. inline const hkpConstraintData* getData() const;
  124. /// Get the non-const hkpConstraintData object.
  125. inline hkpConstraintData* getDataRw() const;
  126. /// Get the constrat's pivot point in world space, for the specified entity.
  127. void getPivotsInWorld(hkVector4& pivotAinW, hkVector4& pivotBinW) const;
  128. /// Adds a constraint listener to this constraint instance
  129. void addConstraintListener( hkpConstraintListener* listener );
  130. /// removes a constraint listener to this constraint instance
  131. void removeConstraintListener( hkpConstraintListener* listener );
  132. //
  133. // Runtime cache data for the constraint.
  134. //
  135. /// Get the runtime data.
  136. /// This can only be called after the constraint has been added to the world.
  137. /// Note: The runtime data is not 16 byte aligned.
  138. ///
  139. /// If setWantRuntime has been set to false, this may return HK_NULL.
  140. /// You can use this data to:
  141. /// - access the solver results directly
  142. /// - or to go the specific constraint runtime implementations and ask for the Runtime struct, e.g. hkBallSocketConstraint::getRuntime()
  143. ///
  144. /// You can get more information about this runtime if you go to the hkpConstraintData
  145. /// and call hkpConstraintData::getRuntimeInfo(...)
  146. inline hkpConstraintRuntime* getRuntime() const;
  147. /// Request that a hkpConstraintRuntime is allocated when you add the constraint to the hkpWorld.
  148. /// This must be called before the constraint is added to the world.
  149. ///
  150. /// If you call setWantRuntime( false ), a runtime might not be allocated for this constraint.
  151. /// Note:
  152. ///  - Not all constraints have a (external) runtime information.
  153. ///  - Some constraints always allocate a runtime, even if the wantRuntime flag is set to false.
  154. inline void setWantRuntime( hkBool b );
  155. /// Get the wantRuntime Flag, see setWantRuntime for details
  156. inline hkBool getWantRuntime() const ;
  157. //
  158. // User data.
  159. //
  160. /// Get the user data for the constraint (initialized to 0).
  161. inline hkUlong getUserData() const;
  162. /// Set the user data of the constraint.
  163. inline void setUserData( hkUlong data );
  164. //
  165. // Priority
  166. //
  167. /// Get the priority that this constraint was created with.
  168. inline ConstraintPriority getPriority() const;
  169. /// Set the priority for this constraint.
  170. void setPriority( ConstraintPriority priority );
  171. /// Get the name of this constraint.
  172. inline const char* getName() const;
  173. /// Set the name of this constraint.
  174. /// IMPORTANT: This data will not be cleaned up by the hkpConstraintInstance destructor. You are required to track it yourself.
  175. inline void setName( const char* name );
  176. /// Set inverse mass multipliers of the two entities.
  177. /// This function sets that inverse mass multipliers for this constraint only, and
  178. /// therefore does not modify the mass of the entities themselves. This function
  179. /// gives very fine grained control over constraints.
  180. /// This function can only be called once the constraint has been added to the
  181. /// world.
  182. void setVirtualMassInverse(const hkVector4& invMassA, const hkVector4& invMassB);
  183. /// Marks the constraint to not go into the solver. 
  184. /// A disabled constraint is still in the world, and still ensures the linked bodies
  185. /// are in the same hkpSimulationIsland.
  186. /// This function can only be called after the constraint has been added to the world.
  187. void disable ( void );
  188. /// Marks the constraint to go into the solver. 
  189. /// A constraint is enabled by default.
  190. /// This function can only be called after the constraint has been added to the world.
  191. void enable ( void );
  192. /// See hkConstraintInstance::enable() and hkConstraintInstance::disable().
  193. void setEnabled ( hkBool state );
  194. /// Returns false if the constraint has been marked as disabled.
  195. /// Disabled constraints will remain in the world, but will not enter the solver.
  196. hkBool isEnabled ( void );
  197. public:
  198. //
  199. // Internal functions
  200. //
  201. inline hkpConstraintOwner* getOwner() const;
  202. // Gets the master entity, can only be called if the constraint is added to the world
  203. inline hkpEntity* getMasterEntity() const;
  204. // Gets the slave entity, can only be called if the constraint is added to the world
  205. inline hkpEntity* getSlaveEntity() const;
  206. // hkpEntityListener interface implementation
  207. virtual void entityAddedCallback(hkpEntity* entity);
  208. // hkpEntityListener interface implementation
  209. virtual void entityRemovedCallback(hkpEntity* entity);
  210. // The constraint should never receive this callback, as the constraint keeps a reference to any entities it operates on.
  211. // The implementation asserts if called.
  212. virtual void entityDeletedCallback( hkpEntity* entity );
  213. inline void setOwner( hkpConstraintOwner* island );
  214. inline struct hkConstraintInternal* getInternal();
  215. void pointNullsToFixedRigidBody();
  216. // If either of the constrained entities are the fixed rigid body associated
  217. // with the provided world (a convention that is used to constrain a rigid body in space),
  218. // remove the reference and null the pointer.
  219. void setFixedRigidBodyPointersToZero( hkpWorld* world );
  220. virtual InstanceType getType() const { return TYPE_NORMAL; }
  221. public:
  222. class SmallArraySerializeOverrideType
  223. {
  224. public:
  225. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpConstraintInstance::SmallArraySerializeOverrideType );
  226. HK_DECLARE_REFLECTION();
  227. void* m_data;
  228. hkUint16 m_size;
  229. hkUint16 m_capacityAndFlags;
  230. };
  231. private:
  232. friend class hkpWorldConstraintUtil;
  233. friend class hkpSimpleConstraintContactMgr;
  234. friend class hkpSaveContactPointsUtil;
  235. /// Default constructor, you cannot derive from this class, you should derive from hkpConstraintData
  236. hkpConstraintInstance(){}
  237. //
  238. // Members
  239. //
  240. protected:
  241. friend class hkpSimpleContactConstraintData;
  242. friend class hkpSimulationIsland;
  243. class hkpConstraintOwner* m_owner; //+nosave
  244. class hkpConstraintData*  m_data;
  245. struct hkpModifierConstraintAtom* m_constraintModifiers;
  246. class hkpEntity* m_entities[2];
  247. public:
  248. hkEnum<ConstraintPriority,hkUint8> m_priority;
  249. protected:
  250. /// Set this to true, if you want to get access to RuntimeData later
  251. hkBool m_wantRuntime;
  252. public:
  253. hkEnum<OnDestructionRemapInfo, hkUint8> m_destructionRemapInfo;
  254. /// An array of constraint listeners
  255. class hkSmallArray<class hkpConstraintListener*> m_listeners; //+overridetype(class SmallArraySerializeOverrideType) +serialized(false)
  256. const char* m_name;
  257. hkUlong m_userData; // +default(0)
  258. struct hkConstraintInternal* m_internal; //+nosave
  259. };
  260. HK_CLASSALIGN16(struct) hkConstraintInternal
  261. {
  262. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkConstraintInternal );
  263. //
  264. // Public functions
  265. //
  266. // Gets the other entity. Not the one specified as the parameter, but the other of the two.
  267. inline hkpEntity* getOtherEntity( const hkpEntity* entity ) const;
  268. inline hkpEntity* getMasterEntity() const;
  269. inline hkpEntity* getSlaveEntity() const;
  270. inline struct hkpConstraintAtom* getAtoms() const { return m_atoms; }
  271. inline hkUint16 getAtomsSize() const { return m_atomsSize; }
  272. //
  273. // Internal functions
  274. //
  275. inline void clearConstraintInfo( );
  276. //
  277. // Members
  278. //
  279. public:
  280. class hkpConstraintInstance* m_constraint;
  281. /// The two entities. Attention: the master entity might be entity 0 or 1
  282. class hkpEntity*   m_entities[2]; // constant; owned by constraintUpdate
  283. protected:
  284. friend class hkpWorldConstraintUtil;
  285. /// pointer to the low level constraint information
  286. struct hkpConstraintAtom* m_atoms; // changed by the collision detection
  287. /// Total size of all constraint information
  288. hkUint16 m_atomsSize; // changed by the collision detection
  289. public:
  290. hkUint8 m_callbackRequest;
  291. hkEnum<hkpConstraintInstance::ConstraintPriority,hkUint8> m_priority;
  292. //
  293. // internal data
  294. //
  295. //
  296. // data controlled by the constraint owner
  297. //
  298. hkUint16 m_sizeOfSchemas;
  299. hkUint16 m_numSolverResults;
  300. hkUint16 m_numSolverElemTemps;
  301. inline void getConstraintInfo( hkpConstraintInfo& info ) const;
  302. inline void addConstraintInfo( const hkpConstraintInfo& delta );
  303. inline void subConstraintInfo( const hkpConstraintInfo& delta );
  304. //
  305. // data controlled by hkpWorldConstraintUtil
  306. //
  307. // Index of the master entity in m_entities.
  308. hkUint8 m_whoIsMaster;
  309. hkBool m_isNormalType;
  310. hkpConstraintRuntime* m_runtime;
  311. hkUint16 m_runtimeSize;
  312. // Index of the pointer to this hkConsraintInstance stored on the m_constraintsSlave list of the slave entity.
  313. hkObjectIndex m_slaveIndex; // this must not be changed in a multithreaded environment, e.g. by the spu collision detector
  314. friend class hkpSaveContactPointsUtil;
  315. };
  316. #include <Physics/Dynamics/Constraint/hkpConstraintInstance.inl>
  317. #endif // HK_DYNAMICS2_CONSTRAINT_H
  318. /*
  319. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  320. * Confidential Information of Havok.  (C) Copyright 1999-2009
  321. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  322. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  323. * rights, and intellectual property rights in the Havok software remain in
  324. * Havok and/or its suppliers.
  325. * Use of this software for evaluation purposes is subject to and indicates
  326. * acceptance of the End User licence Agreement for this product. A copy of
  327. * the license is included with this software and is also available at www.havok.com/tryhavok.
  328. */