r_main.c
上传用户:xuyinpeng
上传日期:2021-05-12
资源大小:455k
文件大小:17k
源码类别:

射击游戏

开发平台:

Visual C++

  1. // Emacs style mode select   -*- C++ -*- 
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. // Rendering main loop and setup functions,
  21. //  utility functions (BSP, geometry, trigonometry).
  22. // See tables.c, too.
  23. //
  24. //-----------------------------------------------------------------------------
  25. static const char rcsid[] = "$Id: r_main.c,v 1.5 1997/02/03 22:45:12 b1 Exp $";
  26. #include <stdlib.h>
  27. #include <math.h>
  28. #include "doomdef.h"
  29. #include "d_net.h"
  30. #include "m_bbox.h"
  31. #include "r_local.h"
  32. #include "r_sky.h"
  33. char MsgText[256];
  34. void WriteDebug(char *);
  35. // Fineangles in the SCREENWIDTH wide window.
  36. #define FIELDOFVIEW 2048
  37. #define SBARHEIGHT      32 // also defined in r_draw.c rather than r_draw.h (BAD)
  38. int viewangleoffset;
  39. // increment every time a check is made
  40. int validcount = 1;
  41. lighttable_t* fixedcolormap;
  42. extern lighttable_t** walllights;
  43. int centerx;
  44. int centery;
  45. fixed_t centerxfrac;
  46. fixed_t centeryfrac;
  47. fixed_t projection;
  48. // just for profiling purposes
  49. int framecount;
  50. int sscount;
  51. int linecount;
  52. int loopcount;
  53. fixed_t viewx;
  54. fixed_t viewy;
  55. fixed_t viewz;
  56. angle_t viewangle;
  57. fixed_t viewcos;
  58. fixed_t viewsin;
  59. player_t* viewplayer;
  60. // 0 = high, 1 = low
  61. int detailshift;
  62. //
  63. // precalculated math tables
  64. //
  65. angle_t clipangle;
  66. // The viewangletox[viewangle + FINEANGLES/4] lookup
  67. // maps the visible view angles to screen X coordinates,
  68. // flattening the arc to a flat projection plane.
  69. // There will be many angles mapped to the same X. 
  70. int viewangletox[FINEANGLES/2];
  71. // The xtoviewangleangle[] table maps a screen pixel
  72. // to the lowest viewangle that maps back to x ranges
  73. // from clipangle to -clipangle.
  74. angle_t          *xtoviewangle;
  75. //angle_t xtoviewangle[SCREENWIDTH+1];
  76. // UNUSED.
  77. // The finetangentgent[angle+FINEANGLES/4] table
  78. // holds the fixed_t tangent values for view angles,
  79. // ranging from MININT to 0 to MAXINT.
  80. // fixed_t finetangent[FINEANGLES/2];
  81. // fixed_t finesine[5*FINEANGLES/4];
  82. fixed_t* finecosine = &finesine[FINEANGLES/4];
  83. lighttable_t* scalelight[LIGHTLEVELS][MAXLIGHTSCALE];
  84. lighttable_t* scalelightfixed[MAXLIGHTSCALE];
  85. lighttable_t* zlight[LIGHTLEVELS][MAXLIGHTZ];
  86. // bumped light from gun blasts
  87. int extralight;
  88. void (*colfunc) (void);
  89. void (*basecolfunc) (void);
  90. void (*fuzzcolfunc) (void);
  91. void (*transcolfunc) (void);
  92. void (*spanfunc) (void);
  93. //
  94. // R_AddPointToBox
  95. // Expand a given bbox
  96. // so that it encloses a given point.
  97. //
  98. void
  99. R_AddPointToBox
  100. ( int x,
  101.   int y,
  102.   fixed_t* box )
  103. {
  104.     if (x< box[BOXLEFT])
  105. box[BOXLEFT] = x;
  106.     if (x> box[BOXRIGHT])
  107. box[BOXRIGHT] = x;
  108.     if (y< box[BOXBOTTOM])
  109. box[BOXBOTTOM] = y;
  110.     if (y> box[BOXTOP])
  111. box[BOXTOP] = y;
  112. }
  113. //
  114. // R_PointOnSide
  115. // Traverse BSP (sub) tree,
  116. //  check point against partition plane.
  117. // Returns side 0 (front) or 1 (back).
  118. //
  119. int
  120. R_PointOnSide
  121. ( fixed_t x,
  122.   fixed_t y,
  123.   node_t* node )
  124. {
  125.     fixed_t dx;
  126.     fixed_t dy;
  127.     fixed_t left;
  128.     fixed_t right;
  129.     if (!node->dx)
  130.     {
  131. if (x <= node->x)
  132.     return node->dy > 0;
  133. return node->dy < 0;
  134.     }
  135.     if (!node->dy)
  136.     {
  137. if (y <= node->y)
  138.     return node->dx < 0;
  139. return node->dx > 0;
  140.     }
  141.     dx = (x - node->x);
  142.     dy = (y - node->y);
  143.     // Try to quickly decide by looking at sign bits.
  144.     if ( (node->dy ^ node->dx ^ dx ^ dy)&0x80000000 )
  145.     {
  146. if  ( (node->dy ^ dx) & 0x80000000 )
  147. {
  148.     // (left is negative)
  149.     return 1;
  150. }
  151. return 0;
  152.     }
  153.     left = FixedMul ( node->dy>>FRACBITS , dx );
  154.     right = FixedMul ( dy , node->dx>>FRACBITS );
  155.     if (right < left)
  156.     {
  157. // front side
  158. return 0;
  159.     }
  160.     // back side
  161.     return 1;
  162. }
  163. int
  164. R_PointOnSegSide
  165. ( fixed_t x,
  166.   fixed_t y,
  167.   seg_t* line )
  168. {
  169.     fixed_t lx;
  170.     fixed_t ly;
  171.     fixed_t ldx;
  172.     fixed_t ldy;
  173.     fixed_t dx;
  174.     fixed_t dy;
  175.     fixed_t left;
  176.     fixed_t right;
  177.     lx = line->v1->x;
  178.     ly = line->v1->y;
  179.     ldx = line->v2->x - lx;
  180.     ldy = line->v2->y - ly;
  181.     if (!ldx)
  182.     {
  183. if (x <= lx)
  184.     return ldy > 0;
  185. return ldy < 0;
  186.     }
  187.     if (!ldy)
  188.     {
  189. if (y <= ly)
  190.     return ldx < 0;
  191. return ldx > 0;
  192.     }
  193.     dx = (x - lx);
  194.     dy = (y - ly);
  195.     // Try to quickly decide by looking at sign bits.
  196.     if ( (ldy ^ ldx ^ dx ^ dy)&0x80000000 )
  197.     {
  198. if  ( (ldy ^ dx) & 0x80000000 )
  199. {
  200.     // (left is negative)
  201.     return 1;
  202. }
  203. return 0;
  204.     }
  205.     left = FixedMul ( ldy>>FRACBITS , dx );
  206.     right = FixedMul ( dy , ldx>>FRACBITS );
  207.     if (right < left)
  208.     {
  209. // front side
  210. return 0;
  211.     }
  212.     // back side
  213.     return 1;
  214. }
  215. //
  216. // R_PointToAngle
  217. // To get a global angle from cartesian coordinates,
  218. //  the coordinates are flipped until they are in
  219. //  the first octant of the coordinate system, then
  220. //  the y (<=x) is scaled and divided by x to get a
  221. //  tangent (slope) value which is looked up in the
  222. //  tantoangle[] table.
  223. //
  224. angle_t
  225. R_PointToAngle
  226. ( fixed_t x,
  227.   fixed_t y )
  228. {
  229.     x -= viewx;
  230.     y -= viewy;
  231.     
  232.     if ( (!x) && (!y) )
  233. return 0;
  234.     if (x>= 0)
  235.     {
  236. // x >=0
  237. if (y>= 0)
  238. {
  239.     // y>= 0
  240.     if (x>y)
  241.     {
  242. // octant 0
  243. return tantoangle[ SlopeDiv(y,x)];
  244.     }
  245.     else
  246.     {
  247. // octant 1
  248. return ANG90-1-tantoangle[ SlopeDiv(x,y)];
  249.     }
  250. }
  251. else
  252. {
  253.     // y<0
  254.     y = -y;
  255.     if (x>y)
  256.     {
  257. // octant 8
  258. return (tantoangle[SlopeDiv(y,x)] * -1);
  259.     }
  260.     else
  261.     {
  262. // octant 7
  263. return ANG270+tantoangle[ SlopeDiv(x,y)];
  264.     }
  265. }
  266.     }
  267.     else
  268.     {
  269. // x<0
  270. x = -x;
  271. if (y>= 0)
  272. {
  273.     // y>= 0
  274.     if (x>y)
  275.     {
  276. // octant 3
  277. return ANG180-1-tantoangle[ SlopeDiv(y,x)];
  278.     }
  279.     else
  280.     {
  281. // octant 2
  282. return ANG90+ tantoangle[ SlopeDiv(x,y)];
  283.     }
  284. }
  285. else
  286. {
  287.     // y<0
  288.     y = -y;
  289.     if (x>y)
  290.     {
  291. // octant 4
  292. return ANG180+tantoangle[ SlopeDiv(y,x)];
  293.     }
  294.     else
  295.     {
  296.  // octant 5
  297. return ANG270-1-tantoangle[ SlopeDiv(x,y)];
  298.     }
  299. }
  300.     }
  301.     return 0;
  302. }
  303. angle_t
  304. R_PointToAngle2
  305. ( fixed_t x1,
  306.   fixed_t y1,
  307.   fixed_t x2,
  308.   fixed_t y2 )
  309. {
  310.     viewx = x1;
  311.     viewy = y1;
  312.     
  313.     return R_PointToAngle (x2, y2);
  314. }
  315. fixed_t
  316. R_PointToDist
  317. ( fixed_t x,
  318.   fixed_t y )
  319. {
  320.     int angle;
  321.     fixed_t dx;
  322.     fixed_t dy;
  323.     fixed_t temp;
  324.     fixed_t dist;
  325.     dx = abs(x - viewx);
  326.     dy = abs(y - viewy);
  327.     if (dy>dx)
  328.     {
  329. temp = dx;
  330. dx = dy;
  331. dy = temp;
  332.     }
  333.     angle = (tantoangle[ FixedDiv(dy,dx)>>DBITS ]+ANG90) >> ANGLETOFINESHIFT;
  334.     // use as cosine
  335.     dist = FixedDiv (dx, finesine[angle] );
  336.     return dist;
  337. }
  338. //
  339. // R_InitPointToAngle
  340. //
  341. void R_InitPointToAngle (void)
  342. {
  343.     // UNUSED - now getting from tables.c
  344. #if 0
  345.     int i;
  346.     long t;
  347.     float f;
  348. //
  349. // slope (tangent) to angle lookup
  350. //
  351.     for (i=0 ; i<=SLOPERANGE ; i++)
  352.     {
  353. f = atan( (float)i/SLOPERANGE )/(3.141592657*2);
  354. t = 0xffffffff*f;
  355. tantoangle[i] = t;
  356.     }
  357. #endif
  358. }
  359. //
  360. // R_ScaleFromGlobalAngle
  361. // Returns the texture mapping scale
  362. //  for the current line (horizontal span)
  363. //  at the given angle.
  364. // rw_distance must be calculated first.
  365. //
  366. fixed_t R_ScaleFromGlobalAngle (angle_t visangle)
  367. {
  368.     fixed_t scale;
  369.     int anglea;
  370.     int angleb;
  371.     int sinea;
  372.     int sineb;
  373.     fixed_t num;
  374.     int den;
  375.     // UNUSED
  376. #if 0
  377. {
  378.     fixed_t dist;
  379.     fixed_t z;
  380.     fixed_t sinv;
  381.     fixed_t cosv;
  382.     sinv = finesine[(visangle-rw_normalangle)>>ANGLETOFINESHIFT];
  383.     dist = FixedDiv (rw_distance, sinv);
  384.     cosv = finecosine[(viewangle-visangle)>>ANGLETOFINESHIFT];
  385.     z = abs(FixedMul (dist, cosv));
  386.     scale = FixedDiv(projection, z);
  387.     return scale;
  388. }
  389. #endif
  390.     anglea = ANG90 + (visangle-viewangle);
  391.     angleb = ANG90 + (visangle-rw_normalangle);
  392.     // both sines are allways positive
  393.     sinea = finesine[anglea>>ANGLETOFINESHIFT];
  394.     sineb = finesine[angleb>>ANGLETOFINESHIFT];
  395.     num = FixedMul(projection,sineb)<<detailshift;
  396.     den = FixedMul(rw_distance,sinea);
  397.     if (den > num>>16)
  398.     {
  399. scale = FixedDiv (num, den);
  400. if (scale > 64*FRACUNIT)
  401.     scale = 64*FRACUNIT;
  402. else if (scale < 256)
  403.     scale = 256;
  404.     }
  405.     else
  406. scale = 64*FRACUNIT;
  407.     return scale;
  408. }
  409. //
  410. // R_InitTables
  411. //
  412. void R_InitTables (void)
  413. {
  414.     // UNUSED: now getting from tables.c
  415. #if 0
  416.     int i;
  417.     float a;
  418.     float fv;
  419.     int t;
  420.     
  421.     // viewangle tangent table
  422.     for (i=0 ; i<FINEANGLES/2 ; i++)
  423.     {
  424. a = (i-FINEANGLES/4+0.5)*PI*2/FINEANGLES;
  425. fv = FRACUNIT*tan (a);
  426. t = fv;
  427. finetangent[i] = t;
  428.     }
  429.     
  430.     // finesine table
  431.     for (i=0 ; i<5*FINEANGLES/4 ; i++)
  432.     {
  433. // OPTIMIZE: mirror...
  434. a = (i+0.5)*PI*2/FINEANGLES;
  435. t = FRACUNIT*sin (a);
  436. finesine[i] = t;
  437.     }
  438. #endif
  439. }
  440. //
  441. // R_InitTextureMapping
  442. //
  443. void R_InitTextureMapping (void)
  444. {
  445.     int i;
  446.     int x;
  447.     int t;
  448.     fixed_t focallength;
  449.     
  450.     // Use tangent table to generate viewangletox:
  451.     //  viewangletox will give the next greatest x
  452.     //  after the view angle.
  453.     //
  454.     // Calc focallength
  455.     //  so FIELDOFVIEW angles covers SCREENWIDTH.
  456.     focallength = FixedDiv (centerxfrac,
  457.     finetangent[FINEANGLES/4+FIELDOFVIEW/2] );
  458.     for (i=0 ; i<FINEANGLES/2 ; i++)
  459.     {
  460. if (finetangent[i] > FRACUNIT*2)
  461.     t = -1;
  462. else if (finetangent[i] < -FRACUNIT*2)
  463.     t = viewwidth+1;
  464. else
  465. {
  466.     t = FixedMul (finetangent[i], focallength);
  467.     t = (centerxfrac - t+FRACUNIT-1)>>FRACBITS;
  468.     if (t < -1)
  469. t = -1;
  470.     else if (t>viewwidth+1)
  471. t = viewwidth+1;
  472. }
  473. viewangletox[i] = t;
  474.     }
  475.     
  476.     // Scan viewangletox[] to generate xtoviewangle[]:
  477.     //  xtoviewangle will give the smallest view angle
  478.     //  that maps to x.
  479.     for (x=0;x<=viewwidth;x++)
  480.     {
  481. i = 0;
  482. while (viewangletox[i]>x)
  483.     i++;
  484. xtoviewangle[x] = (i<<ANGLETOFINESHIFT)-ANG90;
  485.     }
  486.     
  487.     // Take out the fencepost cases from viewangletox.
  488.     for (i=0 ; i<FINEANGLES/2 ; i++)
  489.     {
  490. t = FixedMul (finetangent[i], focallength);
  491. t = centerx - t;
  492. if (viewangletox[i] == -1)
  493.     viewangletox[i] = 0;
  494. else if (viewangletox[i] == viewwidth+1)
  495.     viewangletox[i]  = viewwidth;
  496.     }
  497.     clipangle = xtoviewangle[0];
  498. }
  499. //
  500. // R_InitLightTables
  501. // Only inits the zlight table,
  502. //  because the scalelight table changes with view size.
  503. //
  504. #define DISTMAP 2
  505. void R_InitLightTables (void)
  506. {
  507.     int i;
  508.     int j;
  509.     int level;
  510.     int startmap; 
  511.     int scale;
  512.     
  513.     // Calculate the light levels to use
  514.     //  for each level / distance combination.
  515.     for (i=0 ; i< LIGHTLEVELS ; i++)
  516.     {
  517. startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;
  518. for (j=0 ; j<MAXLIGHTZ ; j++)
  519. {
  520.     scale = FixedDiv ((SCREENWIDTH/2*FRACUNIT), (j+1)<<LIGHTZSHIFT);
  521.     scale >>= LIGHTSCALESHIFT;
  522.     level = startmap - scale/DISTMAP;
  523.     
  524.     if (level < 0)
  525. level = 0;
  526.     if (level >= NUMCOLORMAPS)
  527. level = NUMCOLORMAPS-1;
  528.     zlight[i][j] = colormaps + level*256;
  529. }
  530.     }
  531. }
  532. //
  533. // R_SetViewSize
  534. // Do not really change anything here,
  535. //  because it might be in the middle of a refresh.
  536. // The change will take effect next refresh.
  537. //
  538. boolean setsizeneeded;
  539. int setblocks;
  540. int setdetail;
  541. void
  542. R_SetViewSize
  543. ( int blocks,
  544.   int detail )
  545. {
  546.     setsizeneeded = true;
  547.     setblocks = blocks;
  548.     setdetail = detail;
  549. }
  550. void WriteDebug(char *);
  551. //
  552. // R_ExecuteSetViewSize
  553. //
  554. void R_ExecuteSetViewSize (void)
  555.    {
  556.     fixed_t cosadj;
  557.     fixed_t dy;
  558.     int i;
  559.     int j;
  560.     int level;
  561.     int startmap; 
  562.     setsizeneeded = false;
  563.     if (setblocks == 11)
  564.        {
  565.         scaledviewwidth = SCREENWIDTH;
  566.         viewheight = SCREENHEIGHT;
  567.        }
  568.     else
  569.        {
  570.         scaledviewwidth = (setblocks*SCREENWIDTH)/10;
  571.         viewheight = ((setblocks*(SCREENHEIGHT-SBARHEIGHT))/10)&~7;
  572.        }
  573.     
  574.     detailshift = setdetail;
  575.     viewwidth = scaledviewwidth>>detailshift;
  576.     centery = viewheight/2;
  577.     centerx = viewwidth/2;
  578.     centerxfrac = centerx<<FRACBITS;
  579.     centeryfrac = centery<<FRACBITS;
  580.     projection = centerxfrac;
  581.     if (!detailshift)
  582.     {
  583. colfunc = basecolfunc = R_DrawColumn;
  584. fuzzcolfunc = R_DrawFuzzColumn;
  585. transcolfunc = R_DrawTranslatedColumn;
  586. spanfunc = R_DrawSpan;
  587.     }
  588.     else
  589.     {
  590. colfunc = basecolfunc = R_DrawColumnLow;
  591. fuzzcolfunc = R_DrawFuzzColumn;
  592. transcolfunc = R_DrawTranslatedColumn;
  593. spanfunc = R_DrawSpanLow;
  594.     }
  595.     R_InitBuffer (scaledviewwidth, viewheight);
  596.     R_InitTextureMapping ();
  597.     
  598.     // psprite scales
  599. //    pspritescale = FRACUNIT*viewwidth/SCREENWIDTH;
  600. //    pspriteiscale = FRACUNIT*SCREENWIDTH/viewwidth;
  601.     //pspritescale = FRACUNIT*viewwidth/320;
  602.     //pspriteiscale = FRACUNIT*320/viewheight;
  603.     if (setblocks != 10)
  604.        {
  605.         pspritescale = FRACUNIT*viewheight/200;
  606.         pspriteiscale = FRACUNIT*200/viewheight;
  607.        }
  608.     else
  609.        {
  610.         pspritescale = FRACUNIT*(viewheight+32)/200;
  611.         pspriteiscale = FRACUNIT*200/(viewheight+32);
  612.        }
  613.     
  614.     // thing clipping
  615.     for (i=0 ; i<viewwidth ; i++)
  616. screenheightarray[i] = viewheight;
  617.     
  618.     // planes
  619.     for (i=0 ; i<viewheight ; i++)
  620.     {
  621. dy = ((i-viewheight/2)<<FRACBITS)+FRACUNIT/2;
  622. dy = abs(dy);
  623. yslope[i] = FixedDiv ( (viewwidth<<detailshift)/2*FRACUNIT, dy);
  624.     }
  625.     for (i=0 ; i<viewwidth ; i++)
  626.     {
  627. cosadj = abs(finecosine[xtoviewangle[i]>>ANGLETOFINESHIFT]);
  628. distscale[i] = FixedDiv (FRACUNIT,cosadj);
  629.     }
  630.     
  631.     // Calculate the light levels to use
  632.     //  for each level / scale combination.
  633.     for (i=0 ; i< LIGHTLEVELS ; i++)
  634.     {
  635. startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS;
  636. for (j=0 ; j<MAXLIGHTSCALE ; j++)
  637. {
  638.     level = startmap - j*SCREENWIDTH/(viewwidth<<detailshift)/DISTMAP;
  639.     
  640.     if (level < 0)
  641. level = 0;
  642.     if (level >= NUMCOLORMAPS)
  643. level = NUMCOLORMAPS-1;
  644.     scalelight[i][j] = colormaps + level*256;
  645. }
  646.     }
  647.     R_DrawViewBorder();
  648. }
  649. //
  650. // R_Init
  651. //
  652. extern int detailLevel;
  653. extern int screenblocks;
  654. void R_Init (void)
  655.    {
  656.     R_InitData ();
  657.     //WriteDebug("nR_InitData");
  658.     R_InitPointToAngle();
  659.     //WriteDebug("nR_InitPointToAngle");
  660.     R_InitTables ();
  661.     // viewwidth / viewheight / detailLevel are set by the defaults
  662.     //WriteDebug("nR_InitTables");
  663.     R_SetViewSize (screenblocks, detailLevel);
  664.     R_InitPlanes ();
  665.     //WriteDebug("nR_InitPlanes");
  666.     R_InitLightTables ();
  667.     //WriteDebug("nR_InitLightTables");
  668.     R_InitSkyMap ();
  669.     //WriteDebug("nR_InitSkyMap");
  670.     R_InitTranslationTables ();
  671.     //WriteDebug("nR_InitTranslationsTables");
  672.     R_InitFuzzTable();
  673.     framecount = 0;
  674.    }
  675. //
  676. // R_PointInSubsector
  677. //
  678. subsector_t*
  679. R_PointInSubsector
  680. ( fixed_t x,
  681.   fixed_t y )
  682. {
  683.     node_t* node;
  684.     int side;
  685.     int nodenum;
  686.     // single subsector is a special case
  687.     if (!numnodes)
  688. return subsectors;
  689.     nodenum = numnodes-1;
  690.     while (! (nodenum & NF_SUBSECTOR) )
  691.     {
  692. node = &nodes[nodenum];
  693. side = R_PointOnSide (x, y, node);
  694. nodenum = node->children[side];
  695.     }
  696.     return &subsectors[nodenum & ~NF_SUBSECTOR];
  697. }
  698. //
  699. // R_SetupFrame
  700. //
  701. void R_SetupFrame (player_t* player)
  702.    {
  703.     int  i;
  704.     
  705.     viewplayer = player;
  706.     viewx = player->mo->x;
  707.     viewy = player->mo->y;
  708.     viewangle = player->mo->angle + viewangleoffset;
  709.     extralight = player->extralight;
  710.     viewz = player->viewz;
  711.     
  712.     viewsin = finesine[viewangle>>ANGLETOFINESHIFT];
  713.     viewcos = finecosine[viewangle>>ANGLETOFINESHIFT];
  714.     sscount = 0;
  715.     if (player->fixedcolormap)
  716.        {
  717.         fixedcolormap = colormaps + player->fixedcolormap*256*sizeof(lighttable_t);
  718.         walllights = scalelightfixed;
  719.         for (i = 0; i < MAXLIGHTSCALE; i++)
  720.            scalelightfixed[i] = fixedcolormap;
  721.        }
  722.     else
  723.        fixedcolormap = 0;
  724.     framecount++;
  725.     validcount++;
  726.    }
  727. //
  728. // R_RenderView
  729. //
  730. void R_RenderPlayerView (player_t* player)
  731.    {
  732.     R_SetupFrame(player);
  733.     // Clear buffers.
  734.     R_ClearClipSegs();
  735.     R_ClearDrawSegs();
  736.     R_ClearPlanes();
  737.     R_ClearSprites();
  738.     
  739.     // check for new console commands.
  740.     NetUpdate ();
  741.     // The head node is the last node output.
  742.     R_RenderBSPNode (numnodes-1);
  743.     
  744.     // Check for new console commands.
  745.     NetUpdate ();
  746.     
  747.     R_DrawPlanes ();
  748.     
  749.     // Check for new console commands.
  750.     NetUpdate ();
  751.     
  752.     R_DrawMasked ();
  753.     // Check for new console commands.
  754.     NetUpdate ();
  755. }