Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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];
	}
}