Wheel.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Physics/Vehicle/Wheel.h>
  5. #include <Jolt/Physics/Vehicle/VehicleConstraint.h>
  6. #include <Jolt/ObjectStream/TypeDeclarations.h>
  7. JPH_NAMESPACE_BEGIN
  8. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(WheelSettings)
  9. {
  10. JPH_ADD_ATTRIBUTE(WheelSettings, mPosition)
  11. JPH_ADD_ATTRIBUTE(WheelSettings, mDirection)
  12. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMinLength)
  13. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMaxLength)
  14. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionPreloadLength)
  15. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionFrequency)
  16. JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDamping)
  17. JPH_ADD_ATTRIBUTE(WheelSettings, mRadius)
  18. JPH_ADD_ATTRIBUTE(WheelSettings, mWidth)
  19. }
  20. void WheelSettings::SaveBinaryState(StreamOut &inStream) const
  21. {
  22. inStream.Write(mPosition);
  23. inStream.Write(mDirection);
  24. inStream.Write(mSuspensionMinLength);
  25. inStream.Write(mSuspensionMaxLength);
  26. inStream.Write(mSuspensionPreloadLength);
  27. inStream.Write(mSuspensionFrequency);
  28. inStream.Write(mSuspensionDamping);
  29. inStream.Write(mRadius);
  30. inStream.Write(mWidth);
  31. }
  32. void WheelSettings::RestoreBinaryState(StreamIn &inStream)
  33. {
  34. inStream.Read(mPosition);
  35. inStream.Read(mDirection);
  36. inStream.Read(mSuspensionMinLength);
  37. inStream.Read(mSuspensionMaxLength);
  38. inStream.Read(mSuspensionPreloadLength);
  39. inStream.Read(mSuspensionFrequency);
  40. inStream.Read(mSuspensionDamping);
  41. inStream.Read(mRadius);
  42. inStream.Read(mWidth);
  43. }
  44. Wheel::Wheel(const WheelSettings &inSettings) :
  45. mSettings(&inSettings),
  46. mContactLength(inSettings.mSuspensionMaxLength + inSettings.mRadius)
  47. {
  48. JPH_ASSERT(inSettings.mDirection.IsNormalized());
  49. JPH_ASSERT(inSettings.mSuspensionMinLength >= 0.0f);
  50. JPH_ASSERT(inSettings.mSuspensionMaxLength >= inSettings.mSuspensionMinLength);
  51. JPH_ASSERT(inSettings.mSuspensionPreloadLength >= 0.0f);
  52. JPH_ASSERT(inSettings.mSuspensionFrequency > 0.0f);
  53. JPH_ASSERT(inSettings.mSuspensionDamping >= 0.0f);
  54. JPH_ASSERT(inSettings.mRadius > 0.0f);
  55. JPH_ASSERT(inSettings.mWidth >= 0.0f);
  56. }
  57. bool Wheel::SolveLongitudinalConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  58. {
  59. return mLongitudinalPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLongitudinal, inMinImpulse, inMaxImpulse);
  60. }
  61. bool Wheel::SolveLateralConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
  62. {
  63. return mLateralPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLateral, inMinImpulse, inMaxImpulse);
  64. }
  65. JPH_NAMESPACE_END