JoltPhysics3D: Add distance constraint

This commit is contained in:
SirLynix 2023-04-05 08:31:13 +02:00 committed by Jérôme Leclercq
parent 96cc9aa9d7
commit 61724cc4b9
2 changed files with 107 additions and 0 deletions

View File

@ -58,6 +58,26 @@ namespace Nz
std::unique_ptr<JPH::TwoBodyConstraint> m_constraint;
};
class NAZARA_JOLTPHYSICS3D_API JoltDistanceConstraint3D : public JoltConstraint3D
{
public:
JoltDistanceConstraint3D(JoltRigidBody3D& first, const Vector3f& pivot, float maxDist = -1.f, float minDist = -1.f);
JoltDistanceConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& pivot, float maxDist = -1.f, float minDist = -1.f);
JoltDistanceConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, float maxDist = -1.f, float minDist = -1.f);
~JoltDistanceConstraint3D() = default;
float GetDamping() const;
float GetFrequency() const;
float GetMaxDistance() const;
float GetMinDistance() const;
void SetDamping(float damping);
void SetDistance(float minDist, float maxDist);
void SetFrequency(float frequency);
void SetMaxDistance(float maxDist);
void SetMinDistance(float minDist);
};
class NAZARA_JOLTPHYSICS3D_API JoltPivotConstraint3D : public JoltConstraint3D
{
public:

View File

@ -7,6 +7,7 @@
#include <Nazara/JoltPhysics3D/JoltHelper.hpp>
#include <Jolt/Jolt.h>
#include <Jolt/Physics/PhysicsSystem.h>
#include <Jolt/Physics/Constraints/DistanceConstraint.h>
#include <Jolt/Physics/Constraints/PointConstraint.h>
#include <cassert>
#include <Nazara/JoltPhysics3D/Debug.hpp>
@ -99,6 +100,92 @@ namespace Nz
}
JoltDistanceConstraint3D::JoltDistanceConstraint3D(JoltRigidBody3D& first, const Vector3f& pivot, float maxDist, float minDist)
{
JPH::DistanceConstraintSettings settings;
settings.mPoint1 = ToJolt(pivot);
settings.mPoint2 = ToJolt(pivot);
settings.mSpace = JPH::EConstraintSpace::WorldSpace;
settings.mMaxDistance = maxDist;
settings.mMinDistance = minDist;
SetupConstraint(std::make_unique<JPH::DistanceConstraint>(*first.GetBody(), JPH::Body::sFixedToWorld, settings));
}
JoltDistanceConstraint3D::JoltDistanceConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& pivot, float maxDist, float minDist)
{
JPH::DistanceConstraintSettings settings;
settings.mPoint1 = ToJolt(pivot);
settings.mPoint2 = ToJolt(pivot);
settings.mSpace = JPH::EConstraintSpace::WorldSpace;
settings.mMaxDistance = maxDist;
settings.mMinDistance = minDist;
SetupConstraint(std::make_unique<JPH::DistanceConstraint>(*first.GetBody(), *second.GetBody(), settings));
}
JoltDistanceConstraint3D::JoltDistanceConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, float maxDist, float minDist)
{
JPH::DistanceConstraintSettings settings;
settings.mPoint1 = ToJolt(firstAnchor);
settings.mPoint2 = ToJolt(secondAnchor);
settings.mSpace = JPH::EConstraintSpace::WorldSpace;
settings.mMaxDistance = maxDist;
settings.mMinDistance = minDist;
SetupConstraint(std::make_unique<JPH::DistanceConstraint>(*first.GetBody(), *second.GetBody(), settings));
}
float JoltDistanceConstraint3D::GetDamping() const
{
return GetConstraint<JPH::DistanceConstraint>()->GetDamping();
}
float JoltDistanceConstraint3D::GetFrequency() const
{
return GetConstraint<JPH::DistanceConstraint>()->GetFrequency();
}
float JoltDistanceConstraint3D::GetMaxDistance() const
{
return GetConstraint<JPH::DistanceConstraint>()->GetMaxDistance();
}
float JoltDistanceConstraint3D::GetMinDistance() const
{
return GetConstraint<JPH::DistanceConstraint>()->GetMinDistance();
}
void JoltDistanceConstraint3D::SetDamping(float damping)
{
GetConstraint<JPH::DistanceConstraint>()->SetDamping(damping);
}
void JoltDistanceConstraint3D::SetDistance(float minDist, float maxDist)
{
GetConstraint<JPH::DistanceConstraint>()->SetDistance(minDist, maxDist);
}
void JoltDistanceConstraint3D::SetFrequency(float frequency)
{
GetConstraint<JPH::DistanceConstraint>()->SetFrequency(frequency);
}
void JoltDistanceConstraint3D::SetMaxDistance(float maxDist)
{
JPH::DistanceConstraint* constraint = GetConstraint<JPH::DistanceConstraint>();
constraint->SetDistance(constraint->GetMinDistance(), maxDist);
}
void JoltDistanceConstraint3D::SetMinDistance(float minDist)
{
JPH::DistanceConstraint* constraint = GetConstraint<JPH::DistanceConstraint>();
constraint->SetDistance(minDist, constraint->GetMaxDistance());
}
JoltPivotConstraint3D::JoltPivotConstraint3D(JoltRigidBody3D& first, const Vector3f& pivot)
{
JPH::PointConstraintSettings settings;