ChipmunkPhysics2D/RigidBody2D: Add ToLocal/ToWorld methods

This commit is contained in:
SirLynix 2023-08-12 12:11:24 +02:00
parent 1ef61cc5ad
commit 65a1c195ac
4 changed files with 78 additions and 10 deletions

View File

@ -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();

View File

@ -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 <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Math/Vector2.hpp>
#include <chipmunk/cpVect.h>
namespace Nz
{
inline Vector2f FromChipmunk(const cpVect& vect);
inline cpVect ToChipmunk(const Vector2f& vec);
}
#include <Nazara/ChipmunkPhysics2D/ChipmunkHelper.inl>
#endif // NAZARA_CHIPMUNKPHYSICS2D_CHIPMUNKHELPER_HPP

View File

@ -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 <Nazara/ChipmunkPhysics2D/Debug.hpp>
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 <Nazara/ChipmunkPhysics2D/DebugOff.hpp>

View File

@ -4,6 +4,7 @@
#include <Nazara/ChipmunkPhysics2D/ChipmunkRigidBody2D.hpp>
#include <Nazara/ChipmunkPhysics2D/ChipmunkArbiter2D.hpp>
#include <Nazara/ChipmunkPhysics2D/ChipmunkHelper.hpp>
#include <Nazara/ChipmunkPhysics2D/ChipmunkPhysWorld2D.hpp>
#include <chipmunk/chipmunk.h>
#include <chipmunk/chipmunk_private.h>
@ -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()