FixedConstraint.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Physics/Constraints/TwoBodyConstraint.h>
  5. #include <Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h>
  6. #include <Jolt/Physics/Constraints/ConstraintPart/PointConstraintPart.h>
  7. JPH_NAMESPACE_BEGIN
  8. /// Fixed constraint settings, used to create a fixed constraint
  9. class FixedConstraintSettings final : public TwoBodyConstraintSettings
  10. {
  11. public:
  12. JPH_DECLARE_SERIALIZABLE_VIRTUAL(FixedConstraintSettings)
  13. /// Create an an instance of this constraint
  14. virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;
  15. };
  16. /// A fixed constraint welds two bodies together removing all degrees of freedom between them.
  17. /// This variant uses euler angles for the rotation constraint.
  18. class FixedConstraint final : public TwoBodyConstraint
  19. {
  20. public:
  21. /// Constructor
  22. FixedConstraint(Body &inBody1, Body &inBody2, const FixedConstraintSettings &inSettings);
  23. // Generic interface of a constraint
  24. virtual EConstraintSubType GetSubType() const override { return EConstraintSubType::Fixed; }
  25. virtual void SetupVelocityConstraint(float inDeltaTime) override;
  26. virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) override;
  27. virtual bool SolveVelocityConstraint(float inDeltaTime) override;
  28. virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) override;
  29. #ifdef JPH_DEBUG_RENDERER
  30. virtual void DrawConstraint(DebugRenderer *inRenderer) const override;
  31. #endif // JPH_DEBUG_RENDERER
  32. virtual void SaveState(StateRecorder &inStream) const override;
  33. virtual void RestoreState(StateRecorder &inStream) override;
  34. virtual Ref<ConstraintSettings> GetConstraintSettings() const override;
  35. // See: TwoBodyConstraint
  36. virtual Mat44 GetConstraintToBody1Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition1); }
  37. virtual Mat44 GetConstraintToBody2Matrix() const override { return Mat44::sRotationTranslation(mInvInitialOrientation, mLocalSpacePosition2); }
  38. ///@name Get Lagrange multiplier from last physics update (relates to how much force/torque was applied to satisfy the constraint)
  39. inline Vec3 GetTotalLambdaPosition() const { return mPointConstraintPart.GetTotalLambda(); }
  40. inline Vec3 GetTotalLambdaRotation() const { return mRotationConstraintPart.GetTotalLambda(); }
  41. private:
  42. // CONFIGURATION PROPERTIES FOLLOW
  43. // Local space constraint positions
  44. Vec3 mLocalSpacePosition1;
  45. Vec3 mLocalSpacePosition2;
  46. // Inverse of initial rotation from body 1 to body 2 in body 1 space
  47. Quat mInvInitialOrientation;
  48. // RUN TIME PROPERTIES FOLLOW
  49. // The constraint parts
  50. RotationEulerConstraintPart mRotationConstraintPart;
  51. PointConstraintPart mPointConstraintPart;
  52. };
  53. JPH_NAMESPACE_END