From 75b05d93ffe3b67f448cf884dd4eefee2f69d5ce Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Thu, 13 Feb 2020 00:04:42 -0800 Subject: [PATCH] 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;