Wheel.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #include <Jolt/Physics/Vehicle/Wheel.h>
  6. #include <Jolt/Physics/Vehicle/VehicleConstraint.h>
  7. #include <Jolt/ObjectStream/TypeDeclarations.h>
  8. JPH_NAMESPACE_BEGIN
  9. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(WheelSettings)
  10. {
  11. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionForcePoint)
  12. JPH_ADD_ATTRIBUTE(WheelSettings, mPosition)
  13. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDirection)
  14. JPH_ADD_ATTRIBUTE(WheelSettings, mSteeringAxis)
  15. JPH_ADD_ATTRIBUTE(WheelSettings, mWheelForward)
  16. JPH_ADD_ATTRIBUTE(WheelSettings, mWheelUp)
  17. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMinLength)
  18. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMaxLength)
  19. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionPreloadLength)
  20. JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mMode, "mSuspensionSpringMode")
  21. JPH_ADD_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mFrequency, "mSuspensionFrequency") // Renaming attributes to stay compatible with old versions of the library
  22. JPH_ADD_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mDamping, "mSuspensionDamping")
  23. JPH_ADD_ATTRIBUTE(WheelSettings, mRadius)
  24. JPH_ADD_ATTRIBUTE(WheelSettings, mWidth)
  25. JPH_ADD_ATTRIBUTE(WheelSettings, mEnableSuspensionForcePoint)
  26. }
  27. void WheelSettings::SaveBinaryState(StreamOut &inStream) const
  28. {
  29. inStream.Write(mSuspensionForcePoint);
  30. inStream.Write(mPosition);
  31. inStream.Write(mSuspensionDirection);
  32. inStream.Write(mSteeringAxis);
  33. inStream.Write(mWheelForward);
  34. inStream.Write(mWheelUp);
  35. inStream.Write(mSuspensionMinLength);
  36. inStream.Write(mSuspensionMaxLength);
  37. inStream.Write(mSuspensionPreloadLength);
  38. mSuspensionSpring.SaveBinaryState(inStream);
  39. inStream.Write(mRadius);
  40. inStream.Write(mWidth);
  41. inStream.Write(mEnableSuspensionForcePoint);
  42. }
  43. void WheelSettings::RestoreBinaryState(StreamIn &inStream)
  44. {
  45. inStream.Read(mSuspensionForcePoint);
  46. inStream.Read(mPosition);
  47. inStream.Read(mSuspensionDirection);
  48. inStream.Read(mSteeringAxis);
  49. inStream.Read(mWheelForward);
  50. inStream.Read(mWheelUp);
  51. inStream.Read(mSuspensionMinLength);
  52. inStream.Read(mSuspensionMaxLength);
  53. inStream.Read(mSuspensionPreloadLength);
  54. mSuspensionSpring.RestoreBinaryState(inStream);
  55. inStream.Read(mRadius);
  56. inStream.Read(mWidth);
  57. inStream.Read(mEnableSuspensionForcePoint);
  58. }
  59. Wheel::Wheel(const WheelSettings &inSettings) :
  60. mSettings(&inSettings),
  61. mSuspensionLength(inSettings.mSuspensionMaxLength)
  62. {
  63. JPH_ASSERT(inSettings.mSuspensionDirection.IsNormalized());
  64. JPH_ASSERT(inSettings.mSteeringAxis.IsNormalized());
  65. JPH_ASSERT(inSettings.mWheelForward.IsNormalized());
  66. JPH_ASSERT(inSettings.mWheelUp.IsNormalized());
  67. JPH_ASSERT(inSettings.mSuspensionMinLength >= 0.0f);
  68. JPH_ASSERT(inSettings.mSuspensionMaxLength >= inSettings.mSuspensionMinLength);
  69. JPH_ASSERT(inSettings.mSuspensionPreloadLength >= 0.0f);
  70. JPH_ASSERT(inSettings.mSuspensionSpring.mFrequency > 0.0f);
  71. JPH_ASSERT(inSettings.mSuspensionSpring.mDamping >= 0.0f);
  72. JPH_ASSERT(inSettings.mRadius > 0.0f);
  73. JPH_ASSERT(inSettings.mWidth >= 0.0f);
  74. }
  75. bool Wheel::SolveLongitudinalConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  76. {
  77. return mLongitudinalPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLongitudinal, inMinImpulse, inMaxImpulse);
  78. }
  79. bool Wheel::SolveLateralConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  80. {
  81. return mLateralPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLateral, inMinImpulse, inMaxImpulse);
  82. }
  83. JPH_NAMESPACE_END