📄 r_main.c
字号:
//// R_ScaleFromGlobalAngle// Returns the texture mapping scale// for the current line (horizontal span)// at the given angle.// rw_distance must be calculated first.//fixed_t R_ScaleFromGlobalAngle (angle_t visangle){ fixed_t scale; int anglea; int angleb; int sinea; int sineb; fixed_t num; int den; // UNUSED#if 0{ fixed_t dist; fixed_t z; fixed_t sinv; fixed_t cosv; sinv = finesine[(visangle-rw_normalangle)>>ANGLETOFINESHIFT]; dist = FixedDiv (rw_distance, sinv); cosv = finecosine[(viewangle-visangle)>>ANGLETOFINESHIFT]; z = abs(FixedMul (dist, cosv)); scale = FixedDiv(projection, z); return scale;}#endif anglea = ANG90 + (visangle-viewangle); angleb = ANG90 + (visangle-rw_normalangle); // both sines are allways positive sinea = finesine[anglea>>ANGLETOFINESHIFT]; sineb = finesine[angleb>>ANGLETOFINESHIFT]; num = FixedMul(projection,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;}//// 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}//// 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 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++) { 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// 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;int setblocks;int setdetail;voidR_SetViewSize( int blocks, int detail ){ setsizeneeded = true; setblocks = blocks; setdetail = detail;}//// R_ExecuteSetViewSize//void R_ExecuteSetViewSize (void){ fixed_t cosadj; fixed_t dy; int i; int j; int level; int startmap; setsizeneeded = false; if (setblocks == 11) { scaledviewwidth = SCREENWIDTH; viewheight = SCREENHEIGHT; } else { scaledviewwidth = setblocks*32; viewheight = (setblocks*168/10)&~7; } 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; } }}//// R_Init//extern int detailLevel;extern int screenblocks;void R_Init (void){ R_InitData (); printf ("\nR_InitData"); R_InitPointToAngle (); printf ("\nR_InitPointToAngle"); R_InitTables (); // viewwidth / viewheight / detailLevel are set by the defaults printf ("\nR_InitTables"); R_SetViewSize (screenblocks, detailLevel); R_InitPlanes (); printf ("\nR_InitPlanes"); R_InitLightTables (); printf ("\nR_InitLightTables"); R_InitSkyMap (); printf ("\nR_InitSkyMap"); R_InitTranslationTables (); printf ("\nR_InitTranslationsTables"); 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_SetupFrame//void R_SetupFrame (player_t* player){ int i; viewplayer = player; viewx = player->mo->x; viewy = player->mo->y; viewangle = player->mo->angle + viewangleoffset; extralight = player->extralight; viewz = player->viewz; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; 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++;}//// R_RenderView//void R_RenderPlayerView (player_t* player){ R_SetupFrame (player); // Clear buffers. R_ClearClipSegs (); R_ClearDrawSegs (); R_ClearPlanes (); R_ClearSprites (); // check for new console commands. NetUpdate (); // The head node is the last node output. R_RenderBSPNode (numnodes-1); // Check for new console commands. NetUpdate (); R_DrawPlanes (); // Check for new console commands. NetUpdate (); R_DrawMasked (); // Check for new console commands. NetUpdate (); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -