Annotation of quake1/r_aclip.c, revision 1.1

1.1     ! root        1: // r_aclip.c: clip routines for drawing Alias models directly to the screen
        !             2: 
        !             3: #include "quakedef.h"
        !             4: #include "r_local.h"
        !             5: #include "d_local.h"
        !             6: 
        !             7: static finalvert_t             fv[2][8];
        !             8: static auxvert_t               av[8];
        !             9: 
        !            10: void R_AliasProjectFinalVert (finalvert_t *fv, auxvert_t *av);
        !            11: void R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1,
        !            12:        finalvert_t *out);
        !            13: void R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
        !            14:        finalvert_t *out);
        !            15: void R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
        !            16:        finalvert_t *out);
        !            17: void R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
        !            18:        finalvert_t *out);
        !            19: 
        !            20: 
        !            21: /*
        !            22: ================
        !            23: R_Alias_clip_z
        !            24: 
        !            25: pfv0 is the unclipped vertex, pfv1 is the z-clipped vertex
        !            26: ================
        !            27: */
        !            28: void R_Alias_clip_z (finalvert_t *pfv0, finalvert_t *pfv1, finalvert_t *out)
        !            29: {
        !            30:        float           scale;
        !            31:        auxvert_t       *pav0, *pav1, avout;
        !            32: 
        !            33:        pav0 = &av[pfv0 - &fv[0][0]];
        !            34:        pav1 = &av[pfv1 - &fv[0][0]];
        !            35: 
        !            36:        if (pfv0->v[1] >= pfv1->v[1])
        !            37:        {
        !            38:                scale = (ALIAS_Z_CLIP_PLANE - pav0->fv[2]) /
        !            39:                                (pav1->fv[2] - pav0->fv[2]);
        !            40:        
        !            41:                avout.fv[0] = pav0->fv[0] + (pav1->fv[0] - pav0->fv[0]) * scale;
        !            42:                avout.fv[1] = pav0->fv[1] + (pav1->fv[1] - pav0->fv[1]) * scale;
        !            43:                avout.fv[2] = ALIAS_Z_CLIP_PLANE;
        !            44:        
        !            45:                out->v[2] =     pfv0->v[2] + (pfv1->v[2] - pfv0->v[2]) * scale;
        !            46:                out->v[3] =     pfv0->v[3] + (pfv1->v[3] - pfv0->v[3]) * scale;
        !            47:                out->v[4] =     pfv0->v[4] + (pfv1->v[4] - pfv0->v[4]) * scale;
        !            48:        }
        !            49:        else
        !            50:        {
        !            51:                scale = (ALIAS_Z_CLIP_PLANE - pav1->fv[2]) /
        !            52:                                (pav0->fv[2] - pav1->fv[2]);
        !            53:        
        !            54:                avout.fv[0] = pav1->fv[0] + (pav0->fv[0] - pav1->fv[0]) * scale;
        !            55:                avout.fv[1] = pav1->fv[1] + (pav0->fv[1] - pav1->fv[1]) * scale;
        !            56:                avout.fv[2] = ALIAS_Z_CLIP_PLANE;
        !            57:        
        !            58:                out->v[2] =     pfv1->v[2] + (pfv0->v[2] - pfv1->v[2]) * scale;
        !            59:                out->v[3] =     pfv1->v[3] + (pfv0->v[3] - pfv1->v[3]) * scale;
        !            60:                out->v[4] =     pfv1->v[4] + (pfv0->v[4] - pfv1->v[4]) * scale;
        !            61:        }
        !            62: 
        !            63:        R_AliasProjectFinalVert (out, &avout);
        !            64: 
        !            65:        if (out->v[0] < r_refdef.aliasvrect.x)
        !            66:                out->flags |= ALIAS_LEFT_CLIP;
        !            67:        if (out->v[1] < r_refdef.aliasvrect.y)
        !            68:                out->flags |= ALIAS_TOP_CLIP;
        !            69:        if (out->v[0] > r_refdef.aliasvrectright)
        !            70:                out->flags |= ALIAS_RIGHT_CLIP;
        !            71:        if (out->v[1] > r_refdef.aliasvrectbottom)
        !            72:                out->flags |= ALIAS_BOTTOM_CLIP;        
        !            73: }
        !            74: 
        !            75: 
        !            76: #if    !id386
        !            77: 
        !            78: void R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1, finalvert_t *out)
        !            79: {
        !            80:        float           scale;
        !            81:        int                     i;
        !            82: 
        !            83:        if (pfv0->v[1] >= pfv1->v[1])
        !            84:        {
        !            85:                scale = (float)(r_refdef.aliasvrect.x - pfv0->v[0]) /
        !            86:                                (pfv1->v[0] - pfv0->v[0]);
        !            87:                for (i=0 ; i<6 ; i++)
        !            88:                        out->v[i] = pfv0->v[i] + (pfv1->v[i] - pfv0->v[i])*scale + 0.5;
        !            89:        }
        !            90:        else
        !            91:        {
        !            92:                scale = (float)(r_refdef.aliasvrect.x - pfv1->v[0]) /
        !            93:                                (pfv0->v[0] - pfv1->v[0]);
        !            94:                for (i=0 ; i<6 ; i++)
        !            95:                        out->v[i] = pfv1->v[i] + (pfv0->v[i] - pfv1->v[i])*scale + 0.5;
        !            96:        }
        !            97: }
        !            98: 
        !            99: 
        !           100: void R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
        !           101:        finalvert_t *out)
        !           102: {
        !           103:        float           scale;
        !           104:        int                     i;
        !           105: 
        !           106:        if (pfv0->v[1] >= pfv1->v[1])
        !           107:        {
        !           108:                scale = (float)(r_refdef.aliasvrectright - pfv0->v[0]) /
        !           109:                                (pfv1->v[0] - pfv0->v[0]);
        !           110:                for (i=0 ; i<6 ; i++)
        !           111:                        out->v[i] = pfv0->v[i] + (pfv1->v[i] - pfv0->v[i])*scale + 0.5;
        !           112:        }
        !           113:        else
        !           114:        {
        !           115:                scale = (float)(r_refdef.aliasvrectright - pfv1->v[0]) /
        !           116:                                (pfv0->v[0] - pfv1->v[0]);
        !           117:                for (i=0 ; i<6 ; i++)
        !           118:                        out->v[i] = pfv1->v[i] + (pfv0->v[i] - pfv1->v[i])*scale + 0.5;
        !           119:        }
        !           120: }
        !           121: 
        !           122: 
        !           123: void R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1, finalvert_t *out)
        !           124: {
        !           125:        float           scale;
        !           126:        int                     i;
        !           127: 
        !           128:        if (pfv0->v[1] >= pfv1->v[1])
        !           129:        {
        !           130:                scale = (float)(r_refdef.aliasvrect.y - pfv0->v[1]) /
        !           131:                                (pfv1->v[1] - pfv0->v[1]);
        !           132:                for (i=0 ; i<6 ; i++)
        !           133:                        out->v[i] = pfv0->v[i] + (pfv1->v[i] - pfv0->v[i])*scale + 0.5;
        !           134:        }
        !           135:        else
        !           136:        {
        !           137:                scale = (float)(r_refdef.aliasvrect.y - pfv1->v[1]) /
        !           138:                                (pfv0->v[1] - pfv1->v[1]);
        !           139:                for (i=0 ; i<6 ; i++)
        !           140:                        out->v[i] = pfv1->v[i] + (pfv0->v[i] - pfv1->v[i])*scale + 0.5;
        !           141:        }
        !           142: }
        !           143: 
        !           144: 
        !           145: void R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
        !           146:        finalvert_t *out)
        !           147: {
        !           148:        float           scale;
        !           149:        int                     i;
        !           150: 
        !           151:        if (pfv0->v[1] >= pfv1->v[1])
        !           152:        {
        !           153:                scale = (float)(r_refdef.aliasvrectbottom - pfv0->v[1]) /
        !           154:                                (pfv1->v[1] - pfv0->v[1]);
        !           155: 
        !           156:                for (i=0 ; i<6 ; i++)
        !           157:                        out->v[i] = pfv0->v[i] + (pfv1->v[i] - pfv0->v[i])*scale + 0.5;
        !           158:        }
        !           159:        else
        !           160:        {
        !           161:                scale = (float)(r_refdef.aliasvrectbottom - pfv1->v[1]) /
        !           162:                                (pfv0->v[1] - pfv1->v[1]);
        !           163: 
        !           164:                for (i=0 ; i<6 ; i++)
        !           165:                        out->v[i] = pfv1->v[i] + (pfv0->v[i] - pfv1->v[i])*scale + 0.5;
        !           166:        }
        !           167: }
        !           168: 
        !           169: #endif
        !           170: 
        !           171: 
        !           172: int R_AliasClip (finalvert_t *in, finalvert_t *out, int flag, int count,
        !           173:        void(*clip)(finalvert_t *pfv0, finalvert_t *pfv1, finalvert_t *out) )
        !           174: {
        !           175:        int                     i,j,k;
        !           176:        int                     flags, oldflags;
        !           177:        
        !           178:        j = count-1;
        !           179:        k = 0;
        !           180:        for (i=0 ; i<count ; j = i, i++)
        !           181:        {
        !           182:                oldflags = in[j].flags & flag;
        !           183:                flags = in[i].flags & flag;
        !           184: 
        !           185:                if (flags && oldflags)
        !           186:                        continue;
        !           187:                if (oldflags ^ flags)
        !           188:                {
        !           189:                        clip (&in[j], &in[i], &out[k]);
        !           190:                        out[k].flags = 0;
        !           191:                        if (out[k].v[0] < r_refdef.aliasvrect.x)
        !           192:                                out[k].flags |= ALIAS_LEFT_CLIP;
        !           193:                        if (out[k].v[1] < r_refdef.aliasvrect.y)
        !           194:                                out[k].flags |= ALIAS_TOP_CLIP;
        !           195:                        if (out[k].v[0] > r_refdef.aliasvrectright)
        !           196:                                out[k].flags |= ALIAS_RIGHT_CLIP;
        !           197:                        if (out[k].v[1] > r_refdef.aliasvrectbottom)
        !           198:                                out[k].flags |= ALIAS_BOTTOM_CLIP;      
        !           199:                        k++;
        !           200:                }
        !           201:                if (!flags)
        !           202:                {
        !           203:                        out[k] = in[i];
        !           204:                        k++;
        !           205:                }
        !           206:        }
        !           207:        
        !           208:        return k;
        !           209: }
        !           210: 
        !           211: 
        !           212: /*
        !           213: ================
        !           214: R_AliasClipTriangle
        !           215: ================
        !           216: */
        !           217: void R_AliasClipTriangle (mtriangle_t *ptri)
        !           218: {
        !           219:        int                             i, k, pingpong;
        !           220:        mtriangle_t             mtri;
        !           221:        unsigned                clipflags;
        !           222: 
        !           223: // copy vertexes and fix seam texture coordinates
        !           224:        if (ptri->facesfront)
        !           225:        {
        !           226:                fv[0][0] = pfinalverts[ptri->vertindex[0]];
        !           227:                fv[0][1] = pfinalverts[ptri->vertindex[1]];
        !           228:                fv[0][2] = pfinalverts[ptri->vertindex[2]];
        !           229:        }
        !           230:        else
        !           231:        {
        !           232:                for (i=0 ; i<3 ; i++)
        !           233:                {
        !           234:                        fv[0][i] = pfinalverts[ptri->vertindex[i]];
        !           235:        
        !           236:                        if (!ptri->facesfront && (fv[0][i].flags & ALIAS_ONSEAM) )
        !           237:                                fv[0][i].v[2] += r_affinetridesc.seamfixupX16;
        !           238:                }
        !           239:        }
        !           240: 
        !           241: // clip
        !           242:        clipflags = fv[0][0].flags | fv[0][1].flags | fv[0][2].flags;
        !           243: 
        !           244:        if (clipflags & ALIAS_Z_CLIP)
        !           245:        {
        !           246:                for (i=0 ; i<3 ; i++)
        !           247:                        av[i] = pauxverts[ptri->vertindex[i]];
        !           248: 
        !           249:                k = R_AliasClip (fv[0], fv[1], ALIAS_Z_CLIP, 3, R_Alias_clip_z);
        !           250:                if (k == 0)
        !           251:                        return;
        !           252: 
        !           253:                pingpong = 1;
        !           254:                clipflags = fv[1][0].flags | fv[1][1].flags | fv[1][2].flags;
        !           255:        }
        !           256:        else
        !           257:        {
        !           258:                pingpong = 0;
        !           259:                k = 3;
        !           260:        }
        !           261: 
        !           262:        if (clipflags & ALIAS_LEFT_CLIP)
        !           263:        {
        !           264:                k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
        !           265:                                                        ALIAS_LEFT_CLIP, k, R_Alias_clip_left);
        !           266:                if (k == 0)
        !           267:                        return;
        !           268: 
        !           269:                pingpong ^= 1;
        !           270:        }
        !           271: 
        !           272:        if (clipflags & ALIAS_RIGHT_CLIP)
        !           273:        {
        !           274:                k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
        !           275:                                                        ALIAS_RIGHT_CLIP, k, R_Alias_clip_right);
        !           276:                if (k == 0)
        !           277:                        return;
        !           278: 
        !           279:                pingpong ^= 1;
        !           280:        }
        !           281: 
        !           282:        if (clipflags & ALIAS_BOTTOM_CLIP)
        !           283:        {
        !           284:                k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
        !           285:                                                        ALIAS_BOTTOM_CLIP, k, R_Alias_clip_bottom);
        !           286:                if (k == 0)
        !           287:                        return;
        !           288: 
        !           289:                pingpong ^= 1;
        !           290:        }
        !           291: 
        !           292:        if (clipflags & ALIAS_TOP_CLIP)
        !           293:        {
        !           294:                k = R_AliasClip (fv[pingpong], fv[pingpong ^ 1],
        !           295:                                                        ALIAS_TOP_CLIP, k, R_Alias_clip_top);
        !           296:                if (k == 0)
        !           297:                        return;
        !           298: 
        !           299:                pingpong ^= 1;
        !           300:        }
        !           301: 
        !           302:        for (i=0 ; i<k ; i++)
        !           303:        {
        !           304:                if (fv[pingpong][i].v[0] < r_refdef.aliasvrect.x)
        !           305:                        fv[pingpong][i].v[0] = r_refdef.aliasvrect.x;
        !           306:                else if (fv[pingpong][i].v[0] > r_refdef.aliasvrectright)
        !           307:                        fv[pingpong][i].v[0] = r_refdef.aliasvrectright;
        !           308: 
        !           309:                if (fv[pingpong][i].v[1] < r_refdef.aliasvrect.y)
        !           310:                        fv[pingpong][i].v[1] = r_refdef.aliasvrect.y;
        !           311:                else if (fv[pingpong][i].v[1] > r_refdef.aliasvrectbottom)
        !           312:                        fv[pingpong][i].v[1] = r_refdef.aliasvrectbottom;
        !           313: 
        !           314:                fv[pingpong][i].flags = 0;
        !           315:        }
        !           316: 
        !           317: // draw triangles
        !           318:        mtri.facesfront = ptri->facesfront;
        !           319:        r_affinetridesc.ptriangles = &mtri;
        !           320:        r_affinetridesc.pfinalverts = fv[pingpong];
        !           321: 
        !           322: // FIXME: do all at once as trifan?
        !           323:        mtri.vertindex[0] = 0;
        !           324:        for (i=1 ; i<k-1 ; i++)
        !           325:        {
        !           326:                mtri.vertindex[1] = i;
        !           327:                mtri.vertindex[2] = i+1;
        !           328:                D_PolysetDraw ();
        !           329:        }
        !           330: }
        !           331: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.