Annotation of doom/r_main.c, revision 1.1

1.1     ! root        1: /* r_main.c */
        !             2: 
        !             3: #include "doomdef.h"
        !             4: #include "r_local.h"
        !             5: 
        !             6: /*===================================== */
        !             7: 
        !             8: /* */
        !             9: /* subsectors */
        !            10: /* */
        !            11: subsector_t            *vissubsectors[MAXVISSSEC], **lastvissubsector;
        !            12: 
        !            13: /* */
        !            14: /* walls */
        !            15: /* */
        !            16: viswall_t      viswalls[MAXWALLCMDS], *lastwallcmd;
        !            17: 
        !            18: /* */
        !            19: /* planes */
        !            20: /* */
        !            21: visplane_t     visplanes[MAXVISPLANES], *lastvisplane;
        !            22: 
        !            23: /* */
        !            24: /* sprites */
        !            25: /* */
        !            26: vissprite_t    vissprites[MAXVISSPRITES], *lastsprite_p, *vissprite_p;
        !            27: 
        !            28: /* */
        !            29: /* openings / misc refresh memory */
        !            30: /* */
        !            31: unsigned short openings[MAXOPENINGS], *lastopening;
        !            32: 
        !            33: 
        !            34: /*===================================== */
        !            35: 
        !            36: boolean                phase1completed;
        !            37: 
        !            38: pixel_t                *workingscreen;
        !            39: 
        !            40: 
        !            41: fixed_t                viewx, viewy, viewz;
        !            42: angle_t                viewangle;
        !            43: fixed_t                viewcos, viewsin;
        !            44: player_t       *viewplayer;
        !            45: 
        !            46: int                    validcount = 1;         /* increment every time a check is made */
        !            47: int                    framecount;             /* incremented every frame */
        !            48: 
        !            49: 
        !            50: boolean                fixedcolormap;
        !            51: 
        !            52: int                    lightlevel;                     /* fixed light level */
        !            53: int                    extralight;                     /* bumped light from gun blasts */
        !            54: 
        !            55: /* */
        !            56: /* sky mapping */
        !            57: /* */
        !            58: int                    skytexture;
        !            59: 
        !            60: 
        !            61: /* */
        !            62: /* precalculated math */
        !            63: /* */
        !            64: angle_t                clipangle,doubleclipangle;
        !            65: fixed_t                *finecosine = &finesine[FINEANGLES/4];
        !            66: 
        !            67: /*
        !            68: ===============================================================================
        !            69: =
        !            70: = R_PointToAngle
        !            71: =
        !            72: ===============================================================================
        !            73: */
        !            74: 
        !            75: 
        !            76: extern int     tantoangle[SLOPERANGE+1];
        !            77: 
        !            78: int SlopeDiv (unsigned num, unsigned den)
        !            79: {
        !            80:        unsigned ans;
        !            81:        if (den < 512)
        !            82:                return SLOPERANGE;
        !            83:        ans = (num<<3)/(den>>8);
        !            84:        return ans <= SLOPERANGE ? ans : SLOPERANGE;
        !            85: }
        !            86: 
        !            87: angle_t R_PointToAngle2 (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2)
        !            88: {      
        !            89:        int             x;
        !            90:        int             y;
        !            91:        
        !            92:        x = x2 - x1;
        !            93:        y = y2 - y1;
        !            94:        
        !            95:        if ( (!x) && (!y) )
        !            96:                return 0;
        !            97:        if (x>= 0)
        !            98:        {       /* x >=0 */
        !            99:                if (y>= 0)
        !           100:                {       /* y>= 0 */
        !           101:                        if (x>y)
        !           102:                                return tantoangle[ SlopeDiv(y,x)];     /* octant 0 */
        !           103:                        else
        !           104:                                return ANG90-1-tantoangle[ SlopeDiv(x,y)];  /* octant 1 */
        !           105:                }
        !           106:                else
        !           107:                {       /* y<0 */
        !           108:                        y = -y;
        !           109:                        if (x>y)
        !           110:                                return -tantoangle[SlopeDiv(y,x)];  /* octant 8 */
        !           111:                        else
        !           112:                                return ANG270+tantoangle[ SlopeDiv(x,y)];  /* octant 7 */
        !           113:                }
        !           114:        }
        !           115:        else
        !           116:        {       /* x<0 */
        !           117:                x = -x;
        !           118:                if (y>= 0)
        !           119:                {       /* y>= 0 */
        !           120:                        if (x>y)
        !           121:                                return ANG180-1-tantoangle[ SlopeDiv(y,x)]; /* octant 3 */
        !           122:                        else
        !           123:                                return ANG90+ tantoangle[ SlopeDiv(x,y)];  /* octant 2 */
        !           124:                }
        !           125:                else
        !           126:                {       /* y<0 */
        !           127:                        y = -y;
        !           128:                        if (x>y)
        !           129:                                return ANG180+tantoangle[ SlopeDiv(y,x)];  /* octant 4 */
        !           130:                        else
        !           131:                                return ANG270-1-tantoangle[ SlopeDiv(x,y)];  /* octant 5 */
        !           132:                }
        !           133:        }       
        !           134: #ifndef LCC    
        !           135:        return 0;
        !           136: #endif
        !           137: }
        !           138: 
        !           139: 
        !           140: /*
        !           141: ===============================================================================
        !           142: =
        !           143: = R_PointOnSide
        !           144: =
        !           145: = Returns side 0 (front) or 1 (back)
        !           146: ===============================================================================
        !           147: */
        !           148: 
        !           149: static int     R_PointOnSide (int x, int y, node_t *node)
        !           150: {
        !           151:        fixed_t dx,dy;
        !           152:        fixed_t left, right;
        !           153: 
        !           154:        if (!node->dx)
        !           155:        {
        !           156:                if (x <= node->x)
        !           157:                        return node->dy > 0;
        !           158:                return node->dy < 0;
        !           159:        }
        !           160:        if (!node->dy)
        !           161:        {
        !           162:                if (y <= node->y)
        !           163:                        return node->dx < 0;
        !           164:                return node->dx > 0;
        !           165:        }
        !           166:        
        !           167:        dx = (x - node->x);
        !           168:        dy = (y - node->y);
        !           169:        
        !           170:        left = (node->dy>>16) * (dx>>16);
        !           171:        right = (dy>>16) * (node->dx>>16);
        !           172:        
        !           173:        if (right < left)
        !           174:                return 0;               /* front side */
        !           175:        return 1;                       /* back side */
        !           176: }
        !           177: 
        !           178: 
        !           179: 
        !           180: /*
        !           181: ==============
        !           182: =
        !           183: = R_PointInSubsector
        !           184: =
        !           185: ==============
        !           186: */
        !           187: 
        !           188: struct subsector_s *R_PointInSubsector (fixed_t x, fixed_t y)
        !           189: {
        !           190:        node_t  *node;
        !           191:        int             side, nodenum;
        !           192:        
        !           193:        if (!numnodes)                          /* single subsector is a special case */
        !           194:                return subsectors;
        !           195:                
        !           196:        nodenum = numnodes-1;
        !           197: 
        !           198:        while (! (nodenum & NF_SUBSECTOR) )
        !           199:        {
        !           200:                node = &nodes[nodenum];
        !           201:                side = R_PointOnSide (x, y, node);
        !           202:                nodenum = node->children[side];
        !           203:        }
        !           204:        
        !           205:        return &subsectors[nodenum & ~NF_SUBSECTOR];
        !           206:        
        !           207: }
        !           208: 
        !           209: /*============================================================================= */
        !           210: 
        !           211: 
        !           212: /*
        !           213: ==============
        !           214: =
        !           215: = R_Init
        !           216: =
        !           217: ==============
        !           218: */
        !           219: 
        !           220: void R_Init (void)
        !           221: {
        !           222: D_printf ("R_InitData\n");
        !           223:        R_InitData ();
        !           224: D_printf ("Done\n");
        !           225: 
        !           226:        clipangle = xtoviewangle[0];
        !           227:        doubleclipangle = clipangle*2;
        !           228:        
        !           229:        framecount = 0;
        !           230:        viewplayer = &players[0];
        !           231: }
        !           232: 
        !           233: /*============================================================================= */
        !           234: 
        !           235: extern int ticsinframe;
        !           236: 
        !           237: extern int checkpostics, shoottics;
        !           238: extern int lasttics;
        !           239: 
        !           240: extern int     playertics, thinkertics, sighttics, basetics, latetics;
        !           241: extern int     tictics;
        !           242: 
        !           243: extern int             soundtics;
        !           244: 
        !           245: /*
        !           246: ===================
        !           247: =
        !           248: = R_DebugScreen
        !           249: =
        !           250: ===================
        !           251: */
        !           252: 
        !           253: void R_DebugScreen (void)
        !           254: {
        !           255: #ifdef JAGUAR
        !           256: 
        !           257: #if 1
        !           258:        PrintNumber (15,1, vblsinframe);
        !           259: 
        !           260:        PrintNumber (15,2, phasetime[8] - phasetime[0]);
        !           261:        PrintNumber (15,3, tictics);
        !           262:        PrintNumber (15,4, soundtics);
        !           263: #endif
        !           264: 
        !           265: #if 1
        !           266:        PrintNumber (15,6, playertics);
        !           267:        PrintNumber (15,7, thinkertics);
        !           268:        PrintNumber (15,8, sighttics);
        !           269:        PrintNumber (15,9, basetics);
        !           270:        PrintNumber (15,10, latetics);
        !           271: #endif
        !           272: 
        !           273: #if 0
        !           274:        int     i;
        !           275:        
        !           276:        PrintNumber (15,1, phasetime[8] - phasetime[0]);
        !           277:        for (i=0 ; i < 8 ; i++)
        !           278:                PrintNumber (15,3+i,phasetime[i+1]-phasetime[i]);
        !           279: #endif
        !           280: 
        !           281: 
        !           282: #endif
        !           283: 
        !           284: }
        !           285: /*============================================================================= */
        !           286: 
        !           287: int    shadepixel;
        !           288: extern int     workpage;
        !           289: extern pixel_t *screens[2];    /* [SCREENWIDTH*SCREENHEIGHT];  */
        !           290: 
        !           291: /*
        !           292: ==================
        !           293: =
        !           294: = R_Setup
        !           295: =
        !           296: ==================
        !           297: */
        !           298: 
        !           299: void R_Setup (void)
        !           300: {
        !           301:        int             damagecount, bonuscount;
        !           302:        player_t *player;
        !           303:        int             shadex, shadey, shadei;
        !           304:        
        !           305: /* */
        !           306: /* set up globals for new frame */
        !           307: /* */
        !           308:        workingscreen = screens[workpage];
        !           309: 
        !           310: #ifdef JAGUAR  
        !           311:        *(pixel_t  **)0xf02224 = workingscreen; /* a2 base pointer */
        !           312:        *(int *)0xf02234 = 0x10000;                             /* a2 outer loop add (+1 y) */
        !           313:        *(int *)0xf0226c = *(int *)0xf02268 = 0;                /* pattern compare */
        !           314: #endif
        !           315: 
        !           316:        framecount++;   
        !           317:        validcount++;
        !           318:                
        !           319:        viewplayer = player = &players[displayplayer];
        !           320:        viewx = player->mo->x;
        !           321:        viewy = player->mo->y;
        !           322:        viewz = player->viewz;
        !           323:        viewangle = player->mo->angle;
        !           324: 
        !           325:        viewsin = finesine[viewangle>>ANGLETOFINESHIFT];
        !           326:        viewcos = finecosine[viewangle>>ANGLETOFINESHIFT];
        !           327:                
        !           328:        extralight = player->extralight << 6;
        !           329:        fixedcolormap = player->fixedcolormap;
        !           330:                
        !           331: /* */
        !           332: /* calc shadepixel */
        !           333: /* */
        !           334:        player = &players[consoleplayer];
        !           335: 
        !           336:        damagecount = player->damagecount;
        !           337:        bonuscount = player->bonuscount;
        !           338:        
        !           339:        if (damagecount)
        !           340:                damagecount += 10;
        !           341:        if (bonuscount)
        !           342:                bonuscount += 2;
        !           343:        damagecount >>= 2;
        !           344:        shadex = (bonuscount>>1) + damagecount;
        !           345:        shadey = (bonuscount>>1) - damagecount;
        !           346:        shadei = (bonuscount + damagecount)<<2;
        !           347: 
        !           348:        shadei += player->extralight<<3;
        !           349: 
        !           350: /* */
        !           351: /* pwerups */
        !           352: /* */
        !           353:        if (player->powers[pw_invulnerability] > 60
        !           354:        || (player->powers[pw_invulnerability]&4) )
        !           355:        {
        !           356:                shadex -= 8;
        !           357:                shadei += 32;
        !           358:        }
        !           359: 
        !           360:        if (player->powers[pw_ironfeet] > 60
        !           361:        || (player->powers[pw_ironfeet]&4) )
        !           362:                shadey += 7;
        !           363: 
        !           364:        if (player->powers[pw_strength] 
        !           365:        && (player->powers[pw_strength]< 64) )
        !           366:                shadex += (8 - (player->powers[pw_strength]>>3) );
        !           367: 
        !           368: 
        !           369: /* */
        !           370: /* bound and store shades */
        !           371: /* */
        !           372:        if (shadex > 7)
        !           373:                shadex = 7;
        !           374:        else if (shadex < -8)
        !           375:                shadex = -8;
        !           376:        if (shadey > 7)
        !           377:                shadey = 7;
        !           378:        else if (shadey < -8)
        !           379:                shadey = -8;
        !           380:        if (shadei > 127)
        !           381:                shadei = 127;
        !           382:        else if (shadei < -128)
        !           383:                shadei = -128;
        !           384:                
        !           385:        shadepixel = ((shadex<<12)&0xf000) + ((shadey<<8)&0xf00) + (shadei&0xff);
        !           386: 
        !           387: 
        !           388: /* */
        !           389: /* plane filling */
        !           390: /*      */
        !           391:        lastvisplane = visplanes+1;             /* visplanes[0] is left empty */
        !           392:        lastwallcmd = viswalls;                 /* no walls added yet */
        !           393:        lastvissubsector = vissubsectors;       /* no subsectors visible yet */
        !           394:        
        !           395: /*      */
        !           396: /* clear sprites */
        !           397: /* */
        !           398:        vissprite_p = vissprites;
        !           399:        lastopening = openings;
        !           400: 
        !           401:        phasetime[0] = samplecount;
        !           402: }
        !           403: 
        !           404: 
        !           405: void R_BSP (void);
        !           406: void R_WallPrep (void);
        !           407: void R_SpritePrep (void);
        !           408: boolean R_LatePrep (void);
        !           409: void R_Cache (void);
        !           410: void R_SegCommands (void);
        !           411: void R_DrawPlanes (void);
        !           412: void R_Sprites (void);
        !           413: void R_Update (void);
        !           414: 
        !           415: 
        !           416: /*
        !           417: ==============
        !           418: =
        !           419: = R_RenderView
        !           420: =
        !           421: ==============
        !           422: */
        !           423: 
        !           424: int            phasetime[9] = {1,2,3,4,5,6,7,8,9};
        !           425: 
        !           426: extern ref1_start;
        !           427: extern ref2_start;
        !           428: extern ref3_start;
        !           429: extern ref4_start;
        !           430: extern ref5_start;
        !           431: extern ref6_start;
        !           432: extern ref7_start;
        !           433: extern ref8_start;
        !           434: 
        !           435: 
        !           436: extern boolean debugscreenactive;
        !           437: 
        !           438: void R_RenderPlayerView (void)
        !           439: {
        !           440: 
        !           441: /* make sure its done now */
        !           442: #ifdef JAGUAR
        !           443:        while (!I_RefreshCompleted ())
        !           444:        ;
        !           445: #endif
        !           446: 
        !           447: /* */
        !           448: /* initial setup */
        !           449: /* */
        !           450:        if (debugscreenactive)
        !           451:                R_DebugScreen ();
        !           452: 
        !           453:        R_Setup ();
        !           454: 
        !           455: #ifndef JAGUAR
        !           456:        R_BSP ();
        !           457:        R_WallPrep ();
        !           458:        R_SpritePrep ();
        !           459: /* the rest of the refresh can be run in parallel with the next game tic */
        !           460:        if (R_LatePrep ())
        !           461:                R_Cache ();
        !           462:        R_SegCommands ();
        !           463:        R_DrawPlanes ();
        !           464:        R_Sprites ();
        !           465:        R_Update ();
        !           466: #else
        !           467: 
        !           468: /* start the gpu running the refresh */
        !           469:        phasetime[1] = 0;       
        !           470:        phasetime[2] = 0;       
        !           471:        phasetime[3] = 0;       
        !           472:        phasetime[4] = 0;       
        !           473:        phasetime[5] = 0;       
        !           474:        phasetime[6] = 0;       
        !           475:        phasetime[7] = 0;       
        !           476:        phasetime[8] = 0;       
        !           477:        gpufinished = zero;
        !           478:        gpucodestart = (int)&ref1_start;
        !           479: 
        !           480: #if 0
        !           481:        while (!I_RefreshCompleted () )
        !           482:        ;               /* wait for refresh to latch all needed data before */
        !           483:                        /* running the next tick */
        !           484: #endif
        !           485: 
        !           486: #endif
        !           487: }
        !           488: 

unix.superglobalmegacorp.com

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