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

其他游戏

开发平台:

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_CHAIN_INSTANCE_H
  9. #define HK_DYNAMICS2_CONSTRAINT_CHAIN_INSTANCE_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintInstance.h>
  11. #include <Physics/Dynamics/Constraint/Chain/hkpConstraintChainData.h>
  12. class hkpEntity;
  13. class hkpConstraintChainInstanceAction;
  14. /// hkpConstraintChainInstance allows you to create chains of constraints which are solved with a full-matrix solver (as opposed to Havok's iterative solver).
  15. /// This approach allows for creating much more stable setups. It is useful for creating long ropes, linking objects with high relative mass ratio, and creating
  16. /// more sturdy rag-doll setups.
  17. ///
  18. /// Solving of the constraint chains is based on the solver-in-a-solver approach. The entire constraint-chain is treated by the main Havok's solver as a single
  19. /// constraint. When the chain is processed it performs calculations on all its bodies at once using its own custom information. This means that in itself
  20. /// the constraint chain is perfectly stiff, however if single elements of the chain are colliding with other objects, separation can occur.
  21. /// 
  22. /// If you have a more complicated constraint system, like a ragdoll, you can use several constraint chain instances at the same time. 
  23. /// Example, you can create a chain going from the left foot to the right hand and another one going from the right foot to the left hand.
  24. /// Ideally the body/bodies which are shared by the two chains should be as heavy as possible to reduce stretching artefacts.
  25. ///
  26. /// Note: Constraints chains must use PRIORITY_PSI. Constraint chains do not support TOI-event solving.
  27. ///
  28. /// hkpConstraintChainInstance implements hkpConstraintInstance's interface and is treated by hkdynamics just like a normal constraint. However the hkpConstraintInstance 
  29. /// is designed to only connect two rigid bodies. hkpConstraintChainInstance stores internally the full list of bodies it links. That information is then passed 
  30. /// to the constraint constraint solver with hkpConstraintChainInstance's custom code.
  31. ///
  32. /// In order to properly react to e.g. bodies being removed from the hkpWorld, a hkpConstraintChainInstance is always coupled with a hkpConstraintChainInstanceAction
  33. /// which is automatically added to the world with the constraint chain. This action makes sure that the constraint-chain is removed from the world when some of the bodies
  34. /// that it references are missing.
  35. ///
  36. /// Data organization:
  37. ///  - hkpConstraintChainInstance stores the list of bodies linked. 
  38. ///  - The constraint properties are stored in its hkpConstraintChainData. 
  39. ///  - The current state of those constraints is stored in the chain's Runtime.
  40. ///
  41. class hkpConstraintChainInstance : public hkpConstraintInstance
  42. {
  43. public:
  44. HK_DECLARE_REFLECTION();
  45. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT );
  46. /// Constructor. 
  47. hkpConstraintChainInstance(hkpConstraintChainData* data);
  48. /// Destructor. Deletes the hkpConstraintChainInstanceAction belonging to the chain.
  49. ~hkpConstraintChainInstance();
  50. /// Get the hkpConstraintChainData object
  51. inline hkpConstraintChainData* getData() const { return static_cast<hkpConstraintChainData*>(m_data); }
  52. /// Interface implementation. Also removes the chain's hkpConstraintChainInstanceAction from the world. 
  53. virtual void entityRemovedCallback(hkpEntity* entity);
  54. /// Returns constraint type (normal/chain).
  55. virtual InstanceType getType() const { return TYPE_CHAIN; }
  56. /// Adds entity to the constraint-chain. The number of entities cannot exceed (getData()->getNumConstraintInfos() + 1) but may be less than that. In such
  57. /// case the constraint infos at the end are ignored when solving the constraint.
  58. void addEntity(hkpEntity* entity);
  59. /// Adds entity to the constraint chain at the beginning of the list, and shifts all previous constraints. 
  60. /// Note that this causes a reorganization in the entity-to-constraintInfo matching.
  61. inline void insertEntityAtFront(hkpEntity* entity) 
  62. {
  63. HK_ASSERT2(0xad6d5d44, m_owner == HK_NULL, "Cannot add entities when constraint chain is added to the world");
  64. HK_ASSERT2(0xad7877dd, m_chainedEntities.getSize() <= getData()->getNumConstraintInfos(), "Cannot add anymore entities to the chain -- pivots not specified.");
  65. m_chainedEntities.insertAt( 0, entity );
  66. entity->addReference();
  67. }
  68. /// Returns the number of constraints that will be solved in the chain.
  69. inline int getNumConstraints() { return hkMath::max2( 0, m_chainedEntities.getSize() - 1 ); }
  70. /// List of entieties linked by the chain. This array is also referenced by the hkpConstraintChainInstanceAction.
  71. hkArray<hkpEntity*> m_chainedEntities;
  72. /// Action guarding the chain constraint. When an entity belonging to the chain is removed, that action receives a callback and removes the constraint.
  73. /// We use this workaround because constraints can only hold references to two bodies.
  74. hkpConstraintChainInstanceAction* m_action;
  75. /// Serialization constructor
  76. hkpConstraintChainInstance( hkFinishLoadedObjectFlag f ) : hkpConstraintInstance(f), m_chainedEntities(f) {}
  77. };
  78. #endif // HK_DYNAMICS2_CONSTRAINT_CHAIN_INSTANCE_H
  79. /*
  80. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  81. * Confidential Information of Havok.  (C) Copyright 1999-2009
  82. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  83. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  84. * rights, and intellectual property rights in the Havok software remain in
  85. * Havok and/or its suppliers.
  86. * Use of this software for evaluation purposes is subject to and indicates
  87. * acceptance of the End User licence Agreement for this product. A copy of
  88. * the license is included with this software and is also available at www.havok.com/tryhavok.
  89. */