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