diff --git a/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp b/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp index a510bed44..af8de52b8 100644 --- a/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp +++ b/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp @@ -14,6 +14,8 @@ namespace Nz { class NAZARA_PHYSICS3D_API RigidBody3DComponent : public RigidBody3D { + friend class Physics3DSystem; + public: using RigidBody3D::RigidBody3D; RigidBody3DComponent(const RigidBody3DComponent&) = default; diff --git a/include/Nazara/Physics3D/RigidBody3D.hpp b/include/Nazara/Physics3D/RigidBody3D.hpp index bd9e40408..0343cea3b 100644 --- a/include/Nazara/Physics3D/RigidBody3D.hpp +++ b/include/Nazara/Physics3D/RigidBody3D.hpp @@ -77,6 +77,9 @@ namespace Nz RigidBody3D& operator=(const RigidBody3D& object); RigidBody3D& operator=(RigidBody3D&& object) noexcept; + protected: + void Destroy(); + private: void UpdateBody(const Matrix4f& transformMatrix); static void ForceAndTorqueCallback(const NewtonBody* body, float timeStep, int threadIndex); diff --git a/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp b/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp index 97240b3f9..c47b4ba73 100644 --- a/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp +++ b/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp @@ -35,6 +35,7 @@ namespace Nz private: static void OnConstruct(entt::registry& registry, entt::entity entity); + entt::registry& m_registry; entt::connection m_constructConnection; PhysWorld3D m_physWorld; }; diff --git a/src/Nazara/Physics3D/RigidBody3D.cpp b/src/Nazara/Physics3D/RigidBody3D.cpp index 6454497d9..671e195a7 100644 --- a/src/Nazara/Physics3D/RigidBody3D.cpp +++ b/src/Nazara/Physics3D/RigidBody3D.cpp @@ -418,6 +418,17 @@ namespace Nz return *this; } + void RigidBody3D::Destroy() + { + if (m_body) + { + NewtonDestroyBody(m_body); + m_body = nullptr; + } + + m_geom.reset(); + } + void RigidBody3D::UpdateBody(const Matrix4f& transformMatrix) { NewtonBodySetMatrix(m_body, &transformMatrix.m11); diff --git a/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp b/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp index faf8f8265..26fe23380 100644 --- a/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp +++ b/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp @@ -8,13 +8,19 @@ namespace Nz { - Physics3DSystem::Physics3DSystem(entt::registry& registry) + Physics3DSystem::Physics3DSystem(entt::registry& registry) : + m_registry(registry) { m_constructConnection = registry.on_construct().connect(); } Physics3DSystem::~Physics3DSystem() { + // Ensure every NewtonBody is destroyed before world is + auto rigidBodyView = m_registry.view(); + for (auto [entity, rigidBodyComponent] : rigidBodyView.each()) + rigidBodyComponent.Destroy(); + m_constructConnection.release(); }