[Bf-blender-cvs] [7c2213c00af] soc-2017-sculpting_improvements: Front and backside of the silhouette are now connected.

Sebastian Witt noreply at git.blender.org
Wed Jul 26 13:09:34 CEST 2017


Commit: 7c2213c00af09517069fd86b9aed68e2709988e2
Author: Sebastian Witt
Date:   Wed Jul 26 13:08:10 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB7c2213c00af09517069fd86b9aed68e2709988e2

Front and backside of the silhouette are now connected.

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

M	source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index b6b45b68c10..f806516c157 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5194,6 +5194,7 @@ typedef struct SpineBranch{
 	BranchState flag;
 	int *e_start_arr;		/* Edges on the ends are stored (used primarly for bridging) */
 	int fs_bs_offset;		/* Frontside edge offset to backside*/
+	int *e_flip_side_ends;	/* Front and backside connecting edges of each part*/
 }SpineBranch;
 
 /* Main Tree Container */
@@ -5294,6 +5295,7 @@ static void free_spine_branch(SpineBranch *branch)
 	}
 	if (branch->flag & BRANCH_EDGE_GEN) {
 		MEM_freeN(branch->e_start_arr);
+		MEM_freeN(branch->e_flip_side_ends);
 	}
 	MEM_freeN(branch);
 }
@@ -5833,6 +5835,52 @@ static int add_quad(Mesh *me, int edge_b, int edge_a, int edge_c, bool flip)
 	return e_start;
 }
 
+static void add_face(Mesh *me, int e1, int e2, int e3, int e4, int l_start, int p_start, bool flip){
+	int comp_v1;
+
+	if (me->medge[e1].v1 == me->medge[e2].v1 || me->medge[e1].v1 == me->medge[e2].v2) {
+		comp_v1 = me->medge[e1].v1;
+		me->mloop[l_start].v = me->medge[e1].v2;
+		me->mloop[l_start].e = e1;
+	} else {
+		comp_v1 = me->medge[e1].v2;
+		me->mloop[l_start].v = me->medge[e1].v1;
+		me->mloop[l_start].e = e1;
+	}
+	if (me->medge[e2].v1 == comp_v1) {
+		me->mloop[l_start + (flip ? 3 : 1)].v = me->medge[e2].v1;
+		comp_v1 = me->medge[e2].v2;
+	} else {
+		me->mloop[l_start + (flip ? 3 : 1)].v = me->medge[e2].v2;
+		comp_v1 = me->medge[e2].v1;
+	}
+	me->mloop[l_start + (flip ? 3 : 1)].e = e2;
+
+	if (me->medge[e3].v1 == comp_v1) {
+		me->mloop[l_start + 2].v = me->medge[e3].v1;
+		comp_v1 = me->medge[e3].v2;
+	} else {
+		me->mloop[l_start + 2].v = me->medge[e3].v2;
+		comp_v1 = me->medge[e3].v1;
+	}
+	me->mloop[l_start + 2].e = e3;
+
+	if (me->medge[e4].v1 == comp_v1) {
+		me->mloop[l_start + (flip ? 1 : 3)].v = me->medge[e4].v1;
+		comp_v1 = me->medge[e4].v2;
+	} else {
+		me->mloop[l_start + (flip ? 1 : 3)].v = me->medge[e4].v2;
+		comp_v1 = me->medge[e4].v1;
+	}
+	me->mloop[l_start + (flip ? 1 : 3)].e = e4;
+
+	me->mpoly[p_start].totloop = 4;
+	me->mpoly[p_start].loopstart = l_start;
+	me->mpoly[p_start].mat_nr = 0;
+	me->mpoly[p_start].flag = 0;
+	me->mpoly[p_start].pad = 0;
+}
+
 /* TODO: is there a sort function already?*/
 static int cmpfunc (const void * a, const void * b)
 {
@@ -5939,7 +5987,8 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 	int e_cap_start_a, e_cap_start_b, e_cap_start_c;
 	int e_corner_a, e_corner_b;
 	int cap_end_flip_e_start, cap_end_flip_start_a_l, cap_end_flip_start_b_l;
-	int cap_end_flip_start_a_r, cap_end_flip_start_b_r;
+	int cap_end_flip_start_a_r, cap_end_flip_start_b_r, e_cap_tube_start, e_cap_tube_end;
+	int e_flip_tube_end[2];
 	BLI_array_declare(cap_p);
 
 	if (!flip_side) {
@@ -5964,7 +6013,8 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 	}
 
 	if (!(branch->flag & BRANCH_EDGE_GEN)) {
-		branch->e_start_arr = MEM_callocN(sizeof(int) * 4,"edge startposition array");
+		branch->e_start_arr = MEM_callocN(sizeof(int) * 4, "edge startposition array");
+		branch->e_flip_side_ends = MEM_callocN(sizeof(int) * 2, "fs bs edges");
 		branch->flag |= BRANCH_EDGE_GEN;
 	}
 
@@ -6024,6 +6074,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 			cap_length = totlength - left[totl * 4 - 1] - right[totr * 4 - 1];
 
 			if (flip_side) {
+				branch->e_flip_side_ends[0] = me->totedge;
 				bridge_loops(me,
 							 e_flip_start + 1,
 							 e_flip_start - branch->fs_bs_offset + 1,
@@ -6032,7 +6083,8 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 							 ((v_steps - 1) * 2 + w_steps) * 2 - 1,
 							 (v_steps * 2 + w_steps) * 2 - 1,
 							 !n_g_flip);
-
+				branch->e_flip_side_ends[1] = me->totedge;
+				e_flip_tube_end[0] = me->totedge - 1;
 				bridge_loops(me,
 							 e_flip_start + ((v_steps - 1) * 2 + w_steps) * 2 - 2,
 							 e_flip_start - branch->fs_bs_offset + (v_steps * 2 + w_steps) * 2 - 2,
@@ -6041,6 +6093,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 							 ((v_steps - 1) * 2 + w_steps) * 2 - 1,
 							 (v_steps * 2 + w_steps) * 2 - 1,
 							 n_g_flip);
+				e_flip_tube_end[1] = me->totedge - 1;
 				e_flip_offset += u_steps * 2 - 2;
 			}
 		}
@@ -6208,6 +6261,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 		branch->e_start_arr[flip_side ? 2 : 0] = e_cap_start_a;
 		branch->e_start_arr[flip_side ? 3 : 1] = 1;
 	} else {
+		e_cap_tube_start = me->totedge;
 		bridge_loops(me,
 					 e_cap_start_a,
 					 e_start_tube[flip_side ? 6 : 2],
@@ -6216,6 +6270,8 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 					 1,
 					 1,
 					 n_g_flip);
+		e_cap_tube_end = me->totedge - 1;
+		e_flip_offset += 2;
 		branch->e_start_arr[flip_side ? 2 : 0] = e_start_tube[flip_side ? 4 : 0];
 		branch->e_start_arr[flip_side ? 3 : 1] = e_start_tube[flip_side ? 5 : 1];
 	}
@@ -6225,6 +6281,30 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float
 	} else {
 		add_quad(me, cap_end_flip_e_start, cap_end_flip_start_a_l, cap_end_flip_start_b_l, !n_g_flip);
 		add_quad(me, cap_end_flip_e_start + w_steps - 1, cap_end_flip_start_a_r, cap_end_flip_start_b_r, n_g_flip);
+		if (totlength <= step_size * w_steps || totl == 0 || totr == 0) {
+			branch->e_flip_side_ends[0] = me->totedge - 2;
+			branch->e_flip_side_ends[1] = me->totedge - 1;
+		} else {
+			ED_mesh_loops_add(me, NULL, 8);
+			ED_mesh_polys_add(me, NULL, 2);
+			add_face(me,
+					 e_flip_tube_end[0],
+					 e_cap_tube_start - branch->fs_bs_offset + e_flip_offset,
+					 me->totedge - 2,
+					 e_cap_tube_start,
+					 me->totloop - 8,
+					 me->totpoly - 2,
+					 n_g_flip);
+
+			add_face(me,
+					 e_flip_tube_end[1],
+					 e_cap_tube_end - branch->fs_bs_offset + e_flip_offset + 2,
+					 me->totedge - 1,
+					 e_cap_tube_end,
+					 me->totloop - 4,
+					 me->totpoly - 1,
+					 !n_g_flip);
+		}
 	}
 
 	BLI_array_free(cap_p);
@@ -6265,7 +6345,7 @@ static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch *branch
 	int v_start, v_start_center;
 	int e_start[3], e_start_center, e_start_inner[3], e_t_sign[6];
 	int stride_le;
-	int ori;
+	int ori[3];
 	int e_flip_offset = 0;	/* carry edgecount difference in both sides to refrence opposing edges by subtracting totedge - flip offset. Only valid if flip_side = true*/
 	int e_flip_start[3];
 	int e_flip_q_l[3], e_flip_q_r[3];
@@ -6337,6 +6417,7 @@ static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch *branch
 
 	if (!(branch->flag & BRANCH_EDGE_GEN)) {
 		branch->e_start_arr = MEM_callocN(sizeof(int) * 12,"edge startposition array");
+		branch->e_flip_side_ends = MEM_callocN(sizeof(int) * 6, "fs bs edges");
 		branch->flag |= BRANCH_EDGE_GEN;
 	}
 
@@ -6352,9 +6433,9 @@ static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch *branch
 
 		v_start = me->totvert;
 
-		ori = calc_branch_orientation(spine, branch, &center_s[s * 3], s);
-		branch->e_start_arr[(flip_side ? 6 : 0) + ori * 2] = me->totedge;
-		branch->e_start_arr[(flip_side ? 6 : 0) + ori * 2 + 1] = 1;
+		ori[s] = calc_branch_orientation(spine, branch, &center_s[s * 3], s);
+		branch->e_start_arr[(flip_side ? 6 : 0) + ori[s] * 2] = me->totedge;
+		branch->e_start_arr[(flip_side ? 6 : 0) + ori[s] * 2 + 1] = 1;
 
 		calc_vert_half(me,
 					   &sa[b_start[s]],
@@ -6527,11 +6608,13 @@ static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch *branch
 		e_t_sign[s * 2 + 1] = e_side_a;
 
 		if (flip_side) {
+			branch->e_flip_side_ends[ori[s] * 2] = me->totedge;
 			add_quad(me,
 					 e_flip_q_l[0],
 					 e_flip_q_l[1],
 					 e_flip_q_l[2],
 					 !n_g_flip);
+			branch->e_flip_side_ends[ori[s] * 2 + 1] = me->totedge;
 			add_quad(me,
 					 e_flip_q_r[0],
 					 e_flip_q_r[1],
@@ -6642,6 +6725,7 @@ static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, floa
 
 	if (!(branch->flag & BRANCH_EDGE_GEN)) {
 		branch->e_start_arr = MEM_callocN(sizeof(int) * 8, "edge startposition array");
+		branch->e_flip_side_ends = MEM_callocN(sizeof(int) * 4, "fs bs edges");
 		branch->flag |= BRANCH_EDGE_GEN;
 	}
 
@@ -6650,6 +6734,7 @@ static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, floa
 	fill_tube(me, left, right, totl, totr, u_steps, z_vec, v_steps, w_steps, w_fact, branch->e_start_arr, n_g_flip, flip_side);
 
 	if (flip_side) {
+		branch->e_flip_side_ends[0] = me->totedge;
 		bridge_loops(me,
 					 e_start + 1,
 					 e_start - branch->fs_bs_offset + 1,
@@ -6658,7 +6743,8 @@ static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, floa
 					 ((v_steps - 1) * 2 + w_steps) * 2 - 1,
 					 (v_steps * 2 + w_steps) * 2 - 1,
 					 !n_g_flip);
-
+		branch->e_flip_side_ends[1] = me->totedge;
+		branch->e_flip_side_ends[2] = me->totedge - 1;
 		bridge_loops(me,
 					 e_start + ((v_steps - 1) * 2 + w_steps) * 2 - 2,
 					 e_start - branch->fs_bs_offset + (v_steps * 2 + w_steps) * 2 - 2,
@@ -6667,6 +6753,7 @@ static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, floa
 					 ((v_steps - 1) * 2 + w_steps) * 2 - 1,
 					 (v_steps * 2 + w_steps) * 2 - 1,
 					 n_g_flip);
+		branch->e_flip_side_ends[3] = me->totedge - 1;
 	} else {
 		branch->fs_bs_offset = me->totedge - branch->fs_bs_offset;
 	}
@@ -6688,20 +6775,16 @@ static int r_branch_count(Spine *spine, SpineBranch *b)
 }
 
 /* TODO: T-Intersections are sometimes misordered! Connects the different Branches if they have the BRANCH_EDGE_GEN flag set. */
-static void bridge_all_parts_rec(Mesh *me, Spine *spine, SpineBranch *active_branch, SpineBranch *prev_branch, int verts_per_loop, bool n_g_flip, bool flip_side)
+static void bridge_all_parts_rec(Mesh *me, Spine *spine, SpineBranch *active_branch, SpineBranch *prev_branch, int verts_per_loop, bool n_g_flip)
 {
-	int b_fork_off, a_fork_off;
+	int b_fork_off, a_fork_off, a_fork_off_inv, b_fork_off_inv, comp_e_start

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list