[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