ChipmunkPhysics2D/RigidBody2D: Add unique body index and remove userdata

This commit is contained in:
SirLynix
2023-08-10 08:40:21 +02:00
parent 09f282f2fe
commit 5484967498
7 changed files with 138 additions and 116 deletions

View File

@@ -41,13 +41,16 @@ namespace Nz
auto drawOptions = static_cast<ChipmunkPhysWorld2D::DebugDrawOptions*>(userdata);
if (drawOptions->polygonCallback)
{
//TODO: constexpr if to prevent copy/cast if sizeof(cpVect) == sizeof(Vector2f)
if constexpr (sizeof(cpVect) == sizeof(Vector2f))
drawOptions->polygonCallback(reinterpret_cast<const Vector2f*>(vertices), vertexCount, float(radius), CpDebugColorToColor(outlineColor), CpDebugColorToColor(fillColor), drawOptions->userdata);
else
{
StackArray<Vector2f> nVertices = NazaraStackArray(Vector2f, vertexCount);
for (int i = 0; i < vertexCount; ++i)
nVertices[i] = Vector2f(float(vertices[i].x), float(vertices[i].y));
StackArray<Vector2f> nVertices = NazaraStackArray(Vector2f, vertexCount);
for (int i = 0; i < vertexCount; ++i)
nVertices[i] = Vector2f(float(vertices[i].x), float(vertices[i].y));
drawOptions->polygonCallback(nVertices.data(), vertexCount, float(radius), CpDebugColorToColor(outlineColor), CpDebugColorToColor(fillColor), drawOptions->userdata);
drawOptions->polygonCallback(nVertices.data(), vertexCount, float(radius), CpDebugColorToColor(outlineColor), CpDebugColorToColor(fillColor), drawOptions->userdata);
}
}
}
@@ -92,7 +95,7 @@ namespace Nz
cpSpaceFree(m_handle);
}
void ChipmunkPhysWorld2D::DebugDraw(const DebugDrawOptions& options, bool drawShapes, bool drawConstraints, bool drawCollisions)
void ChipmunkPhysWorld2D::DebugDraw(const DebugDrawOptions& options, bool drawShapes, bool drawConstraints, bool drawCollisions) const
{
auto ColorToCpDebugColor = [](Color c) -> cpSpaceDebugColor
{
@@ -103,7 +106,7 @@ namespace Nz
drawOptions.collisionPointColor = ColorToCpDebugColor(options.collisionPointColor);
drawOptions.constraintColor = ColorToCpDebugColor(options.constraintColor);
drawOptions.shapeOutlineColor = ColorToCpDebugColor(options.shapeOutlineColor);
drawOptions.data = const_cast<DebugDrawOptions*>(&options); //< Yeah, I know, shame :bell: but it won't be used for writing anyway
drawOptions.data = const_cast<DebugDrawOptions*>(&options); //< won't be used to write
std::underlying_type_t<cpSpaceDebugDrawFlags> drawFlags = 0;
if (drawCollisions)
@@ -364,15 +367,18 @@ namespace Nz
cpSpaceStep(m_handle, dt);
OnPhysWorld2DPostStep(this, invStepCount);
if (!m_rigidPostSteps.empty())
if (!m_rigidBodyPostSteps.empty())
{
for (const auto& pair : m_rigidPostSteps)
for (auto&& [bodyIndex, callbackVec] : m_rigidBodyPostSteps)
{
for (const auto& step : pair.second.funcs)
step(pair.first);
ChipmunkRigidBody2D* rigidBody = m_bodies[bodyIndex];
assert(rigidBody);
for (const auto& step : callbackVec)
step(rigidBody);
}
m_rigidPostSteps.clear();
m_rigidBodyPostSteps.clear();
}
m_timestepAccumulator -= m_stepSize;
@@ -504,40 +510,16 @@ namespace Nz
}
}
void ChipmunkPhysWorld2D::OnRigidBodyMoved(ChipmunkRigidBody2D* oldPointer, ChipmunkRigidBody2D* newPointer)
{
auto it = m_rigidPostSteps.find(oldPointer);
if (it == m_rigidPostSteps.end())
return; //< Shouldn't happen
m_rigidPostSteps.emplace(std::make_pair(newPointer, std::move(it->second)));
m_rigidPostSteps.erase(oldPointer);
}
void ChipmunkPhysWorld2D::OnRigidBodyRelease(ChipmunkRigidBody2D* rigidBody)
{
m_rigidPostSteps.erase(rigidBody);
}
void ChipmunkPhysWorld2D::RegisterPostStep(ChipmunkRigidBody2D* rigidBody, PostStep&& func)
void ChipmunkPhysWorld2D::DeferBodyAction(ChipmunkRigidBody2D& rigidBody, PostStep&& func)
{
// If space isn't locked, no need to wait
if (!cpSpaceIsLocked(m_handle))
{
func(rigidBody);
func(&rigidBody);
return;
}
auto it = m_rigidPostSteps.find(rigidBody);
if (it == m_rigidPostSteps.end())
{
PostStepContainer postStep;
postStep.onMovedSlot.Connect(rigidBody->OnRigidBody2DMove, this, &ChipmunkPhysWorld2D::OnRigidBodyMoved);
postStep.onReleaseSlot.Connect(rigidBody->OnRigidBody2DRelease, this, &ChipmunkPhysWorld2D::OnRigidBodyRelease);
it = m_rigidPostSteps.insert(std::make_pair(rigidBody, std::move(postStep))).first;
}
it->second.funcs.emplace_back(std::move(func));
UInt32 bodyIndex = rigidBody.GetBodyIndex();
m_rigidBodyPostSteps[bodyIndex].emplace_back(std::move(func));
}
}