PointConstraint.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Physics/Constraints/TwoBodyConstraint.h>
  5. #include <Physics/Constraints/ConstraintPart/PointConstraintPart.h>
  6. namespace JPH {
  7. /// Point constraint settings, used to create a point constraint
  8. class PointConstraintSettings final : public TwoBodyConstraintSettings
  9. {
  10. public:
  11. JPH_DECLARE_SERIALIZABLE_VIRTUAL(PointConstraintSettings)
  12. // See: ConstraintSettings::SaveBinaryState
  13. virtual void SaveBinaryState(StreamOut &inStream) const override;
  14. /// Create an an instance of this constraint
  15. virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;
  16. /// Constraint is placed at mCommonPoint (world space position).
  17. Vec3 mCommonPoint = Vec3::sZero();
  18. protected:
  19. // See: ConstraintSettings::RestoreBinaryState
  20. virtual void RestoreBinaryState(StreamIn &inStream) override;
  21. };
  22. /// A point constraint constrains 2 bodies on a single point (removing 3 degrees of freedom)
  23. class PointConstraint final : public TwoBodyConstraint
  24. {
  25. public:
  26. /// Construct point constraint
  27. PointConstraint(Body &inBody1, Body &inBody2, const PointConstraintSettings &inSettings);
  28. // Generic interface of a constraint
  29. virtual EConstraintType GetType() const override { return EConstraintType::Point; }
  30. virtual void SetupVelocityConstraint(float inDeltaTime) override;
  31. virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) override;
  32. virtual bool SolveVelocityConstraint(float inDeltaTime) override;
  33. virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) override;
  34. #ifdef JPH_DEBUG_RENDERER
  35. virtual void DrawConstraint(DebugRenderer *inRenderer) const override;
  36. #endif // JPH_DEBUG_RENDERER
  37. virtual void SaveState(StateRecorder &inStream) const override;
  38. virtual void RestoreState(StateRecorder &inStream) override;
  39. // See: TwoBodyConstraint
  40. virtual Mat44 GetConstraintToBody1Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition1); }
  41. virtual Mat44 GetConstraintToBody2Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition2); } // Note: Incorrect rotation as we don't track the original rotation difference, should not matter though as the constraint is not limiting rotation.
  42. private:
  43. // Internal helper function to calculate the values below
  44. void CalculateConstraintProperties();
  45. // Local space constraint positions
  46. Vec3 mLocalSpacePosition1;
  47. Vec3 mLocalSpacePosition2;
  48. // The constraint part
  49. PointConstraintPart mPointConstraintPart;
  50. };
  51. } // JPH