hkpSolverInfo.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_CONSTRAINTSOLVER2_SOLVER_INFO_H
  9. #define HK_CONSTRAINTSOLVER2_SOLVER_INFO_H
  10. #include <Common/Base/hkBase.h>
  11. struct hkpSolverInfo
  12. {
  13. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSolverInfo );
  14. // Class to decide when an object is slow and what to do<br>
  15. //  - An object is recognized as a slow object if
  16. //     - all components of normalizedVelocity are less than 1
  17. // - normalizedVelocity = m_linearVelocityThresholdInv * linearVelocity + m_angularVelocityThresholdInv * angularVelocity
  18. enum DeactivationClass
  19. {
  20. DEACTIVATION_CLASS_INVALID, // same as off
  21. DEACTIVATION_CLASS_OFF,
  22. DEACTIVATION_CLASS_LOW,
  23. DEACTIVATION_CLASS_MEDIUM,
  24. DEACTIVATION_CLASS_HIGH,
  25. DEACTIVATION_CLASS_AGGRESSIVE,
  26. DEACTIVATION_CLASSES_END
  27. };
  28. struct DeactivationInfo
  29. {
  30. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSolverInfo::DeactivationInfo );
  31. //
  32. // The next values are used for solver deactivation.
  33. //  This type of deactivation just stabilizes slow objects
  34. //  it does not save CPU work
  35. //
  36. float m_linearVelocityThresholdInv;
  37. float m_angularVelocityThresholdInv;
  38. float m_slowObjectVelocityMultiplier;
  39. float m_relativeSleepVelocityThreshold;
  40. //
  41. // The next values are used for a real deactivation.
  42. //  They do save CPU work
  43. //
  44. /// the maximum distance sqrd a deactivation candidate is allowed to move
  45. /// There are 2 settings: The first is the normal one and will trigger a deactivation
  46. /// after 20 frames, the second one is an emergency deactivation and will trigger after 80 frames
  47. float m_maxDistSqrd[2];
  48. /// sames as m_maxDistSqrd, but instead of using the distance traveled by the mass center
  49. /// this is the distance traveled by any point on the object caused by rotation only
  50. hkHalf m_maxRotSqrd[2];
  51. };
  52. //
  53. // Static members
  54. //
  55. HK_ALIGN16( float m_one );
  56. float m_tau;
  57. float m_damping; // [ 0.0f .. 1.0f ]
  58. float m_frictionTau;
  59. hkVector4 m_globalAccelerationPerSubStep;
  60. hkVector4 m_globalAccelerationPerStep;
  61. hkVector4 m_integrateVelocityFactor;
  62. hkVector4 m_invIntegrateVelocityFactor;
  63. // tau/damping
  64. float m_dampDivTau;
  65. float m_tauDivDamp;
  66. float m_dampDivFrictionTau;
  67. float m_frictionTauDivDamp;
  68. inline void setTauAndDamping( float tau, float damping )
  69. {
  70. m_tau = tau;
  71. m_frictionTau = 0.5f * tau;
  72. m_damping = damping;
  73. m_dampDivTau = damping / tau;
  74. m_dampDivFrictionTau = damping / m_frictionTau;
  75. m_tauDivDamp = tau/damping;
  76. m_frictionTauDivDamp = m_frictionTau/damping;
  77. m_integrateVelocityFactor.setAll3( m_tauDivDamp );
  78. m_invIntegrateVelocityFactor.setAll3( m_dampDivTau );
  79. }
  80. float m_contactRestingVelocity; // [0.0 .. 0.5f if the contact velocity is less, restitution will be set to 0
  81. DeactivationInfo m_deactivationInfo[ DEACTIVATION_CLASSES_END ];
  82. //
  83. // Time step information
  84. //
  85. float m_deltaTime;
  86. float m_invDeltaTime;
  87. int m_numSteps;
  88. int   m_numMicroSteps;
  89. float m_invNumMicroSteps;
  90. float m_invNumSteps;
  91. hkBool m_forceCoherentConstraintOrderingInSolver;
  92. // <os.todo.a> change those counters to be more intuitive.
  93. inline void incrementDeactivationFlags() 
  94. {                                        // <ag.todo.a> test activation from actions & from outside of step()
  95. m_deactivationIntegrateCounter++;
  96. // we need each consecutive bi-flag to be not a negation of the previous one
  97. if (((m_deactivationIntegrateCounter+4) & 7) == 0)
  98. {
  99. m_deactivationNumInactiveFramesSelectFlag[0] ^= 0x01; // flip high-freq flag
  100. }
  101. if ((m_deactivationIntegrateCounter & 7) == 0)
  102. {
  103. m_deactivationNumInactiveFramesSelectFlag[0] ^= 0x02; // flip high-freq flag
  104. }
  105. if ((m_deactivationIntegrateCounter & 15) == 0)
  106. {
  107. m_deactivationNumInactiveFramesSelectFlag[1] = 1 - m_deactivationNumInactiveFramesSelectFlag[1]; // flip low-freq flag
  108. m_deactivationIntegrateCounter = 0; // loop counter
  109. }
  110. }
  111. hkUint8 m_deactivationNumInactiveFramesSelectFlag[2];
  112. hkUint8 m_deactivationIntegrateCounter;
  113. };
  114. struct hkp1dMotorSolverInfo 
  115. {
  116.     HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkp1dMotorSolverInfo );
  117.     
  118.     /// max impulse that can be applied forward
  119.     hkReal m_maxImpulsePerSubstep;
  120.     
  121.     /// max impulse that can be applied backwards. This is a negative value. This has not been tested for positive values!
  122.     hkReal m_minImpulsePerSubstep;
  123.     
  124.     /// the velocity target
  125.     hkReal m_velocity;
  126.     
  127.     /// The strength of the constraint between 0 and 1
  128.     hkReal m_tau; // Consider changing this to a hkHalf
  129.     
  130.     /// The damping of the motor between 0 and 1
  131.     hkReal m_damping; // Consider changing this to a hkHalf
  132. };
  133. struct hkp3dAngularMotorSolverInfo
  134. {
  135. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkp3dAngularMotorSolverInfo );
  136. typedef hkUint8 Status;
  137. enum Mask
  138. {
  139. ANGULAR_1ST = 0x03,
  140. ANGULAR_2ND = 0x0c,
  141. ANGULAR_3RD = 0x30,
  142. };
  143. enum MotorState
  144. {
  145. // Values:
  146. // 0b00 -- ok, not broken
  147. MOTOR_NOT_BROKEN          = 0x00,
  148. // 0b01 -- broken, max breached
  149. MOTOR_BROKEN_MAX_BREACHED = 0x01,
  150. // 0b11 -- broken, min breached
  151. MOTOR_BROKEN_MIN_BREACHED = 0x03,
  152. // 0b10 -- illegal, (might be used for marking excluded/disabled motors)
  153. MOTOR_DISABLED = 0x02
  154. };
  155. // Flags that mark individual angular constraints as broken.
  156. Status m_broken;
  157. inline int getState(int idx) const 
  158. {
  159. HK_ASSERT2(0xad67d8d8, idx >= 0  && idx <= 2, "Idx must be in {1,2,3}.");
  160. return (m_broken >> (2 * idx)) & ANGULAR_1ST; 
  161. }
  162. inline void setState(int idx, int value)
  163. {
  164. HK_ASSERT2(0xad67d8d8, idx >= 0  && idx <= 2, "Idx must be in {1,2,3}.");
  165. const int shiftedValue  = (value & ANGULAR_1ST) << (2 * idx);
  166. const int shiftedMask   = ANGULAR_1ST << (2 * idx);
  167. m_broken &= hkUint8(~shiftedMask);
  168. m_broken |= hkUint8(shiftedValue);
  169. }
  170. // Holds motor information for each of the angular constraints.
  171. hkp1dMotorSolverInfo m_motorInfos[3];
  172. };
  173. #endif // HK_CONSTRAINTSOLVER2_SOLVER_INFO_H
  174. /*
  175. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  176. * Confidential Information of Havok.  (C) Copyright 1999-2009
  177. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  178. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  179. * rights, and intellectual property rights in the Havok software remain in
  180. * Havok and/or its suppliers.
  181. * Use of this software for evaluation purposes is subject to and indicates
  182. * acceptance of the End User licence Agreement for this product. A copy of
  183. * the license is included with this software and is also available at www.havok.com/tryhavok.
  184. */