hkpLimitedHingeConstraintData.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_LIMITED_HINGE_CONSTRAINT_H
  9. #define HK_LIMITED_HINGE_CONSTRAINT_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintData.h>
  11. #include <Physics/ConstraintSolver/Constraint/Atom/hkpConstraintAtom.h>
  12. extern const hkClass hkpLimitedHingeConstraintDataClass;
  13. /// Full hinge constraint with limits and motor. 
  14. /// 
  15. /// By default the motor is disabled. When the motor is enabled friction is automatically disabled.
  16. class hkpLimitedHingeConstraintData : public hkpConstraintData
  17. {
  18. public:
  19. HK_DECLARE_REFLECTION();
  20. hkpLimitedHingeConstraintData();
  21. ~hkpLimitedHingeConstraintData();
  22. /// Set the data for a Limited Hinge constraint with information given in body space.
  23. /// param pivotA The constraint pivot point, specified in bodyA space.
  24. /// param pivotB The constraint pivot point, specified in bodyB space.
  25. /// param axisA The hinge axis, specified in bodyA space.
  26. /// param axisB The hinge axis, specified in bodyB space.
  27. /// param axisAPerp Axis perpendicular to the hinge axis, specified in bodyA space.
  28. /// param axisBPerp Axis perpendicular to the hinge axis, specified in bodyB space.
  29. void setInBodySpace(const hkVector4& pivotA, const hkVector4& pivotB, 
  30. const hkVector4& axisA, const hkVector4& axisB, 
  31. const hkVector4& axisAPerp, const hkVector4& axisBPerp);
  32. /// Set the data for a Limited Hinge constraint with information given in world space.
  33. /// param bodyA The first rigid body transform.
  34. /// param bodyB The second rigid body transform.
  35. /// param pivot The pivot point, specified in world space.
  36. /// param axis The hinge axis, specified in world space.
  37. void setInWorldSpace(const hkTransform& bodyATransform, const hkTransform& bodyBTransform, 
  38. const hkVector4& pivot, const hkVector4& axis);
  39. /// Sets the maximum impulse that can be applied for this atom.
  40. /// Set it to HK_REAL_MAX to effectively disable the limit.
  41. virtual void setMaxLinearImpulse(hkReal maxImpulse);
  42. /// Gets the maximUm impulse that can be applied by this constraint.
  43. virtual hkReal getMaxLinearImpulse() const;
  44. /// Choose the body to be notified when the constraint's impulse is breached.
  45. virtual void setBodyToNotify(int bodyIdx);
  46. /// Returns the index of the body that is notified when the constraint's impulse limit is breached.
  47. virtual hkUint8 getNotifiedBodyIndex() const;
  48. /// Check consistency of constraint members
  49. virtual hkBool isValid() const;
  50. /* Methods to set and get angle limits and friction */
  51. /// Sets the friction value. Set this before adding to the system.
  52. /// Note that this value is an absolute torque value and is therefore dependent on the masses of constrained bodies
  53. /// and not limited between 0.0f and 1.0f. 
  54. /// If trying to stiffen up hinge constraints, try setting this value sufficiently high so that constraints are completely stiff and then
  55. /// reduce until the desired behaviour has been achieved.
  56. inline void setMaxFrictionTorque(hkReal tmag);
  57. /// Gets the friction value.
  58. inline hkReal getMaxFrictionTorque() const;
  59. /// Sets the maximum angular limit.
  60. inline void setMaxAngularLimit(hkReal rad);
  61. /// Sets the minimum angular limit.
  62. inline void setMinAngularLimit(hkReal rad);
  63. /// Gets the maximum angular limit.
  64. inline hkReal getMaxAngularLimit() const;
  65. /// Gets the minimum angular limit.
  66. inline hkReal getMinAngularLimit() const;
  67. /// sets the m_angularLimitsTauFactor. This is a factor in the range between 0 and 1
  68. /// which controls the stiffness of the angular limits. If you slowly increase
  69. /// this value from 0 to 1 for a newly created constraint,
  70. /// you can nicely blend in the limits.
  71. inline void setAngularLimitsTauFactor( hkReal mag );
  72. /// get the m_angularLimitsTauFactor;
  73.   inline hkReal getAngularLimitsTauFactor() const;
  74. /// This is the preferable way to disable angular limits when motor is active.
  75. inline void disableLimits();
  76. //
  77. // Motor-related methods
  78. //
  79. /// get the motor. default is HK_NULL
  80. inline hkpConstraintMotor* getMotor() const;
  81. /// Is this motor on ?
  82. inline hkBool isMotorActive() const;
  83. /// turn the motor on or off
  84. void setMotorActive( hkpConstraintInstance* instance, hkBool toBeEnabled );
  85. /// Set the motor.  Setting this to null will disable any motor computations.
  86. /// The angle passed to the hkpConstraintMotor::motor() callback will be the relative angle  
  87. /// between the attached and reference body.  You need to set the desired target angle of 
  88. /// your motor each step.
  89. /// increments reference of new motor, decrements counter of replaced motor ( if any )
  90. void setMotor( hkpConstraintMotor* motor );
  91. /// Sets the target angle for the motor. Only used by motors which use positions
  92. inline void setMotorTargetAngle( hkReal angle );
  93. /// Gets the target angle for the motor
  94. inline hkReal getMotorTargetAngle() const;
  95. //
  96. //
  97. //
  98. /// Get type from this constraint
  99. virtual int getType() const;
  100. enum 
  101. {
  102. SOLVER_RESULT_MOTOR = 0, // the motor
  103. SOLVER_RESULT_FRICTION = 1, // or friction 
  104. SOLVER_RESULT_LIMIT = 2, // limits defined around m_freeAxisA 
  105. SOLVER_RESULT_ANG_0 = 3, // angular constraint 0
  106. SOLVER_RESULT_ANG_1 = 4, // angular constraint 1
  107. SOLVER_RESULT_LIN_0 = 5, // linear constraint 
  108. SOLVER_RESULT_LIN_1 = 6, // linear constraint 
  109. SOLVER_RESULT_LIN_2 = 7, // linear constraint 
  110. SOLVER_RESULT_MAX = 8
  111. };
  112. struct Runtime
  113. {
  114. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpLimitedHingeConstraintData::Runtime );
  115. // Solver results must always be in the first position
  116. HK_ALIGN16( class hkpSolverResults m_solverResults[8/*VC6 doesn't like the scoping for SOLVER_RESULT_MAX*/] );
  117. // To tell whether the previous angle has been initialized.
  118. hkUint8 m_initialized;
  119. // The previous target angle
  120. hkReal m_previousTargetAngle;
  121. /// Returns current angle position
  122. inline hkReal getCurrentPos() const;
  123. };
  124. static inline Runtime* HK_CALL getRuntime( hkpConstraintRuntime* runtime ) { return reinterpret_cast<Runtime*>(runtime); }
  125. public:
  126. struct Atoms
  127. {
  128. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpLimitedHingeConstraintData::Atoms );
  129. HK_DECLARE_REFLECTION();
  130. struct hkpSetLocalTransformsConstraintAtom m_transforms;
  131. struct hkpAngMotorConstraintAtom           m_angMotor;
  132. struct hkpAngFrictionConstraintAtom        m_angFriction;
  133. struct hkpAngLimitConstraintAtom           m_angLimit; 
  134. struct hkp2dAngConstraintAtom   m_2dAng;
  135. struct hkpBallSocketConstraintAtom         m_ballSocket;
  136. enum Axis
  137. {
  138. AXIS_AXLE = 0,
  139. AXIS_PERP_TO_AXLE_1 = 1,
  140. AXIS_PERP_TO_AXLE_2 = 2
  141. };
  142. Atoms(){}
  143. // get a pointer to the first atom
  144. const hkpConstraintAtom* getAtoms() const { return &m_transforms; }
  145. // get the size of all atoms (we can't use sizeof(*this) because of align16 padding)
  146. int getSizeOfAllAtoms() const               { return hkGetByteOffsetInt(this, &m_ballSocket+1); }
  147. Atoms(hkFinishLoadedObjectFlag f) : m_transforms(f), m_angMotor(f), m_angFriction(f), m_angLimit(f), m_2dAng(f), m_ballSocket(f) {}
  148. };
  149. HK_ALIGN16( struct Atoms m_atoms );
  150. public:
  151. // hkpConstraintData interface implementations
  152. virtual void getConstraintInfo( ConstraintInfo& infoOut ) const ;
  153. // hkpConstraintData interface implementations
  154. virtual void getRuntimeInfo( hkBool wantRuntime, hkpConstraintData::RuntimeInfo& infoOut ) const;
  155. public:
  156. hkpLimitedHingeConstraintData(hkFinishLoadedObjectFlag f) : hkpConstraintData(f), m_atoms(f) {}
  157. };
  158. #include <Physics/Dynamics/Constraint/Bilateral/LimitedHinge/hkpLimitedHingeConstraintData.inl>
  159. #endif
  160. /*
  161. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  162. * Confidential Information of Havok.  (C) Copyright 1999-2009
  163. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  164. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  165. * rights, and intellectual property rights in the Havok software remain in
  166. * Havok and/or its suppliers.
  167. * Use of this software for evaluation purposes is subject to and indicates
  168. * acceptance of the End User licence Agreement for this product. A copy of
  169. * the license is included with this software and is also available at www.havok.com/tryhavok.
  170. */