Rewrite collision filtering code

This commit is contained in:
Oleg Klimov
2017-05-11 12:50:24 +03:00
parent f74adffb84
commit d755513146

View File

@@ -4536,7 +4536,6 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
int linkIndexB = -1; int linkIndexB = -1;
int objectIndexB = -1; int objectIndexB = -1;
const btRigidBody* bodyB = btRigidBody::upcast(manifold->getBody1()); const btRigidBody* bodyB = btRigidBody::upcast(manifold->getBody1());
if (bodyB) if (bodyB)
{ {
@@ -4547,12 +4546,6 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
{ {
linkIndexB = mblB->m_link; linkIndexB = mblB->m_link;
objectIndexB = mblB->m_multiBody->getUserIndex2(); objectIndexB = mblB->m_multiBody->getUserIndex2();
if (
(clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_B_FILTER) &&
clientCmd.m_requestContactPointArguments.m_linkIndexBIndexFilter != linkIndexB)
{
continue;
}
} }
int objectIndexA = -1; int objectIndexA = -1;
@@ -4566,30 +4559,55 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
{ {
linkIndexA = mblA->m_link; linkIndexA = mblA->m_link;
objectIndexA = mblA->m_multiBody->getUserIndex2(); objectIndexA = mblA->m_multiBody->getUserIndex2();
if ( }
(clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_A_FILTER) && btAssert(bodyA || mblA);
clientCmd.m_requestContactPointArguments.m_linkIndexAIndexFilter != linkIndexA)
//apply the filter, if the user provides it
bool swap = false;
if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter >= 0)
{
if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter == objectIndexA)
{
swap = false;
}
else if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter == objectIndexB)
{
swap = true;
}
else
{ {
continue; continue;
} }
} }
btAssert(bodyA || mblA); if (swap)
//apply the filter, if the user provides it
if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter >= 0)
{ {
if ((clientCmd.m_requestContactPointArguments.m_objectAIndexFilter != objectIndexA) && std::swap(objectIndexA, objectIndexB);
(clientCmd.m_requestContactPointArguments.m_objectAIndexFilter != objectIndexB)) std::swap(linkIndexA, linkIndexB);
continue; std::swap(bodyA, bodyB);
} }
//apply the second object filter, if the user provides it //apply the second object filter, if the user provides it
if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter >= 0) if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter >= 0)
{ {
if ((clientCmd.m_requestContactPointArguments.m_objectBIndexFilter != objectIndexA) && if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter != objectIndexB)
(clientCmd.m_requestContactPointArguments.m_objectBIndexFilter != objectIndexB)) {
continue; continue;
}
}
if (
(clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_A_FILTER) &&
clientCmd.m_requestContactPointArguments.m_linkIndexAIndexFilter != linkIndexA)
{
continue;
}
if (
(clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_B_FILTER) &&
clientCmd.m_requestContactPointArguments.m_linkIndexBIndexFilter != linkIndexB)
{
continue;
} }
for (int p = 0; p < manifold->getNumContacts(); p++) for (int p = 0; p < manifold->getNumContacts(); p++)