PointConstraint.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt.h>
  4. #include <Physics/Constraints/PointConstraint.h>
  5. #include <Physics/Body/Body.h>
  6. #include <ObjectStream/TypeDeclarations.h>
  7. #include <Core/StreamIn.h>
  8. #include <Core/StreamOut.h>
  9. #ifdef JPH_DEBUG_RENDERER
  10. #include <Renderer/DebugRenderer.h>
  11. #endif // JPH_DEBUG_RENDERER
  12. namespace JPH {
  13. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(PointConstraintSettings)
  14. {
  15. JPH_ADD_BASE_CLASS(PointConstraintSettings, TwoBodyConstraintSettings)
  16. JPH_ADD_ATTRIBUTE(PointConstraintSettings, mCommonPoint)
  17. }
  18. void PointConstraintSettings::SaveBinaryState(StreamOut &inStream) const
  19. {
  20. ConstraintSettings::SaveBinaryState(inStream);
  21. inStream.Write(mCommonPoint);
  22. }
  23. void PointConstraintSettings::RestoreBinaryState(StreamIn &inStream)
  24. {
  25. ConstraintSettings::RestoreBinaryState(inStream);
  26. inStream.Read(mCommonPoint);
  27. }
  28. TwoBodyConstraint *PointConstraintSettings::Create(Body &inBody1, Body &inBody2) const
  29. {
  30. return new PointConstraint(inBody1, inBody2, *this);
  31. }
  32. PointConstraint::PointConstraint(Body &inBody1, Body &inBody2, const PointConstraintSettings &inSettings) :
  33. TwoBodyConstraint(inBody1, inBody2, inSettings)
  34. {
  35. // Store local positions
  36. mLocalSpacePosition1 = inBody1.GetInverseCenterOfMassTransform() * inSettings.mCommonPoint;
  37. mLocalSpacePosition2 = inBody2.GetInverseCenterOfMassTransform() * inSettings.mCommonPoint;
  38. }
  39. void PointConstraint::CalculateConstraintProperties()
  40. {
  41. mPointConstraintPart.CalculateConstraintProperties(*mBody1, Mat44::sRotation(mBody1->GetRotation()), mLocalSpacePosition1, *mBody2, Mat44::sRotation(mBody2->GetRotation()), mLocalSpacePosition2);
  42. }
  43. void PointConstraint::SetupVelocityConstraint(float inDeltaTime)
  44. {
  45. CalculateConstraintProperties();
  46. }
  47. void PointConstraint::WarmStartVelocityConstraint(float inWarmStartImpulseRatio)
  48. {
  49. // Warm starting: Apply previous frame impulse
  50. mPointConstraintPart.WarmStart(*mBody1, *mBody2, inWarmStartImpulseRatio);
  51. }
  52. bool PointConstraint::SolveVelocityConstraint(float inDeltaTime)
  53. {
  54. return mPointConstraintPart.SolveVelocityConstraint(*mBody1, *mBody2);
  55. }
  56. bool PointConstraint::SolvePositionConstraint(float inDeltaTime, float inBaumgarte)
  57. {
  58. // Update constraint properties (bodies may have moved)
  59. CalculateConstraintProperties();
  60. return mPointConstraintPart.SolvePositionConstraint(*mBody1, *mBody2, inBaumgarte);
  61. }
  62. #ifdef JPH_DEBUG_RENDERER
  63. void PointConstraint::DrawConstraint(DebugRenderer *inRenderer) const
  64. {
  65. // Draw constraint
  66. inRenderer->DrawMarker(mBody1->GetCenterOfMassTransform() * mLocalSpacePosition1, Color::sRed, 0.1f);
  67. inRenderer->DrawMarker(mBody2->GetCenterOfMassTransform() * mLocalSpacePosition2, Color::sGreen, 0.1f);
  68. }
  69. #endif // JPH_DEBUG_RENDERER
  70. void PointConstraint::SaveState(StateRecorder &inStream) const
  71. {
  72. TwoBodyConstraint::SaveState(inStream);
  73. mPointConstraintPart.SaveState(inStream);
  74. }
  75. void PointConstraint::RestoreState(StateRecorder &inStream)
  76. {
  77. TwoBodyConstraint::RestoreState(inStream);
  78. mPointConstraintPart.RestoreState(inStream);
  79. }
  80. } // JPH