Wheel.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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, mPosition)
  12. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDirection)
  13. JPH_ADD_ATTRIBUTE(WheelSettings, mSteeringAxis)
  14. JPH_ADD_ATTRIBUTE(WheelSettings, mWheelForward)
  15. JPH_ADD_ATTRIBUTE(WheelSettings, mWheelUp)
  16. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMinLength)
  17. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMaxLength)
  18. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionPreloadLength)
  19. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionFrequency)
  20. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDamping)
  21. JPH_ADD_ATTRIBUTE(WheelSettings, mRadius)
  22. JPH_ADD_ATTRIBUTE(WheelSettings, mWidth)
  23. }
  24. void WheelSettings::SaveBinaryState(StreamOut &inStream) const
  25. {
  26. inStream.Write(mPosition);
  27. inStream.Write(mSuspensionDirection);
  28. inStream.Write(mSteeringAxis);
  29. inStream.Write(mWheelForward);
  30. inStream.Write(mWheelUp);
  31. inStream.Write(mSuspensionMinLength);
  32. inStream.Write(mSuspensionMaxLength);
  33. inStream.Write(mSuspensionPreloadLength);
  34. inStream.Write(mSuspensionFrequency);
  35. inStream.Write(mSuspensionDamping);
  36. inStream.Write(mRadius);
  37. inStream.Write(mWidth);
  38. }
  39. void WheelSettings::RestoreBinaryState(StreamIn &inStream)
  40. {
  41. inStream.Read(mPosition);
  42. inStream.Read(mSuspensionDirection);
  43. inStream.Read(mSteeringAxis);
  44. inStream.Read(mWheelForward);
  45. inStream.Read(mWheelUp);
  46. inStream.Read(mSuspensionMinLength);
  47. inStream.Read(mSuspensionMaxLength);
  48. inStream.Read(mSuspensionPreloadLength);
  49. inStream.Read(mSuspensionFrequency);
  50. inStream.Read(mSuspensionDamping);
  51. inStream.Read(mRadius);
  52. inStream.Read(mWidth);
  53. }
  54. Wheel::Wheel(const WheelSettings &inSettings) :
  55. mSettings(&inSettings),
  56. mSuspensionLength(inSettings.mSuspensionMaxLength)
  57. {
  58. JPH_ASSERT(inSettings.mSuspensionDirection.IsNormalized());
  59. JPH_ASSERT(inSettings.mSteeringAxis.IsNormalized());
  60. JPH_ASSERT(inSettings.mWheelForward.IsNormalized());
  61. JPH_ASSERT(inSettings.mWheelUp.IsNormalized());
  62. JPH_ASSERT(inSettings.mSuspensionMinLength >= 0.0f);
  63. JPH_ASSERT(inSettings.mSuspensionMaxLength >= inSettings.mSuspensionMinLength);
  64. JPH_ASSERT(inSettings.mSuspensionPreloadLength >= 0.0f);
  65. JPH_ASSERT(inSettings.mSuspensionFrequency > 0.0f);
  66. JPH_ASSERT(inSettings.mSuspensionDamping >= 0.0f);
  67. JPH_ASSERT(inSettings.mRadius > 0.0f);
  68. JPH_ASSERT(inSettings.mWidth >= 0.0f);
  69. }
  70. bool Wheel::SolveLongitudinalConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  71. {
  72. return mLongitudinalPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLongitudinal, inMinImpulse, inMaxImpulse);
  73. }
  74. bool Wheel::SolveLateralConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  75. {
  76. return mLateralPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLateral, inMinImpulse, inMaxImpulse);
  77. }
  78. JPH_NAMESPACE_END