[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, ¢er_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, ¢er_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