PhysWorld2D: Fix possible stack overflow when using wildcard collision handler

This commit is contained in:
Lynix 2019-06-16 15:40:24 +02:00
parent 6e7fd326db
commit c23248c564
2 changed files with 5 additions and 27 deletions

View File

@ -403,11 +403,7 @@ namespace Nz
const Callback* customCallbacks = static_cast<const Callback*>(data); const Callback* customCallbacks = static_cast<const Callback*>(data);
if (customCallbacks->startCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) if (customCallbacks->startCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata))
{ return cpTrue;
cpBool retA = cpArbiterCallWildcardBeginA(arb, space);
cpBool retB = cpArbiterCallWildcardBeginB(arb, space);
return retA && retB;
}
else else
return cpFalse; return cpFalse;
}; };
@ -416,9 +412,7 @@ namespace Nz
{ {
handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool
{ {
cpBool retA = cpArbiterCallWildcardBeginA(arb, space); return cpTrue;
cpBool retB = cpArbiterCallWildcardBeginB(arb, space);
return retA && retB;
}; };
} }
@ -438,17 +432,12 @@ namespace Nz
const Callback* customCallbacks = static_cast<const Callback*>(data); const Callback* customCallbacks = static_cast<const Callback*>(data);
customCallbacks->endCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); customCallbacks->endCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata);
cpArbiterCallWildcardSeparateA(arb, space);
cpArbiterCallWildcardSeparateB(arb, space);
}; };
} }
else else
{ {
handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*)
{ {
cpArbiterCallWildcardSeparateA(arb, space);
cpArbiterCallWildcardSeparateB(arb, space);
}; };
} }
@ -468,11 +457,7 @@ namespace Nz
const Callback* customCallbacks = static_cast<const Callback*>(data); const Callback* customCallbacks = static_cast<const Callback*>(data);
if (customCallbacks->preSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) if (customCallbacks->preSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata))
{ return cpTrue;
cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space);
cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space);
return retA && retB;
}
else else
return cpFalse; return cpFalse;
}; };
@ -481,9 +466,7 @@ namespace Nz
{ {
handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool
{ {
cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); return cpTrue;
cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space);
return retA && retB;
}; };
} }
@ -503,17 +486,12 @@ namespace Nz
const Callback* customCallbacks = static_cast<const Callback*>(data); const Callback* customCallbacks = static_cast<const Callback*>(data);
customCallbacks->postSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); customCallbacks->postSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata);
cpArbiterCallWildcardPostSolveA(arb, space);
cpArbiterCallWildcardPostSolveB(arb, space);
}; };
} }
else else
{ {
handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data)
{ {
cpArbiterCallWildcardPostSolveA(arb, space);
cpArbiterCallWildcardPostSolveB(arb, space);
}; };
} }
} }

View File

@ -89,7 +89,7 @@ cpAreaForSegment(cpVect a, cpVect b, cpFloat r)
} }
cpFloat cpFloat
cpMomentForPoly(cpFloat m, const int count, const cpVect *verts, cpVect offset, cpFloat r) cpMomentForPoly(cpFloat m, int count, const cpVect *verts, cpVect offset, cpFloat r)
{ {
// TODO account for radius. // TODO account for radius.
if(count == 2) return cpMomentForSegment(m, verts[0], verts[1], 0.0f); if(count == 2) return cpMomentForSegment(m, verts[0], verts[1], 0.0f);