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