static void pf_triangulate(PolyFill *pf) { /* localize */ PolyIndex *pi_ear; #ifdef USE_CLIP_EVEN PolyIndex *pi_ear_init = pf->indices; #endif #ifdef USE_CLIP_SWEEP bool reverse = false; #endif while (pf->coords_tot > 3) { PolyIndex *pi_prev, *pi_next; eSign sign_orig_prev, sign_orig_next; pi_ear = pf_ear_tip_find( pf #ifdef USE_CLIP_EVEN , pi_ear_init #endif #ifdef USE_CLIP_SWEEP , reverse #endif ); #ifdef USE_CLIP_SWEEP #ifdef USE_CLIP_EVEN if (pi_ear != pi_ear_init) { reverse = !reverse; } #else if (pi_ear != pf->indices) { reverse = !reverse; } #endif #endif #ifdef USE_CONVEX_SKIP if (pi_ear->sign != CONVEX) { pf->coords_tot_concave -= 1; } #endif pi_prev = pi_ear->prev; pi_next = pi_ear->next; pf_ear_tip_cut(pf, pi_ear); /* The type of the two vertices adjacent to the clipped vertex may have changed. */ sign_orig_prev = pi_prev->sign; sign_orig_next = pi_next->sign; /* check if any verts became convex the (else if) * case is highly unlikely but may happen with degenerate polygons */ if (sign_orig_prev != CONVEX) { pf_coord_sign_calc(pf, pi_prev); #ifdef USE_CONVEX_SKIP if (pi_prev->sign == CONVEX) { pf->coords_tot_concave -= 1; #ifdef USE_KDTREE kdtree2d_node_remove(&pf->kdtree, pi_prev->index); #endif } #endif } if (sign_orig_next != CONVEX) { pf_coord_sign_calc(pf, pi_next); #ifdef USE_CONVEX_SKIP if (pi_next->sign == CONVEX) { pf->coords_tot_concave -= 1; #ifdef USE_KDTREE kdtree2d_node_remove(&pf->kdtree, pi_next->index); #endif } #endif } #ifdef USE_CLIP_EVEN #ifdef USE_CLIP_SWEEP pi_ear_init = reverse ? pi_next->next : pi_prev->prev; #else pi_ear_init = pi_next->next; #endif #endif } if (pf->coords_tot == 3) { unsigned int *tri = pf_tri_add(pf); pi_ear = pf->indices; tri[0] = pi_ear->index; pi_ear = pi_ear->next; tri[1] = pi_ear->index; pi_ear = pi_ear->next; tri[2] = pi_ear->index; } }
static void pf_triangulate(PolyFill *pf) { /* localize */ eSign *coords_sign = pf->coords_sign; unsigned int index_ear_tip = 0; while (pf->coords_tot > 3) { unsigned int i_prev, i_next; #ifdef USE_CONVEX_SKIP eSign sign_orig_prev, sign_orig_next; #endif #ifdef USE_CLIP_EVEN index_ear_tip = pf_ear_tip_find(pf, index_ear_tip); #else index_ear_tip = pf_ear_tip_find(pf); #endif #ifdef USE_CONVEX_SKIP if (coords_sign[index_ear_tip] != CONVEX) { pf->coords_tot_concave -= 1; } #endif pf_ear_tip_cut(pf, index_ear_tip); /* The type of the two vertices adjacent to the clipped vertex may have changed. */ i_prev = pf_index_prev(pf, index_ear_tip); i_next = (index_ear_tip == pf->coords_tot) ? 0 : index_ear_tip; #ifdef USE_CONVEX_SKIP sign_orig_prev = coords_sign[i_prev]; sign_orig_next = coords_sign[i_next]; #endif coords_sign[i_prev] = pf_coord_sign_calc(pf, i_prev); coords_sign[i_next] = pf_coord_sign_calc(pf, i_next); #ifdef USE_CONVEX_SKIP /* check if any verts became convex the (else if) * case is highly unlikely but may happen with degenerate polygons */ if ((sign_orig_prev != CONVEX) && (coords_sign[i_prev] == CONVEX)) pf->coords_tot_concave -= 1; else if (UNLIKELY((sign_orig_prev == CONVEX) && (coords_sign[i_prev] != CONVEX))) pf->coords_tot_concave += 1; if ((sign_orig_next != CONVEX) && (coords_sign[i_next] == CONVEX)) pf->coords_tot_concave -= 1; else if (UNLIKELY((sign_orig_next == CONVEX) && (coords_sign[i_next] != CONVEX))) pf->coords_tot_concave += 1; #endif #ifdef USE_CLIP_EVEN index_ear_tip = i_prev; #endif } if (pf->coords_tot == 3) { unsigned int *tri = pf_tri_add(pf); tri[0] = pf->indices[0]; tri[1] = pf->indices[1]; tri[2] = pf->indices[2]; } }