From 9772b43542f80ba35119090af3b087d766dd77fa Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 10 Nov 2016 17:18:44 +0100 Subject: [PATCH] Physics2D/RigidBody2D: Made SetGeom public --- include/Nazara/Physics2D/RigidBody2D.hpp | 3 +- src/Nazara/Physics2D/RigidBody2D.cpp | 53 +++++++++++++++++------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 7d521fbe6..b45526641 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -49,6 +49,7 @@ namespace Nz bool IsSleeping() const; void SetAngularVelocity(float angularVelocity); + void SetGeom(Collider2DRef geom); void SetMass(float mass); void SetMassCenter(const Vector2f& center); void SetPosition(const Vector2f& position); @@ -59,8 +60,8 @@ namespace Nz RigidBody2D& operator=(RigidBody2D&& object); private: + void Create(float mass = 0.f, float moment = 0.f); void Destroy(); - void SetGeom(Collider2DRef geom); std::vector m_shapes; Collider2DRef m_geom; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index faa6223d1..f88af79b3 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -26,9 +26,7 @@ namespace Nz { NazaraAssert(m_world, "Invalid world"); - m_handle = cpBodyNew(0.f, 0.f); - cpBodySetUserData(m_handle, this); - cpSpaceAddBody(m_world->GetHandle(), m_handle); + Create(); SetGeom(geom); SetMass(mass); @@ -43,9 +41,7 @@ namespace Nz NazaraAssert(m_world, "Invalid world"); NazaraAssert(m_geom, "Invalid geometry"); - m_handle = cpBodyNew(0.f, 0.f); - cpBodySetUserData(m_handle, this); - cpSpaceAddBody(m_world->GetHandle(), m_handle); + Create(); SetGeom(object.GetGeom()); SetMass(object.GetMass()); @@ -169,6 +165,34 @@ namespace Nz cpBodySetAngularVelocity(m_handle, angularVelocity); } + void RigidBody2D::SetGeom(Collider2DRef geom) + { + // We have no public way of getting rid of an existing geom without removing the whole body + // So let's save some attributes of the body, destroy it and rebuild it + if (m_geom) + { + cpVect pos = cpBodyGetPosition(m_handle); + cpFloat mass = cpBodyGetMass(m_handle); + cpFloat moment = cpBodyGetMoment(m_handle); + cpFloat rot = cpBodyGetAngle(m_handle); + cpVect vel = cpBodyGetVelocity(m_handle); + + Destroy(); + Create(mass, moment); + + cpBodySetAngle(m_handle, rot); + cpBodySetPosition(m_handle, pos); + cpBodySetVelocity(m_handle, vel); + } + + if (geom) + m_geom = geom; + else + m_geom = NullCollider2D::New(); + + m_shapes = m_geom->CreateShapes(this); + } + void RigidBody2D::SetMass(float mass) { if (m_mass > 0.f) @@ -230,6 +254,13 @@ namespace Nz return *this; } + void RigidBody2D::Create(float mass, float moment) + { + m_handle = cpBodyNew(mass, moment); + cpBodySetUserData(m_handle, this); + cpSpaceAddBody(m_world->GetHandle(), m_handle); + } + void RigidBody2D::Destroy() { for (cpShape* shape : m_shapes) @@ -238,14 +269,4 @@ namespace Nz if (m_handle) cpBodyFree(m_handle); } - - void RigidBody2D::SetGeom(Collider2DRef geom) - { - if (geom) - m_geom = geom; - else - m_geom = NullCollider2D::New(); - - m_shapes = m_geom->CreateShapes(this); - } }