diff options
author | Johannes Brust <johannes.brust@gmail.com> | 2021-10-21 17:38:13 +0200 |
---|---|---|
committer | Maarten Behn <maarten.behn@gmail.com> | 2022-12-19 11:00:27 +0100 |
commit | 60512c7872eb42a460920c8823f7692e00530e90 (patch) | |
tree | 7a42901d534bcf96a4a90153b8f43e8776040cd6 | |
parent | fa1d1fc8eeb80d8887faea3cb3c83d9abe3c1935 (diff) | |
download | bullet3-60512c7872eb42a460920c8823f7692e00530e90.tar.gz |
Fix bug due to missing swap
(cherry picked from commit 61d5bdb783d8673eabedd10f660cb222b6a286fd)
-rw-r--r-- | examples/SharedMemory/PhysicsServerCommandProcessor.cpp | 113 |
1 files changed, 57 insertions, 56 deletions
diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 59fd491d3..376e833a6 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -8331,74 +8331,74 @@ bool PhysicsServerCommandProcessor::processRequestDeformableContactpointHelper(c btSoftBody::Node* node = contact->m_face->m_n[contactNodeIdx]; // check if node is already in the list int idx = nodesInContact.findLinearSearch2(node); - if (idx < 0) - { - // add new node and contact point - nodesInContact.push_back(node); - //convert rigidbody contact - int linkIndexA = -1; - int linkIndexB = -1; - int objectIndexA = psb->getUserIndex2(); - int objectIndexB = -1; - const btRigidBody* bodyB = btRigidBody::upcast(contact->m_cti.m_colObj); - if (bodyB) - { - objectIndexB = bodyB->getUserIndex2(); - } - const btMultiBodyLinkCollider* mblB = btMultiBodyLinkCollider::upcast(contact->m_cti.m_colObj); - if (mblB && mblB->m_multiBody) - { - linkIndexB = mblB->m_link; - objectIndexB = mblB->m_multiBody->getUserIndex2(); - } - - //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; - } - } + //apply the filter, if the user provides it + int linkIndexA = -1; + int linkIndexB = -1; + int objectIndexA = psb->getUserIndex2(); - if (swap) + int objectIndexB = -1; + const btRigidBody* bodyB = btRigidBody::upcast(contact->m_cti.m_colObj); + if (bodyB) + { + objectIndexB = bodyB->getUserIndex2(); + } + const btMultiBodyLinkCollider* mblB = btMultiBodyLinkCollider::upcast(contact->m_cti.m_colObj); + if (mblB && mblB->m_multiBody) + { + linkIndexB = mblB->m_link; + objectIndexB = mblB->m_multiBody->getUserIndex2(); + } + bool swap = false; + if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter >= 0) + { + if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter == objectIndexA) { - std::swap(objectIndexA, objectIndexB); - std::swap(linkIndexA, linkIndexB); + swap = false; } - - //apply the second object filter, if the user provides it - if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter >= 0) + else if (clientCmd.m_requestContactPointArguments.m_objectAIndexFilter == objectIndexB) { - if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter != objectIndexB) - { - continue; - } + swap = true; } - - if ( - (clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_A_FILTER) && - clientCmd.m_requestContactPointArguments.m_linkIndexAIndexFilter != linkIndexA) + else { continue; } + } - if ( - (clientCmd.m_updateFlags & CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_B_FILTER) && - clientCmd.m_requestContactPointArguments.m_linkIndexBIndexFilter != linkIndexB) + if (swap) + { + std::swap(objectIndexA, objectIndexB); + std::swap(linkIndexA, linkIndexB); + } + + //apply the second object filter, if the user provides it + if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter >= 0) + { + if (clientCmd.m_requestContactPointArguments.m_objectBIndexFilter != objectIndexB) { 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; + } + + if (idx < 0) + { + // add new node and contact point + nodesInContact.push_back(node); b3ContactPointData pt; pt.m_bodyUniqueIdA = objectIndexA; pt.m_bodyUniqueIdB = objectIndexB; @@ -8442,7 +8442,8 @@ bool PhysicsServerCommandProcessor::processRequestDeformableContactpointHelper(c btScalar(pt->m_contactNormalOnBInWS[1]), btScalar(pt->m_contactNormalOnBInWS[2])) * pt->m_normalForce; // add normal force of additional node contact - normalForce += contact->m_cti.m_normal * (impulseNormal / m_data->m_physicsDeltaTime).norm(); + btScalar swapFactor = swap ? -1.0 : 1.0; + normalForce += swapFactor * contact->m_cti.m_normal * (impulseNormal / m_data->m_physicsDeltaTime).norm(); // get magnitude of normal force pt->m_normalForce = normalForce.norm(); // get direction of normal force |