Commit: 5183a1d0ed723cd00ae7946ac156c32e6ba45775
Author: Martin Felke
Date:   Fri Nov 9 23:16:02 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB5183a1d0ed723cd00ae7946ac156c32e6ba45775

fixes for dynamic fracture

fixes for:
- speed transfer (shards could stop their motion)
- shards could be stuck in the air
- ghost dynamic triggers work now too (firing a contact callback)

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

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

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index ef8a75665d2..7c8933cc29c 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -293,14 +293,33 @@ static bool weakenCompound(const btCollisionObject *body, 
btScalar force, btVect
        return false;
 }
 
+static void manifold_callback(TickDiscreteDynamicsWorld* tworld, 
btManifoldPoint& pt,
+                              btCollisionObject *obA,  btCollisionObject *obB)
+{
+       btFractureDynamicsWorld *fworld = (btFractureDynamicsWorld*)tworld;
+
+       if (pt.getDistance()<0.f)
+       {
+               if (tworld->m_contactCallback)
+               {
+                       rbContactPoint* cp = tworld->make_contact_point(pt, 
obA, obB);
+                       //broken = weakenCompound(obA, cp->contact_force, 
pt.getPositionWorldOnA(), fworld);
+                       //broken = broken || weakenCompound(obB, 
cp->contact_force, pt.getPositionWorldOnB(), fworld);
+                       tworld->m_contactCallback(cp, tworld->m_bworld);
+                       delete cp;
+               }
+       }
+}
+
 static void tickCallback(btDynamicsWorld *world, btScalar timeStep)
 {
        btFractureDynamicsWorld *fworld = (btFractureDynamicsWorld*)world;
        fworld->updateBodies();
 
        TickDiscreteDynamicsWorld* tworld = (TickDiscreteDynamicsWorld*)world;
-       bool broken = false;
+       //bool broken = false;
 
+#if 0
        int numManifolds = world->getDispatcher()->getNumManifolds();
        for (int i=0;i<numManifolds;i++)
        {
@@ -311,6 +330,9 @@ static void tickCallback(btDynamicsWorld *world, btScalar 
timeStep)
                int numContacts = contactManifold->getNumContacts();
                for (int j=0;j<numContacts;j++)
                {
+                       manifold_callback(tworld, pt, obA, obB);
+
+
                        btManifoldPoint& pt = 
contactManifold->getContactPoint(j);
                        if (pt.getDistance()<0.f)
                        {
@@ -338,6 +360,7 @@ static void tickCallback(btDynamicsWorld *world, btScalar 
timeStep)
                if (broken)
                        break;
        }
+#endif
 
        if (tworld->m_tickCallback)
        {
@@ -976,6 +999,11 @@ static void nearCallback(btBroadphasePair &collisionPair, 
btCollisionDispatcher
 
                                //handle_activation(manifold, rb0, rb1);
                                //handle_activation(manifold, rb1, rb0);
+                               for (int i = 0; i < manifold->getNumContacts(); 
i++)
+                               {
+                                       
manifold_callback(rb0->world->dynamicsWorld, manifold->getContactPoint(i), 
colObj0, colObj1);
+                               }
+
                                
((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderWorld,
 rb0->meshIsland, rb1->meshIsland,
                                                           rb0->blenderOb, 
rb1->blenderOb, true);
                        }
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index fdd3c5e2d0a..096a56adc30 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4326,9 +4326,9 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                }
        }
 
-       //if ghost is involved, and dynafrac trigger is enabled, try to call 
check_fracture manually here, without forces and with centroid as contact point
-       fake_dynamic_collide(ob1, ob2, mi1, mi2, rbw);
-       fake_dynamic_collide(ob2, ob1, mi2, mi1, rbw);
+       //if ghost is involved, and dynafrac trigger is enabled, try to call 
check_fracture manually here, without forces and with centroid as contact 
point... Update: should have real contact point now from bullet
+       //fake_dynamic_collide(ob1, ob2, mi1, mi2, rbw);
+       //fake_dynamic_collide(ob2, ob1, mi2, mi1, rbw);
 
        validOb = (check_colgroup_ghost(ob1, ob2) && 
((check_constraint_island(fmd1, mi1, mi2) &&
                          check_constraint_island(fmd2, mi2, mi1)) || (ob1 != 
ob2)));
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 982e91aba5c..f1e5eda74ae 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -4183,7 +4183,7 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
                        copy_v3_v3(mi->rigidbody->lin_vel, 
par->rigidbody->lin_vel);
                        copy_v3_v3(mi->rigidbody->ang_vel, 
par->rigidbody->ang_vel);
                        mi->rigidbody->flag = par->rigidbody->flag;
-
+#if 0
                        //keep 1st level shards kinematic if parent is triggered
                        if ((par->rigidbody->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact && 
!fmd->is_dynamic_external) {
 
@@ -4213,6 +4213,7 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
                                        mi->rigidbody->flag |= 
RBO_FLAG_NEEDS_VALIDATE;
                                }
                        }
+#endif
                }
 
                mi->rigidbody->meshisland_index = mi->id;

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

Reply via email to