⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_main.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
    int                 angleb;    int                 sinea;    int                 sineb;    fixed_t             num;    int                 den;    anglea = ANG90 + (visangle-viewangle);    angleb = ANG90 + (visangle-rw_normalangle);    // both sines are allways positive    sinea = finesine[anglea>>ANGLETOFINESHIFT];    sineb = finesine[angleb>>ANGLETOFINESHIFT];    //added:02-02-98:now uses projectiony instead of projection for    //               correct aspect ratio!    num = FixedMul(projectiony,sineb)<<detailshift;    den = FixedMul(rw_distance,sinea);    if (den > num>>16)    {        scale = FixedDiv (num, den);        if (scale > 64*FRACUNIT)            scale = 64*FRACUNIT;        else if (scale < 256)            scale = 256;    }    else        scale = 64*FRACUNIT;    return scale;#endif}//// R_InitTables//void R_InitTables (void){    // UNUSED: now getting from tables.c#if 0    int         i;    float       a;    float       fv;    int         t;    // viewangle tangent table    for (i=0 ; i<FINEANGLES/2 ; i++)    {        a = (i-FINEANGLES/4+0.5)*PI*2/FINEANGLES;        fv = FRACUNIT*tan (a);        t = fv;        finetangent[i] = t;    }    // finesine table    for (i=0 ; i<5*FINEANGLES/4 ; i++)    {        // OPTIMIZE: mirror...        a = (i+0.5)*PI*2/FINEANGLES;        t = FRACUNIT*sin (a);        finesine[i] = t;    }#endif}// consvar_t cv_fov = {"fov","2048", CV_CALL | CV_NOINIT, NULL, R_ExecuteSetViewSize};//// R_InitTextureMapping//void R_InitTextureMapping (void){    int                 i;    int                 x;    int                 t;    fixed_t             focallength;    // Use tangent table to generate viewangletox:    //  viewangletox will give the next greatest x    //  after the view angle.    //    // Calc focallength    //  so FIELDOFVIEW angles covers SCREENWIDTH.    focallength = FixedDiv (centerxfrac,                            finetangent[FINEANGLES/4+/*cv_fov.value*/ FIELDOFVIEW/2] );    for (i=0 ; i<FINEANGLES/2 ; i++)    {        if (finetangent[i] > FRACUNIT*2)            t = -1;        else if (finetangent[i] < -FRACUNIT*2)            t = viewwidth+1;        else        {            t = FixedMul (finetangent[i], focallength);            t = (centerxfrac - t+FRACUNIT-1)>>FRACBITS;            if (t < -1)                t = -1;            else if (t>viewwidth+1)                t = viewwidth+1;        }        viewangletox[i] = t;    }    // Scan viewangletox[] to generate xtoviewangle[]:    //  xtoviewangle will give the smallest view angle    //  that maps to x.    for (x=0;x<=viewwidth;x++)    {        i = 0;        while (viewangletox[i]>x)            i++;        xtoviewangle[x] = (i<<ANGLETOFINESHIFT)-ANG90;    }    // Take out the fencepost cases from viewangletox.    for (i=0 ; i<FINEANGLES/2 ; i++)    {        t = FixedMul (finetangent[i], focallength);        t = centerx - t;        if (viewangletox[i] == -1)            viewangletox[i] = 0;        else if (viewangletox[i] == viewwidth+1)            viewangletox[i]  = viewwidth;    }    clipangle = xtoviewangle[0];}//// R_InitLightTables// Only inits the zlight table,//  because the scalelight table changes with view size.//#define DISTMAP         2void R_InitLightTables (void){    int         i;    int         j;    int         level;    int         startmap;    int         scale;    // Calculate the light levels to use    //  for each level / distance combination.    for (i=0 ; i< LIGHTLEVELS ; i++)    {        startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;        for (j=0 ; j<MAXLIGHTZ ; j++)        {            //added:02-02-98:use BASEVIDWIDTH, vid.width is not set already,            // and it seems it needs to be calculated only once.            scale = FixedDiv ((BASEVIDWIDTH/2*FRACUNIT), (j+1)<<LIGHTZSHIFT);            scale >>= LIGHTSCALESHIFT;            level = startmap - scale/DISTMAP;            if (level < 0)                level = 0;            if (level >= NUMCOLORMAPS)                level = NUMCOLORMAPS-1;            zlight[i][j] = colormaps + level*256;        }    }}//// R_SetViewSize// Do not really change anything here,//  because it might be in the middle of a refresh.// The change will take effect next refresh.//boolean         setsizeneeded;void R_SetViewSize (void){    setsizeneeded = true;}//// R_ExecuteSetViewSize//// now uses screen variables cv_viewsize, cv_detaillevel//void R_ExecuteSetViewSize (void){    fixed_t     cosadj;    fixed_t     dy;    int         i;    int         j;    int         level;    int         startmap;    int         setdetail;    int         aspectx;  //added:02-02-98:for aspect ratio calc. below...    setsizeneeded = false;    // no reduced view in splitscreen mode    if( cv_splitscreen.value && cv_viewsize.value < 11 )        CV_SetValue (&cv_viewsize, 11);    // added by Hurdler#ifdef __WIN32__    if ((rendermode!=render_soft) && (cv_viewsize.value < 6))        CV_SetValue (&cv_viewsize, 6);#endif    setdetail = cv_detaillevel.value;        // status bar overlay at viewsize 11    st_overlay = (cv_viewsize.value==11);    // clamp detail level (actually ignore it, keep it for later who knows)    if (setdetail)    {        setdetail = 0;        CONS_Printf ("lower detail mode n.a.\n");        CV_SetValue (&cv_detaillevel,setdetail);    }    stbarheight = gamemode == heretic ? SBARHEIGHT : ST_HEIGHT;         if( cv_scalestatusbar.value || cv_viewsize.value>=11)        stbarheight *= vid.dupy;    //added 01-01-98: full screen view, without statusbar    if (cv_viewsize.value > 10)    {        scaledviewwidth = vid.width;        viewheight = vid.height;    }    else    {        //added 01-01-98: always a multiple of eight        scaledviewwidth = (cv_viewsize.value*vid.width/10)&~7;        //added:05-02-98: make viewheight multiple of 2 because sometimes        //                a line is not refreshed by R_DrawViewBorder()        viewheight = (cv_viewsize.value*(vid.height-stbarheight)/10)&~1;    }    // added 16-6-98:splitscreen    if( cv_splitscreen.value )        viewheight >>= 1;    detailshift = setdetail;    viewwidth = scaledviewwidth>>detailshift;    centery = viewheight/2;    centerx = viewwidth/2;    centerxfrac = centerx<<FRACBITS;    centeryfrac = centery<<FRACBITS;    //added:01-02-98:aspect ratio is now correct, added an 'projectiony'    //      since the scale is not always the same between horiz. & vert.    projection  = centerxfrac;    projectiony = (((vid.height*centerx*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width)<<FRACBITS;    //    // no more low detail mode, it used to setup the right drawer routines    // for either detail mode here    //    // if (!detailshift) ... else ...    R_InitViewBuffer (scaledviewwidth, viewheight);    R_InitTextureMapping ();#ifdef HWRENDER // not win32 only 19990829 by Kin    if (rendermode != render_soft)        HWR_InitTextureMapping ();#endif    // psprite scales    centerypsp = viewheight/2;  //added:06-02-98:psprite pos for freelook    pspritescale  = (viewwidth<<FRACBITS)/BASEVIDWIDTH;    pspriteiscale = (BASEVIDWIDTH<<FRACBITS)/viewwidth;   // x axis scale    //added:02-02-98:now aspect ratio correct for psprites    pspriteyscale = (((vid.height*viewwidth)/vid.width)<<FRACBITS)/BASEVIDHEIGHT;    // thing clipping    for (i=0 ; i<viewwidth ; i++)        screenheightarray[i] = viewheight;    // setup sky scaling for old/new skies (uses pspriteyscale)    R_SetSkyScale ();    // planes    //added:02-02-98:now correct aspect ratio!    aspectx = (((vid.height*centerx*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width);    if ( rendermode == render_soft ) {        // this is only used for planes rendering in software mode        j = viewheight*4;        for (i=0 ; i<j ; i++)        {            //added:10-02-98:(i-centery) became (i-centery*2) and centery*2=viewheight            dy = ((i-viewheight*2)<<FRACBITS)+FRACUNIT/2;            dy = abs(dy);            yslopetab[i] = FixedDiv (aspectx*FRACUNIT, dy);        }    }    for (i=0 ; i<viewwidth ; i++)    {        cosadj = abs(finecosine[xtoviewangle[i]>>ANGLETOFINESHIFT]);        distscale[i] = FixedDiv (FRACUNIT,cosadj);    }    // Calculate the light levels to use    //  for each level / scale combination.    for (i=0 ; i< LIGHTLEVELS ; i++)    {        startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;        for (j=0 ; j<MAXLIGHTSCALE ; j++)        {            level = startmap - j*vid.width/(viewwidth<<detailshift)/DISTMAP;            if (level < 0)                level = 0;            if (level >= NUMCOLORMAPS)                level = NUMCOLORMAPS-1;            scalelight[i][j] = colormaps + level*256;        }    }    //faB: continue to do the software setviewsize as long as we use    //     the reference software view#ifdef HWRENDER // not win32 only 19990829 by Kin    if (rendermode!=render_soft)        HWR_SetViewSize (cv_viewsize.value);#endif    st_recalc = true;    am_recalc = true;}//// R_Init//void R_Init (void){    //added:24-01-98: screensize independent    if(devparm)        CONS_Printf ("\nR_InitData");    R_InitData ();    if(devparm)        CONS_Printf ("\nR_InitPointToAngle");    R_InitPointToAngle ();    if(devparm)        CONS_Printf ("\nR_InitTables");    R_InitTables ();    R_InitViewBorder ();        R_SetViewSize ();   // setsizeneeded is set true    if(devparm)        CONS_Printf ("\nR_InitPlanes");    R_InitPlanes ();    //added:02-02-98: this is now done by SCR_Recalc() at the first mode set    if(devparm)        CONS_Printf ("\nR_InitLightTables");    R_InitLightTables ();    if(devparm)        CONS_Printf ("\nR_InitSkyMap");    R_InitSkyMap ();    if(devparm)        CONS_Printf ("\nR_InitTranslationsTables");    R_InitTranslationTables ();    R_InitDrawNodes();    framecount = 0;}//// R_PointInSubsector//subsector_t* R_PointInSubsector ( fixed_t       x,                                  fixed_t       y ){    node_t*     node;    int         side;    int         nodenum;    // single subsector is a special case    if (!numnodes)        return subsectors;    nodenum = numnodes-1;    while (! (nodenum & NF_SUBSECTOR) )    {        node = &nodes[nodenum];        side = R_PointOnSide (x, y, node);        nodenum = node->children[side];    }    return &subsectors[nodenum & ~NF_SUBSECTOR];}//// R_IsPointInSubsector, same of above but return 0 if not in subsector//subsector_t* R_IsPointInSubsector ( fixed_t       x,                                    fixed_t       y ){    node_t*     node;    int         side;    int         nodenum,i;    subsector_t *ret;    // single subsector is a special case    if (!numnodes)        return subsectors;    nodenum = numnodes-1;    while (! (nodenum & NF_SUBSECTOR) )    {        node = &nodes[nodenum];        side = R_PointOnSide (x, y, node);        nodenum = node->children[side];    }    ret=&subsectors[nodenum & ~NF_SUBSECTOR];    for(i=0;i<ret->numlines;i++)    {        if(R_PointOnSegSide(x,y,&segs[ret->firstline+i]))            return 0;    }    return ret;}//// R_SetupFrame//mobj_t*   viewmobj;void P_ResetCamera (player_t *player);// WARNING : a should be unsigned but to add with 2048, it isn't !#define AIMINGTODY(a) ((finetangent[(2048+(((int)a)>>ANGLETOFINESHIFT)) & FINEMASK]*160)>>FRACBITS)void R_SetupFrame (player_t* player){    int         i;    int         fixedcolormap_setup;    int         dy=0; //added:10-02-98:    extralight = player->extralight;    //    if (cv_chasecam.value && !camera.chase)    {        P_ResetCamera(player);        camera.chase = true;    }    else if (!cv_chasecam.value)        camera.chase = false;#ifdef FRAGGLESCRIPT    if (script_camera_on)    {        viewmobj = script_camera.mo;#ifdef PARANOIA        if (!viewmobj)            I_Error("no mobj for the camera");#endif        viewz = viewmobj->z;        fixedcolormap_setup = camera.fixedcolormap;        aimingangle=script_camera.aiming;        viewangle = viewmobj->angle;    }    else#endif    if (camera.chase)    // use outside cam view    {        viewmobj = camera.mo;#ifdef PARANOIA        if (!viewmobj)            I_Error("no mobj for the camera");#endif        viewz = viewmobj->z + (viewmobj->height>>1);        fixedcolormap_setup = camera.fixedcolormap;        aimingangle=camera.aiming;        viewangle = viewmobj->angle;    }    else    // use the player's eyes view    {        viewz = player->viewz;#ifdef CLIENTPREDICTION2        if( demoplayback || !player->spirit)        {            viewmobj = player->mo;            CONS_Printf("\2No spirit\n");        }        else            viewmobj = player->spirit;#else          viewmobj = player->mo;#endif        fixedcolormap_setup = player->fixedcolormap;        aimingangle=player->aiming;        viewangle = viewmobj->angle+viewangleoffset;        if(!demoplayback && player->playerstate!=PST_DEAD && !drone)        {            if(player==&players[consoleplayer])            {                viewangle = localangle; // WARNING : camera use this                aimingangle=localaiming;            }            else                if(player==&players[secondarydisplayplayer])                {                    viewangle = localangle2;                     aimingangle=localaiming2;                }        }            }#ifdef PARANOIA     if (!viewmobj)         I_Error("R_Setupframe : viewmobj null (player %d)",player-players);#endif    viewplayer = player;    viewx = bspx = viewmobj->x;    viewy = bspy = viewmobj->y;    viewangle = viewmobj->angle+viewangleoffset;    bspangle = viewangle;        viewsin = finesine[viewangle>>ANGLETOFINESHIFT];    viewcos = finecosine[viewangle>>ANGLETOFINESHIFT];    sscount = 0;    if (fixedcolormap_setup)    {        fixedcolormap =            colormaps            + fixedcolormap_setup*256*sizeof(lighttable_t);        walllights = scalelightfixed;        for (i=0 ; i<MAXLIGHTSCALE ; i++)            scalelightfixed[i] = fixedcolormap;    }    else        fixedcolormap = 0;    //added:06-02-98:recalc necessary stuff for mouseaiming    //               slopes are already calculated for the full    //               possible view (which is 4*viewheight).    if ( rendermode == render_soft )     {        // clip it in the case we are looking a hardware 90

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -