[Bf-blender-cvs] [19b1da2] master: Polyfill2d: avoid calculating polygon winding (its known in all cases)

Campbell Barton noreply at git.blender.org
Sat Jun 14 00:33:29 CEST 2014


Commit: 19b1da2b7b73c227807e4fc343efd88914a624cf
Author: Campbell Barton
Date:   Sat Jun 14 07:22:39 2014 +1000
https://developer.blender.org/rB19b1da2b7b73c227807e4fc343efd88914a624cf

Polyfill2d: avoid calculating polygon winding (its known in all cases)

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

M	source/blender/blenkernel/intern/mesh_evaluate.c
M	source/blender/blenlib/BLI_polyfill2d.h
M	source/blender/blenlib/intern/polyfill2d.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 018cf85..cb0386b 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -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++) {
diff --git a/source/blender/blenlib/BLI_polyfill2d.h b/source/blender/blenlib/BLI_polyfill2d.h
index bdc9c10..5c5cea8 100644
--- a/source/blender/blenlib/BLI_polyfill2d.h
+++ b/source/blender/blenlib/BLI_polyfill2d.h
@@ -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__ */
diff --git a/source/blender/blenlib/intern/polyfill2d.c b/source/blender/blenlib/intern/polyfill2d.c
index f7aaca6..1c0b936 100644
--- a/source/blender/blenlib/intern/polyfill2d.c
+++ b/source/blender/blenlib/intern/polyfill2d.c
@@ -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 */
 
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c
index 4065ba3..307c391 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -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++];




More information about the Bf-blender-cvs mailing list