Annotation of doom/r_draw.c, revision 1.1

1.1     ! root        1: // R_draw.c
        !             2: 
        !             3: #include "DoomDef.h"
        !             4: #include "R_local.h"
        !             5: 
        !             6: /*
        !             7: 
        !             8: All drawing to the view buffer is accomplished in this file.  The other refresh
        !             9: files only know about ccordinates, not the architecture of the frame buffer.
        !            10: 
        !            11: */
        !            12: 
        !            13: byte *viewimage;
        !            14: int viewwidth, scaledviewwidth, viewheight, viewwindowx, viewwindowy;
        !            15: byte *ylookup[MAXHEIGHT];
        !            16: int columnofs[MAXWIDTH];
        !            17: byte translations[3][256]; // color tables for different players
        !            18: byte *tinttable; // used for translucent sprites
        !            19: 
        !            20: /*
        !            21: ==================
        !            22: =
        !            23: = R_DrawColumn
        !            24: =
        !            25: = Source is the top of the column to scale
        !            26: =
        !            27: ==================
        !            28: */
        !            29: 
        !            30: lighttable_t   *dc_colormap;
        !            31: int                            dc_x;
        !            32: int                            dc_yl;
        !            33: int                            dc_yh;
        !            34: fixed_t                        dc_iscale;
        !            35: fixed_t                        dc_texturemid;
        !            36: byte                   *dc_source;             // first pixel in a column (possibly virtual)
        !            37: 
        !            38: int                            dccount;                // just for profiling
        !            39: 
        !            40: #ifndef __WATCOMC__
        !            41: #ifndef __i386
        !            42: #ifndef __m68k
        !            43: void R_DrawColumn (void)
        !            44: {
        !            45:        int                     count;
        !            46:        byte            *dest;
        !            47:        fixed_t         frac, fracstep; 
        !            48: 
        !            49:        count = dc_yh - dc_yl;
        !            50:        if (count < 0)
        !            51:                return;
        !            52:                                
        !            53: #ifdef RANGECHECK
        !            54:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
        !            55:                I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
        !            56: #endif
        !            57: 
        !            58:        dest = ylookup[dc_yl] + columnofs[dc_x]; 
        !            59:        
        !            60:        fracstep = dc_iscale;
        !            61:        frac = dc_texturemid + (dc_yl-centery)*fracstep;
        !            62: 
        !            63:        do
        !            64:        {
        !            65:                *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
        !            66:                dest += SCREENWIDTH;
        !            67:                frac += fracstep;
        !            68:        } while (count--);
        !            69: }
        !            70: #endif         // __m68k
        !            71: #endif         // __i386
        !            72: #endif
        !            73: 
        !            74: void R_DrawColumnLow (void)
        !            75: {
        !            76:        int                     count;
        !            77:        byte            *dest;
        !            78:        fixed_t         frac, fracstep; 
        !            79: 
        !            80:        count = dc_yh - dc_yl;
        !            81:        if (count < 0)
        !            82:                return;
        !            83:                                
        !            84: #ifdef RANGECHECK
        !            85:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
        !            86:                I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
        !            87: //     dccount++;
        !            88: #endif
        !            89: 
        !            90:        dest = ylookup[dc_yl] + columnofs[dc_x]; 
        !            91:        
        !            92:        fracstep = dc_iscale;
        !            93:        frac = dc_texturemid + (dc_yl-centery)*fracstep;
        !            94: 
        !            95:        do
        !            96:        {
        !            97:                *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
        !            98:                dest += SCREENWIDTH;
        !            99:                frac += fracstep;
        !           100:        } while (count--);
        !           101: }
        !           102: 
        !           103: 
        !           104: #define FUZZTABLE      50
        !           105: 
        !           106: #define FUZZOFF        (SCREENWIDTH)
        !           107: int            fuzzoffset[FUZZTABLE] = {
        !           108: FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF
        !           109: };
        !           110: int fuzzpos = 0;
        !           111: 
        !           112: void R_DrawFuzzColumn (void)
        !           113: {
        !           114:        int                     count;
        !           115:        byte            *dest;
        !           116:        fixed_t         frac, fracstep; 
        !           117: 
        !           118:        if (!dc_yl)
        !           119:                dc_yl = 1;
        !           120:        if (dc_yh == viewheight-1)
        !           121:                dc_yh = viewheight - 2;
        !           122:                
        !           123:        count = dc_yh - dc_yl;
        !           124:        if (count < 0)
        !           125:                return;
        !           126:                                
        !           127: #ifdef RANGECHECK
        !           128:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
        !           129:                I_Error ("R_DrawFuzzColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
        !           130: #endif
        !           131: 
        !           132:        dest = ylookup[dc_yl] + columnofs[dc_x];
        !           133: 
        !           134:        fracstep = dc_iscale;
        !           135:        frac = dc_texturemid + (dc_yl-centery)*fracstep;
        !           136: 
        !           137: // OLD FUZZY INVISO SPRITE STUFF
        !           138: /*     do
        !           139:        {
        !           140:                *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]];
        !           141:                if (++fuzzpos == FUZZTABLE)
        !           142:                        fuzzpos = 0;
        !           143:                dest += SCREENWIDTH;
        !           144:                frac += fracstep;
        !           145:        } while (count--);
        !           146: */
        !           147: 
        !           148:        do
        !           149:        {
        !           150:                *dest = tinttable[((*dest)<<8)+dc_colormap[dc_source[(frac>>FRACBITS)&127]]];
        !           151: 
        !           152:                //*dest = dest[SCREENWIDTH*10+5];
        !           153: 
        !           154: //             *dest = //tinttable[((*dest)<<8)+colormaps[dc_source[(frac>>FRACBITS)&127]]];
        !           155: 
        !           156: //             *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
        !           157:                dest += SCREENWIDTH;
        !           158:                frac += fracstep;
        !           159:        } while(count--);
        !           160: }
        !           161: 
        !           162: /*
        !           163: ========================
        !           164: =
        !           165: = R_DrawTranslatedColumn
        !           166: =
        !           167: ========================
        !           168: */
        !           169: 
        !           170: byte *dc_translation;
        !           171: byte *translationtables;
        !           172: 
        !           173: void R_DrawTranslatedColumn (void)
        !           174: {
        !           175:        int                     count;
        !           176:        byte            *dest;
        !           177:        fixed_t         frac, fracstep; 
        !           178: 
        !           179:        count = dc_yh - dc_yl;
        !           180:        if (count < 0)
        !           181:                return;
        !           182:                                
        !           183: #ifdef RANGECHECK
        !           184:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
        !           185:                I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
        !           186: #endif
        !           187: 
        !           188:        dest = ylookup[dc_yl] + columnofs[dc_x];
        !           189:        
        !           190:        fracstep = dc_iscale;
        !           191:        frac = dc_texturemid + (dc_yl-centery)*fracstep;
        !           192: 
        !           193:        do
        !           194:        {
        !           195:                *dest = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]];
        !           196:                dest += SCREENWIDTH;
        !           197:                frac += fracstep;
        !           198:        } while (count--);
        !           199: }
        !           200: 
        !           201: void R_DrawTranslatedFuzzColumn (void)
        !           202: {
        !           203:        int                     count;
        !           204:        byte            *dest;
        !           205:        fixed_t         frac, fracstep; 
        !           206: 
        !           207:        count = dc_yh - dc_yl;
        !           208:        if (count < 0)
        !           209:                return;
        !           210:                                
        !           211: #ifdef RANGECHECK
        !           212:        if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
        !           213:                I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
        !           214: #endif
        !           215: 
        !           216:        dest = ylookup[dc_yl] + columnofs[dc_x];
        !           217:        
        !           218:        fracstep = dc_iscale;
        !           219:        frac = dc_texturemid + (dc_yl-centery)*fracstep;
        !           220: 
        !           221:        do
        !           222:        {
        !           223:                *dest = tinttable[((*dest)<<8)
        !           224:                        +dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]];
        !           225:                dest += SCREENWIDTH;
        !           226:                frac += fracstep;
        !           227:        } while (count--);
        !           228: }
        !           229: 
        !           230: //--------------------------------------------------------------------------
        !           231: //
        !           232: // PROC R_InitTranslationTables
        !           233: //
        !           234: //--------------------------------------------------------------------------
        !           235: 
        !           236: void R_InitTranslationTables (void)
        !           237: {
        !           238:        int i;
        !           239: 
        !           240:        // Load tint table
        !           241:        tinttable = W_CacheLumpName("TINTTAB", PU_STATIC);
        !           242: 
        !           243:        // Allocate translation tables
        !           244:        translationtables = Z_Malloc(256*3+255, PU_STATIC, 0);
        !           245:        translationtables = (byte *)(( (int)translationtables + 255 )& ~255);
        !           246: 
        !           247:        // Fill out the translation tables
        !           248:        for(i = 0; i < 256; i++)
        !           249:        {
        !           250:                if(i >= 225 && i <= 240)
        !           251:                {
        !           252:                        translationtables[i] = 114+(i-225); // yellow
        !           253:                        translationtables[i+256] = 145+(i-225); // red
        !           254:                        translationtables[i+512] = 190+(i-225); // blue
        !           255:                }
        !           256:                else
        !           257:                {
        !           258:                        translationtables[i] = translationtables[i+256] 
        !           259:                        = translationtables[i+512] = i;
        !           260:                }
        !           261:        }
        !           262: }
        !           263: 
        !           264: /*
        !           265: ================
        !           266: =
        !           267: = R_DrawSpan
        !           268: =
        !           269: ================
        !           270: */
        !           271: 
        !           272: int                            ds_y;
        !           273: int                            ds_x1;
        !           274: int                            ds_x2;
        !           275: lighttable_t   *ds_colormap;
        !           276: fixed_t                        ds_xfrac;
        !           277: fixed_t                        ds_yfrac;
        !           278: fixed_t                        ds_xstep;
        !           279: fixed_t                        ds_ystep;
        !           280: byte                   *ds_source;             // start of a 64*64 tile image
        !           281: 
        !           282: int                            dscount;                // just for profiling
        !           283: 
        !           284: #ifndef __WATCOMC__
        !           285: #ifndef __i386
        !           286: #ifndef __m68k
        !           287: void R_DrawSpan (void)
        !           288: {
        !           289:        fixed_t         xfrac, yfrac;
        !           290:        byte            *dest;
        !           291:        int                     count, spot;
        !           292:        
        !           293: #ifdef RANGECHECK
        !           294:        if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH 
        !           295:        || (unsigned)ds_y>SCREENHEIGHT)
        !           296:                I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y);
        !           297: //     dscount++;
        !           298: #endif
        !           299:        
        !           300:        xfrac = ds_xfrac;
        !           301:        yfrac = ds_yfrac;
        !           302:        
        !           303:        dest = ylookup[ds_y] + columnofs[ds_x1];        
        !           304:        count = ds_x2 - ds_x1;
        !           305:        do
        !           306:        {
        !           307:                spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63);
        !           308:                *dest++ = ds_colormap[ds_source[spot]];
        !           309:                xfrac += ds_xstep;
        !           310:                yfrac += ds_ystep;
        !           311:        } while (count--);
        !           312: }
        !           313: #endif
        !           314: #endif
        !           315: #endif
        !           316: 
        !           317: void R_DrawSpanLow (void)
        !           318: {
        !           319:        fixed_t         xfrac, yfrac;
        !           320:        byte            *dest;
        !           321:        int                     count, spot;
        !           322:        
        !           323: #ifdef RANGECHECK
        !           324:        if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH 
        !           325:        || (unsigned)ds_y>SCREENHEIGHT)
        !           326:                I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y);
        !           327: //     dscount++;
        !           328: #endif
        !           329:        
        !           330:        xfrac = ds_xfrac;
        !           331:        yfrac = ds_yfrac;
        !           332:        
        !           333:        dest = ylookup[ds_y] + columnofs[ds_x1];        
        !           334:        count = ds_x2 - ds_x1;
        !           335:        do
        !           336:        {
        !           337:                spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63);
        !           338:                *dest++ = ds_colormap[ds_source[spot]];
        !           339:                xfrac += ds_xstep;
        !           340:                yfrac += ds_ystep;
        !           341:        } while (count--);
        !           342: }
        !           343: 
        !           344: 
        !           345: 
        !           346: /*
        !           347: ================
        !           348: =
        !           349: = R_InitBuffer
        !           350: =
        !           351: =================
        !           352: */
        !           353: 
        !           354: void R_InitBuffer (int width, int height)
        !           355: {
        !           356:        int             i;
        !           357:        
        !           358:        viewwindowx = (SCREENWIDTH-width) >> 1;
        !           359:        for (i=0 ; i<width ; i++)
        !           360:                columnofs[i] = viewwindowx + i;
        !           361:        if (width == SCREENWIDTH)
        !           362:                viewwindowy = 0;
        !           363:        else
        !           364:                viewwindowy = (SCREENHEIGHT-SBARHEIGHT-height) >> 1;
        !           365:        for (i=0 ; i<height ; i++)
        !           366:                ylookup[i] = screen + (i+viewwindowy)*SCREENWIDTH;
        !           367: }
        !           368: 
        !           369: 
        !           370: /*
        !           371: ==================
        !           372: =
        !           373: = R_DrawViewBorder
        !           374: =
        !           375: = Draws the border around the view for different size windows
        !           376: ==================
        !           377: */
        !           378: 
        !           379: boolean BorderNeedRefresh;
        !           380: 
        !           381: void R_DrawViewBorder (void)
        !           382: {
        !           383:        byte    *src, *dest;
        !           384:        int             x,y;
        !           385:        
        !           386:        if (scaledviewwidth == SCREENWIDTH)
        !           387:                return;
        !           388: 
        !           389:        if(shareware)
        !           390:        {
        !           391:                src = W_CacheLumpName ("FLOOR04", PU_CACHE);
        !           392:        }
        !           393:        else
        !           394:        {
        !           395:                src = W_CacheLumpName ("FLAT513", PU_CACHE);
        !           396:        }
        !           397:        dest = screen;
        !           398:        
        !           399:        for (y=0 ; y<SCREENHEIGHT-SBARHEIGHT ; y++)
        !           400:        {
        !           401:                for (x=0 ; x<SCREENWIDTH/64 ; x++)
        !           402:                {
        !           403:                        memcpy (dest, src+((y&63)<<6), 64);
        !           404:                        dest += 64;
        !           405:                }
        !           406:                if (SCREENWIDTH&63)
        !           407:                {
        !           408:                        memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
        !           409:                        dest += (SCREENWIDTH&63);
        !           410:                }
        !           411:        }
        !           412:        for(x=viewwindowx; x < viewwindowx+viewwidth; x += 16)
        !           413:        {
        !           414:                V_DrawPatch(x, viewwindowy-4, W_CacheLumpName("bordt", PU_CACHE));
        !           415:                V_DrawPatch(x, viewwindowy+viewheight, W_CacheLumpName("bordb", 
        !           416:                        PU_CACHE));
        !           417:        }
        !           418:        for(y=viewwindowy; y < viewwindowy+viewheight; y += 16)
        !           419:        {
        !           420:                V_DrawPatch(viewwindowx-4, y, W_CacheLumpName("bordl", PU_CACHE));
        !           421:                V_DrawPatch(viewwindowx+viewwidth, y, W_CacheLumpName("bordr", 
        !           422:                        PU_CACHE));
        !           423:        }
        !           424:        V_DrawPatch(viewwindowx-4, viewwindowy-4, W_CacheLumpName("bordtl", 
        !           425:                PU_CACHE));
        !           426:        V_DrawPatch(viewwindowx+viewwidth, viewwindowy-4, 
        !           427:                W_CacheLumpName("bordtr", PU_CACHE));
        !           428:        V_DrawPatch(viewwindowx+viewwidth, viewwindowy+viewheight, 
        !           429:                W_CacheLumpName("bordbr", PU_CACHE));
        !           430:        V_DrawPatch(viewwindowx-4, viewwindowy+viewheight, 
        !           431:                W_CacheLumpName("bordbl", PU_CACHE));
        !           432: }
        !           433: 
        !           434: /*
        !           435: ==================
        !           436: =
        !           437: = R_DrawTopBorder
        !           438: =
        !           439: = Draws the top border around the view for different size windows
        !           440: ==================
        !           441: */
        !           442: 
        !           443: boolean BorderTopRefresh;
        !           444: 
        !           445: void R_DrawTopBorder (void)
        !           446: {
        !           447:        byte    *src, *dest;
        !           448:        int             x,y;
        !           449:        
        !           450:        if (scaledviewwidth == SCREENWIDTH)
        !           451:                return;
        !           452: 
        !           453:        if(shareware)
        !           454:        {
        !           455:                src = W_CacheLumpName ("FLOOR04", PU_CACHE);
        !           456:        }
        !           457:        else
        !           458:        {
        !           459:                src = W_CacheLumpName ("FLAT513", PU_CACHE);
        !           460:        }
        !           461:        dest = screen;
        !           462:        
        !           463:        for (y=0 ; y<30 ; y++)
        !           464:        {
        !           465:                for (x=0 ; x<SCREENWIDTH/64 ; x++)
        !           466:                {
        !           467:                        memcpy (dest, src+((y&63)<<6), 64);
        !           468:                        dest += 64;
        !           469:                }
        !           470:                if (SCREENWIDTH&63)
        !           471:                {
        !           472:                        memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
        !           473:                        dest += (SCREENWIDTH&63);
        !           474:                }
        !           475:        }
        !           476:        if(viewwindowy < 25)
        !           477:        {
        !           478:                for(x=viewwindowx; x < viewwindowx+viewwidth; x += 16)
        !           479:                {
        !           480:                        V_DrawPatch(x, viewwindowy-4, W_CacheLumpName("bordt", PU_CACHE));
        !           481:                }
        !           482:                V_DrawPatch(viewwindowx-4, viewwindowy, W_CacheLumpName("bordl", 
        !           483:                        PU_CACHE));
        !           484:                V_DrawPatch(viewwindowx+viewwidth, viewwindowy, 
        !           485:                        W_CacheLumpName("bordr", PU_CACHE));
        !           486:                V_DrawPatch(viewwindowx-4, viewwindowy+16, W_CacheLumpName("bordl", 
        !           487:                        PU_CACHE));
        !           488:                V_DrawPatch(viewwindowx+viewwidth, viewwindowy+16, 
        !           489:                        W_CacheLumpName("bordr", PU_CACHE));
        !           490: 
        !           491:                V_DrawPatch(viewwindowx-4, viewwindowy-4, W_CacheLumpName("bordtl", 
        !           492:                        PU_CACHE));
        !           493:                V_DrawPatch(viewwindowx+viewwidth, viewwindowy-4, 
        !           494:                        W_CacheLumpName("bordtr", PU_CACHE));
        !           495:        }
        !           496: }
        !           497: 
        !           498: 

unix.superglobalmegacorp.com

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