Physics2D/RigidBody2D: Add ClosestPointQuery method
This commit is contained in:
parent
56b23a2f27
commit
b2185f2138
|
|
@ -114,6 +114,7 @@ Nazara Engine:
|
||||||
- Fixed a lot of classes not having their move constructor/assignation operator marked noexcept
|
- Fixed a lot of classes not having their move constructor/assignation operator marked noexcept
|
||||||
- ⚠️ SocketPoller::Wait now returns the number of socket marked as ready, and takes an additional optional parameter allowing to query the last error.
|
- ⚠️ SocketPoller::Wait now returns the number of socket marked as ready, and takes an additional optional parameter allowing to query the last error.
|
||||||
- SocketPoller will now silently ignore "interrupt errors"
|
- SocketPoller will now silently ignore "interrupt errors"
|
||||||
|
- Added RigidBody2D::ClosestPointQuery
|
||||||
|
|
||||||
Nazara Development Kit:
|
Nazara Development Kit:
|
||||||
- Added ImageWidget (#139)
|
- Added ImageWidget (#139)
|
||||||
|
|
@ -164,6 +165,7 @@ Nazara Development Kit:
|
||||||
- Fixed EntityOwner move assignment which was losing entity ownership
|
- Fixed EntityOwner move assignment which was losing entity ownership
|
||||||
- Add GraphicsComponent:ForEachRenderable method
|
- Add GraphicsComponent:ForEachRenderable method
|
||||||
- Fixed GraphicsComponent reflective material count which was not initialized
|
- Fixed GraphicsComponent reflective material count which was not initialized
|
||||||
|
- Added PhysicsComponent2D::ClosestPointQuery
|
||||||
|
|
||||||
# 0.4:
|
# 0.4:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ namespace Ndk
|
||||||
void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global);
|
void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global);
|
||||||
void AddTorque(float torque);
|
void AddTorque(float torque);
|
||||||
|
|
||||||
|
bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const;
|
||||||
|
|
||||||
Nz::Rectf GetAABB() const;
|
Nz::Rectf GetAABB() const;
|
||||||
float GetAngularVelocity() const;
|
float GetAngularVelocity() const;
|
||||||
Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const;
|
Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// This file is part of the "Nazara Development Kit"
|
// This file is part of the "Nazara Development Kit"
|
||||||
// For conditions of distribution and use, see copyright notice in Prerequisites.hpp
|
// For conditions of distribution and use, see copyright notice in Prerequisites.hpp
|
||||||
|
|
||||||
|
#include <NDK/Components/PhysicsComponent2D.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
|
|
||||||
namespace Ndk
|
namespace Ndk
|
||||||
|
|
@ -97,6 +98,23 @@ namespace Ndk
|
||||||
m_object->AddTorque(torque);
|
m_object->AddTorque(torque);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Finds the closest point on the entity relative to a position
|
||||||
|
* \return True if such a point exists (will return false if no collider exists)
|
||||||
|
*
|
||||||
|
* \param position The starting point which will be used for the query
|
||||||
|
* \param closestPoint The closest point on entity surface
|
||||||
|
* \param closestDistance The distance between the closest point and the starting point, may be negative if starting point is inside the entity
|
||||||
|
*
|
||||||
|
* \remark Produces a NazaraAssert if the physics object is invalid
|
||||||
|
*/
|
||||||
|
inline bool PhysicsComponent2D::ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const
|
||||||
|
{
|
||||||
|
NazaraAssert(m_object, "Invalid physics object");
|
||||||
|
|
||||||
|
return m_object->ClosestPointQuery(position, closestPoint, closestDistance);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Gets the AABB of the physics object
|
* \brief Gets the AABB of the physics object
|
||||||
* \return AABB of the object
|
* \return AABB of the object
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,8 @@ namespace Nz
|
||||||
void AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys = CoordSys_Global);
|
void AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys = CoordSys_Global);
|
||||||
void AddTorque(float torque);
|
void AddTorque(float torque);
|
||||||
|
|
||||||
|
bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint = nullptr, float* closestDistance = nullptr) const;
|
||||||
|
|
||||||
void EnableSimulation(bool simulation);
|
void EnableSimulation(bool simulation);
|
||||||
|
|
||||||
Rectf GetAABB() const;
|
Rectf GetAABB() const;
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <chipmunk/chipmunk.h>
|
#include <chipmunk/chipmunk.h>
|
||||||
#include <chipmunk/chipmunk_private.h>
|
#include <chipmunk/chipmunk_private.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <Nazara/Physics3D/Debug.hpp>
|
#include <Nazara/Physics3D/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
|
|
@ -127,6 +128,37 @@ namespace Nz
|
||||||
cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + ToRadians(torque));
|
cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + ToRadians(torque));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RigidBody2D::ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const
|
||||||
|
{
|
||||||
|
cpVect pos = cpv(cpFloat(position.x), cpFloat(position.y));
|
||||||
|
|
||||||
|
float minDistance = std::numeric_limits<float>::infinity();
|
||||||
|
Nz::Vector2f closest;
|
||||||
|
for (cpShape* shape : m_shapes)
|
||||||
|
{
|
||||||
|
cpPointQueryInfo result;
|
||||||
|
cpShapePointQuery(shape, pos, &result);
|
||||||
|
|
||||||
|
float resultDistance = float(result.distance);
|
||||||
|
if (resultDistance < minDistance)
|
||||||
|
{
|
||||||
|
closest.Set(float(result.point.x), float(result.point.y));
|
||||||
|
minDistance = resultDistance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::isinf(minDistance))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (closestPoint)
|
||||||
|
*closestPoint = closest;
|
||||||
|
|
||||||
|
if (minDistance)
|
||||||
|
*closestDistance = minDistance;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void RigidBody2D::EnableSimulation(bool simulation)
|
void RigidBody2D::EnableSimulation(bool simulation)
|
||||||
{
|
{
|
||||||
if (m_isRegistered != simulation)
|
if (m_isRegistered != simulation)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue