Polyfill2d: avoid calculating polygon winding (its known in all cases)
authorCampbell Barton <ideasman42@gmail.com>
Fri, 13 Jun 2014 21:22:39 +0000 (07:22 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 13 Jun 2014 22:21:52 +0000 (08:21 +1000)
source/blender/blenkernel/intern/mesh_evaluate.c
source/blender/blenlib/BLI_polyfill2d.h
source/blender/blenlib/intern/polyfill2d.c
source/blender/bmesh/intern/bmesh_polygon.c

index 018cf85f9c60c42a34a4cad62cb8cb9d118ad194..cb0386b120378ffcb9a6c049fe64c9a267dc4f7a 100644 (file)
@@ -1411,7 +1411,7 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata, CustomData *ldata, CustomDat
                                mul_v2_m3v3(projverts[j], axis_mat, mvert[ml->v].co);
                        }
 
-                       BLI_polyfill_calc_arena((const float (*)[2])projverts, mp_totloop, tris, arena);
+                       BLI_polyfill_calc_arena((const float (*)[2])projverts, mp_totloop, -1, tris, arena);
 
                        /* apply fill */
                        for (j = 0; j < totfilltri; j++) {
index bdc9c105d05e20a060cd6bf8a14741e5594b3303..5c5cea8f67d3825034beb959c706ca867a1d4e9c 100644 (file)
@@ -26,6 +26,7 @@ struct MemArena;
 void BLI_polyfill_calc_arena(
         const float (*coords)[2],
         const unsigned int coords_tot,
+        const int coords_sign,
         unsigned int (*r_tris)[3],
 
         struct MemArena *arena);
@@ -33,6 +34,7 @@ void BLI_polyfill_calc_arena(
 void BLI_polyfill_calc(
         const float (*coords)[2],
         const unsigned int coords_tot,
+        const int coords_sign,
         unsigned int (*r_tris)[3]);
 
 #endif  /* __BLI_POLYFILL2D_H__ */
index f7aaca6a0f3c1b025e26b407c540fb4687dfb8c0..1c0b936a881abddab0b502e00d1fc3a57a9d99e2 100644 (file)
@@ -423,6 +423,7 @@ static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip)
 static void polyfill_calc_ex(
         const float (*coords)[2],
         const unsigned int coords_tot,
+        int coords_sign,
         unsigned int (*r_tris)[3],
 
         PolyIndex *r_indices)
@@ -444,9 +445,22 @@ static void polyfill_calc_ex(
        pf.tris = r_tris;
        pf.tris_tot = 0;
 
-       if ((coords_tot < 3) ||
-           cross_poly_v2(coords, coords_tot) > 0.0f)
-       {
+       if (coords_sign == 0) {
+               coords_sign = (cross_poly_v2(coords, coords_tot) >= 0.0f) ? 1 : -1;
+       }
+       else {
+               /* chech we're passing in correcty args */
+#ifndef NDEBUG
+               if (coords_sign == 1) {
+                       BLI_assert(cross_poly_v2(coords, coords_tot) >= 0.0f);
+               }
+               else {
+                       BLI_assert(cross_poly_v2(coords, coords_tot) <= 0.0f);
+               }
+#endif
+       }
+
+       if (coords_sign == 1) {
                for (i = 0; i < coords_tot; i++) {
                        indices[i].next = &indices[i + 1];
                        indices[i].prev = &indices[i - 1];
@@ -481,6 +495,7 @@ static void polyfill_calc_ex(
 void BLI_polyfill_calc_arena(
         const float (*coords)[2],
         const unsigned int coords_tot,
+        const int coords_sign,
         unsigned int (*r_tris)[3],
 
         struct MemArena *arena)
@@ -492,7 +507,7 @@ void BLI_polyfill_calc_arena(
 #endif
 
        polyfill_calc_ex(
-               coords, coords_tot,
+               coords, coords_tot, coords_sign,
                r_tris,
                /* cache */
 
@@ -509,6 +524,7 @@ void BLI_polyfill_calc_arena(
 void BLI_polyfill_calc(
         const float (*coords)[2],
         const unsigned int coords_tot,
+        const int coords_sign,
         unsigned int (*r_tris)[3])
 {
        PolyIndex *indices = BLI_array_alloca(indices, coords_tot);
@@ -518,7 +534,7 @@ void BLI_polyfill_calc(
 #endif
 
        polyfill_calc_ex(
-               coords, coords_tot,
+               coords, coords_tot, coords_sign,
                r_tris,
                /* cache */
 
index 4065ba33ee1667479ab04089277f512574250262..307c391a406a81a0a3f11d84097930ba58a42514 100644 (file)
@@ -191,7 +191,7 @@ void BM_face_calc_tessellation(const BMFace *f, BMLoop **r_loops, unsigned int (
                } while ((l_iter = l_iter->next) != l_first);
 
                /* complete the loop */
-               BLI_polyfill_calc((const float (*)[2])projverts, f->len, r_index);
+               BLI_polyfill_calc((const float (*)[2])projverts, f->len, -1, r_index);
        }
 }
 
@@ -833,7 +833,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f,
                        mul_v2_m3v3(projverts[i], axis_mat, l_iter->v->co);
                }
 
-               BLI_polyfill_calc_arena((const float (*)[2])projverts, f->len, tris,
+               BLI_polyfill_calc_arena((const float (*)[2])projverts, f->len, -1, tris,
                                        sf_arena);
 
                if (use_beauty) {
@@ -1303,7 +1303,7 @@ 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, 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++];