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)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to