[Bf-blender-cvs] [a504717] fracture_modifier: inter-objects constraint objects can now determine which shards (closest) will be connected to the other object

Martin Felke noreply at git.blender.org
Thu Dec 15 18:35:12 CET 2016


Commit: a5047171b9e3720bdb29caac87c911f900cd7287
Author: Martin Felke
Date:   Thu Dec 15 18:34:50 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBa5047171b9e3720bdb29caac87c911f900cd7287

inter-objects constraint objects can now determine which shards (closest) will be connected to the other object

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index a359df7..53d5fdb 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -121,5 +121,6 @@ int BKE_fracture_update_visual_mesh(struct FractureModifierData *fmd, struct Obj
 short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, short matstart, struct GHash** mat_index_map);
 
 void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
+void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, int con_type, float thresh);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 1024a8b..8ef6bca 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -3151,3 +3151,69 @@ void BKE_bm_mesh_hflag_flush_vert(BMesh *bm, const char hflag)
 		BM_elem_flag_set(f, hflag, ok);
 	}
 }
+
+void BKE_meshisland_constraint_create(FractureModifierData* fmd, MeshIsland *mi1, MeshIsland *mi2, int con_type, float thresh)
+{
+	RigidBodyShardCon *rbsc;
+	rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, con_type, fmd->fracture_mode != MOD_FRACTURE_DYNAMIC);
+	rbsc->mi1 = mi1;
+	rbsc->mi2 = mi2;
+
+	BLI_snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
+
+	if (thresh == 0 || fmd->use_breaking == false) {
+		rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
+	}
+
+	if (!fmd->use_constraint_collision) {
+		rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
+	}
+	else {
+		rbsc->flag &= ~RBC_FLAG_DISABLE_COLLISIONS;
+	}
+
+	if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
+		(mi1->particle_index == mi2->particle_index))
+	{
+		if (fmd->cluster_count > 1) {
+			rbsc->breaking_threshold = fmd->cluster_breaking_threshold;
+		}
+		else {
+			rbsc->breaking_threshold = thresh;
+		}
+	}
+	else
+	{
+		if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
+			(mi1->particle_index != mi2->particle_index))
+		{
+			/* set a different type of constraint between clusters */
+			rbsc->type = fmd->cluster_constraint_type;
+		}
+		rbsc->breaking_threshold = thresh;
+	}
+
+	if (fmd->thresh_defgrp_name[0]) {
+		/* modify maximum threshold by minimum weight */
+		rbsc->breaking_threshold = thresh * MIN2(mi1->thresh_weight, mi2->thresh_weight);
+	}
+
+	BLI_addtail(&fmd->meshConstraints, rbsc);
+
+	/* store constraints per meshisland too, to allow breaking percentage */
+	if (mi1->participating_constraints == NULL) {
+		mi1->participating_constraints = MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi1");
+		mi1->participating_constraint_count = 0;
+	}
+	mi1->participating_constraints = MEM_reallocN(mi1->participating_constraints, sizeof(RigidBodyShardCon *) * (mi1->participating_constraint_count + 1));
+	mi1->participating_constraints[mi1->participating_constraint_count] = rbsc;
+	mi1->participating_constraint_count++;
+
+	if (mi2->participating_constraints == NULL) {
+		mi2->participating_constraints = MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi2");
+		mi2->participating_constraint_count = 0;
+	}
+	mi2->participating_constraints = MEM_reallocN(mi2->participating_constraints, sizeof(RigidBodyShardCon *) * (mi2->participating_constraint_count + 1));
+	mi2->participating_constraints[mi2->participating_constraint_count] = rbsc;
+	mi2->participating_constraint_count++;
+}
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 4be148e..43c2aa5 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1414,44 +1414,15 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 
 /* --------------------- */
 
