Beispiel #1
0
        /*
        ================
        R_AliasClipTriangle
        ================
        */
        static void R_AliasClipTriangle(model.mtriangle_t ptri)
        {
            int				    i, k, pingpong;
            model.mtriangle_t   mtri = new model.mtriangle_t();
            uint		        clipflags;

            // copy vertexes and fix seam texture coordinates
            if (ptri.facesfront != 0)
            {
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[0]], fva[0][0]);
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[1]], fva[0][1]);
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[2]], fva[0][2]);
            }
            else
            {
                for (i=0 ; i<3 ; i++)
                {
                    draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[i]], fva[0][i]);

                    if (ptri.facesfront == 0 && (fva[0][i].flags & ALIAS_ONSEAM) != 0 )
                        fva[0][i].v[2] += r_affinetridesc.seamfixupX16;
                }
            }

            // clip
            clipflags = (uint)(fva[0][0].flags | fva[0][1].flags | fva[0][2].flags);

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

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

                pingpong = 1;
                clipflags = (uint)(fva[1][0].flags | fva[1][1].flags | fva[1][2].flags);
            }
            else
            {
                pingpong = 0;
                k = 3;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

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

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

            // draw triangles
            mtri.facesfront = ptri.facesfront;
            r_affinetridesc.ptriangles = new model.mtriangle_t[] { mtri };
            r_affinetridesc.pfinalverts = fva[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;
                draw.D_PolysetDraw ();
            }
        }
Beispiel #2
0
        /*
         * ================
         * R_AliasClipTriangle
         * ================
         */
        static void R_AliasClipTriangle(model.mtriangle_t ptri)
        {
            int i, k, pingpong;

            model.mtriangle_t mtri = new model.mtriangle_t();
            uint clipflags;

            // copy vertexes and fix seam texture coordinates
            if (ptri.facesfront != 0)
            {
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[0]], fva[0][0]);
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[1]], fva[0][1]);
                draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[2]], fva[0][2]);
            }
            else
            {
                for (i = 0; i < 3; i++)
                {
                    draw.finalvert_t.Copy(pfinalverts[ptri.vertindex[i]], fva[0][i]);

                    if (ptri.facesfront == 0 && (fva[0][i].flags & ALIAS_ONSEAM) != 0)
                    {
                        fva[0][i].v[2] += r_affinetridesc.seamfixupX16;
                    }
                }
            }

            // clip
            clipflags = (uint)(fva[0][0].flags | fva[0][1].flags | fva[0][2].flags);

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

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

                pingpong  = 1;
                clipflags = (uint)(fva[1][0].flags | fva[1][1].flags | fva[1][2].flags);
            }
            else
            {
                pingpong = 0;
                k        = 3;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

                pingpong ^= 1;
            }

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

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

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

            // draw triangles
            mtri.facesfront             = ptri.facesfront;
            r_affinetridesc.ptriangles  = new model.mtriangle_t[] { mtri };
            r_affinetridesc.pfinalverts = fva[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;
                draw.D_PolysetDraw();
            }
        }