/*
================
R_AliasClipTriangle
================
*/
void R_AliasClipTriangle (mtriangle_t *ptri)
{
	int			i, k, pingpong;
	mtriangle_t		mtri;
	unsigned int		clipflags;

// copy vertexes and fix seam texture coordinates
	if (ptri->facesfront)
	{
		fv[0][0] = pfinalverts[ptri->vertindex[0]];
		fv[0][1] = pfinalverts[ptri->vertindex[1]];
		fv[0][2] = pfinalverts[ptri->vertindex[2]];
	}
	else
	{
		for (i = 0; i < 3; i++)
		{
			fv[0][i] = pfinalverts[ptri->vertindex[i]];

			if (fv[0][i].flags & ALIAS_ONSEAM)
				fv[0][i].v[2] += r_affinetridesc.seamfixupX16;
		}
	}

// clip
	clipflags = fv[0][0].flags | fv[0][1].flags | fv[0][2].flags;

	if (clipflags & ALIAS_Z_CLIP)
	{
		for (i = 0; i < 3; i++)
			av[i] = pauxverts[ptri->vertindex[i]];

		k = R_AliasClip (fv[0], fv[1], ALIAS_Z_CLIP, 3, R_Alias_clip_z);
		if (k == 0)
			return;

		pingpong = 1;
		clipflags = fv[1][0].flags | fv[1][1].flags | fv[1][2].flags;
	}
	else
	{
		pingpong = 0;
		k = 3;
	}

	if (clipflags & ALIAS_LEFT_CLIP)
	{
		k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
							ALIAS_LEFT_CLIP, k, R_Alias_clip_left);
		if (k == 0)
			return;

		pingpong ^= 1;
	}

	if (clipflags & ALIAS_RIGHT_CLIP)
	{
		k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
							ALIAS_RIGHT_CLIP, k, R_Alias_clip_right);
		if (k == 0)
			return;

		pingpong ^= 1;
	}

	if (clipflags & ALIAS_BOTTOM_CLIP)
	{
		k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
							ALIAS_BOTTOM_CLIP, k, R_Alias_clip_bottom);
		if (k == 0)
			return;

		pingpong ^= 1;
	}

	if (clipflags & ALIAS_TOP_CLIP)
	{
		k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
							ALIAS_TOP_CLIP, k, R_Alias_clip_top);
		if (k == 0)
			return;

		pingpong ^= 1;
	}

	for (i = 0; i < k; i++)
	{
		if (fv[pingpong][i].v[0] < r_refdef.aliasvrect.x)
			fv[pingpong][i].v[0] = r_refdef.aliasvrect.x;
		else if (fv[pingpong][i].v[0] > r_refdef.aliasvrectright)
			fv[pingpong][i].v[0] = r_refdef.aliasvrectright;

		if (fv[pingpong][i].v[1] < r_refdef.aliasvrect.y)
			fv[pingpong][i].v[1] = r_refdef.aliasvrect.y;
		else if (fv[pingpong][i].v[1] > r_refdef.aliasvrectbottom)
			fv[pingpong][i].v[1] = r_refdef.aliasvrectbottom;

		fv[pingpong][i].flags = 0;
	}

// draw triangles
	mtri.facesfront = ptri->facesfront;
	r_affinetridesc.ptriangles = &mtri;
	r_affinetridesc.pfinalverts = fv[pingpong];

// FIXME: do all at once as trifan?
	mtri.vertindex[0] = 0;
	for (i = 1; i < k - 1; i++)
	{
		mtri.vertindex[1] = i;
		mtri.vertindex[2] = i+1;
		if ((currententity->model->flags & EF_SPECIAL_TRANS))
			D_PolysetDrawT5 ();
		else if (currententity->drawflags & DRF_TRANSLUCENT)
			D_PolysetDrawT ();
		else if ((currententity->model->flags & EF_TRANSPARENT))
			D_PolysetDrawT2 ();
		else if ((currententity->model->flags & EF_HOLEY))
			D_PolysetDrawT3 ();
		else
			D_PolysetDraw ();
	}
}
Exemple #2
0
/*
================
R_AliasClipTriangle
================
*/
void R_AliasClipTriangle (finalvert_t *index0, finalvert_t *index1, finalvert_t *index2)
{
    int             i, k, pingpong;
    unsigned        clipflags;

// copy vertexes and fix seam texture coordinates
    fv[0][0] = *index0;
    fv[0][1] = *index1;
    fv[0][2] = *index2;

// clip
    clipflags = fv[0][0].flags | fv[0][1].flags | fv[0][2].flags;

    if (clipflags & ALIAS_Z_CLIP)
    {
        k = R_AliasClip (fv[0], fv[1], ALIAS_Z_CLIP, 3, R_Alias_clip_z);
        if (k == 0)
            return;

        pingpong = 1;
        clipflags = fv[1][0].flags | fv[1][1].flags | fv[1][2].flags;
    }
    else
    {
        pingpong = 0;
        k = 3;
    }

    if (clipflags & ALIAS_LEFT_CLIP)
    {
        k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
                         ALIAS_LEFT_CLIP, k, R_Alias_clip_left);
        if (k == 0)
            return;

        pingpong ^= 1;
    }

    if (clipflags & ALIAS_RIGHT_CLIP)
    {
        k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
                         ALIAS_RIGHT_CLIP, k, R_Alias_clip_right);
        if (k == 0)
            return;

        pingpong ^= 1;
    }

    if (clipflags & ALIAS_BOTTOM_CLIP)
    {
        k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
                         ALIAS_BOTTOM_CLIP, k, R_Alias_clip_bottom);
        if (k == 0)
            return;

        pingpong ^= 1;
    }

    if (clipflags & ALIAS_TOP_CLIP)
    {
        k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
                         ALIAS_TOP_CLIP, k, R_Alias_clip_top);
        if (k == 0)
            return;

        pingpong ^= 1;
    }

    for (i=0 ; i<k ; i++)
    {
        if (fv[pingpong][i].u < r_refdef.aliasvrect.x)
            fv[pingpong][i].u = r_refdef.aliasvrect.x;
        else if (fv[pingpong][i].u > r_refdef.aliasvrectright)
            fv[pingpong][i].u = r_refdef.aliasvrectright;

        if (fv[pingpong][i].v < r_refdef.aliasvrect.y)
            fv[pingpong][i].v = r_refdef.aliasvrect.y;
        else if (fv[pingpong][i].v > r_refdef.aliasvrectbottom)
            fv[pingpong][i].v = r_refdef.aliasvrectbottom;

        fv[pingpong][i].flags = 0;
    }

// draw triangles
    for (i=1 ; i<k-1 ; i++)
    {
        aliastriangleparms.a = &fv[pingpong][0];
        aliastriangleparms.b = &fv[pingpong][i];
        aliastriangleparms.c = &fv[pingpong][i+1];
        R_DrawTriangle();
    }
}