Commit: 85e280bc434f394652bfe87e7a0bf4dbb42cd95a
Author: Sebastian Witt
Date:   Wed Jul 19 12:24:56 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB85e280bc434f394652bfe87e7a0bf4dbb42cd95a

Added orientation calculation. Normals are now flipped correctly.

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

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 4e76b4b05f3..f85494e189b 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5835,7 +5835,7 @@ static int cmpfunc (const void * a, const void * b)
 }
 
 /* Generate the Tube shape for branches with two ends. */
-static void fill_tube(Mesh *me, float *left, float *right, int totl, int totr, 
int u_steps, float z_vec[3], int v_steps, int w_steps, float smoothness, int 
*r_edge_loop_ends)
+static void fill_tube(Mesh *me, float *left, float *right, int totl, int totr, 
int u_steps, float z_vec[3], int v_steps, int w_steps, float smoothness, int 
*r_edge_loop_ends, bool n_g_flip)
 {
        float step_l = left[totl * 4 - 1] / (float)u_steps;
        float step_r = right[totr * 4 - 1] / (float)u_steps;
@@ -5889,7 +5889,7 @@ static void fill_tube(Mesh *me, float *left, float 
*right, int totl, int totr, i
                /* v1 left, v2 right, v3 center bottom, v4 center top */
                calc_vert_half(me, v1, v2, v3, v4, v_steps, w_steps, 
smoothness);
        }
-       generate_mesh_grid_f_e(me, u_steps, v_steps * 2 + w_steps, v_start, 
false);
+       generate_mesh_grid_f_e(me, u_steps, v_steps * 2 + w_steps, v_start, 
n_g_flip);
        r_edge_loop_ends[0] = e_start;
        r_edge_loop_ends[1] = 2;
        r_edge_loop_ends[2] = me->totedge - v_steps * 2 - w_steps + 1;
@@ -5917,7 +5917,7 @@ static int get_cyclic_offset(SpineBranch *branch)
 }
 
 /* Generate the Cap for branches with one ends. */
-static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, 
float z_vec[3], float depth, int v_steps, int w_steps, float smoothness)
+static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, Mesh *me, 
float z_vec[3], float depth, int v_steps, int w_steps, float smoothness, bool 
n_g_flip)
 {
        float *cap_p = NULL;
        float v1[3], m_center[3], m_center_up[3], left_ref[3], right_ref[3];
@@ -5997,7 +5997,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
 
                if (totl >= 1 && totr >= 1) {
                        u_steps = fmax(2.0f, fmax(left[totl * 4 - 1], 
right[totr * 4 - 1]) / (float)(2 * depth / v_steps));
-                       fill_tube(me, left, right, totl, totr, u_steps, z_vec, 
v_steps, w_steps, smoothness, e_start_tube);
+                       fill_tube(me, left, right, totl, totr, u_steps, z_vec, 
v_steps, w_steps, smoothness, e_start_tube, n_g_flip);
                        copy_v3_v3(left_ref, &left[totl * 4 - 4]);
                        copy_v3_v3(right_ref, &right[0]);
                        cap_length = totlength - left[totl * 4 - 1] - 
right[totr * 4 - 1];
@@ -6071,7 +6071,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
                cap_pos += step_size;
        }
        e_cap_start_b = me->totedge;
-       generate_mesh_grid_f_e(me, w_steps, v_steps, v_start, false);
+       generate_mesh_grid_f_e(me, w_steps, v_steps, v_start, n_g_flip);
        e_cap_start_c = me->totedge;
 
        bridge_loops(me,
@@ -6081,7 +6081,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
                                 false,
                                 1,
                                 2,
-                                true);
+                                !n_g_flip);
 
        e_corner_a = me->totedge - 1;
 
@@ -6092,7 +6092,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
                                 false,
                                 1,
                                 2 * v_steps - 1,
-                                true);
+                                !n_g_flip);
 
        e_corner_b = me->totedge - 1;
 
@@ -6103,7 +6103,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
                                 true,
                                 1,
                                 1,
-                                true);
+                                !n_g_flip);
 
        ED_mesh_loops_add(me, NULL, 6);
        ED_mesh_polys_add(me, NULL, 2);
@@ -6111,11 +6111,11 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
        me->mloop[me->totloop - 6].v = me->medge[e_cap_start_a + v_steps - 
1].v1;
        me->mloop[me->totloop - 6].e = e_cap_start_a + v_steps - 1;
 
-       me->mloop[me->totloop - 4].v = me->medge[e_corner_a + 1].v1;
-       me->mloop[me->totloop - 4].e = e_corner_a + 1;
+       me->mloop[me->totloop - (n_g_flip ? 5 : 4)].v = me->medge[e_corner_a + 
1].v1;
+       me->mloop[me->totloop - (n_g_flip ? 5 : 4)].e = e_corner_a + 1;
 
-       me->mloop[me->totloop - 5].v = me->medge[e_corner_a].v2;
-       me->mloop[me->totloop - 5].e = e_corner_a;
+       me->mloop[me->totloop - (n_g_flip ? 4 : 5)].v = 
me->medge[e_corner_a].v2;
+       me->mloop[me->totloop - (n_g_flip ? 4 : 5)].e = e_corner_a;
 
        me->mpoly[me->totpoly - 2].loopstart = me->totloop - 6;
        me->mpoly[me->totpoly - 2].totloop = 3;
@@ -6127,11 +6127,11 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
        me->mloop[me->totloop - 3].v = me->medge[e_cap_start_a + v_steps + 
w_steps - 1].v1;
        me->mloop[me->totloop - 3].e = e_cap_start_a + v_steps + w_steps - 1;
 
-       me->mloop[me->totloop - 1].v = me->medge[e_corner_b + 1].v1;
-       me->mloop[me->totloop - 1].e = e_corner_b + 1;
+       me->mloop[me->totloop - (n_g_flip ? 2 : 1)].v = me->medge[e_corner_b + 
1].v1;
+       me->mloop[me->totloop - (n_g_flip ? 2 : 1)].e = e_corner_b + 1;
 
-       me->mloop[me->totloop - 2].v = me->medge[e_corner_b].v2;
-       me->mloop[me->totloop - 2].e = e_corner_b;
+       me->mloop[me->totloop - (n_g_flip ? 1 : 2)].v = 
me->medge[e_corner_b].v2;
+       me->mloop[me->totloop - (n_g_flip ? 1 : 2)].e = e_corner_b;
 
        me->mpoly[me->totpoly - 1].loopstart = me->totloop - 3;
        me->mpoly[me->totpoly - 1].totloop = 3;
@@ -6150,7 +6150,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch 
*branch, Mesh *me, float
                                         false,
                                         1,
                                         1,
-                                        false);
+                                        n_g_flip);
                branch->e_start_arr[0] = e_start_tube[0];
                branch->e_start_arr[1] = e_start_tube[1];
        }
@@ -6179,7 +6179,7 @@ static int calc_branch_orientation(Spine *spine, 
SpineBranch *branch, float poin
 }
 
 /* Generate a T-Intersection for branches with three ends. */
-static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch 
*branch, Mesh *me, float z_vec[3], float depth, int v_steps, int w_steps, float 
smoothness)
+static void add_ss_tinter(SilhouetteData *sil, Spine *spine, SpineBranch 
*branch, Mesh *me, float z_vec[3], float depth, int v_steps, int w_steps, float 
smoothness, bool n_g_flip)
 {
        float *sa = NULL;
        int b_start[3] = {0,0,0}, b_tot[3] = {0,0,0};
@@ -6365,7 +6365,7 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
                me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].flag = 
0;
 
                e_start_inner[s] = me->totedge;
-               generate_mesh_grid_f_e(me, u_steps - 2, v_steps + w_steps / 2, 
v_start, false);
+               generate_mesh_grid_f_e(me, u_steps - 2, v_steps + w_steps / 2, 
v_start, n_g_flip);
        }
 
        for(int s = 0; s < 3; s++){
@@ -6377,7 +6377,7 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
                                         false,
                                         2,
                                         1,
-                                        false);
+                                        n_g_flip);
 
                e_end_a = me->totedge;
                bridge_loops(me,
@@ -6387,12 +6387,12 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
                                         true,
                                         1,
                                         1,
-                                        true);
+                                        !n_g_flip);
                e_end_b = me->totedge;
 
                int e_side_a, e_side_b;
-               e_side_a = add_quad(me, e_start[s] + v_steps + w_steps / 2, 
e_start_center + s * (u_steps / 2), e_end_b - 1, true);
-               e_side_b = add_quad(me, e_start[s] + v_steps + w_steps / 2 - 1, 
e_end_a - 1, e_start_center + s * (u_steps / 2), true);
+               e_side_a = add_quad(me, e_start[s] + v_steps + w_steps / 2, 
e_start_center + s * (u_steps / 2), e_end_b - 1, !n_g_flip);
+               e_side_b = add_quad(me, e_start[s] + v_steps + w_steps / 2 - 1, 
e_end_a - 1, e_start_center + s * (u_steps / 2), !n_g_flip);
                stride_le = (2 * (v_steps + w_steps / 2) - 1);
 
                for (int u = 1; u < u_steps / 2 - 1; u++) {
@@ -6400,19 +6400,19 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
                                                                e_side_b,
                                                                
e_start_inner[s] - 1 + stride_le * u,
                                                                e_start_center 
+ s * (u_steps / 2) + u,
-                                                               true);
+                                                               !n_g_flip);
                        e_side_a = add_quad(me,
                                                                e_side_a,
                                                                
e_start_inner[(s + 2) % 3] - 1 + stride_le * (u_steps - 2 - u),
                                                                e_start_center 
+ s * (u_steps / 2) + u,
-                                                               false);
+                                                               n_g_flip);
                }
 
                e_t_sign[s * 2] = add_quad(me,
                                 e_side_b,
                                 e_start_inner[s] - 1 + stride_le * ((u_steps / 
2) - 1),
                                 e_start_center + s * (u_steps / 2) + u_steps / 
2 - 1,
-                                true);
+                                !n_g_flip);
 
                e_t_sign[s * 2 + 1] = e_side_a;
        }
@@ -6422,14 +6422,14 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
                me->mloop[me->totloop - 4].v = me->medge[e_t_sign[(s + 2) % 3 * 
2]].v1;
                me->mloop[me->totloop - 4].e = e_t_sign[(s + 2) % 3 * 2];
 
-               me->mloop[me->totloop - 1].v = me->medge[e_start_center + s * 
(u_steps / 2) + u_steps / 2 - 1].v1;
-               me->mloop[me->totloop - 1].e = e_start_center + s * (u_steps / 
2) + u_steps / 2 - 1;
+               me->mloop[me->totloop - (n_g_flip ? 3 : 1)].v = 
me->medge[e_start_center + s * (u_steps / 2) + u_steps / 2 - 1].v1;
+               me->mloop[me->totloop - (n_g_flip ? 3 : 1)].e = e_start_center 
+ s * (u_steps / 2) + u_steps / 2 - 1;
 
                me->mloop[me->totloop - 2].v = me->medge[e_start_inner[(s + 2) 
% 3] - 1 + stride_le * ((u_steps / 2))].v2;
                me->mloop[me->totloop - 2].e = e_t_sign[s * 2 + 1];
 
-               me->mloop[me->totloop - 3].v = me->medge[e_start_inner[(s + 2) 
% 3] - 1 + stride_le * ((u_steps / 2))].v1;
-               me->mloop[me->totloop - 3].e = e_start_inner[(s + 2) % 3] - 1 + 
stride_le * ((u_steps / 2));
+               me->mloop[me->totloop - (n_g_flip ? 1 : 3)].v = 
me->medge[e_start_inner[(s + 2) % 3] - 1 + stride_le * ((u_steps / 2))].v1;
+               me->mloop[me->totloop - (n_g_flip ? 1 : 3)].e = 
e_start_inner[(s + 2) % 3] - 1 + stride_le * ((u_steps / 2));
 
                ED_mesh_polys_add(me, NULL, 1);
                me->mpoly[me->totpoly - 1].loopstart = me->totloop - 4;
@@ -6442,7 +6442,7 @@ static void add_ss_tinter(SilhouetteData *sil, Spine 
*spine, SpineBranch *branch
        BLI_array_free(sa);
 }
 
-static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, 
float z_vec[3], float depth, int v_steps, int w_steps, float w_fact)
+static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, 
float z_vec[3], float depth, int v_steps, int w_steps, float w_fact, bool 
n_g_flip)
 {
        /* x y z l (accumulative length)*/
        float *left = NULL, *right = NULL;
@@ -6513,7 +6513,7 @@ static void add_ss_tube(SilhouetteData *sil, SpineBranch 
*branch, M

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to