[Bf-blender-cvs] [1941be005d0] fracture_modifier: more tweaks for automerge

Martin Felke noreply at git.blender.org
Mon Jun 12 11:29:54 CEST 2017


Commit: 1941be005d0fa57f8c33efba395d10a935acf6d9
Author: Martin Felke
Date:   Mon Jun 12 11:29:27 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB1941be005d0fa57f8c33efba395d10a935acf6d9

more tweaks for automerge

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

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 b6fceee35db..17585ce9fb4 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3139,6 +3139,11 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm, Object *
 		}
 	}
 
+	if (faces == 0 || pairs == 0) {
+		BLI_ghash_free(fmd->face_pairs, NULL, NULL);
+		fmd->face_pairs = NULL;
+	}
+
 	printf("faces, pairs: %d %d\n", faces, pairs);
 	BLI_kdtree_free(tree);
 }
@@ -3233,11 +3238,15 @@ static void reset_automerge(FractureModifierData *fmd)
 	for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
 		vg->exceeded = false;
 		vg->moved = false;
+		zero_v3(vg->delta);
+		vg->deltas_set = false;
 
 		for (sv = vg->verts.first; sv; sv = sv->next)
 		{
 			sv->exceeded = false;
 			sv->moved = false;
+			zero_v3(sv->delta);
+			sv->deltas_set = false;
 		}
 	}
 }
@@ -3283,11 +3292,12 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 		BMVert* v1, *v2;
 		BMIter iter;
 		BMEdge *e;
-		float co[3];
+		float co[3], no[3], inverse;
 		int verts = 0;
 
 		v1 = bm->vtable[vg->index];
 		copy_v3_v3(co, v1->co);
+		copy_v3_v3(no, v1->no);
 		verts = 1;
 
 		for (sv = vg->verts.first; sv; sv = sv->next)
@@ -3297,6 +3307,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 
 			if (!sv->exceeded) {
 				add_v3_v3(co, v2->co);
+				add_v3_v3(no, v2->no);
 				verts++;
 			}
 			else
@@ -3307,7 +3318,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 				}
 			}
 
-			if (vg->exceeded)
+			if (sv->exceeded)
 			{
 				BM_ITER_ELEM(e, &iter2, v2, BM_EDGES_OF_VERT)
 				{
@@ -3316,10 +3327,12 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 			}
 		}
 
-		mul_v3_fl(co, 1.0f/(float)verts);
+		inverse = 1.0f/(float)verts;
+		mul_v3_fl(co, inverse);
+		mul_v3_fl(no, inverse);
 		verts = 0;
 
-		if (!vg->exceeded)
+		//if (!vg->exceeded)
 		{
 			for (sv = vg->verts.first; sv; sv = sv->next)
 			{
@@ -3335,12 +3348,11 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 					if (!sv->exceeded)
 					{
 						copy_v3_v3(v2->co, co);
-						BM_elem_flag_enable(v2, BM_ELEM_SELECT);
+						copy_v3_v3(v2->no, no);
 					}
 				}
 				else {
 					sv->exceeded = true;
-					vg->exceeded = true;
 
 					if (!sv->deltas_set){
 						sub_v3_v3v3(sv->delta, co, v2->co);
@@ -3350,15 +3362,17 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 				}
 			}
 
+			if ((len_squared_v3v3(co, v1->co) > (dist * dist)))
+			{
+				vg->moved = true;
+			}
+
 			if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
 			{
-				if ((len_squared_v3v3(co, v1->co) > (dist * dist)))
-				{
-					vg->moved = true;
+				if (!vg->exceeded) {
+					copy_v3_v3(v1->co, co);
+					copy_v3_v3(v1->no, no);
 				}
-
-				copy_v3_v3(v1->co, co);	
-				BM_elem_flag_enable(v1, BM_ELEM_SELECT);
 			}
 			else {
 
@@ -3369,7 +3383,8 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 				}
 			}
 		}
-		else
+
+		if (vg->exceeded)
 		{
 			if (do_calc_delta && vg->deltas_set)
 			{
@@ -3439,7 +3454,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 	BM_mesh_elem_table_ensure(bm, BM_FACE | BM_VERT);
 	BM_mesh_elem_toolflags_ensure(bm);
 
-	BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+	//BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
 
 	//if (fmd->automerge_dist > 0)
 	{
@@ -3463,6 +3478,8 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 
 	if (fmd->face_pairs && fmd->autohide_dist > 0)
 	{
+		BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+
 		for (i = 0; i < totpoly; i++) {
 			find_other_face(fmd, i, bm, ob,  &faces, &del_faces);
 		}
@@ -3485,11 +3502,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 		{
 			BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "delete_keep_normals geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
 		}
+	}
 
-		if (del_faces == 0) {
-			/*fallback if you want to merge verts but use no filling method, whose faces could be hidden (and you dont have any selection then) */
-			BM_mesh_elem_hflag_enable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
-		}
+	if (del_faces == 0) {
+		/*fallback if you want to merge verts but use no filling method, whose faces could be hidden (and you dont have any selection then) */
+		BM_mesh_elem_hflag_enable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
 	}
 
 	if (fmd->automerge_dist > 0 && do_merge) {




More information about the Bf-blender-cvs mailing list