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