hkpHingeLimitsData.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_HINGE_LIMITS_H
  9. #define HK_HINGE_LIMITS_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintData.h>
  11. #include <Physics/ConstraintSolver/Constraint/Atom/hkpConstraintAtom.h>
  12. extern const hkClass hkpHingeLimitsDataClass;
  13. /// This is a version of a hkLimitedHingeConstraint with removed linear constraints.
  14. /// This constraint is meant to be used with hkConstraintChains. 
  15. /// (that correspond to the ball-and-socket part). Once a chain has been defined, this constraint can be simply overlayed on top of it to impose 
  16. /// additional angular constraints.
  17. /// When this constraint is used together with hkpPoweredChainData, 
  18. /// care should be taken not to set the target in the powered chain data to lay
  19. /// outside the limits defined here.
  20. class hkpHingeLimitsData : public hkpConstraintData
  21. {
  22. public:
  23. HK_DECLARE_REFLECTION();
  24. hkpHingeLimitsData();
  25. /// Set the data for a Limited Hinge constraint with information given in body space.
  26. void setInBodySpace(const hkVector4& axisA, const hkVector4& axisB, 
  27. const hkVector4& axisAPerp, const hkVector4& axisBPerp);
  28. /// Set the data for a Limited Hinge constraint with information given in world space.
  29. void setInWorldSpace(const hkTransform& bodyATransform, const hkTransform& bodyBTransform, const hkVector4& axis);
  30. /// Check consistency of constraint members
  31. virtual hkBool isValid() const;
  32. /* Methods to set and get angle limits */
  33. /// Sets the maximum angular limit.
  34. inline void setMaxAngularLimit(hkReal rad);
  35. /// Sets the minimum angular limit.
  36. inline void setMinAngularLimit(hkReal rad);
  37. /// Gets the maximum angular limit.
  38. inline hkReal getMaxAngularLimit() const;
  39. /// Gets the minimum angular limit.
  40. inline hkReal getMinAngularLimit() const;
  41. /// sets the m_angularLimitsTauFactor. This is a factor in the range between 0 and 1
  42. /// which controls the stiffness of the angular limits. If you slowly increase
  43. /// this value from 0 to 1 for a newly created constraint,
  44. /// you can nicely blend in the limits.
  45. inline void setAngularLimitsTauFactor( hkReal mag );
  46. /// get the m_angularLimitsTauFactor;
  47.   inline hkReal getAngularLimitsTauFactor() const;
  48. /// Get type from this constraint
  49. virtual int getType() const;
  50. enum 
  51. {
  52. SOLVER_RESULT_LIMITS = 0, // angular limits defined around m_freeAxisA 
  53. SOLVER_RESULT_ANG_AXIS_1 = 1, // angular constraint defined by m_constrainedAxis1A
  54. SOLVER_RESULT_ANG_AXIS_2 = 2, // angular constraint defined by m_constrainedAxis2A
  55. SOLVER_RESULT_MAX = 3 // keep this in sync with the hkSolverResult array below
  56. };
  57. struct Runtime
  58. {
  59. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpHingeLimitsData::Runtime );
  60. class hkpSolverResults m_solverResults[3/*VC6 doesn't like the scoping for SOLVER_RESULT_MAX*/];
  61. // used by limits
  62. hkReal m_lastAngle; 
  63. };
  64. static inline Runtime* HK_CALL getRuntime( hkpConstraintRuntime* runtime ) { return reinterpret_cast<Runtime*>(runtime); }
  65. public:
  66. struct Atoms
  67. {
  68. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpHingeLimitsData::Atoms );
  69. HK_DECLARE_REFLECTION();
  70. struct hkpSetLocalRotationsConstraintAtom  m_rotations;
  71. struct hkpAngLimitConstraintAtom           m_angLimit; 
  72. struct hkp2dAngConstraintAtom   m_2dAng;
  73. enum Axis
  74. {
  75. AXIS_AXLE = 0,
  76. AXIS_PERP_TO_AXLE_1 = 1,
  77. AXIS_PERP_TO_AXLE_2 = 2
  78. };
  79. Atoms(){}
  80. // get a pointer to the first atom
  81. const hkpConstraintAtom* getAtoms() const { return &m_rotations; }
  82. // get the size of all atoms (we can't use sizeof(*this) because of align16 padding)
  83. int getSizeOfAllAtoms() const               { return hkGetByteOffsetInt(this, &m_2dAng+1); }
  84. Atoms(hkFinishLoadedObjectFlag f) :m_rotations(f), m_angLimit(f), m_2dAng(f) {}
  85. };
  86. HK_ALIGN16( struct Atoms m_atoms );
  87. public:
  88. // hkpConstraintData interface implementations
  89. virtual void getConstraintInfo( ConstraintInfo& infoOut ) const;
  90. // hkpConstraintData interface implementations
  91. virtual void getRuntimeInfo( hkBool wantRuntime, hkpConstraintData::RuntimeInfo& infoOut ) const;
  92. public:
  93. hkpHingeLimitsData(hkFinishLoadedObjectFlag f) : hkpConstraintData(f), m_atoms(f) {}
  94. };
  95. #include <Physics/Dynamics/Constraint/Chain/HingeLimits/hkpHingeLimitsData.inl>
  96. #endif // HK_HINGE_LIMITS_H
  97. /*
  98. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  99. * Confidential Information of Havok.  (C) Copyright 1999-2009
  100. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  101. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  102. * rights, and intellectual property rights in the Havok software remain in
  103. * Havok and/or its suppliers.
  104. * Use of this software for evaluation purposes is subject to and indicates
  105. * acceptance of the End User licence Agreement for this product. A copy of
  106. * the license is included with this software and is also available at www.havok.com/tryhavok.
  107. */