97 lines
4.1 KiB
C++
97 lines
4.1 KiB
C++
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
|
|
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include <Jolt/Physics/Constraints/TwoBodyConstraint.h>
|
|
#include <Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h>
|
|
#include <Jolt/Physics/Constraints/ConstraintPart/PointConstraintPart.h>
|
|
|
|
JPH_NAMESPACE_BEGIN
|
|
|
|
/// Fixed constraint settings, used to create a fixed constraint
|
|
class JPH_EXPORT FixedConstraintSettings final : public TwoBodyConstraintSettings
|
|
{
|
|
JPH_DECLARE_SERIALIZABLE_VIRTUAL(JPH_EXPORT, FixedConstraintSettings)
|
|
|
|
public:
|
|
// See: ConstraintSettings::SaveBinaryState
|
|
virtual void SaveBinaryState(StreamOut &inStream) const override;
|
|
|
|
/// Create an instance of this constraint
|
|
virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;
|
|
|
|
/// This determines in which space the constraint is setup, all properties below should be in the specified space
|
|
EConstraintSpace mSpace = EConstraintSpace::WorldSpace;
|
|
|
|
/// When mSpace is WorldSpace mPoint1 and mPoint2 can be automatically calculated based on the positions of the bodies when the constraint is created (they will be fixated in their current relative position/orientation). Set this to false if you want to supply the attachment points yourself.
|
|
bool mAutoDetectPoint = false;
|
|
|
|
/// Body 1 constraint reference frame (space determined by mSpace)
|
|
RVec3 mPoint1 = RVec3::sZero();
|
|
Vec3 mAxisX1 = Vec3::sAxisX();
|
|
Vec3 mAxisY1 = Vec3::sAxisY();
|
|
|
|
/// Body 2 constraint reference frame (space determined by mSpace)
|
|
RVec3 mPoint2 = RVec3::sZero();
|
|
Vec3 mAxisX2 = Vec3::sAxisX();
|
|
Vec3 mAxisY2 = Vec3::sAxisY();
|
|
|
|
protected:
|
|
// See: ConstraintSettings::RestoreBinaryState
|
|
virtual void RestoreBinaryState(StreamIn &inStream) override;
|
|
};
|
|
|
|
/// A fixed constraint welds two bodies together removing all degrees of freedom between them.
|
|
/// This variant uses Euler angles for the rotation constraint.
|
|
class JPH_EXPORT FixedConstraint final : public TwoBodyConstraint
|
|
{
|
|
public:
|
|
JPH_OVERRIDE_NEW_DELETE
|
|
|
|
/// Constructor
|
|
FixedConstraint(Body &inBody1, Body &inBody2, const FixedConstraintSettings &inSettings);
|
|
|
|
// Generic interface of a constraint
|
|
virtual EConstraintSubType GetSubType() const override { return EConstraintSubType::Fixed; }
|
|
virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM) override;
|
|
virtual void SetupVelocityConstraint(float inDeltaTime) override;
|
|
virtual void ResetWarmStart() override;
|
|
virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) override;
|
|
virtual bool SolveVelocityConstraint(float inDeltaTime) override;
|
|
virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) override;
|
|
#ifdef JPH_DEBUG_RENDERER
|
|
virtual void DrawConstraint(DebugRenderer *inRenderer) const override;
|
|
#endif // JPH_DEBUG_RENDERER
|
|
virtual void SaveState(StateRecorder &inStream) const override;
|
|
virtual void RestoreState(StateRecorder &inStream) override;
|
|
virtual Ref<ConstraintSettings> GetConstraintSettings() const override;
|
|
|
|
// See: TwoBodyConstraint
|
|
virtual Mat44 GetConstraintToBody1Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition1); }
|
|
virtual Mat44 GetConstraintToBody2Matrix() const override { return Mat44::sRotationTranslation(mInvInitialOrientation, mLocalSpacePosition2); }
|
|
|
|
///@name Get Lagrange multiplier from last physics update (the linear/angular impulse applied to satisfy the constraint)
|
|
inline Vec3 GetTotalLambdaPosition() const { return mPointConstraintPart.GetTotalLambda(); }
|
|
inline Vec3 GetTotalLambdaRotation() const { return mRotationConstraintPart.GetTotalLambda(); }
|
|
|
|
private:
|
|
// CONFIGURATION PROPERTIES FOLLOW
|
|
|
|
// Local space constraint positions
|
|
Vec3 mLocalSpacePosition1;
|
|
Vec3 mLocalSpacePosition2;
|
|
|
|
// Inverse of initial rotation from body 1 to body 2 in body 1 space
|
|
Quat mInvInitialOrientation;
|
|
|
|
// RUN TIME PROPERTIES FOLLOW
|
|
|
|
// The constraint parts
|
|
RotationEulerConstraintPart mRotationConstraintPart;
|
|
PointConstraintPart mPointConstraintPart;
|
|
};
|
|
|
|
JPH_NAMESPACE_END
|