diff --git a/include/Nazara/JoltPhysics3D/JoltConstraint3D.hpp b/include/Nazara/JoltPhysics3D/JoltConstraint3D.hpp index 2144f480e..4b2e4bf77 100644 --- a/include/Nazara/JoltPhysics3D/JoltConstraint3D.hpp +++ b/include/Nazara/JoltPhysics3D/JoltConstraint3D.hpp @@ -3,63 +3,68 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#if 0 + #ifndef NAZARA_JOLTPHYSICS3D_JOLTCONSTRAINT3D_HPP #define NAZARA_JOLTPHYSICS3D_JOLTCONSTRAINT3D_HPP #include -#include -#include -#include +#include +#include +#include #include #include -class btTypedConstraint; +namespace JPH +{ + class TwoBodyConstraint; +} namespace Nz { - class BulletConstraint3D; + class JoltConstraint3D; - using BulletConstraint3DHandle = ObjectHandle; + using JoltConstraint3DHandle = ObjectHandle; - class NAZARA_BULLETPHYSICS3D_API BulletConstraint3D : public HandledObject + class NAZARA_JOLTPHYSICS3D_API JoltConstraint3D : public HandledObject { public: - BulletConstraint3D(const BulletConstraint3D&) = delete; - BulletConstraint3D(BulletConstraint3D&& constraint) noexcept; - virtual ~BulletConstraint3D(); + JoltConstraint3D(const JoltConstraint3D&) = delete; + JoltConstraint3D(JoltConstraint3D&& constraint) noexcept; + virtual ~JoltConstraint3D(); - BulletRigidBody3D& GetBodyA(); - const BulletRigidBody3D& GetBodyA() const; - BulletRigidBody3D& GetBodyB(); - const BulletRigidBody3D& GetBodyB() const; - BulletPhysWorld3D& GetWorld(); - const BulletPhysWorld3D& GetWorld() const; + JoltRigidBody3D& GetBodyA(); + const JoltRigidBody3D& GetBodyA() const; + JoltRigidBody3D& GetBodyB(); + const JoltRigidBody3D& GetBodyB() const; + JoltPhysWorld3D& GetWorld(); + const JoltPhysWorld3D& GetWorld() const; - inline bool IsBodyCollisionEnabled() const; bool IsSingleBody() const; - BulletConstraint3D& operator=(const BulletConstraint3D&) = delete; - BulletConstraint3D& operator=(BulletConstraint3D&& constraint) noexcept; + JoltConstraint3D& operator=(const JoltConstraint3D&) = delete; + JoltConstraint3D& operator=(JoltConstraint3D&& constraint) noexcept; protected: - BulletConstraint3D(std::unique_ptr constraint, bool disableCollisions = false); + JoltConstraint3D(); template T* GetConstraint(); template const T* GetConstraint() const; + void SetupConstraint(std::unique_ptr constraint); + private: - std::unique_ptr m_constraint; - bool m_bodyCollisionEnabled; + void Destroy(); + + std::unique_ptr m_constraint; }; - class NAZARA_BULLETPHYSICS3D_API BulletPivotConstraint3D : public BulletConstraint3D + class NAZARA_JOLTPHYSICS3D_API JoltPivotConstraint3D : public JoltConstraint3D { public: - BulletPivotConstraint3D(BulletRigidBody3D& first, const Vector3f& pivot); - BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& pivot, bool disableCollisions = false); - BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions = false); - ~BulletPivotConstraint3D() = default; + JoltPivotConstraint3D(JoltRigidBody3D& first, const Vector3f& pivot); + JoltPivotConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& pivot); + JoltPivotConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor); + ~JoltPivotConstraint3D() = default; Vector3f GetFirstAnchor() const; Vector3f GetSecondAnchor() const; @@ -69,7 +74,6 @@ namespace Nz }; } -#include +#include #endif // NAZARA_BULLETPHYSICS3D_BULLETCONSTRAINT3D_HPP -#endif // NAZARA_JOLTPHYSICS3D_JOLTCONSTRAINT3D_HPP diff --git a/include/Nazara/JoltPhysics3D/JoltConstraint3D.inl b/include/Nazara/JoltPhysics3D/JoltConstraint3D.inl index ed65f234f..7f92f2e6e 100644 --- a/include/Nazara/JoltPhysics3D/JoltConstraint3D.inl +++ b/include/Nazara/JoltPhysics3D/JoltConstraint3D.inl @@ -6,19 +6,14 @@ namespace Nz { - inline bool BulletConstraint3D::IsBodyCollisionEnabled() const - { - return m_bodyCollisionEnabled; - } - template - T* BulletConstraint3D::GetConstraint() + T* JoltConstraint3D::GetConstraint() { return SafeCast(m_constraint.get()); } template - const T* BulletConstraint3D::GetConstraint() const + const T* JoltConstraint3D::GetConstraint() const { return SafeCast(m_constraint.get()); } diff --git a/include/Nazara/JoltPhysics3D/JoltRigidBody3D.hpp b/include/Nazara/JoltPhysics3D/JoltRigidBody3D.hpp index f0402ae15..88c20f42d 100644 --- a/include/Nazara/JoltPhysics3D/JoltRigidBody3D.hpp +++ b/include/Nazara/JoltPhysics3D/JoltRigidBody3D.hpp @@ -46,6 +46,8 @@ namespace Nz Boxf GetAABB() const; float GetAngularDamping() const; Vector3f GetAngularVelocity() const; + inline JPH::Body* GetBody(); + inline const JPH::Body* GetBody() const; inline UInt32 GetBodyIndex() const; inline const std::shared_ptr& GetGeom() const; float GetLinearDamping() const; diff --git a/include/Nazara/JoltPhysics3D/JoltRigidBody3D.inl b/include/Nazara/JoltPhysics3D/JoltRigidBody3D.inl index 2f95a37da..d53a176c4 100644 --- a/include/Nazara/JoltPhysics3D/JoltRigidBody3D.inl +++ b/include/Nazara/JoltPhysics3D/JoltRigidBody3D.inl @@ -11,6 +11,16 @@ namespace Nz return EnableSleeping(false); } + inline JPH::Body* JoltRigidBody3D::GetBody() + { + return m_body; + } + + inline const JPH::Body* JoltRigidBody3D::GetBody() const + { + return m_body; + } + inline UInt32 JoltRigidBody3D::GetBodyIndex() const { return m_bodyIndex; diff --git a/src/Nazara/JoltPhysics3D/JoltConstraint3D.cpp b/src/Nazara/JoltPhysics3D/JoltConstraint3D.cpp index 280db9682..b43d972aa 100644 --- a/src/Nazara/JoltPhysics3D/JoltConstraint3D.cpp +++ b/src/Nazara/JoltPhysics3D/JoltConstraint3D.cpp @@ -1,125 +1,156 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - JoltPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#if 0 + #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include namespace Nz { - BulletConstraint3D::BulletConstraint3D(std::unique_ptr constraint, bool disableCollisions) : - m_constraint(std::move(constraint)), - m_bodyCollisionEnabled(!disableCollisions) - { - btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); - world->addConstraint(m_constraint.get(), disableCollisions); - } + JoltConstraint3D::JoltConstraint3D() = default; - BulletConstraint3D::BulletConstraint3D(BulletConstraint3D&& constraint) noexcept : - m_constraint(std::move(constraint.m_constraint)), - m_bodyCollisionEnabled(constraint.m_bodyCollisionEnabled) + JoltConstraint3D::JoltConstraint3D(JoltConstraint3D&& constraint) noexcept : + m_constraint(std::move(constraint.m_constraint)) { if (m_constraint) - m_constraint->setUserConstraintPtr(this); + m_constraint->SetUserData(SafeCast(reinterpret_cast(this))); } - BulletConstraint3D::~BulletConstraint3D() + JoltConstraint3D::~JoltConstraint3D() { - if (m_constraint) - { - btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); - world->removeConstraint(m_constraint.get()); - } + Destroy(); } - BulletRigidBody3D& BulletConstraint3D::GetBodyA() + JoltRigidBody3D& JoltConstraint3D::GetBodyA() { - return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); + return *reinterpret_cast(static_cast(m_constraint->GetBody1()->GetUserData())); } - const BulletRigidBody3D& BulletConstraint3D::GetBodyA() const + const JoltRigidBody3D& JoltConstraint3D::GetBodyA() const { - return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); + return *reinterpret_cast(static_cast(m_constraint->GetBody1()->GetUserData())); } - BulletRigidBody3D& BulletConstraint3D::GetBodyB() + JoltRigidBody3D& JoltConstraint3D::GetBodyB() { NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); - return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); + return *reinterpret_cast(static_cast(m_constraint->GetBody2()->GetUserData())); } - const BulletRigidBody3D& BulletConstraint3D::GetBodyB() const + const JoltRigidBody3D& JoltConstraint3D::GetBodyB() const { NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); - return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); + return *reinterpret_cast(static_cast(m_constraint->GetBody2()->GetUserData())); } - BulletPhysWorld3D& BulletConstraint3D::GetWorld() + JoltPhysWorld3D& JoltConstraint3D::GetWorld() { return *GetBodyA().GetWorld(); } - const BulletPhysWorld3D& BulletConstraint3D::GetWorld() const + const JoltPhysWorld3D& JoltConstraint3D::GetWorld() const { return *GetBodyA().GetWorld(); } - bool BulletConstraint3D::IsSingleBody() const + bool JoltConstraint3D::IsSingleBody() const { - return &m_constraint->getRigidBodyB() == &btTypedConstraint::getFixedBody(); + return m_constraint->GetBody2() == &JPH::Body::sFixedToWorld; } - BulletConstraint3D& BulletConstraint3D::operator=(BulletConstraint3D&& constraint) noexcept + JoltConstraint3D& JoltConstraint3D::operator=(JoltConstraint3D&& constraint) noexcept { - m_constraint.reset(); + Destroy(); m_constraint = std::move(constraint.m_constraint); - m_bodyCollisionEnabled = constraint.m_bodyCollisionEnabled; if (m_constraint) - m_constraint->setUserConstraintPtr(this); + m_constraint->SetUserData(SafeCast(reinterpret_cast(this))); return *this; } - - BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, const Vector3f& pivot) : - BulletConstraint3D(std::make_unique(*first.GetRigidBody(), ToBullet(first.ToLocal(pivot)))) + void JoltConstraint3D::Destroy() { + if (m_constraint) + { + JPH::PhysicsSystem* physicsSystem = GetWorld().GetPhysicsSystem(); + physicsSystem->RemoveConstraint(m_constraint.get()); + + m_constraint.reset(); + } } - BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& pivot, bool disableCollisions) : - BulletConstraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(first.ToLocal(pivot)), ToBullet(second.ToLocal(pivot))), disableCollisions) + void JoltConstraint3D::SetupConstraint(std::unique_ptr constraint) { + assert(!m_constraint); + m_constraint = std::move(constraint); + m_constraint->SetEmbedded(); + m_constraint->SetUserData(SafeCast(reinterpret_cast(this))); + + JPH::PhysicsSystem* physicsSystem = GetWorld().GetPhysicsSystem(); + physicsSystem->AddConstraint(m_constraint.get()); } - BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions) : - BulletConstraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(firstAnchor), ToBullet(secondAnchor)), disableCollisions) + + JoltPivotConstraint3D::JoltPivotConstraint3D(JoltRigidBody3D& first, const Vector3f& pivot) { + JPH::PointConstraintSettings settings; + settings.mPoint1 = ToJolt(pivot); + settings.mPoint2 = ToJolt(pivot); + settings.mSpace = JPH::EConstraintSpace::WorldSpace; + + SetupConstraint(std::make_unique(*first.GetBody(), JPH::Body::sFixedToWorld, settings)); } - Vector3f BulletPivotConstraint3D::GetFirstAnchor() const + JoltPivotConstraint3D::JoltPivotConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& pivot) { - return FromBullet(GetConstraint()->getPivotInA()); + JPH::PointConstraintSettings settings; + settings.mPoint1 = ToJolt(pivot); + settings.mPoint2 = ToJolt(pivot); + settings.mSpace = JPH::EConstraintSpace::WorldSpace; + + SetupConstraint(std::make_unique(*first.GetBody(), *second.GetBody(), settings)); } - Vector3f BulletPivotConstraint3D::GetSecondAnchor() const + JoltPivotConstraint3D::JoltPivotConstraint3D(JoltRigidBody3D& first, JoltRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor) { - return FromBullet(GetConstraint()->getPivotInB()); + JPH::PointConstraintSettings settings; + settings.mPoint1 = ToJolt(firstAnchor); + settings.mPoint2 = ToJolt(secondAnchor); + settings.mSpace = JPH::EConstraintSpace::WorldSpace; + + SetupConstraint(std::make_unique(*first.GetBody(), *second.GetBody(), settings)); } - void BulletPivotConstraint3D::SetFirstAnchor(const Vector3f& firstAnchor) + Vector3f JoltPivotConstraint3D::GetFirstAnchor() const { - GetConstraint()->setPivotA(ToBullet(firstAnchor)); + const JPH::PointConstraint* constraint = GetConstraint(); + + return FromJolt(constraint->GetBody1()->GetCenterOfMassTransform() * constraint->GetLocalSpacePoint1()); } - void BulletPivotConstraint3D::SetSecondAnchor(const Vector3f& secondAnchor) + Vector3f JoltPivotConstraint3D::GetSecondAnchor() const { - GetConstraint()->setPivotB(ToBullet(secondAnchor)); + const JPH::PointConstraint* constraint = GetConstraint(); + + return FromJolt(constraint->GetBody2()->GetCenterOfMassTransform() * constraint->GetLocalSpacePoint2()); + } + + void JoltPivotConstraint3D::SetFirstAnchor(const Vector3f& firstAnchor) + { + GetConstraint()->SetPoint1(JPH::EConstraintSpace::WorldSpace, ToJolt(firstAnchor)); + GetConstraint()->SetPoint2(JPH::EConstraintSpace::WorldSpace, ToJolt(firstAnchor)); + } + + void JoltPivotConstraint3D::SetSecondAnchor(const Vector3f& secondAnchor) + { + GetConstraint()->SetPoint2(JPH::EConstraintSpace::WorldSpace, ToJolt(secondAnchor)); } } -#endif