Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-06-14 01:22:39 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-06-14 02:21:52 +0400
commit19b1da2b7b73c227807e4fc343efd88914a624cf (patch)
tree9534a95f2d2a3a982d7c9b8e9974f80d678d213d /source
parent7529e36f493c7fa0f61255274afdfa67a6dbd436 (diff)
Polyfill2d: avoid calculating polygon winding (its known in all cases)
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/mesh_evaluate.c2
-rw-r--r--source/blender/blenlib/BLI_polyfill2d.h2
-rw-r--r--source/blender/blenlib/intern/polyfill2d.c26
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.c6
4 files changed, 27 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index 018cf85f9c6..cb0386b1203 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 bdc9c105d05..5c5cea8f67d 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 f7aaca6a0f3..1c0b936a881 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 4065ba33ee1..307c391a406 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++];