-static int connected_island_cons(RigidBodyWorld *rbw, Object* ob, RigidBodyCon*** cons)
-{
-	GroupObject* go;
-	int count = 0, i = 0;
-
-	for (go = rbw->constraints->gobject.first; go; go = go->next ) {
-		RigidBodyCon *con = go->ob->rigidbody_constraint;
-		if ((con->ob1 == ob) || (con->ob2 == ob))
-		{
-			count++;
-		}
-	}
-
-	*cons = MEM_mallocN(sizeof(RigidBodyCon*) * count, "connected_island_cons");
-
-	for (go = rbw->constraints->gobject.first; go; go = go->next ) {
-		RigidBodyCon *con = go->ob->rigidbody_constraint;
-		if ((con->ob1 == ob) || (con->ob2 == ob))
-		{
-			(*cons)[i] = con;
-			i++;
-		}
-	}
-
-	return count;
-}
-
 static MeshIsland* find_closest_meshisland_to_point(FractureModifierData* fmd, Object *ob, Object *ob2, RigidBodyWorld* rbw, RigidBodyCon *con) {
 
 	MeshIsland *mi, **mi_array = NULL;
 	KDTree *tree;
-	KDTreeNearest *n;
+	KDTreeNearest *n = NULL;
 	int count = 0;
-	int con_count = 0;
 	int index = 0;
-	float loc[3];
-	int i = 0, j = 0;
-	RigidBodyCon **cons = NULL;
+	float loc[3], min[3], max[3], vec[3] = {1, 1, 1};
+	int i = 0, r = 0;
 
 	count = BLI_listbase_count(&fmd->meshIslands);
 	tree = BLI_kdtree_new(count);
@@ -1466,22 +1437,15 @@ static MeshIsland* find_closest_meshisland_to_point(FractureModifierData* fmd, O
 
 	BLI_kdtree_balance(tree);
 
-	con_count = connected_island_cons(rbw, ob, &cons);
-	n = MEM_mallocN(sizeof(KDTreeNearest) * con_count, "n nearest find_closest_meshisland");
-
-	BLI_kdtree_find_nearest_n(tree, ob2->loc, n, con_count);
+	index = BLI_kdtree_find_nearest(tree, ob2->loc, n);
 
-	for (j = 0; j < con_count; j++) {
-		if (cons[j] == con) {
-			index = n[j].index;
-			break;
-		}
-	}
+	//create "aabb"
+	mul_v3_v3(vec, ob2->size);
+	sub_v3_v3v3(min, ob2->loc, vec);
+	add_v3_v3v3(max, ob2->loc, vec);
 
 	if (index == -1) {
 		MEM_freeN(mi_array);
-		MEM_freeN(n);
-		MEM_freeN(cons);
 		BLI_kdtree_free(tree);
 		return NULL;
 	}
@@ -1492,9 +1456,36 @@ static MeshIsland* find_closest_meshisland_to_point(FractureModifierData* fmd, O
 
 	mi = mi_array[index];
 
+	//do a range search and clip against "aabb" of empty scale for additional inner constraint
+	r = BLI_kdtree_range_search(tree, ob2->loc, &n, max_fff(UNPACK3(ob2->size)));
+	for (i = 0; i < r; i++)
+	{
+		float co[3];
+		copy_v3_v3(co, n[i].co);
+
+		if ((co[0] > min[0] && co[0] < max[0]) &&
+		    (co[1] > min[1] && co[1] < max[1]) &&
+		    (co[2] > min[2] && co[2] < max[2]))
+		{
+			MeshIsland* mi2;
+			int ind = n[i].index;
+
+			if (ind >= count) {
+				ind = count-1;
+			}
+
+			mi2 = mi_array[ind];
+
+			//connect ?
+			BKE_meshisland_constraint_create(fmd, mi, mi2, RBC_TYPE_FIXED, fmd->breaking_threshold);
+		}
+	}
+
+	if (n) {
+		MEM_freeN(n);
+	}
+
 	MEM_freeN(mi_array);
-	MEM_freeN(n);
-	MEM_freeN(cons);
 	BLI_kdtree_free(tree);
 
 	return mi;
@@ -1546,8 +1537,8 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
 		fmd2 = (FractureModifierData*)modifiers_findByType(rbc->ob2, eModifierType_Fracture);
 
 		if (fmd1 && fmd2) {
-			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, rbc->ob2, rbw, rbc);
-			mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, rbc->ob1, rbw, rbc);
+			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, ob, rbw, rbc);
+			mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, ob, rbw, rbc);
 
 			if (mi1 && mi2) {
 				rb1 = mi1->rigidbody->physics_object;
@@ -1555,14 +1546,14 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
 			}
 		}
 		else if (fmd1) {
-			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, rbc->ob2, rbw, rbc);
+			mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, ob, rbw, rbc);
 			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, rbw, rbc);
+			mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, ob, rbw, rbc);
 			if (mi2)
 			{
 				rb2 = mi2->rigidbody->physics_object;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 35e2fcb..c48b280 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2456,72 +2456,6 @@ static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMe
 
 }
 
-static void do_constraint(FractureModifierData* fmd, MeshIsland *mi1, MeshIsland *mi2, int con_type, float thresh)
-{
-	RigidBodyShardCon *rbsc;
-	rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, con_type, fmd->fracture_mode != MOD_FRACTURE_DYNAMIC);
-	rbsc->mi1 = mi1;
-	rbsc->mi2 = mi2;
-
-	BLI_snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
-
-	if (thresh == 0 || fmd->use_breaking == false) {
-		rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
-	}
-
-	if (!fmd->use_constraint_collision) {
-		rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
-	}
-	else {
-		rbsc->flag &= ~RBC_FLAG_DISABLE_COLLISIONS;
-	}
-
-	if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
-		(mi1->particle_index == mi2->particle_index))
-	{
-		if (fmd->cluster_count > 1) {
-			rbsc->breaking_threshold = fmd->cluster_breaking_threshold;
-		}
-		else {
-			rbsc->breaking_threshold = thresh;
-		}
-	}
-	else
-	{
-		if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
-			(mi1->particle_index != mi2->particle_index))
-		{
-			/* set a different type of constraint between clusters */
-			rbsc->type = fmd->cluster_constraint_type;
-		}
-		rbsc->breaking_threshold = thresh;
-	}
-
-	if (fmd->thresh_defgrp_name[0]) {
-		/* modify maximum threshold by minimum weight */
-		rbsc->breaking_threshold = thresh * MIN2(mi1->thresh_weight, mi2->thresh_weight);
-	}
-
-	BLI_addtail(&fmd->meshConstraints, rbsc);
-
-	/* store constraints per meshisland too, to allow breaking percentage */
-	if (mi1->participating_constraints == NULL) {
-		mi1->participating_constraints = MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi1");
-		mi1->participating_constraint_count = 0;
-	}
-	mi1->participating_constraints = MEM_reallocN(mi1->participating_constraints, sizeof(RigidBodyShardCon *) * (mi1->participating_constraint_count + 1));
-	mi1->participating_constraints[mi1->participating_cons

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list