Annotation of doom/r_plane.c, revision 1.1.1.1

1.1       root        1: // R_planes.c
                      2: 
                      3: #include "DoomDef.h"
                      4: #include "R_local.h"
                      5: 
                      6: planefunction_t                floorfunc, ceilingfunc;
                      7: 
                      8: //
                      9: // sky mapping
                     10: //
                     11: int                    skyflatnum;
                     12: int                    skytexture;
                     13: int                    skytexturemid;
                     14: fixed_t                skyiscale;
                     15: 
                     16: //
                     17: // opening
                     18: //
                     19: 
                     20: visplane_t             visplanes[MAXVISPLANES], *lastvisplane;
                     21: visplane_t             *floorplane, *ceilingplane;
                     22: 
                     23: short                  openings[MAXOPENINGS], *lastopening;
                     24: 
                     25: //
                     26: // clip values are the solid pixel bounding the range
                     27: // floorclip starts out SCREENHEIGHT
                     28: // ceilingclip starts out -1
                     29: //
                     30: short          floorclip[SCREENWIDTH];
                     31: short          ceilingclip[SCREENWIDTH];
                     32: 
                     33: //
                     34: // spanstart holds the start of a plane span
                     35: // initialized to 0 at start
                     36: //
                     37: int                    spanstart[SCREENHEIGHT];
                     38: int                    spanstop[SCREENHEIGHT];
                     39: 
                     40: //
                     41: // texture mapping
                     42: //
                     43: lighttable_t   **planezlight;
                     44: fixed_t                planeheight;
                     45: 
                     46: fixed_t                yslope[SCREENHEIGHT];
                     47: fixed_t                distscale[SCREENWIDTH];
                     48: fixed_t                basexscale, baseyscale;
                     49: 
                     50: fixed_t                cachedheight[SCREENHEIGHT];
                     51: fixed_t                cacheddistance[SCREENHEIGHT];
                     52: fixed_t                cachedxstep[SCREENHEIGHT];
                     53: fixed_t                cachedystep[SCREENHEIGHT];
                     54: 
                     55: 
                     56: /*
                     57: ================
                     58: =
                     59: = R_InitSkyMap
                     60: =
                     61: = Called whenever the view size changes
                     62: =
                     63: ================
                     64: */
                     65: 
                     66: void R_InitSkyMap (void)
                     67: {
                     68:        skyflatnum = R_FlatNumForName ("F_SKY1");
                     69:        skytexturemid = 200*FRACUNIT;
                     70:        skyiscale = FRACUNIT;
                     71: }
                     72: 
                     73: 
                     74: /*
                     75: ====================
                     76: =
                     77: = R_InitPlanes
                     78: =
                     79: = Only at game startup
                     80: ====================
                     81: */
                     82: 
                     83: void R_InitPlanes (void)
                     84: {
                     85: }
                     86: 
                     87: 
                     88: /*
                     89: ================
                     90: =
                     91: = R_MapPlane
                     92: =
                     93: global vars:
                     94: 
                     95: planeheight
                     96: ds_source
                     97: basexscale
                     98: baseyscale
                     99: viewx
                    100: viewy
                    101: 
                    102: BASIC PRIMITIVE
                    103: ================
                    104: */
                    105: 
                    106: void R_MapPlane (int y, int x1, int x2)
                    107: {
                    108:        angle_t         angle;
                    109:        fixed_t         distance, length;
                    110:        unsigned        index;
                    111:        
                    112: #ifdef RANGECHECK
                    113:        if (x2 < x1 || x1<0 || x2>=viewwidth || (unsigned)y>viewheight)
                    114:                I_Error ("R_MapPlane: %i, %i at %i",x1,x2,y);
                    115: #endif
                    116: 
                    117:        if (planeheight != cachedheight[y])
                    118:        {
                    119:                cachedheight[y] = planeheight;
                    120:                distance = cacheddistance[y] = FixedMul (planeheight, yslope[y]);
                    121: 
                    122:                ds_xstep = cachedxstep[y] = FixedMul (distance,basexscale);
                    123:                ds_ystep = cachedystep[y] = FixedMul (distance,baseyscale);
                    124:        }
                    125:        else
                    126:        {
                    127:                distance = cacheddistance[y];
                    128:                ds_xstep = cachedxstep[y];
                    129:                ds_ystep = cachedystep[y];
                    130:        }
                    131:        
                    132:        length = FixedMul (distance,distscale[x1]);
                    133:        angle = (viewangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
                    134:        ds_xfrac = viewx + FixedMul(finecosine[angle], length);
                    135:        ds_yfrac = -viewy - FixedMul(finesine[angle], length);
                    136: 
                    137:        if (fixedcolormap)
                    138:                ds_colormap = fixedcolormap;
                    139:        else
                    140:        {
                    141:                index = distance >> LIGHTZSHIFT;
                    142:                if (index >= MAXLIGHTZ )
                    143:                        index = MAXLIGHTZ-1;
                    144:                ds_colormap = planezlight[index];
                    145:        }
                    146:        
                    147:        ds_y = y;
                    148:        ds_x1 = x1;
                    149:        ds_x2 = x2;
                    150:        
                    151:        spanfunc ();            // high or low detail
                    152: }
                    153: 
                    154: //=============================================================================
                    155: 
                    156: /*
                    157: ====================
                    158: =
                    159: = R_ClearPlanes
                    160: =
                    161: = At begining of frame
                    162: ====================
                    163: */
                    164: 
                    165: void R_ClearPlanes (void)
                    166: {
                    167:        int             i;
                    168:        angle_t angle;
                    169:        
                    170: //
                    171: // opening / clipping determination
                    172: //     
                    173:        for (i=0 ; i<viewwidth ; i++)
                    174:        {
                    175:                floorclip[i] = viewheight;
                    176:                ceilingclip[i] = -1;
                    177:        }
                    178: 
                    179:        lastvisplane = visplanes;
                    180:        lastopening = openings;
                    181:        
                    182: //
                    183: // texture calculation
                    184: //
                    185:        memset (cachedheight, 0, sizeof(cachedheight)); 
                    186:        angle = (viewangle-ANG90)>>ANGLETOFINESHIFT;    // left to right mapping
                    187:        
                    188:        // scale will be unit scale at SCREENWIDTH/2 distance
                    189:        basexscale = FixedDiv (finecosine[angle],centerxfrac);
                    190:        baseyscale = -FixedDiv (finesine[angle],centerxfrac);
                    191: }
                    192: 
                    193: 
                    194: 
                    195: /*
                    196: ===============
                    197: =
                    198: = R_FindPlane
                    199: =
                    200: ===============
                    201: */
                    202: 
                    203: visplane_t *R_FindPlane(fixed_t height, int picnum,
                    204:        int lightlevel, int special)
                    205: {
                    206:        visplane_t *check;
                    207: 
                    208:        if(picnum == skyflatnum)
                    209:        {
                    210:                // all skies map together
                    211:                height = 0;
                    212:                lightlevel = 0;
                    213:        }
                    214: 
                    215:        for(check = visplanes; check < lastvisplane; check++)
                    216:        {
                    217:                if(height == check->height
                    218:                && picnum == check->picnum
                    219:                && lightlevel == check->lightlevel
                    220:                && special == check->special)
                    221:                        break;
                    222:        }
                    223: 
                    224:        if(check < lastvisplane)
                    225:        {
                    226:                return(check);
                    227:        }
                    228: 
                    229:        if(lastvisplane-visplanes == MAXVISPLANES)
                    230:        {
                    231:                I_Error("R_FindPlane: no more visplanes");
                    232:        }
                    233: 
                    234:        lastvisplane++;
                    235:        check->height = height;
                    236:        check->picnum = picnum;
                    237:        check->lightlevel = lightlevel;
                    238:        check->special = special;
                    239:        check->minx = SCREENWIDTH;
                    240:        check->maxx = -1;
                    241:        memset(check->top,0xff,sizeof(check->top));
                    242:        return(check);
                    243: }
                    244: 
                    245: /*
                    246: ===============
                    247: =
                    248: = R_CheckPlane
                    249: =
                    250: ===============
                    251: */
                    252: 
                    253: visplane_t *R_CheckPlane (visplane_t *pl, int start, int stop)
                    254: {
                    255:        int                     intrl, intrh;
                    256:        int                     unionl, unionh;
                    257:        int                     x;
                    258:        
                    259:        if (start < pl->minx)
                    260:        {
                    261:                intrl = pl->minx;
                    262:                unionl = start;
                    263:        }
                    264:        else
                    265:        {
                    266:                unionl = pl->minx;
                    267:                intrl = start;
                    268:        }
                    269:        
                    270:        if (stop > pl->maxx)
                    271:        {
                    272:                intrh = pl->maxx;
                    273:                unionh = stop;
                    274:        }
                    275:        else
                    276:        {
                    277:                unionh = pl->maxx;
                    278:                intrh = stop;
                    279:        }
                    280: 
                    281:        for (x=intrl ; x<= intrh ; x++)
                    282:                if (pl->top[x] != 0xff)
                    283:                        break;
                    284: 
                    285:        if (x > intrh)
                    286:        {
                    287:                pl->minx = unionl;
                    288:                pl->maxx = unionh;
                    289:                return pl;                      // use the same one
                    290:        }
                    291:        
                    292: // make a new visplane
                    293: 
                    294:        lastvisplane->height = pl->height;
                    295:        lastvisplane->picnum = pl->picnum;
                    296:        lastvisplane->lightlevel = pl->lightlevel;
                    297:        lastvisplane->special = pl->special;
                    298:        pl = lastvisplane++;
                    299:        pl->minx = start;
                    300:        pl->maxx = stop;
                    301:        memset (pl->top,0xff,sizeof(pl->top));
                    302:                
                    303:        return pl;
                    304: }
                    305: 
                    306: 
                    307: 
                    308: //=============================================================================
                    309: 
                    310: /*
                    311: ================
                    312: =
                    313: = R_MakeSpans
                    314: =
                    315: ================
                    316: */
                    317: 
                    318: void R_MakeSpans (int x, int t1, int b1, int t2, int b2)
                    319: {
                    320:        while (t1 < t2 && t1<=b1)
                    321:        {
                    322:                R_MapPlane (t1,spanstart[t1],x-1);
                    323:                t1++;
                    324:        }
                    325:        while (b1 > b2 && b1>=t1)
                    326:        {
                    327:                R_MapPlane (b1,spanstart[b1],x-1);
                    328:                b1--;
                    329:        }
                    330:        
                    331:        while (t2 < t1 && t2<=b2)
                    332:        {
                    333:                spanstart[t2] = x;
                    334:                t2++;
                    335:        }
                    336:        while (b2 > b1 && b2>=t2)
                    337:        {
                    338:                spanstart[b2] = x;
                    339:                b2--;
                    340:        }
                    341: }
                    342: 
                    343: 
                    344: 
                    345: /*
                    346: ================
                    347: =
                    348: = R_DrawPlanes
                    349: =
                    350: = At the end of each frame
                    351: ================
                    352: */
                    353: 
                    354: void R_DrawPlanes (void)
                    355: {
                    356:        visplane_t      *pl;
                    357:        int                     light;
                    358:        int                     x, stop;
                    359:        int                     angle;
                    360:        byte *tempSource;
                    361:        
                    362:        byte *dest;
                    363:        int count;
                    364:        fixed_t frac, fracstep;
                    365:                                
                    366: extern byte *ylookup[MAXHEIGHT];
                    367: extern int columnofs[MAXWIDTH];
                    368: 
                    369: #ifdef RANGECHECK
                    370:        if (ds_p - drawsegs > MAXDRAWSEGS)
                    371:                I_Error ("R_DrawPlanes: drawsegs overflow (%i)", ds_p - drawsegs);
                    372:        if (lastvisplane - visplanes > MAXVISPLANES)
                    373:                I_Error ("R_DrawPlanes: visplane overflow (%i)", lastvisplane - visplanes);
                    374:        if (lastopening - openings > MAXOPENINGS)
                    375:                I_Error ("R_DrawPlanes: opening overflow (%i)", lastopening - openings);
                    376: #endif
                    377: 
                    378:        for (pl = visplanes ; pl < lastvisplane ; pl++)
                    379:        {
                    380:                if (pl->minx > pl->maxx)
                    381:                        continue;
                    382:        //
                    383:        // sky flat
                    384:        //
                    385:                if (pl->picnum == skyflatnum)
                    386:                {
                    387:                        dc_iscale = skyiscale;
                    388:                        dc_colormap = colormaps;// sky is allways drawn full bright
                    389:                        dc_texturemid = skytexturemid;
                    390:                        for (x=pl->minx ; x <= pl->maxx ; x++)
                    391:                        {
                    392:                                dc_yl = pl->top[x];
                    393:                                dc_yh = pl->bottom[x];
                    394:                                if (dc_yl <= dc_yh)
                    395:                                {
                    396:                                        angle = (viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT;
                    397:                                        dc_x = x;
                    398:                                        dc_source = R_GetColumn(skytexture, angle);
                    399: 
                    400:                                        count = dc_yh - dc_yl;
                    401:                                        if (count < 0)
                    402:                                                return;
                    403:                                
                    404: #ifdef RANGECHECK
                    405:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
                    406:                I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
                    407: #endif
                    408: 
                    409:                                        dest = ylookup[dc_yl] + columnofs[dc_x]; 
                    410:        
                    411:                                        fracstep = 1;
                    412:                                        frac = (dc_texturemid>>FRACBITS) + (dc_yl-centery);             
                    413:                                        do
                    414:                                        {
                    415:                                                *dest = dc_source[frac];
                    416:                                                dest += SCREENWIDTH;
                    417:                                                frac += fracstep;
                    418:                                        } while (count--);
                    419:        
                    420: //                                     colfunc ();
                    421:                                }
                    422:                        }
                    423:                        continue;
                    424:                }
                    425:                
                    426:        //
                    427:        // regular flat
                    428:        //
                    429:                tempSource = W_CacheLumpNum(firstflat +
                    430:                        flattranslation[pl->picnum], PU_STATIC);
                    431: 
                    432:                switch(pl->special)
                    433:                {
                    434:                        case 25: case 26: case 27: case 28: case 29: // Scroll_North
                    435:                                ds_source = tempSource;
                    436:                                break;
                    437:                        case 20: case 21: case 22: case 23: case 24: // Scroll_East
                    438:                                ds_source = tempSource+((63-((leveltime>>1)&63))<<
                    439:                                        (pl->special-20)&63);
                    440:                                //ds_source = tempSource+((leveltime>>1)&63);
                    441:                                break;
                    442:                        case 30: case 31: case 32: case 33: case 34: // Scroll_South
                    443:                                ds_source = tempSource;
                    444:                                break;
                    445:                        case 35: case 36: case 37: case 38: case 39: // Scroll_West
                    446:                                ds_source = tempSource;
                    447:                                break;
                    448:                        case 4: // Scroll_EastLavaDamage
                    449:                                ds_source = tempSource+(((63-((leveltime>>1)&63))<<3)&63);
                    450:                                break;
                    451:                        default:
                    452:                                ds_source = tempSource;
                    453:                }
                    454:                planeheight = abs(pl->height-viewz);
                    455:                light = (pl->lightlevel >> LIGHTSEGSHIFT)+extralight;
                    456:                if (light >= LIGHTLEVELS)
                    457:                        light = LIGHTLEVELS-1;
                    458:                if (light < 0)
                    459:                        light = 0;
                    460:                planezlight = zlight[light];
                    461: 
                    462:                pl->top[pl->maxx+1] = 0xff;
                    463:                pl->top[pl->minx-1] = 0xff;
                    464:                
                    465:                stop = pl->maxx + 1;
                    466:                for (x=pl->minx ; x<= stop ; x++)
                    467:                        R_MakeSpans (x,pl->top[x-1],pl->bottom[x-1]
                    468:                        ,pl->top[x],pl->bottom[x]);
                    469:                
                    470:                Z_ChangeTag (tempSource, PU_CACHE);
                    471:        }
                    472: }

unix.superglobalmegacorp.com

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