Commit: 39330a3e622ba3e6dafdcc91290794f8e4db1c1d
Author: Martin Felke
Date:   Wed Aug 9 22:18:03 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB39330a3e622ba3e6dafdcc91290794f8e4db1c1d

reworked the trigger system to work in narrowphase of bullet (more exact shapes)

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

M       intern/rigidbody/rb_bullet_api.cpp
M       release/scripts/startup/bl_ui/properties_physics_rigidbody.py
M       source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index 1ef84bd92c8..ef6941bd5a5 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -723,20 +723,15 @@ struct rbFilterCallback : public btOverlapFilterCallback
                this->callback = callback;
        }
 
-       virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, 
btBroadphaseProxy *proxy1) const
+       bool check_collision(rbRigidBody* rb0, rbRigidBody* rb1, bool collides) 
const
        {
-               rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody 
*)proxy0->m_clientObject)->getUserPointer();
-               rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody 
*)proxy1->m_clientObject)->getUserPointer();
-               
-               bool collides;
-               collides = (proxy0->m_collisionFilterGroup & 
proxy1->m_collisionFilterMask) != 0;
-               collides = collides && (proxy1->m_collisionFilterGroup & 
proxy0->m_collisionFilterMask);
                if (!rb0 || !rb1)
                        return collides;
 
                collides = collides && (rb0->col_groups & rb1->col_groups);
                if (this->callback != NULL) {
                        int result = 0;
+#if 0
                        //cast ray from centroid of 1 rigidbody to another, do 
this only for mesh shapes (all other can use standard bbox)
                        int stype0 = 
rb0->body->getCollisionShape()->getShapeType();
                        int stype1 = 
rb1->body->getCollisionShape()->getShapeType();
@@ -806,10 +801,29 @@ struct rbFilterCallback : public btOverlapFilterCallback
                        }
 
                        collides = collides && (bool)result;
+#endif
+                       result = this->callback(rb0->world->blenderWorld, 
rb0->meshIsland, rb1->meshIsland, rb0->blenderOb, rb1->blenderOb);
+                       collides = collides && (bool)result;
                }
-               
+
                return collides;
        }
+
+       virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, 
btBroadphaseProxy *proxy1) const
+       {
+               //rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody 
*)proxy0->m_clientObject)->getUserPointer();
+               //rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody 
*)proxy1->m_clientObject)->getUserPointer();
+               
+               bool collides;
+               collides = (proxy0->m_collisionFilterGroup &
+                          (proxy1->m_collisionFilterMask | 
btBroadphaseProxy::StaticFilter |
+                           btBroadphaseProxy::KinematicFilter)) != 0;
+               collides = collides && (proxy1->m_collisionFilterGroup &
+                          (proxy0->m_collisionFilterMask | 
btBroadphaseProxy::StaticFilter |
+                           btBroadphaseProxy::KinematicFilter));
+
+               return collides; //this->check_collision(rb0, rb1, collides);
+       }
 };
 
 static inline void copy_quat_btquat(float quat[4], const btQuaternion &btquat)
@@ -892,6 +906,33 @@ static void idCallback(void *userPtr, int* objectId, int* 
shardId)
        }
 }
 
+class CollisionFilterDispatcher : public btCollisionDispatcher
+{
+       public:
+               virtual bool needsCollision(const btCollisionObject *body0, 
const btCollisionObject *body1);
+               rbFilterCallback *filterCallback;
+               CollisionFilterDispatcher(btDefaultCollisionConfiguration 
*configuration, rbFilterCallback* callback);
+};
+
+CollisionFilterDispatcher::CollisionFilterDispatcher(btDefaultCollisionConfiguration*
 configuration, rbFilterCallback *callback)
+    :btCollisionDispatcher(configuration)
+{
+       this->filterCallback = callback;
+}
+
+bool CollisionFilterDispatcher::needsCollision(const btCollisionObject *body0, 
const btCollisionObject *body1)
+{
+       rbRigidBody *rb0 = (rbRigidBody *)((btFractureBody 
*)body0)->getUserPointer();
+       rbRigidBody *rb1 = (rbRigidBody *)((btFractureBody 
*)body1)->getUserPointer();
+
+       if (this->filterCallback)
+       {
+               return this->filterCallback->check_collision(rb0, rb1, true);
+       }
+
+       return true;
+}
+
 //yuck, but need a handle for the world somewhere for collision callback...
 rbDynamicsWorld *RB_dworld_new(const float gravity[3], void* blenderWorld, 
void* blenderScene, int (*callback)(void *, void *, void *, void *, void *),
                                                           void 
(*contactCallback)(rbContactPoint* cp, void *bworld), void 
(*idCallbackOut)(void*, void*, int*, int*),
@@ -901,13 +942,12 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], 
void* blenderWorld, void*
        
        /* collision detection/handling */
        world->collisionConfiguration = new btDefaultCollisionConfiguration();
-       
-       world->dispatcher = new 
btCollisionDispatcher(world->collisionConfiguration);
+
+       world->filterCallback = new rbFilterCallback(callback);
+       world->dispatcher = new 
CollisionFilterDispatcher(world->collisionConfiguration, 
(rbFilterCallback*)world->filterCallback);
        btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher 
*)world->dispatcher);
        
        world->pairCache = new btDbvtBroadphase();
-       
-       world->filterCallback = new rbFilterCallback(callback);
        
world->pairCache->getOverlappingPairCache()->setOverlapFilterCallback(world->filterCallback);
 
        /* constraint solving */
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py 
b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
index fd6fa2223df..961fbdc6bf9 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
@@ -81,7 +81,7 @@ class 
PHYSICS_PT_rigid_body_trigger_advanced(PHYSICS_PT_rigidbody_panel, Panel):
         row.prop(rbo, "dynamic_trigger")
         row = layout.row()
         row.prop(rbo, "plastic_dissolve")
-        row.prop(rbo, "is_anti_trigger")
+        row.prop(rbo, "is_anti_trigger", text="Stop Trigger")
 
 class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel):
     bl_label = "Rigid Body Collisions"
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 34705ed569e..a6f010b824e 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1273,9 +1273,10 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld 
*rbw, MeshIsland *mi, Objec
                BKE_rigidbody_validate_sim_shard_shape(mi, ob, true);
        
        if (rbo->physics_object) {
-               if (rebuild == false || mi->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD)
+               if (rebuild == false /*|| mi->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD*/)
                        RB_dworld_remove_body(rbw->physics_world, 
rbo->physics_object);
        }
+
        if (!rbo->physics_object || rebuild) {
                float size[3];
 
@@ -1349,6 +1350,12 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld 
*rbw, MeshIsland *mi, Objec
                        }
                }
        }
+       else if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD )
+       {
+               RB_body_deactivate(rbo->physics_object);
+               RB_body_set_mass(rbo->physics_object, 0.0f);
+               RB_body_set_kinematic_state(rbo->physics_object, true);
+       }
 
        if (rbw && rbw->physics_world && rbo->physics_object)
        {
@@ -1356,7 +1363,7 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld 
*rbw, MeshIsland *mi, Objec
        }
 
        rbo->flag &= ~RBO_FLAG_NEEDS_VALIDATE;
-       rbo->flag &= ~RBO_FLAG_KINEMATIC_REBUILD;
+       //rbo->flag &= ~RBO_FLAG_KINEMATIC_REBUILD;
 }
 
 
@@ -1444,6 +1451,12 @@ static void rigidbody_validate_sim_object(RigidBodyWorld 
*rbw, Object *ob, bool
                        }
                }
        }
+       else if (rbo->flag & RBO_FLAG_KINEMATIC_REBUILD )
+       {
+               RB_body_deactivate(rbo->physics_object);
+               RB_body_set_mass(rbo->physics_object, 0.0f);
+               RB_body_set_kinematic_state(rbo->physics_object, true);
+       }
 
        if (rbw && rbw->physics_world)
                RB_dworld_add_body(rbw->physics_world, rbo->physics_object, 
rbo->col_groups, NULL, ob, rbo->meshisland_index);
@@ -3539,7 +3552,7 @@ static void rigidbody_update_sim_ob(Scene *scene, 
RigidBodyWorld *rbw, Object *o
 
        /* update rigid body location and rotation for kinematic bodies */
        if ((rbo->flag & RBO_FLAG_KINEMATIC && rbo->force_thresh == 0.0f) || 
(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
-               if (rbo->type == RBO_TYPE_ACTIVE || mi == NULL)
+               if (((rbo->type == RBO_TYPE_ACTIVE || mi == NULL) && (rbo->flag 
& RBO_FLAG_KINEMATIC_REBUILD) == 0))
                {
                        mul_v3_v3(centr, scale);
                        mul_qt_v3(rot, centr);
@@ -3583,12 +3596,15 @@ static void rigidbody_update_sim_ob(Scene *scene, 
RigidBodyWorld *rbw, Object *o
                        }
                        else if (rbo->flag & RBO_FLAG_KINEMATIC)
                        {
-                               /* do the same here as above, but here we 
needed the eff_force value to compare against threshold */
-                               mul_v3_v3(centr, scale);
-                               mul_qt_v3(rot, centr);
-                               add_v3_v3(loc, centr);
-                               RB_body_activate(rbo->physics_object);
-                               RB_body_set_loc_rot(rbo->physics_object, loc, 
rot);
+                               if ((rbo->flag & RBO_FLAG_KINEMATIC_REBUILD) == 
0)
+                               {   //XXXXX TODO, maybe this is wrong here
+                                       /* do the same here as above, but here 
we needed the eff_force value to compare against threshold */
+                                       mul_v3_v3(centr, scale);
+                                       mul_qt_v3(rot, centr);
+                                       add_v3_v3(loc, centr);
+                                       RB_body_activate(rbo->physics_object);
+                                       
RB_body_set_loc_rot(rbo->physics_object, loc, rot);
+                               }
                        }
                        else
                        {
@@ -3619,7 +3635,7 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland 
*mi, Object *ob, int r
                return;
        }
 
-       if (rebuild || (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)) {
+       if (rebuild /*|| (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)*/) {
                /* World has been rebuilt so rebuild object */
                BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true, 
transfer_speed, size);
        }
@@ -3759,12 +3775,15 @@ void BKE_deactivateRigidbody(RigidBodyOb *rbo)
 {
        //make kinematic again (un-trigger)
        //printf("Untrigger\n");
-       if (rbo->physics_object)
+       //if (rbo->physics_object)
        {
-               RB_body_set_kinematic_state(rbo->physics_object, true);
-               RB_body_set_mass(rbo->physics_object, 0.0f);
+               //RB_body_set_kinematic_state(rbo->physics_object, true);
+               //RB_body_set_mass(rbo->physics_object, 0.0f);
                //rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
-               RB_body_deactivate(rbo->physics_object);
+               //RB_body_deactivate(rbo->physics_object);
+               rbo->flag |= RBO_FLAG_KINEMATIC;
+               rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+               rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
        }
 }
 
@@ -4224,8 +4243,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                }
                        }
 
-                       if (rebuild || rbsc->mi1->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD ||
-                               rbsc->mi2->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD) {
+                       if (rebuild) { // || rbsc->mi1->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD ||
+                               //rbsc->mi2->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD) {
                                /* World has been rebuilt 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to