/* ================ 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 (); } }
/* * ================ * 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(); } }