12 All drawing to the view buffer is accomplished in this file. The other refresh
13 files only know about ccordinates, not the architecture of the frame buffer.
18 int viewwidth, scaledviewwidth, viewheight, viewwindowx, viewwindowy;
19 byte *ylookup[MAXHEIGHT];
20 int columnofs[MAXWIDTH];
21 byte translations[3][256]; // color tables for different players
22 byte *tinttable; // used for translucent sprites
31 = Source is the top of the column to scale
36 lighttable_t *dc_colormap;
41 fixed_t dc_texturemid;
42 byte *dc_source; // first pixel in a column (possibly virtual)
44 int dccount; // just for profiling
46 void R_DrawColumn (void)
50 fixed_t frac, fracstep;
52 count = dc_yh - dc_yl;
57 if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
58 I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
61 dest = ylookup[dc_yl] + columnofs[dc_x];
64 frac = dc_texturemid + (dc_yl-centery)*fracstep;
68 *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
74 void R_DrawColumnLow (void)
78 fixed_t frac, fracstep;
80 count = dc_yh - dc_yl;
85 if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
86 I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
90 dest = ylookup[dc_yl] + columnofs[dc_x];
93 frac = dc_texturemid + (dc_yl-centery)*fracstep;
97 *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
106 #define FUZZOFF (SCREENWIDTH)
107 int fuzzoffset[FUZZTABLE] = {
108 FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF
112 void R_DrawFuzzColumn (void)
116 fixed_t frac, fracstep;
120 if (dc_yh == viewheight-1)
121 dc_yh = viewheight - 2;
123 count = dc_yh - dc_yl;
128 if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
129 I_Error ("R_DrawFuzzColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
132 dest = ylookup[dc_yl] + columnofs[dc_x];
134 fracstep = dc_iscale;
135 frac = dc_texturemid + (dc_yl-centery)*fracstep;
137 // OLD FUZZY INVISO SPRITE STUFF
140 *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]];
141 if (++fuzzpos == FUZZTABLE)
150 *dest = tinttable[((*dest)<<8)+dc_colormap[dc_source[(frac>>FRACBITS)&127]]];
152 //*dest = dest[SCREENWIDTH*10+5];
154 // *dest = //tinttable[((*dest)<<8)+colormaps[dc_source[(frac>>FRACBITS)&127]]];
156 // *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
163 ========================
165 = R_DrawTranslatedColumn
167 ========================
170 byte *dc_translation;
171 byte *translationtables;
173 void R_DrawTranslatedColumn (void)
177 fixed_t frac, fracstep;
179 count = dc_yh - dc_yl;
184 if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
185 I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
188 dest = ylookup[dc_yl] + columnofs[dc_x];
190 fracstep = dc_iscale;
191 frac = dc_texturemid + (dc_yl-centery)*fracstep;
195 *dest = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]];
201 void R_DrawTranslatedFuzzColumn (void)
205 fixed_t frac, fracstep;
207 count = dc_yh - dc_yl;
212 if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT)
213 I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x);
216 dest = ylookup[dc_yl] + columnofs[dc_x];
218 fracstep = dc_iscale;
219 frac = dc_texturemid + (dc_yl-centery)*fracstep;
223 *dest = tinttable[((*dest)<<8)
224 +dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]];
230 //--------------------------------------------------------------------------
232 // PROC R_InitTranslationTables
234 //--------------------------------------------------------------------------
236 void R_InitTranslationTables (void)
241 tinttable = W_CacheLumpName("TINTTAB", PU_STATIC);
243 // Allocate translation tables
244 translationtables = Z_Malloc(256*3+255, PU_STATIC, 0);
245 translationtables = (byte *)(( (intptr_t)translationtables + 255 )& ~255);
247 // Fill out the translation tables
248 for(i = 0; i < 256; i++)
250 if(i >= 225 && i <= 240)
252 translationtables[i] = 114+(i-225); // yellow
253 translationtables[i+256] = 145+(i-225); // red
254 translationtables[i+512] = 190+(i-225); // blue
258 translationtables[i] = translationtables[i+256]
259 = translationtables[i+512] = i;
275 lighttable_t *ds_colormap;
280 byte *ds_source; // start of a 64*64 tile image
282 int dscount; // just for profiling
284 void R_DrawSpan (void)
286 fixed_t xfrac, yfrac;
291 if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH
292 || (unsigned)ds_y>SCREENHEIGHT)
293 I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y);
300 dest = ylookup[ds_y] + columnofs[ds_x1];
301 count = ds_x2 - ds_x1;
304 spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63);
305 *dest++ = ds_colormap[ds_source[spot]];
311 void R_DrawSpanLow (void)
313 fixed_t xfrac, yfrac;
318 if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH
319 || (unsigned)ds_y>SCREENHEIGHT)
320 I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y);
327 dest = ylookup[ds_y] + columnofs[ds_x1];
328 count = ds_x2 - ds_x1;
331 spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63);
332 *dest++ = ds_colormap[ds_source[spot]];
348 void R_InitBuffer (int width, int height)
352 viewwindowx = (SCREENWIDTH-width) >> 1;
353 for (i=0 ; i<width ; i++)
354 columnofs[i] = viewwindowx + i;
355 if (width == SCREENWIDTH)
358 viewwindowy = (SCREENHEIGHT-SBARHEIGHT-height) >> 1;
359 for (i=0 ; i<height ; i++)
360 ylookup[i] = screen + (i+viewwindowy)*SCREENWIDTH;
369 = Draws the border around the view for different size windows
373 boolean BorderNeedRefresh;
375 void R_DrawViewBorder (void)
381 if (scaledviewwidth == SCREENWIDTH)
384 if((scaledviewwidth == 320 && sbarscale == 20) ||
385 (sbarscale != 20 && viewheight == 200))
389 OGL_SetColorAndAlpha(1,1,1,1);
392 OGL_SetFlat(W_GetNumForName("FLOOR04")-firstflat);
396 OGL_SetFlat(W_GetNumForName("FLAT513")-firstflat);
400 OGL_DrawCutRectTiled(0, 0, 320, 200 - SBARHEIGHT, 64, 64,
401 viewwindowx-4, viewwindowy-4, viewwidth+8, viewheight+8);
403 //OGL_DrawRectTiled(0, 0, SCREENWIDTH, SCREENHEIGHT-SBARHEIGHT, 64, 64);
404 OGL_DrawCutRectTiled(0, 0, 320, 200 - (sbarscale==20? SBARHEIGHT : 0)
405 /**sbarscale/20*/, 64, 64,
406 viewwindowx-4, viewwindowy-4, viewwidth+8, viewheight+8);
410 OGL_SetPatch(lump=W_GetNumForName("bordt"));
411 OGL_DrawRectTiled(viewwindowx, viewwindowy-4, viewwidth,
412 lumptexsizes[lump].h, 16, lumptexsizes[lump].h);
414 OGL_SetPatch(lump=W_GetNumForName("bordb"));
415 OGL_DrawRectTiled(viewwindowx, viewwindowy+viewheight, viewwidth,
416 lumptexsizes[lump].h, 16, lumptexsizes[lump].h);
419 OGL_SetPatch(lump=W_GetNumForName("bordl"));
420 OGL_DrawRectTiled(viewwindowx-4, viewwindowy, lumptexsizes[lump].w,
421 viewheight, lumptexsizes[lump].w, 16);
422 // Right view border.
423 OGL_SetPatch(lump=W_GetNumForName("bordr"));
424 OGL_DrawRectTiled(viewwindowx+viewwidth, viewwindowy,
425 lumptexsizes[lump].w,
426 viewheight, lumptexsizes[lump].w, 16);
428 OGL_DrawPatch(viewwindowx-4, viewwindowy-4, W_GetNumForName("bordtl"));
429 OGL_DrawPatch(viewwindowx+viewwidth, viewwindowy-4,
430 W_GetNumForName("bordtr"));
431 OGL_DrawPatch(viewwindowx+viewwidth, viewwindowy+viewheight,
432 W_GetNumForName("bordbr"));
434 OGL_DrawPatch(viewwindowx-4, viewwindowy+viewheight,
435 W_GetNumForName("bordbl"));
441 if (scaledviewwidth == SCREENWIDTH)
446 src = W_CacheLumpName ("FLOOR04", PU_CACHE);
450 src = W_CacheLumpName ("FLAT513", PU_CACHE);
454 for (y=0 ; y<SCREENHEIGHT-SBARHEIGHT ; y++)
456 for (x=0 ; x<SCREENWIDTH/64 ; x++)
458 memcpy (dest, src+((y&63)<<6), 64);
463 memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
464 dest += (SCREENWIDTH&63);
467 for(x=viewwindowx; x < viewwindowx+viewwidth; x += 16)
469 V_DrawPatch(x, viewwindowy-4, W_CacheLumpName("bordt", PU_CACHE));
470 V_DrawPatch(x, viewwindowy+viewheight, W_CacheLumpName("bordb",
473 for(y=viewwindowy; y < viewwindowy+viewheight; y += 16)
475 V_DrawPatch(viewwindowx-4, y, W_CacheLumpName("bordl", PU_CACHE));
476 V_DrawPatch(viewwindowx+viewwidth, y, W_CacheLumpName("bordr",
479 V_DrawPatch(viewwindowx-4, viewwindowy-4, W_CacheLumpName("bordtl",
481 V_DrawPatch(viewwindowx+viewwidth, viewwindowy-4,
482 W_CacheLumpName("bordtr", PU_CACHE));
483 V_DrawPatch(viewwindowx+viewwidth, viewwindowy+viewheight,
484 W_CacheLumpName("bordbr", PU_CACHE));
485 V_DrawPatch(viewwindowx-4, viewwindowy+viewheight,
486 W_CacheLumpName("bordbl", PU_CACHE));
495 = Draws the top border around the view for different size windows
499 boolean BorderTopRefresh;
501 void R_DrawTopBorder (void)
504 if (scaledviewwidth == SCREENWIDTH)
507 OGL_SetColorAndAlpha( 1,1,1,1 );
510 OGL_SetFlat(W_GetNumForName("FLOOR04")-firstflat);
514 OGL_SetFlat(W_GetNumForName("FLAT513")-firstflat);
517 OGL_DrawRectTiled(0, 0, 320, 64, 64, 64);
519 if( viewwindowy < 65 )
522 OGL_SetPatch(lump=W_GetNumForName("bordt"));
523 OGL_DrawRectTiled(viewwindowx, viewwindowy-4, viewwidth,
524 lumptexsizes[lump].h, 16, lumptexsizes[lump].h);
526 OGL_DrawPatch(viewwindowx-4, viewwindowy, W_GetNumForName("bordl"));
527 OGL_DrawPatch(viewwindowx+viewwidth, viewwindowy,
528 W_GetNumForName("bordr"));
529 OGL_DrawPatch(viewwindowx-4, viewwindowy+16,
530 W_GetNumForName("bordl"));
531 OGL_DrawPatch(viewwindowx+viewwidth, viewwindowy+16,
532 W_GetNumForName("bordr"));
534 OGL_DrawPatch(viewwindowx-4, viewwindowy-4,
535 W_GetNumForName("bordtl"));
536 OGL_DrawPatch(viewwindowx+viewwidth, viewwindowy-4,
537 W_GetNumForName("bordtr"));//, PU_CACHE));
544 if (scaledviewwidth == SCREENWIDTH)
549 src = W_CacheLumpName ("FLOOR04", PU_CACHE);
553 src = W_CacheLumpName ("FLAT513", PU_CACHE);
557 for (y=0 ; y<30 ; y++)
559 for (x=0 ; x<SCREENWIDTH/64 ; x++)
561 memcpy (dest, src+((y&63)<<6), 64);
566 memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
567 dest += (SCREENWIDTH&63);
572 for(x=viewwindowx; x < viewwindowx+viewwidth; x += 16)
574 V_DrawPatch(x, viewwindowy-4, W_CacheLumpName("bordt", PU_CACHE));
576 V_DrawPatch(viewwindowx-4, viewwindowy, W_CacheLumpName("bordl",
578 V_DrawPatch(viewwindowx+viewwidth, viewwindowy,
579 W_CacheLumpName("bordr", PU_CACHE));
580 V_DrawPatch(viewwindowx-4, viewwindowy+16, W_CacheLumpName("bordl",
582 V_DrawPatch(viewwindowx+viewwidth, viewwindowy+16,
583 W_CacheLumpName("bordr", PU_CACHE));
585 V_DrawPatch(viewwindowx-4, viewwindowy-4, W_CacheLumpName("bordtl",
587 V_DrawPatch(viewwindowx+viewwidth, viewwindowy-4,
588 W_CacheLumpName("bordtr", PU_CACHE));