me-main #1

Merged
Nate Rupsis merged 123 commits from me-main into main 2023-02-13 18:39:11 +01:00
Showing only changes of commit 09eb4fe19a - Show all commits

View File

@ -155,7 +155,7 @@ static PolyIndex *pf_ear_tip_find(PolyFill *pf
#endif #endif
); );
static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip); static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign sign_accept);
static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip); static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip);
BLI_INLINE eSign signum_enum(float a) BLI_INLINE eSign signum_enum(float a)
@ -590,15 +590,36 @@ static PolyIndex *pf_ear_tip_find(PolyFill *pf
uint i; uint i;
/* Use two passes when looking for an ear.
*
* - The first pass only picks *good* (concave) choices.
* For polygons which aren't degenerate this works well
* since it avoids creating any zero area faces.
*
* - The second pass is only met if no concave choices are possible,
* so the cost of a second pass is only incurred for degenerate polygons.
* In this case accept zero area faces as better alternatives aren't available.
*
* See: #103913 for reference.
*
* NOTE: these passes draw a distinction between zero area faces and concave
* which is susceptible minor differences in float precision
* (since #TANGENTIAL compares with 0.0f).
*
* While it's possible to compute an error threshold and run a pass that picks
* ears which are more likely not to appear as zero area from a users perspective,
* this API prioritizes performance (for real-time updates).
* Higher quality tessellation can always be achieved using #BLI_polyfill_beautify.
*/
for (eSign sign_accept = CONVEX; sign_accept >= TANGENTIAL; sign_accept--) {
#ifdef USE_CLIP_EVEN #ifdef USE_CLIP_EVEN
pi_ear = pi_ear_init; pi_ear = pi_ear_init;
#else #else
pi_ear = pf->indices; pi_ear = pf->indices;
#endif #endif
i = coords_num; i = coords_num;
while (i--) { while (i--) {
if (pf_ear_tip_check(pf, pi_ear)) { if (pf_ear_tip_check(pf, pi_ear, sign_accept)) {
return pi_ear; return pi_ear;
} }
#ifdef USE_CLIP_SWEEP #ifdef USE_CLIP_SWEEP
@ -607,6 +628,7 @@ static PolyIndex *pf_ear_tip_find(PolyFill *pf
pi_ear = pi_ear->next; pi_ear = pi_ear->next;
#endif #endif
} }
}
/* Desperate mode: if no vertex is an ear tip, /* Desperate mode: if no vertex is an ear tip,
* we are dealing with a degenerate polygon (e.g. nearly collinear). * we are dealing with a degenerate polygon (e.g. nearly collinear).
@ -638,7 +660,7 @@ static PolyIndex *pf_ear_tip_find(PolyFill *pf
return pi_ear; return pi_ear;
} }
static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip) static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign sign_accept)
{ {
#ifndef USE_KDTREE #ifndef USE_KDTREE
/* localize */ /* localize */
@ -674,7 +696,7 @@ static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip)
} }
#endif #endif
if (UNLIKELY(pi_ear_tip->sign == CONCAVE)) { if (UNLIKELY(pi_ear_tip->sign != sign_accept)) {
return false; return false;
} }