From 72bcb1fda7397495a7254c17871a839c0947b805 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 28 Nov 2017 23:20:45 +0100 Subject: [PATCH] Physics2D/RigidBody2D: Fix SetGeom attribute copy --- include/Nazara/Physics2D/RigidBody2D.hpp | 3 +- src/Nazara/Physics2D/RigidBody2D.cpp | 43 ++++++++++++++---------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 4494c690c..49df6a775 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -74,10 +74,11 @@ namespace Nz static constexpr std::size_t InvalidShapeIndex = std::numeric_limits::max(); private: - void CopyBodyData(cpBody* body); cpBody* Create(float mass = 1.f, float moment = 1.f); void Destroy(); + static void CopyBodyData(cpBody* from, cpBody* to); + std::vector m_shapes; Collider2DRef m_geom; cpBody* m_handle; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 0931e0a45..fd54909b4 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -44,7 +44,7 @@ namespace Nz m_handle = Create(m_mass, object.GetMomentOfInertia()); SetGeom(object.GetGeom(), false); - CopyBodyData(object.GetHandle()); + CopyBodyData(object.GetHandle(), m_handle); for (std::size_t i = 0; i < m_shapes.size(); ++i) m_shapes[i]->bb = cpShapeCacheBB(object.m_shapes[i]); @@ -243,7 +243,7 @@ namespace Nz cpBody* newHandle = Create(static_cast(mass), static_cast(moment)); - CopyBodyData(m_handle); + CopyBodyData(m_handle, newHandle); Destroy(); m_handle = newHandle; @@ -403,25 +403,20 @@ namespace Nz return *this; } - void RigidBody2D::CopyBodyData(cpBody* body) - { - cpBodySetAngle(m_handle, cpBodyGetAngle(body)); - cpBodySetAngularVelocity(m_handle, cpBodyGetAngularVelocity(body)); - cpBodySetCenterOfGravity(m_handle, cpBodyGetCenterOfGravity(body)); - cpBodySetForce(m_handle, cpBodyGetForce(body)); - cpBodySetPosition(m_handle, cpBodyGetPosition(body)); - cpBodySetTorque(m_handle, cpBodyGetTorque(body)); - cpBodySetVelocity(m_handle, cpBodyGetVelocity(body)); - } - cpBody* RigidBody2D::Create(float mass, float moment) { - cpBody* handle = cpBodyNew(mass, moment); + cpBody* handle; + if (IsKinematic()) + { + if (IsStatic()) + handle = cpBodyNewStatic(); + else + handle = cpBodyNewKinematic(); + } + else + handle = cpBodyNew(mass, moment); + cpBodySetUserData(handle, this); - - if (mass <= 0.f) - cpBodySetType(handle, CP_BODY_TYPE_KINEMATIC); - cpSpaceAddBody(m_world->GetHandle(), handle); return handle; @@ -443,4 +438,16 @@ namespace Nz } m_shapes.clear(); } + + void RigidBody2D::CopyBodyData(cpBody* from, cpBody* to) + { + cpBodySetAngle(to, cpBodyGetAngle(from)); + cpBodySetAngularVelocity(to, cpBodyGetAngularVelocity(from)); + cpBodySetCenterOfGravity(to, cpBodyGetCenterOfGravity(from)); + cpBodySetForce(to, cpBodyGetForce(from)); + cpBodySetPosition(to, cpBodyGetPosition(from)); + cpBodySetTorque(to, cpBodyGetTorque(from)); + cpBodySetVelocity(to, cpBodyGetVelocity(from)); + } + }