diff --git a/include/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.hpp b/include/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.hpp index 4a63de352..5a47f3136 100644 --- a/include/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.hpp +++ b/include/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.hpp @@ -98,6 +98,11 @@ namespace Nz void TeleportTo(const Vector2f& position, const RadianAnglef& rotation); + RadianAnglef ToLocal(const RadianAnglef& worldRotation); + Vector2f ToLocal(const Vector2f& worldPosition); + RadianAnglef ToWorld(const RadianAnglef& localRotation); + Vector2f ToWorld(const Vector2f& localPosition); + void UpdateVelocity(const Vector2f& gravity, float damping, float deltaTime); void Wakeup(); diff --git a/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.hpp b/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.hpp new file mode 100644 index 000000000..5b88fba78 --- /dev/null +++ b/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.hpp @@ -0,0 +1,22 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - ChipmunkPhysics2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_CHIPMUNKPHYSICS2D_CHIPMUNKHELPER_HPP +#define NAZARA_CHIPMUNKPHYSICS2D_CHIPMUNKHELPER_HPP + +#include +#include +#include + +namespace Nz +{ + inline Vector2f FromChipmunk(const cpVect& vect); + inline cpVect ToChipmunk(const Vector2f& vec); +} + +#include + +#endif // NAZARA_CHIPMUNKPHYSICS2D_CHIPMUNKHELPER_HPP diff --git a/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.inl b/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.inl new file mode 100644 index 000000000..bf242eef5 --- /dev/null +++ b/src/Nazara/ChipmunkPhysics2D/ChipmunkHelper.inl @@ -0,0 +1,20 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - ChipmunkPhysics2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + inline Vector2f FromChipmunk(const cpVect& vect) + { + return { float(vect.x), float(vect.y) }; + } + + inline cpVect ToChipmunk(const Vector2f& vec) + { + return cpv(cpFloat(vec.x), cpFloat(vec.y)); + } +} + +#include diff --git a/src/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.cpp b/src/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.cpp index 2101ba0f4..189c8f640 100644 --- a/src/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.cpp +++ b/src/Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -73,11 +74,11 @@ namespace Nz switch (coordSys) { case CoordSys::Global: - cpBodyApplyForceAtWorldPoint(m_handle, cpv(force.x, force.y), cpv(point.x, point.y)); + cpBodyApplyForceAtWorldPoint(m_handle, ToChipmunk(force), ToChipmunk(point)); break; case CoordSys::Local: - cpBodyApplyForceAtLocalPoint(m_handle, cpv(force.x, force.y), cpv(point.x, point.y)); + cpBodyApplyForceAtLocalPoint(m_handle, ToChipmunk(force), ToChipmunk(point)); break; } } @@ -87,11 +88,11 @@ namespace Nz switch (coordSys) { case CoordSys::Global: - cpBodyApplyImpulseAtWorldPoint(m_handle, cpv(impulse.x, impulse.y), cpv(point.x, point.y)); + cpBodyApplyImpulseAtWorldPoint(m_handle, ToChipmunk(impulse), ToChipmunk(point)); break; case CoordSys::Local: - cpBodyApplyImpulseAtLocalPoint(m_handle, cpv(impulse.x, impulse.y), cpv(point.x, point.y)); + cpBodyApplyImpulseAtLocalPoint(m_handle, ToChipmunk(impulse), ToChipmunk(point)); break; } } @@ -365,7 +366,7 @@ namespace Nz void ChipmunkRigidBody2D::SetMassCenter(const Vector2f& center, CoordSys coordSys) { - cpVect massCenter = cpv(center.x, center.y); + cpVect massCenter = ToChipmunk(center); switch (coordSys) { @@ -392,7 +393,7 @@ namespace Nz void ChipmunkRigidBody2D::SetPosition(const Vector2f& position) { // Use cpTransformVect to rotate/scale the position offset - cpBodySetPosition(m_handle, cpvadd(cpv(position.x, position.y), cpTransformVect(m_handle->transform, cpv(m_positionOffset.x, m_positionOffset.y)))); + cpBodySetPosition(m_handle, cpvadd(ToChipmunk(position), cpTransformVect(m_handle->transform, ToChipmunk(m_positionOffset)))); if (m_isStatic) { m_world->DeferBodyAction(*this, [](ChipmunkRigidBody2D* body) @@ -453,7 +454,7 @@ namespace Nz void ChipmunkRigidBody2D::SetVelocity(const Vector2f& velocity) { - cpBodySetVelocity(m_handle, cpv(velocity.x, velocity.y)); + cpBodySetVelocity(m_handle, ToChipmunk(velocity)); } void ChipmunkRigidBody2D::SetVelocityFunction(VelocityFunc velocityFunc) @@ -478,7 +479,7 @@ namespace Nz void ChipmunkRigidBody2D::TeleportTo(const Vector2f& position, const RadianAnglef& rotation) { // Use cpTransformVect to rotate/scale the position offset - cpBodySetPosition(m_handle, cpvadd(cpv(position.x, position.y), cpTransformVect(m_handle->transform, cpv(m_positionOffset.x, m_positionOffset.y)))); + cpBodySetPosition(m_handle, cpvadd(ToChipmunk(position), cpTransformVect(m_handle->transform, ToChipmunk(m_positionOffset)))); cpBodySetAngle(m_handle, rotation.value); if (m_isStatic) { @@ -489,9 +490,29 @@ namespace Nz } } - void ChipmunkRigidBody2D::UpdateVelocity(const Vector2f & gravity, float damping, float deltaTime) + RadianAnglef ChipmunkRigidBody2D::ToLocal(const RadianAnglef& worldRotation) { - cpBodyUpdateVelocity(m_handle, cpv(gravity.x, gravity.y), damping, deltaTime); + return worldRotation - GetRotation(); + } + + Vector2f ChipmunkRigidBody2D::ToLocal(const Vector2f& worldPosition) + { + return FromChipmunk(cpBodyWorldToLocal(m_handle, ToChipmunk(worldPosition))); + } + + RadianAnglef ChipmunkRigidBody2D::ToWorld(const RadianAnglef& localRotation) + { + return GetRotation() + localRotation; + } + + Vector2f ChipmunkRigidBody2D::ToWorld(const Vector2f& localPosition) + { + return FromChipmunk(cpBodyLocalToWorld(m_handle, ToChipmunk(localPosition))); + } + + void ChipmunkRigidBody2D::UpdateVelocity(const Vector2f& gravity, float damping, float deltaTime) + { + cpBodyUpdateVelocity(m_handle, ToChipmunk(gravity), damping, deltaTime); } void ChipmunkRigidBody2D::Wakeup()