Commit: 2cffd6649b0e9b646bc090e4bba90e9873fb2982
Author: Campbell Barton
Date:   Tue Jul 14 22:09:14 2015 +1000
Branches: master
https://developer.blender.org/rB2cffd6649b0e9b646bc090e4bba90e9873fb2982

Match face tessellation order in edimode

add a negated version of axis_dominant_v3_to_m3

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

M       source/blender/blenkernel/intern/mesh_evaluate.c
M       source/blender/blenlib/BLI_math_geom.h
M       source/blender/blenlib/intern/math_geom.c
M       source/blender/bmesh/intern/bmesh_polygon.c

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

diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c 
b/source/blender/blenkernel/intern/mesh_evaluate.c
index 00a8272..40a299e 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -2420,7 +2420,7 @@ int BKE_mesh_recalc_tessellation(
                        co_prev = mvert[ml[mp_totloop - 1].v].co;
                        for (j = 0; j < mp_totloop; j++, ml++) {
                                co_curr = mvert[ml->v].co;
-                               add_newell_cross_v3_v3v3(normal, co_curr, 
co_prev);
+                               add_newell_cross_v3_v3v3(normal, co_prev, 
co_curr);
                                co_prev = co_curr;
                        }
                        if (UNLIKELY(normalize_v3(normal) == 0.0f)) {
@@ -2428,7 +2428,7 @@ int BKE_mesh_recalc_tessellation(
                        }
 
                        /* project verts to 2d */
-                       axis_dominant_v3_to_m3(axis_mat, normal);
+                       axis_dominant_v3_to_m3_negate(axis_mat, normal);
 
                        ml = mloop + mp_loopstart;
                        for (j = 0; j < mp_totloop; j++, ml++) {
diff --git a/source/blender/blenlib/BLI_math_geom.h 
b/source/blender/blenlib/BLI_math_geom.h
index 2c91aca..359e2a9 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -351,6 +351,7 @@ bool form_factor_visible_quad(const float p[3], const float 
n[3],
 float form_factor_hemi_poly(float p[3], float n[3],
                             float v1[3], float v2[3], float v3[3], float 
v4[3]);
 
+void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3]);
 void  axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]);
 
 MINLINE void  axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float 
axis[3]);
diff --git a/source/blender/blenlib/intern/math_geom.c 
b/source/blender/blenlib/intern/math_geom.c
index 7329a11..f40f1cc 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -2402,6 +2402,25 @@ void axis_dominant_v3_to_m3(float r_mat[3][3], const 
float normal[3])
        BLI_assert((fabsf(dot_m3_v3_row_z(r_mat, normal) - 1.0f) < 
BLI_ASSERT_UNIT_EPSILON) || is_zero_v3(normal));
 }
 
+/**
+ * Same as axis_dominant_v3_to_m3, but flips the normal
+ */
+void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3])
+{
+       BLI_ASSERT_UNIT_V3(normal);
+
+       negate_v3_v3(r_mat[2], normal);
+       ortho_basis_v3v3_v3(r_mat[0], r_mat[1], r_mat[2]);
+
+       BLI_ASSERT_UNIT_V3(r_mat[0]);
+       BLI_ASSERT_UNIT_V3(r_mat[1]);
+
+       transpose_m3(r_mat);
+
+       BLI_assert(!is_negative_m3(r_mat));
+       BLI_assert((dot_m3_v3_row_z(r_mat, normal) < BLI_ASSERT_UNIT_EPSILON) 
|| is_zero_v3(normal));
+}
+
 /****************************** Interpolation ********************************/
 
 static float tri_signed_area(const float v1[3], const float v2[3], const float 
v3[3], const int i, const int j)
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c 
b/source/blender/bmesh/intern/bmesh_polygon.c
index d2d31d6..1318ad0 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -856,14 +856,14 @@ void BM_face_triangulate(
                const int last_tri = f->len - 3;
                int i;
 
-               axis_dominant_v3_to_m3(axis_mat, f->no);
+               axis_dominant_v3_to_m3_negate(axis_mat, f->no);
 
                for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f); i < f->len; i++, 
l_iter = l_iter->next) {
                        loops[i] = l_iter;
                        mul_v2_m3v3(projverts[i], axis_mat, l_iter->v->co);
                }
 
-               BLI_polyfill_calc_arena((const float (*)[2])projverts, f->len, 
-1, tris,
+               BLI_polyfill_calc_arena((const float (*)[2])projverts, f->len, 
1, tris,
                                        pf_arena);
 
                if (use_beauty) {
@@ -1259,7 +1259,7 @@ void BM_bmesh_calc_tessellation(BMesh *bm, BMLoop 
*(*looptris)[3], int *r_looptr
                        l_arr = BLI_memarena_alloc(arena, sizeof(*l_arr) * 
efa->len);
                        projverts = BLI_memarena_alloc(arena, 
sizeof(*projverts) * efa->len);
 
-                       axis_dominant_v3_to_m3(axis_mat, efa->no);
+                       axis_dominant_v3_to_m3_negate(axis_mat, efa->no);
 
                        j = 0;
                        l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
@@ -1269,15 +1269,15 @@ void BM_bmesh_calc_tessellation(BMesh *bm, BMLoop 
*(*looptris)[3], int *r_looptr
                                j++;
                        } while ((l_iter = l_iter->next) != l_first);
 
-                       BLI_polyfill_calc_arena((const float (*)[2])projverts, 
efa->len, -1, tris, arena);
+                       BLI_polyfill_calc_arena((const float (*)[2])projverts, 
efa->len, 1, tris, arena);
 
                        for (j = 0; j < totfilltri; j++) {
                                BMLoop **l_ptr = looptris[i++];
                                unsigned int *tri = tris[j];
 
-                               l_ptr[0] = l_arr[tri[2]];
+                               l_ptr[0] = l_arr[tri[0]];
                                l_ptr[1] = l_arr[tri[1]];
-                               l_ptr[2] = l_arr[tri[0]];
+                               l_ptr[2] = l_arr[tri[2]];
                        }
 
                        BLI_memarena_clear(arena);

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

Reply via email to