[Bf-blender-cvs] [63ec1f4f9de] fracture_modifier: fix for ghost trigger (again)

Martin Felke noreply at git.blender.org
Sun Jul 29 21:27:31 CEST 2018


Commit: 63ec1f4f9ded4204372d064ccdc1e8c7ed578b4f
Author: Martin Felke
Date:   Sun Jul 29 21:27:04 2018 +0200
Branches: fracture_modifier
https://developer.blender.org/rB63ec1f4f9ded4204372d064ccdc1e8c7ed578b4f

fix for ghost trigger (again)

===================================================================

M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/intern/rigidbody.c

===================================================================

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 9871b4751c2..a0f22a23b01 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -767,7 +767,7 @@ struct rbFilterCallback : public btOverlapFilterCallback
 		           (rb0->blenderOb != rb1->blenderOb)));
 
 		//only apply to trigger and triggered, to improve performance, but do not actually activate
-		return this->check_collision(rb0, rb1, false, collides);
+		return collides; // this->check_collision(rb0, rb1, false, collides);
 	}
 };
 
@@ -854,7 +854,11 @@ static void idCallback(void *userPtr, int* objectId, int* shardId)
 class CollisionFilterDispatcher : public btCollisionDispatcher
 {
 	public:
-		virtual bool needsCollision(const btCollisionObject *body0, const btCollisionObject *body1);
+		//virtual bool needsCollision(const btCollisionObject *body0, const btCollisionObject *body1);
+		virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,
+		                                                         const btDispatcherInfo& dispatchInfo,
+		                                                         btDispatcher* dispatcher);
+
 		rbFilterCallback *filterCallback;
 		CollisionFilterDispatcher(btDefaultCollisionConfiguration *configuration, rbFilterCallback* callback);
 };
@@ -865,6 +869,53 @@ CollisionFilterDispatcher::CollisionFilterDispatcher(btDefaultCollisionConfigura
 	this->filterCallback = callback;
 }
 
+class CollisionPairCallback : public btOverlapCallback
+{
+	const btDispatcherInfo& m_dispatchInfo;
+	btCollisionDispatcher*	m_dispatcher;
+
+public:
+
+	CollisionPairCallback(const btDispatcherInfo& dispatchInfo,btCollisionDispatcher*	dispatcher)
+	:m_dispatchInfo(dispatchInfo),
+	m_dispatcher(dispatcher)
+	{
+	}
+
+	virtual ~CollisionPairCallback() {}
+
+
+	virtual bool	processOverlap(btBroadphasePair& pair)
+	{
+		(*m_dispatcher->getNearCallback())(pair,*m_dispatcher,m_dispatchInfo);
+
+		bool do_collide = false;
+
+		//true will remove this collision pair again...
+		btCollisionObject* colObj0 = (btCollisionObject*)pair.m_pProxy0->m_clientObject;
+		btCollisionObject* colObj1 = (btCollisionObject*)pair.m_pProxy1->m_clientObject;
+
+		rbRigidBody *rb0 = (rbRigidBody*)colObj0->getUserPointer();
+		rbRigidBody *rb1 = (rbRigidBody*)colObj1->getUserPointer();
+
+		do_collide = ((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderWorld,
+		                                                                             rb0->meshIsland, rb1->meshIsland,
+																				     rb0->blenderOb, rb1->blenderOb, false);
+		return !do_collide;
+	}
+};
+
+void	CollisionFilterDispatcher::dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,
+                                                               const btDispatcherInfo& dispatchInfo,
+                                                               btDispatcher* dispatcher)
+{
+
+	CollisionPairCallback	collisionCallback(dispatchInfo,this);
+
+	pairCache->processAllOverlappingPairs(&collisionCallback,dispatcher);
+}
+
+#if 0
 bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, const btCollisionObject *body1)
 {
 	rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)body0)->getUserPointer();
@@ -872,6 +923,7 @@ bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, c
 
 	if (((btRigidBody*)body0)->checkCollideWithOverride(body1))
 	{
+
 		if (this->filterCallback)
 		{
 			return this->filterCallback->check_collision(rb0, rb1, false, true);
@@ -882,6 +934,7 @@ bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, c
 
 	return false;
 }
+#endif
 
 /*taken from btCollisionDispatcher defaultNearCallback */
 static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
@@ -901,9 +954,8 @@ static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher
 			btManifoldResult contactPointResult(&obj0Wrap, &obj1Wrap);
 
 			if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) {
-			//discrete collision detection query
-
-			collisionPair.m_algorithm->processCollision(&obj0Wrap, &obj1Wrap, dispatchInfo, &contactPointResult);
+				//discrete collision detection query
+				collisionPair.m_algorithm->processCollision(&obj0Wrap, &obj1Wrap, dispatchInfo, &contactPointResult);
 			}
 			else
 			{
@@ -915,8 +967,8 @@ static void nearCallback(btBroadphasePair &collisionPair, btCollisionDispatcher
 
 			btPersistentManifold *manifold = contactPointResult.getPersistentManifold();
 			if (manifold && manifold->getNumContacts() > 0) {
-				rbRigidBody *rb0 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy0->m_clientObject)->getUserPointer();
-				rbRigidBody *rb1 = (rbRigidBody *)((btRigidBody *)collisionPair.m_pProxy1->m_clientObject)->getUserPointer();
+				rbRigidBody *rb0 = (rbRigidBody*)colObj0->getUserPointer();
+				rbRigidBody *rb1 = (rbRigidBody*)colObj1->getUserPointer();
 
 				//handle_activation(manifold, rb0, rb1);
 				//handle_activation(manifold, rb1, rb0);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 4f6a32a984f..243b467228b 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4333,7 +4333,8 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	validOb = (check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) &&
 		          check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2)));
 
-	return activate ? validOb : check_activate || validOb;
+	//return activate ? validOb : check_activate || validOb;
+	return validOb;
 }
 
 static bool can_break(Object* collider, Object* ob, bool limit)



More information about the Bf-blender-cvs mailing list