📄 r_main.c
字号:
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 + -