From 75b05d93ffe3b67f448cf884dd4eefee2f69d5ce Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Thu, 13 Feb 2020 00:04:42 -0800 Subject: [PATCH 1/2] apply custom pair-cache filter to predictive contacts --- .../BroadphaseCollision/btOverlappingPairCache.h | 11 ++++++++++- .../Dynamics/btDiscreteDynamicsWorld.cpp | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h index f4a2d5e36..24c68439c 100644 --- a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h +++ b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h @@ -61,7 +61,8 @@ public: virtual void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher) = 0; virtual int getNumOverlappingPairs() const = 0; - + virtual bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const = 0; // stephengold added 2020-02-12 + virtual btOverlapFilterCallback* getOverlapFilterCallback() = 0; // stephengold added 2020-02-12 virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0; virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0; @@ -380,6 +381,14 @@ public: { } + bool needsBroadphaseCollision(btBroadphaseProxy*, btBroadphaseProxy*) const // stephengold added 2020-02-12 + { // stephengold added 2020-02-12 + return true; // stephengold added 2020-02-12 + } // stephengold added 2020-02-12 + btOverlapFilterCallback* getOverlapFilterCallback() // stephengold added 2020-02-12 + { // stephengold added 2020-02-12 + return 0; // stephengold added 2020-02-12 + } // stephengold added 2020-02-12 virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/) { } diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index a3c9f42eb..fff1f0cfb 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -800,6 +800,14 @@ public: ///don't do CCD when the collision filters are not matching if (!ClosestConvexResultCallback::needsCollision(proxy0)) return false; + if (m_pairCache->getOverlapFilterCallback()) { // stephengold added 2020-02-12 + btBroadphaseProxy* proxy1 = m_me->getBroadphaseHandle(); // stephengold added 2020-02-12 + bool collides = m_pairCache->needsBroadphaseCollision(proxy0, proxy1); // stephengold added 2020-02-12 + if (!collides) // stephengold added 2020-02-12 + { // stephengold added 2020-02-12 + return false; // stephengold added 2020-02-12 + } // stephengold added 2020-02-12 + } // stephengold added 2020-02-12 btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject; From abb2e4ee23cdad38d8ca51534f092f270580d543 Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Sun, 23 Feb 2020 21:48:25 -0800 Subject: [PATCH 2/2] delete comments plainly marking the altered source code --- .../btOverlappingPairCache.h | 20 +++++++++---------- .../Dynamics/btDiscreteDynamicsWorld.cpp | 16 +++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h index 24c68439c..56011899c 100644 --- a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h +++ b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h @@ -61,8 +61,8 @@ public: virtual void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher) = 0; virtual int getNumOverlappingPairs() const = 0; - virtual bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const = 0; // stephengold added 2020-02-12 - virtual btOverlapFilterCallback* getOverlapFilterCallback() = 0; // stephengold added 2020-02-12 + virtual bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const = 0; + virtual btOverlapFilterCallback* getOverlapFilterCallback() = 0; virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0; virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0; @@ -381,14 +381,14 @@ public: { } - bool needsBroadphaseCollision(btBroadphaseProxy*, btBroadphaseProxy*) const // stephengold added 2020-02-12 - { // stephengold added 2020-02-12 - return true; // stephengold added 2020-02-12 - } // stephengold added 2020-02-12 - btOverlapFilterCallback* getOverlapFilterCallback() // stephengold added 2020-02-12 - { // stephengold added 2020-02-12 - return 0; // stephengold added 2020-02-12 - } // stephengold added 2020-02-12 + bool needsBroadphaseCollision(btBroadphaseProxy*, btBroadphaseProxy*) const + { + return true; + } + btOverlapFilterCallback* getOverlapFilterCallback() + { + return 0; + } virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/) { } diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index fff1f0cfb..fb15ae31e 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -800,14 +800,14 @@ public: ///don't do CCD when the collision filters are not matching if (!ClosestConvexResultCallback::needsCollision(proxy0)) return false; - if (m_pairCache->getOverlapFilterCallback()) { // stephengold added 2020-02-12 - btBroadphaseProxy* proxy1 = m_me->getBroadphaseHandle(); // stephengold added 2020-02-12 - bool collides = m_pairCache->needsBroadphaseCollision(proxy0, proxy1); // stephengold added 2020-02-12 - if (!collides) // stephengold added 2020-02-12 - { // stephengold added 2020-02-12 - return false; // stephengold added 2020-02-12 - } // stephengold added 2020-02-12 - } // stephengold added 2020-02-12 + if (m_pairCache->getOverlapFilterCallback()) { + btBroadphaseProxy* proxy1 = m_me->getBroadphaseHandle(); + bool collides = m_pairCache->needsBroadphaseCollision(proxy0, proxy1); + if (!collides) + { + return false; + } + } btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject;