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
|
||||
- ⚠️ 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"
|
||||
- Added RigidBody2D::ClosestPointQuery
|
||||
|
||||
Nazara Development Kit:
|
||||
- Added ImageWidget (#139)
|
||||
|
|
@ -164,6 +165,7 @@ Nazara Development Kit:
|
|||
- Fixed EntityOwner move assignment which was losing entity ownership
|
||||
- Add GraphicsComponent:ForEachRenderable method
|
||||
- Fixed GraphicsComponent reflective material count which was not initialized
|
||||
- Added PhysicsComponent2D::ClosestPointQuery
|
||||
|
||||
# 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 AddTorque(float torque);
|
||||
|
||||
bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const;
|
||||
|
||||
Nz::Rectf GetAABB() const;
|
||||
float GetAngularVelocity() const;
|
||||
Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
// This file is part of the "Nazara Development Kit"
|
||||
// For conditions of distribution and use, see copyright notice in Prerequisites.hpp
|
||||
|
||||
#include <NDK/Components/PhysicsComponent2D.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
|
||||
namespace Ndk
|
||||
|
|
@ -97,6 +98,23 @@ namespace Ndk
|
|||
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
|
||||
* \return AABB of the object
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ namespace Nz
|
|||
void AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys = CoordSys_Global);
|
||||
void AddTorque(float torque);
|
||||
|
||||
bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint = nullptr, float* closestDistance = nullptr) const;
|
||||
|
||||
void EnableSimulation(bool simulation);
|
||||
|
||||
Rectf GetAABB() const;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <chipmunk/chipmunk.h>
|
||||
#include <chipmunk/chipmunk_private.h>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <Nazara/Physics3D/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
|
|
@ -127,6 +128,37 @@ namespace Nz
|
|||
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)
|
||||
{
|
||||
if (m_isRegistered != simulation)
|
||||
|
|
|
|||
Loading…
Reference in New Issue