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

其他游戏

开发平台:

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_WHEEL_CONSTRAINT_H
  9. #define HK_DYNAMICS2_WHEEL_CONSTRAINT_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintData.h>
  11. #include <Physics/ConstraintSolver/Constraint/Atom/hkpConstraintAtom.h>
  12. extern const hkClass hkpWheelConstraintDataClass;
  13. /// A wheel constraint.  The constraint's body A is the wheel, while its body B is the chassis.
  14. class hkpWheelConstraintData : public hkpConstraintData
  15. {
  16. public: 
  17. HK_DECLARE_REFLECTION();
  18. hkpWheelConstraintData();
  19. /// Sets the wheel up with world space information. The Wheel is A, the Chassis is B.
  20. /// param bodyA The attached body, ie the wheel.
  21. /// param bodyB The reference body, ie the chassis.
  22. /// param pivot The pivot point, specified in world space.
  23. /// param axle The axle, specified in world space.
  24. /// param suspensionAxis The suspension axis, in world space.
  25. /// param steeringAxis The steering axis, in world space.
  26. void setInWorldSpace(const hkTransform& bodyATransform, const hkTransform& bodyBTransform, 
  27. const hkVector4& pivot, const hkVector4& axle, 
  28. const hkVector4& suspensionAxis, const hkVector4& steeringAxis);
  29. /// Sets the wheel up with with body space information. The Wheel is A, the Chassis is B.
  30. /// param bodyA The attached body, ie the wheel.
  31. /// param bodyB The reference body, ie the chassis.
  32. /// param pivotA The pivot point, specified in bodyA space.
  33. /// param pivotB The pivot point, specified in bodyB space.
  34. /// param axleA The axle, specified in bodyA space.
  35. /// param axleB The axle, specified in bodyB space.
  36. /// param suspensionAxisB The suspension axis, in bodyB space.
  37. /// param steeringAxisB The steering axis, in bodyB space.
  38. void setInBodySpace(const hkVector4& pivotA, const hkVector4& pivotB, 
  39. const hkVector4& axleA, const hkVector4& axleB, 
  40. const hkVector4& suspensionAxisB, const hkVector4& steeringAxisB);
  41. /// Check consistency of constraint members
  42. virtual hkBool isValid() const;
  43.     /// Sets the steering angle.
  44. void setSteeringAngle( hkReal angle );
  45. /// Get type from this constraint
  46. virtual int getType() const;
  47. /// Sets maximum limit of the suspension (0.5f by default).
  48. HK_FORCE_INLINE void setSuspensionMaxLimit(hkReal maxLimit);
  49. /// Sets minimum limit of the suspension (-0.5f by default).
  50. HK_FORCE_INLINE void setSuspensionMinLimit(hkReal minLimit);
  51. /// Sets suspension strength factor (0 by default).
  52. HK_FORCE_INLINE void setSuspensionStrength(hkReal tau);
  53. /// Sets suspension damping factor (0 by default).
  54. HK_FORCE_INLINE void setSuspensionDamping(hkReal damping);
  55. public:
  56. struct Atoms
  57. {
  58. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpWheelConstraintData::Atoms );
  59. HK_DECLARE_REFLECTION();
  60. enum Axis
  61. {
  62. AXIS_SUSPENSION = 0,
  63. AXIS_PERP_SUSPENSION = 1,
  64. AXIS_AXLE = 0,
  65. AXIS_STEERING = 1
  66. };
  67. struct hkpSetLocalTransformsConstraintAtom m_suspensionBase;
  68. struct hkpLinLimitConstraintAtom m_lin0Limit;
  69. struct hkpLinSoftConstraintAtom m_lin0Soft;
  70. struct hkpLinConstraintAtom m_lin1;
  71. struct hkpLinConstraintAtom m_lin2;
  72. struct hkpSetLocalRotationsConstraintAtom m_steeringBase;
  73. struct hkp2dAngConstraintAtom                m_2dAng;
  74. Atoms()
  75. {
  76. HK_CONSTRAINT_FILL_PADDING_WITH_ZERO(m_lin2,   m_steeringBase);
  77. }
  78. // get a pointer to the first atom
  79. const hkpConstraintAtom* getAtoms() const { return &m_suspensionBase; }
  80. // get the size of all atoms (we can't use sizeof(*this) because of align16 padding)
  81. int getSizeOfAllAtoms() const               { return hkGetByteOffsetInt(this, &m_2dAng+1); }
  82. Atoms(hkFinishLoadedObjectFlag f) : m_suspensionBase(f), m_lin0Limit(f), m_lin0Soft(f), m_lin1(f), m_lin2(f), m_steeringBase(f), m_2dAng(f) {}
  83. };
  84. HK_ALIGN16( struct Atoms m_atoms );
  85. // Used for modifying the localRotation when settingSteeringAngle
  86. hkVector4 m_initialAxleInB;
  87. hkVector4 m_initialSteeringAxisInB;
  88. enum 
  89. {
  90. SOLVER_RESULT_ANG_0 = 0, // angular constraint 0
  91. SOLVER_RESULT_ANG_1 = 1, // angular constraint 1
  92. SOLVER_RESULT_LIMIT = 2,        // linear limit 2
  93. SOLVER_RESULT_LIN_0 = 3, // linear constraint 
  94. SOLVER_RESULT_LIN_1 = 4, // linear constraint 
  95. SOLVER_RESULT_TAU_AND_DAMP = 5, // tau and damping
  96. SOLVER_RESULT_MAX = 6 // keep in sync with solver res array below.
  97. };
  98. struct Runtime
  99. {
  100. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpWheelConstraintData::Runtime );
  101. class hkpSolverResults m_solverResults[6/*VC6 doesn't like the scoping for SOLVER_RESULT_MAX*/];
  102. };
  103. static inline Runtime* HK_CALL getRuntime( hkpConstraintRuntime* runtime ) { return reinterpret_cast<Runtime*>(runtime); }
  104. public:
  105. // Internal functions
  106. // hkpConstraintData interface implementations
  107. virtual void getConstraintInfo( ConstraintInfo& infoOut ) const;
  108. // hkpConstraintData interface implementations
  109. virtual void getRuntimeInfo( hkBool wantRuntime, hkpConstraintData::RuntimeInfo& infoOut ) const;
  110. public:
  111. hkpWheelConstraintData(hkFinishLoadedObjectFlag f) : hkpConstraintData(f), m_atoms(f) {}
  112. };
  113. void hkpWheelConstraintData::setSuspensionMaxLimit(hkReal maxLimit)
  114. {
  115. m_atoms.m_lin0Limit.m_max = maxLimit;
  116. }
  117. void hkpWheelConstraintData::setSuspensionMinLimit(hkReal minLimit)
  118. {
  119. m_atoms.m_lin0Limit.m_min = minLimit;
  120. }
  121. void hkpWheelConstraintData::setSuspensionStrength(hkReal tau)
  122. {
  123. m_atoms.m_lin0Soft.m_tau = tau;
  124. }
  125. void hkpWheelConstraintData::setSuspensionDamping(hkReal damping)
  126. {
  127. m_atoms.m_lin0Soft.m_damping = damping;
  128. }
  129. #endif //HK_DYNAMICS2_WHEEL_CONSTRAINT_H
  130. /*
  131. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  132. * Confidential Information of Havok.  (C) Copyright 1999-2009
  133. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  134. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  135. * rights, and intellectual property rights in the Havok software remain in
  136. * Havok and/or its suppliers.
  137. * Use of this software for evaluation purposes is subject to and indicates
  138. * acceptance of the End User licence Agreement for this product. A copy of
  139. * the license is included with this software and is also available at www.havok.com/tryhavok.
  140. */