[Bf-blender-cvs] [b1d786de2c7] fracture_modifier: fix for automerge, do not snap together after exceeding threshold, and adding optionally crease to edges, too

Martin Felke noreply at git.blender.org
Thu Jun 8 13:01:10 CEST 2017


Commit: b1d786de2c73f5e8cc8910b6e51b3d7d97e34d78
Author: Martin Felke
Date:   Thu Jun 8 13:00:47 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBb1d786de2c73f5e8cc8910b6e51b3d7d97e34d78

fix for automerge, do not snap together after exceeding threshold, and adding optionally crease to edges, too

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

M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index a7eac7135e3..c37c1141239 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -94,16 +94,19 @@ static void cleanup_arrange_shard(FractureModifierData *fmd, Shard *s, float cen
 static MeshIsland* find_meshisland(ListBase* meshIslands, int id);
 static void do_halving(FractureModifierData *fmd, Object* ob, DerivedMesh *dm, DerivedMesh *orig_dm, bool is_prehalving, ShardID id);
 static void free_shared_verts(FractureModifierData* fmd);
+static void reset_automerge(FractureModifierData *fmd);
 
 typedef struct SharedVertGroup {
 	struct SharedVertGroup* next, *prev;
 	int index;
+	bool exceeded;
 	ListBase verts;
 } SharedVertGroup;
 
 typedef struct SharedVert {
 	struct SharedVert* next, *prev;
 	int index;
+	bool exceeded;
 } SharedVert;
 
 //TODO XXX Make BKE
@@ -3199,13 +3202,35 @@ static void find_other_face(FractureModifierData *fmd, int i, BMesh* bm, Object*
 	}
 }
 
+static void reset_automerge(FractureModifierData *fmd)
+{
+	SharedVert *sv;
+	SharedVertGroup *vg;
+
+	for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
+		vg->exceeded = false;
+
+		for (sv = vg->verts.first; sv; sv = sv->next)
+		{
+			sv->exceeded = false;
+		}
+	}
+}
+
 static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 {
 	SharedVert *sv;
 	SharedVertGroup *vg;
+	int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
+	if (cd_edge_crease_offset == -1) {
+		BM_data_layer_add(bm, &bm->edata, CD_CREASE);
+		cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
+	}
 
 	for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
 		BMVert* v1, *v2;
+		BMIter iter;
+		BMEdge *e;
 		float co[3];
 		int verts = 0;
 
@@ -3213,32 +3238,52 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 		copy_v3_v3(co, v1->co);
 		verts = 1;
 
-		//printf("Index: %d %d\n", vg->index, verts);
 		for (sv = vg->verts.first; sv; sv = sv->next)
 		{
 			v2 = bm->vtable[sv->index];
-			add_v3_v3(co, v2->co);
-			verts++;
-			//printf("Index2: %d\n", sv->index);
+			BMIter iter2;
+
+			if (!sv->exceeded) {
+				add_v3_v3(co, v2->co);
+				verts++;
+			}
+
+			BM_ITER_ELEM(e, &iter2, v2, BM_EDGES_OF_VERT)
+			{
+				BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
+			}
 		}
 
 		mul_v3_fl(co, 1.0f/(float)verts);
-		//print_v3("co", co);
-
 		verts = 0;
 
-		for (sv = vg->verts.first; sv; sv = sv->next)
+		if (!vg->exceeded)
 		{
-			v2 = bm->vtable[sv->index];
-			if (len_squared_v3v3(co, v2->co) <= fmd->automerge_dist * fmd->automerge_dist)
+			for (sv = vg->verts.first; sv; sv = sv->next)
+			{
+				v2 = bm->vtable[sv->index];
+				if (len_squared_v3v3(co, v2->co) <= fmd->automerge_dist * fmd->automerge_dist)
+				{
+					if (!sv->exceeded)
+					{
+						copy_v3_v3(v2->co, co);
+					}
+				}
+				else {
+					sv->exceeded = true;
+					vg->exceeded = true;
+				}
+			}
+
+			if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
 			{
-				copy_v3_v3(v2->co, co);
+				copy_v3_v3(v1->co, co);
 			}
 		}
 
-		if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
+		BM_ITER_ELEM(e, &iter, v1, BM_EDGES_OF_VERT)
 		{
-			copy_v3_v3(v1->co, co);
+			BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
 		}
 	}
 }
@@ -3251,7 +3296,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 	DerivedMesh *result;
 	BMFace **faces = MEM_mallocN(sizeof(BMFace *), "faces");
 	int del_faces = 0;
-	bool do_merge = false;
+	bool do_merge = true;
 
 	DM_to_bmesh_ex(dm, bm, true);
 
@@ -3300,7 +3345,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 		//separate this, because it costs performance and might not work so well with thin objects, but its useful for smooth objects
 		BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
 	             "automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT,
-	             0.001f); /*need to merge larger cracks*/
+	             0.0001f); /*need to merge larger cracks*/
 
 		if (fmd->fix_normals) {
 			/* dissolve sharp edges with limit dissolve
@@ -3886,6 +3931,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 			gvert->index = i;
 			gvert->verts.first = NULL;
 			gvert->verts.last = NULL;
+			gvert->exceeded = false;
 
 			for (j = 1; j < r; j++)
 			{
@@ -3896,6 +3942,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 
 					SharedVert *svert = MEM_mallocN(sizeof(SharedVert), "sharedVert");
 					svert->index = index;
+					svert->exceeded = false;
 					BLI_addtail(&gvert->verts, svert);
 				}
 			}
@@ -4177,6 +4224,16 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		do_refresh_constraints(fmd, ob);
 	}
 
+	if (fmd->modifier.scene && fmd->modifier.scene->rigidbody_world) {
+		Scene *sc = fmd->modifier.scene;
+		RigidBodyWorld *rbw = sc->rigidbody_world;
+		int frame = (int)BKE_scene_frame_get(sc);
+		int start = rbw ? rbw->pointcache->startframe : 1;
+		if (frame == start) {
+			reset_automerge(fmd);
+		}
+	}
+
 	/*XXX better rename this, it checks whether we have a valid fractured mesh */
 	exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->dm && fmd->frac_mesh);




More information about the Bf-blender-cvs mailing list