[Bf-blender-cvs] [5183a1d0ed7] fracture_modifier: fixes for dynamic fracture
Martin Felke
noreply at git.blender.org
Fri Nov 9 23:17:06 CET 2018
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;
More information about the Bf-blender-cvs
mailing list