📄 r_main.c
字号:
== 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+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 xtoviewangleangle[]//// 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,j, level, 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++) { scale = FixedDiv ((SCREENWIDTH/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== Don't really change anything here, because i might be in the middle of= a refresh. The change will take effect next refresh.===============*/boolean setsizeneeded;int setblocks, setdetail;void R_SetViewSize (int blocks, int detail){ setsizeneeded = true; setblocks = blocks; setdetail = detail;}/*================ R_ExecuteSetViewSize===============*/void R_ExecuteSetViewSize (void){ fixed_t cosadj, dy; int i,j, level, startmap;
setsizeneeded = false; if (setblocks == 11) { scaledviewwidth = SCREENWIDTH; viewheight = SCREENHEIGHT; } else { scaledviewwidth = setblocks*32; viewheight = (setblocks*161/10); } detailshift = setdetail; viewwidth = scaledviewwidth>>detailshift; centery = viewheight/2; centerx = viewwidth/2; centerxfrac = centerx<<FRACBITS; centeryfrac = centery<<FRACBITS; projection = centerxfrac; if (!detailshift) { colfunc = basecolfunc = R_DrawColumn; fuzzcolfunc = R_DrawFuzzColumn; transcolfunc = R_DrawTranslatedColumn; spanfunc = R_DrawSpan; } else { colfunc = basecolfunc = R_DrawColumnLow; fuzzcolfunc = R_DrawFuzzColumn; transcolfunc = R_DrawTranslatedColumn; spanfunc = R_DrawSpanLow; } R_InitBuffer (scaledviewwidth, viewheight); R_InitTextureMapping ();//// psprite scales// pspritescale = FRACUNIT*viewwidth/SCREENWIDTH; pspriteiscale = FRACUNIT*SCREENWIDTH/viewwidth;//// thing clipping// for (i=0 ; i<viewwidth ; i++) screenheightarray[i] = viewheight;//// planes// for (i=0 ; i<viewheight ; i++) { dy = ((i-viewheight/2)<<FRACBITS)+FRACUNIT/2; dy = abs(dy); yslope[i] = FixedDiv ( (viewwidth<<detailshift)/2*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*SCREENWIDTH/(viewwidth<<detailshift)/DISTMAP; if (level < 0) level = 0; if (level >= NUMCOLORMAPS) level = NUMCOLORMAPS-1; scalelight[i][j] = colormaps + level*256; } }//// draw the border// R_DrawViewBorder (); // erase old menu stuff}/*================ R_Init===============*/int detailLevel;int screenblocks;void R_Init(void){ R_InitData(); R_InitPointToAngle(); R_InitTables(); // viewwidth / viewheight / detailLevel are set by the defaults R_SetViewSize(screenblocks, detailLevel); R_InitPlanes(); R_InitLightTables(); R_InitSkyMap(); R_InitTranslationTables(); framecount = 0;}/*================ R_PointInSubsector===============*/subsector_t *R_PointInSubsector (fixed_t x, fixed_t y){ node_t *node; int side, nodenum; if (!numnodes) // single subsector is a special case 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];}//----------------------------------------------------------------------------//// PROC R_SetupFrame////----------------------------------------------------------------------------void R_SetupFrame(player_t *player){ int i; int tableAngle; int tempCentery; int intensity; //drawbsp = 1; viewplayer = player;#ifdef __WATCOMC__
if(newViewAngleOff) { viewangleoffset = newViewAngleOff<<ANGLETOFINESHIFT;
}#endif
viewangle = player->mo->angle+viewangleoffset; tableAngle = viewangle>>ANGLETOFINESHIFT; viewx = player->mo->x; viewy = player->mo->y; if(localQuakeHappening[displayplayer] && !paused) { intensity = localQuakeHappening[displayplayer]; viewx += ((M_Random() % (intensity<<2)) -(intensity<<1))<<FRACBITS; viewy += ((M_Random()%(intensity<<2)) -(intensity<<1))<<FRACBITS; } extralight = player->extralight; viewz = player->viewz; tempCentery = viewheight/2+(player->lookdir)*screenblocks/10; if(centery != tempCentery) { centery = tempCentery; centeryfrac = centery<<FRACBITS; for(i = 0; i < viewheight; i++) { yslope[i] = FixedDiv ((viewwidth<<detailshift)/2*FRACUNIT, abs(((i-centery)<<FRACBITS)+FRACUNIT/2)); } } viewsin = finesine[tableAngle]; viewcos = finecosine[tableAngle]; sscount = 0; if(player->fixedcolormap) { fixedcolormap = colormaps+player->fixedcolormap *256*sizeof(lighttable_t); walllights = scalelightfixed; for(i = 0; i < MAXLIGHTSCALE; i++) { scalelightfixed[i] = fixedcolormap; } } else { fixedcolormap = 0; } framecount++; validcount++; if(BorderNeedRefresh) { if(setblocks < 10) { R_DrawViewBorder(); } BorderNeedRefresh = false; BorderTopRefresh = false; UpdateState |= I_FULLSCRN; } if(BorderTopRefresh) { if(setblocks < 10) { R_DrawTopBorder(); } BorderTopRefresh = false; UpdateState |= I_MESSAGES; }#ifdef __NeXT__ RD_ClearMapWindow ();#endif#ifdef __WATCOMC__ destview = destscreen+(viewwindowx>>2)+viewwindowy*80;#endif#if 0{static int frame;memset (screen, frame, SCREENWIDTH*SCREENHEIGHT);frame++;}#endif}/*================ R_RenderView===============*/void R_RenderPlayerView (player_t *player){ R_SetupFrame (player); R_ClearClipSegs (); R_ClearDrawSegs (); R_ClearPlanes (); R_ClearSprites (); NetUpdate (); // check for new console commands // Make displayed player invisible locally if (localQuakeHappening[displayplayer] && gamestate == GS_LEVEL) { players[displayplayer].mo->flags2 |= MF2_DONTDRAW; R_RenderBSPNode (numnodes-1); // head node is the last node output players[displayplayer].mo->flags2 &= ~MF2_DONTDRAW; } else { R_RenderBSPNode (numnodes-1); // head node is the last node output } NetUpdate (); // check for new console commands R_DrawPlanes (); NetUpdate (); // check for new console commands R_DrawMasked (); NetUpdate (); // check for new console commands}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -