[Bf-blender-cvs] [88fc1dd] fracture_modifier: first attempt of inter-object constraints with fracture modifier, via regular constraint / connect operator

Martin Felke noreply at git.blender.org
Mon Dec 12 00:26:35 CET 2016


Commit: 88fc1dd84615956adb124d3d64155921ea2f5662
Author: Martin Felke
Date:   Mon Dec 12 00:26:25 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB88fc1dd84615956adb124d3d64155921ea2f5662

first attempt of inter-object constraints with fracture modifier, via regular constraint / connect operator

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

M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 1a38c06..a51274a 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -83,6 +83,7 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int r
 static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo, float imat[4][4]);
 static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
 static void check_fracture(rbContactPoint *cp, RigidBodyWorld *rbw, Object *obA, Object *obB);
+static MeshIsland* findMeshIsland(FractureModifierData *fmd, int id);
 
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *mi, Object *ob)
@@ -1413,6 +1414,36 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 
 /* --------------------- */
 
+static MeshIsland* find_closest_meshisland_to_point(FractureModifierData* fmd, Object *ob, Object *ob2) {
+
+	MeshIsland *mi, **mi_array = NULL;
+	KDTree *tree;
+	KDTreeNearest n;
+	int count = BLI_listbase_count(&fmd->meshIslands);
+	int index = 0;
+	float loc[3];
+
+	tree = BLI_kdtree_new(count);
+	mi_array = MEM_mallocN(sizeof(MeshIsland*) * count, "mi_array find_closest_meshisland");
+
+	int i = 0;
+	for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
+		mul_v3_m4v3(loc, ob->obmat, mi->centroid);
+		BLI_kdtree_insert(tree, i, loc);
+		mi_array[i] = mi;
+		i++;
+	}
+
+	BLI_kdtree_balance(tree);
+	index = BLI_kdtree_find_nearest(tree, ob2->loc, &n);
+
+	mi = mi_array[index];
+	MEM_freeN(mi_array);
+	BLI_kdtree_free(tree);
+
+	return mi;
+}
+
 /**
  * Create physics sim representation of constraint given rigid body constraint settings
  *
@@ -1449,8 +1480,43 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
 		RB_dworld_remove_constraint(rbw->physics_world, rbc->physics_constraint);
 	}
 	if (rbc->physics_constraint == NULL || rebuild) {
-		rbRigidBody *rb1 = rbc->ob1->rigidbody_object->physics_object;
-		rbRigidBody *rb2 = rbc->ob2->rigidbody_object->physics_object;
+		rbRigidBody *rb1 = NULL, *rb2 = NULL;
+		FractureModifierData *fmd1 = NULL, *fmd2 = NULL;
+		MeshIsland *mi1, *mi2;
+
+		/*add logic to find closest shards of 2 FM objects, or to attach one shard to one regular */
+		/*for now, just take the first meshislands... later find the closest ones or the closest to center*/
+		fmd1 = (FractureModifierData*)modifiers_findByType(rbc->ob1, eModifierType_Fracture);
+		fmd2 = (FractureModifierData*)modifiers_findByType(rbc->ob2, eModifierType_Fracture);
+
+		if (fmd1 && fmd2) {
+			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, rbc->ob2);
+			mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, rbc->ob1);
+
+			if (mi1 && mi2) {
+				rb1 = mi1->rigidbody->physics_object;
+				rb2 = mi2->rigidbody->physics_object;
+			}
+		}
+		else if (fmd1) {
+			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, rbc->ob2);
+			if (mi1) {
+				rb1 = mi1->rigidbody->physics_object;
+				rb2 = rbc->ob2->rigidbody_object->physics_object;
+			}
+		}
+		else if (fmd2) {
+			mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, rbc->ob1);
+			if (mi2)
+			{
+				rb2 = mi2->rigidbody->physics_object;
+				rb1 = rbc->ob1->rigidbody_object->physics_object;
+			}
+		}
+		else {
+			rb1 = rbc->ob1->rigidbody_object->physics_object;
+			rb2 = rbc->ob2->rigidbody_object->physics_object;
+		}
 
 		/* remove constraint if it already exists before creating a new one */
 		if (rbc->physics_constraint) {




More information about the Bf-blender-cvs mailing list