[Bf-blender-cvs] [78b3061c32c] fracture_modifier: fix attempt for avoiding incorrect inner collisions between constrained objects

Martin Felke noreply at git.blender.org
Wed Aug 16 01:20:41 CEST 2017


Commit: 78b3061c32c83b41e43bcf0e92d4b673bdcb8122
Author: Martin Felke
Date:   Wed Aug 16 01:20:11 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB78b3061c32c83b41e43bcf0e92d4b673bdcb8122

fix attempt for avoiding incorrect inner collisions between constrained objects

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

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 e67a88c7631..1f1aa574084 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -926,12 +926,17 @@ bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, c
 	rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody *)body0)->getUserPointer();
 	rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody *)body1)->getUserPointer();
 
-	if (this->filterCallback)
+	if (((btRigidBody*)body0)->checkCollideWithOverride(body1))
 	{
-		return this->filterCallback->check_collision(rb0, rb1, true, true);
+		if (this->filterCallback)
+		{
+			return this->filterCallback->check_collision(rb0, rb1, true, true);
+		}
+
+		return true;
 	}
 
-	return true;
+	return false;
 }
 
 //yuck, but need a handle for the world somewhere for collision callback...
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index d4dc303c5b9..3d5ec92bec5 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4043,18 +4043,20 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	fake_dynamic_collide(ob1, ob2, mi1, mi2, rbw);
 	fake_dynamic_collide(ob2, ob1, mi2, mi1, rbw);
 
-	validOb = ((ob1->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0) || ((ob2->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0);
-	validOb = validOb || ((ob1->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0) || ((mi2 && mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0);
-	validOb = validOb || ((mi1 && (mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0)) || ((ob2->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0);
-	validOb = validOb || ((mi1 && (mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0)) || ((mi2 && mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0);
-
-	if (validOb)
+	if (activate)
 	{
-		//always allow when atleast one object is not kinematic
-		check_activate = true;
+		validOb = ((ob1->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0) || ((ob2->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0);
+		validOb = validOb || ((ob1->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0) || ((mi2 && mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0);
+		validOb = validOb || ((mi1 && (mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0)) || ((ob2->rigidbody_object->flag & RBO_FLAG_KINEMATIC) == 0);
+		validOb = validOb || ((mi1 && (mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0)) || ((mi2 && mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0);
+
+		validOb = validOb && (check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2)));
+	}
+	else {
+		validOb = (check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2)));
 	}
 
-	return check_activate && 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;
 }
 
 static bool can_break(Object* collider, Object* ob, bool limit)




More information about the Bf-blender-cvs mailing list