[Bf-blender-cvs] [5caefc95a7e] fracture_modifier: refactor of automerge shared vertex handling function

Martin Felke noreply at git.blender.org
Wed Jun 14 20:55:38 CEST 2017


Commit: 5caefc95a7ee35c36f9f07489dbf6fdf155c4101
Author: Martin Felke
Date:   Wed Jun 14 20:55:26 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB5caefc95a7ee35c36f9f07489dbf6fdf155c4101

refactor of automerge shared vertex handling function

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

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 56d8cab8fe6..f2dbc402337 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3275,12 +3275,57 @@ static void clamp_delta(SharedVert *sv, FractureModifierData *fmd)
 	}
 }
 
+static void handle_vertex(FractureModifierData *fmd, BMesh* bm, SharedVert *sv, float co[3], float no[3],
+                          int cd_edge_crease_offset, bool allow_distort)
+{
+	bool do_calc_delta = fmd->keep_distort;
+	float dist = fmd->autohide_dist;
+	BMEdge *e = NULL;
+
+	BMVert *v = bm->vtable[sv->index];
+
+	if ((len_squared_v3v3(co, v->co) > (dist * dist)))
+	{
+		sv->moved = true;
+	}
+
+	if ((len_squared_v3v3(co, v->co) <= fmd->automerge_dist * fmd->automerge_dist))
+	{
+		if (!sv->exceeded)
+		{
+			copy_v3_v3(v->co, co);
+			copy_v3_v3(v->no, no);
+		}
+	}
+	else {
+		sv->exceeded = true;
+
+		if (!sv->deltas_set) {
+			sub_v3_v3v3(sv->delta, co, v->co);
+			clamp_delta(sv, fmd);
+			sv->deltas_set = true;
+		}
+	}
+
+	if (sv->exceeded)
+	{
+		BMIter iter;
+		if (do_calc_delta && sv->deltas_set && allow_distort)
+		{
+			calc_delta(sv, v);
+		}
+
+		BM_ITER_ELEM(e, &iter, v, BM_EDGES_OF_VERT)
+		{
+			BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
+		}
+	}
+}
+
 static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 {
 	SharedVert *sv;
 	SharedVertGroup *vg;
-	bool do_calc_delta = fmd->keep_distort;
-	float dist = fmd->autohide_dist;
 
 	int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
 	if (cd_edge_crease_offset == -1) {
@@ -3290,8 +3335,6 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 
 	for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
 		BMVert* v1, *v2;
-		BMIter iter;
-		BMEdge *e;
 		float co[3], no[3], inverse;
 		int verts = 0;
 
@@ -3303,28 +3346,9 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 		for (sv = vg->verts.first; sv; sv = sv->next)
 		{
 			v2 = bm->vtable[sv->index];
-			BMIter iter2;
-
-			if (!sv->exceeded) {
-				add_v3_v3(co, v2->co);
-				add_v3_v3(no, v2->no);
-				verts++;
-			}
-			else
-			{
-				if (do_calc_delta && sv->deltas_set)
-				{
-					calc_delta(sv, v2);
-				}
-			}
-
-			if (sv->exceeded)
-			{
-				BM_ITER_ELEM(e, &iter2, v2, BM_EDGES_OF_VERT)
-				{
-					BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
-				}
-			}
+			add_v3_v3(co, v2->co);
+			add_v3_v3(no, v2->no);
+			verts++;
 		}
 
 		inverse = 1.0f/(float)verts;
@@ -3332,65 +3356,16 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 		mul_v3_fl(no, inverse);
 		verts = 0;
 
-		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 (!vg->exceeded) {
-				copy_v3_v3(v1->co, co);
-				copy_v3_v3(v1->no, no);
-			}
-
-			if (do_calc_delta && vg->deltas_set)
-			{
-				calc_delta((SharedVert*)vg, v1);
-			}
-		}
-		else {
-			vg->exceeded = true;
-
-			if (!vg->deltas_set){
-				sub_v3_v3v3(vg->delta, co, v1->co);
-				clamp_delta((SharedVert*)vg, fmd);
-				vg->deltas_set = true;
-			}
-		}
-
-		if (vg->exceeded)
-		{
-			BM_ITER_ELEM(e, &iter, v1, BM_EDGES_OF_VERT)
-			{
-				BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
-			}
-		}
+		handle_vertex(fmd, bm, (SharedVert*)vg, co, no, cd_edge_crease_offset, true);
 
-		for (sv = vg->verts.first; sv; sv = sv->next)
+		if (!vg->exceeded)
 		{
-			v2 = bm->vtable[sv->index];
-
-			if ((len_squared_v3v3(co, v2->co) > (dist * dist)))
+			for (sv = vg->verts.first; sv; sv = sv->next)
 			{
-				sv->moved = true;
-			}
-
-			if (len_squared_v3v3(co, v2->co) <= fmd->automerge_dist * fmd->automerge_dist)
-			{
-				if (!sv->exceeded)
-				{
-					copy_v3_v3(v2->co, co);
-					copy_v3_v3(v2->no, no);
-				}
-			}
-			else {
-				sv->exceeded = true;
-
-				if (!sv->deltas_set){
-					sub_v3_v3v3(sv->delta, co, v2->co);
-					clamp_delta(sv, fmd);
-					sv->deltas_set = true;
+				handle_vertex(fmd, bm, sv, co, no, cd_edge_crease_offset, true);
+				if (sv->exceeded) {
+					vg->exceeded = true;
+					break;
 				}
 			}
 		}




More information about the Bf-blender-cvs mailing list