From c7ddc423f67236a99956960cf9fe89abf077839b Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Fri, 5 Sep 2008 00:02:14 +0000 Subject: Reformat (beautify) Raven sources and add GPL headers. Subversion-branch: /branches/raven-branch Subversion-revision: 1197 --- src/heretic/r_draw.c | 902 +++++++++++++++++++++++++++------------------------ 1 file changed, 470 insertions(+), 432 deletions(-) (limited to 'src/heretic/r_draw.c') diff --git a/src/heretic/r_draw.c b/src/heretic/r_draw.c index 5cb3a85e..3d8cb776 100644 --- a/src/heretic/r_draw.c +++ b/src/heretic/r_draw.c @@ -1,21 +1,43 @@ -// R_draw.c - -#include "DoomDef.h" -#include "R_local.h" - -/* - -All drawing to the view buffer is accomplished in this file. The other refresh -files only know about ccordinates, not the architecture of the frame buffer. - -*/ - +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +// +//----------------------------------------------------------------------------- +// R_draw.c + +#include "DoomDef.h" +#include "R_local.h" + +/* + +All drawing to the view buffer is accomplished in this file. The other refresh +files only know about ccordinates, not the architecture of the frame buffer. + +*/ + byte *viewimage; int viewwidth, scaledviewwidth, viewheight, viewwindowx, viewwindowy; byte *ylookup[MAXHEIGHT]; int columnofs[MAXWIDTH]; -byte translations[3][256]; // color tables for different players -byte *tinttable; // used for translucent sprites +byte translations[3][256]; // color tables for different players +byte *tinttable; // used for translucent sprites /* ================== @@ -27,136 +49,147 @@ byte *tinttable; // used for translucent sprites ================== */ -lighttable_t *dc_colormap; -int dc_x; -int dc_yl; -int dc_yh; -fixed_t dc_iscale; -fixed_t dc_texturemid; -byte *dc_source; // first pixel in a column (possibly virtual) - -int dccount; // just for profiling - +lighttable_t *dc_colormap; +int dc_x; +int dc_yl; +int dc_yh; +fixed_t dc_iscale; +fixed_t dc_texturemid; +byte *dc_source; // first pixel in a column (possibly virtual) + +int dccount; // just for profiling + #ifndef __WATCOMC__ -#ifndef __i386 -#ifndef __m68k -void R_DrawColumn (void) -{ - int count; - byte *dest; - fixed_t frac, fracstep; - - count = dc_yh - dc_yl; - if (count < 0) - return; - -#ifdef RANGECHECK - if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) - I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); -#endif - - dest = ylookup[dc_yl] + columnofs[dc_x]; - - fracstep = dc_iscale; - frac = dc_texturemid + (dc_yl-centery)*fracstep; - - do - { - *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; - dest += SCREENWIDTH; - frac += fracstep; - } while (count--); -} -#endif // __m68k -#endif // __i386 +#ifndef __i386 +#ifndef __m68k +void R_DrawColumn(void) +{ + int count; + byte *dest; + fixed_t frac, fracstep; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + I_Error("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +#endif + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl - centery) * fracstep; + + do + { + *dest = dc_colormap[dc_source[(frac >> FRACBITS) & 127]]; + dest += SCREENWIDTH; + frac += fracstep; + } + while (count--); +} +#endif // __m68k +#endif // __i386 +#endif + +void R_DrawColumnLow(void) +{ + int count; + byte *dest; + fixed_t frac, fracstep; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + I_Error("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +// dccount++; #endif -void R_DrawColumnLow (void) -{ - int count; - byte *dest; - fixed_t frac, fracstep; - - count = dc_yh - dc_yl; - if (count < 0) - return; - -#ifdef RANGECHECK - if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) - I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); -// dccount++; -#endif - - dest = ylookup[dc_yl] + columnofs[dc_x]; - - fracstep = dc_iscale; - frac = dc_texturemid + (dc_yl-centery)*fracstep; - - do - { - *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; - dest += SCREENWIDTH; - frac += fracstep; - } while (count--); -} - - -#define FUZZTABLE 50 + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl - centery) * fracstep; + + do + { + *dest = dc_colormap[dc_source[(frac >> FRACBITS) & 127]]; + dest += SCREENWIDTH; + frac += fracstep; + } + while (count--); +} + + +#define FUZZTABLE 50 #define FUZZOFF (SCREENWIDTH) -int fuzzoffset[FUZZTABLE] = { -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 -}; +int fuzzoffset[FUZZTABLE] = { + 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 +}; int fuzzpos = 0; -void R_DrawFuzzColumn (void) -{ - int count; - byte *dest; - fixed_t frac, fracstep; - - if (!dc_yl) - dc_yl = 1; - if (dc_yh == viewheight-1) - dc_yh = viewheight - 2; - - count = dc_yh - dc_yl; - if (count < 0) - return; - -#ifdef RANGECHECK - if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) - I_Error ("R_DrawFuzzColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); -#endif - - dest = ylookup[dc_yl] + columnofs[dc_x]; - - fracstep = dc_iscale; - frac = dc_texturemid + (dc_yl-centery)*fracstep; - +void R_DrawFuzzColumn(void) +{ + int count; + byte *dest; + fixed_t frac, fracstep; + + if (!dc_yl) + dc_yl = 1; + if (dc_yh == viewheight - 1) + dc_yh = viewheight - 2; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + I_Error("R_DrawFuzzColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +#endif + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl - centery) * fracstep; + // OLD FUZZY INVISO SPRITE STUFF /* do - { - *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]]; - if (++fuzzpos == FUZZTABLE) - fuzzpos = 0; + { + *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]]; + if (++fuzzpos == FUZZTABLE) + fuzzpos = 0; dest += SCREENWIDTH; frac += fracstep; } while (count--); */ - do - { - *dest = tinttable[((*dest)<<8)+dc_colormap[dc_source[(frac>>FRACBITS)&127]]]; + do + { + *dest = + tinttable[((*dest) << 8) + + dc_colormap[dc_source[(frac >> FRACBITS) & 127]]]; - //*dest = dest[SCREENWIDTH*10+5]; + //*dest = dest[SCREENWIDTH*10+5]; -// *dest = //tinttable[((*dest)<<8)+colormaps[dc_source[(frac>>FRACBITS)&127]]]; +// *dest = //tinttable[((*dest)<<8)+colormaps[dc_source[(frac>>FRACBITS)&127]]]; -// *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; - dest += SCREENWIDTH; - frac += fracstep; - } while(count--); +// *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; + dest += SCREENWIDTH; + frac += fracstep; + } + while (count--); } /* @@ -170,62 +203,66 @@ void R_DrawFuzzColumn (void) byte *dc_translation; byte *translationtables; -void R_DrawTranslatedColumn (void) -{ - int count; - byte *dest; - fixed_t frac, fracstep; - - count = dc_yh - dc_yl; - if (count < 0) - return; - -#ifdef RANGECHECK - if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) - I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); -#endif - - dest = ylookup[dc_yl] + columnofs[dc_x]; - - fracstep = dc_iscale; - frac = dc_texturemid + (dc_yl-centery)*fracstep; - - do - { - *dest = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]; - dest += SCREENWIDTH; - frac += fracstep; - } while (count--); -} - -void R_DrawTranslatedFuzzColumn (void) -{ - int count; - byte *dest; - fixed_t frac, fracstep; - - count = dc_yh - dc_yl; - if (count < 0) - return; - -#ifdef RANGECHECK - if ((unsigned)dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) - I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); -#endif - - dest = ylookup[dc_yl] + columnofs[dc_x]; - - fracstep = dc_iscale; - frac = dc_texturemid + (dc_yl-centery)*fracstep; - - do - { - *dest = tinttable[((*dest)<<8) - +dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]]; - dest += SCREENWIDTH; - frac += fracstep; - } while (count--); -} +void R_DrawTranslatedColumn(void) +{ + int count; + byte *dest; + fixed_t frac, fracstep; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + I_Error("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +#endif + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl - centery) * fracstep; + + do + { + *dest = dc_colormap[dc_translation[dc_source[frac >> FRACBITS]]]; + dest += SCREENWIDTH; + frac += fracstep; + } + while (count--); +} + +void R_DrawTranslatedFuzzColumn(void) +{ + int count; + byte *dest; + fixed_t frac, fracstep; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + I_Error("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +#endif + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl - centery) * fracstep; + + do + { + *dest = tinttable[((*dest) << 8) + + + dc_colormap[dc_translation + [dc_source[frac >> FRACBITS]]]]; + dest += SCREENWIDTH; + frac += fracstep; + } + while (count--); +} //-------------------------------------------------------------------------- // @@ -233,266 +270,267 @@ void R_DrawTranslatedFuzzColumn (void) // //-------------------------------------------------------------------------- -void R_InitTranslationTables (void) +void R_InitTranslationTables(void) { - int i; + int i; - // Load tint table - tinttable = W_CacheLumpName("TINTTAB", PU_STATIC); + // Load tint table + tinttable = W_CacheLumpName("TINTTAB", PU_STATIC); - // Allocate translation tables - translationtables = Z_Malloc(256*3+255, PU_STATIC, 0); - translationtables = (byte *)(( (int)translationtables + 255 )& ~255); + // Allocate translation tables + translationtables = Z_Malloc(256 * 3 + 255, PU_STATIC, 0); + translationtables = (byte *) (((int) translationtables + 255) & ~255); - // Fill out the translation tables - for(i = 0; i < 256; i++) - { - if(i >= 225 && i <= 240) - { - translationtables[i] = 114+(i-225); // yellow - translationtables[i+256] = 145+(i-225); // red - translationtables[i+512] = 190+(i-225); // blue - } - else - { - translationtables[i] = translationtables[i+256] - = translationtables[i+512] = i; - } - } + // Fill out the translation tables + for (i = 0; i < 256; i++) + { + if (i >= 225 && i <= 240) + { + translationtables[i] = 114 + (i - 225); // yellow + translationtables[i + 256] = 145 + (i - 225); // red + translationtables[i + 512] = 190 + (i - 225); // blue + } + else + { + translationtables[i] = translationtables[i + 256] + = translationtables[i + 512] = i; + } + } } -/* -================ -= -= R_DrawSpan -= -================ -*/ - -int ds_y; -int ds_x1; -int ds_x2; -lighttable_t *ds_colormap; -fixed_t ds_xfrac; -fixed_t ds_yfrac; -fixed_t ds_xstep; -fixed_t ds_ystep; -byte *ds_source; // start of a 64*64 tile image - -int dscount; // just for profiling - -#ifndef __WATCOMC__ -#ifndef __i386 -#ifndef __m68k -void R_DrawSpan (void) -{ - fixed_t xfrac, yfrac; - byte *dest; - int count, spot; - -#ifdef RANGECHECK - if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH - || (unsigned)ds_y>SCREENHEIGHT) - I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y); -// dscount++; -#endif - - xfrac = ds_xfrac; - yfrac = ds_yfrac; - - dest = ylookup[ds_y] + columnofs[ds_x1]; - count = ds_x2 - ds_x1; - do - { - spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63); - *dest++ = ds_colormap[ds_source[spot]]; - xfrac += ds_xstep; - yfrac += ds_ystep; - } while (count--); -} +/* +================ += += R_DrawSpan += +================ +*/ + +int ds_y; +int ds_x1; +int ds_x2; +lighttable_t *ds_colormap; +fixed_t ds_xfrac; +fixed_t ds_yfrac; +fixed_t ds_xstep; +fixed_t ds_ystep; +byte *ds_source; // start of a 64*64 tile image + +int dscount; // just for profiling + +#ifndef __WATCOMC__ +#ifndef __i386 +#ifndef __m68k +void R_DrawSpan(void) +{ + fixed_t xfrac, yfrac; + byte *dest; + int count, spot; + +#ifdef RANGECHECK + if (ds_x2 < ds_x1 || ds_x1 < 0 || ds_x2 >= SCREENWIDTH + || (unsigned) ds_y > SCREENHEIGHT) + I_Error("R_DrawSpan: %i to %i at %i", ds_x1, ds_x2, ds_y); +// dscount++; +#endif + + xfrac = ds_xfrac; + yfrac = ds_yfrac; + + dest = ylookup[ds_y] + columnofs[ds_x1]; + count = ds_x2 - ds_x1; + do + { + spot = ((yfrac >> (16 - 6)) & (63 * 64)) + ((xfrac >> 16) & 63); + *dest++ = ds_colormap[ds_source[spot]]; + xfrac += ds_xstep; + yfrac += ds_ystep; + } + while (count--); +} +#endif #endif #endif -#endif - -void R_DrawSpanLow (void) -{ - fixed_t xfrac, yfrac; - byte *dest; - int count, spot; - -#ifdef RANGECHECK - if (ds_x2 < ds_x1 || ds_x1<0 || ds_x2>=SCREENWIDTH - || (unsigned)ds_y>SCREENHEIGHT) - I_Error ("R_DrawSpan: %i to %i at %i",ds_x1,ds_x2,ds_y); -// dscount++; -#endif - - xfrac = ds_xfrac; - yfrac = ds_yfrac; - - dest = ylookup[ds_y] + columnofs[ds_x1]; - count = ds_x2 - ds_x1; - do - { - spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63); - *dest++ = ds_colormap[ds_source[spot]]; - xfrac += ds_xstep; - yfrac += ds_ystep; - } while (count--); -} - - - -/* -================ -= -= R_InitBuffer -= -================= -*/ - -void R_InitBuffer (int width, int height) -{ - int i; - - viewwindowx = (SCREENWIDTH-width) >> 1; - for (i=0 ; i> 1; - for (i=0 ; i= SCREENWIDTH + || (unsigned) ds_y > SCREENHEIGHT) + I_Error("R_DrawSpan: %i to %i at %i", ds_x1, ds_x2, ds_y); +// dscount++; +#endif + + xfrac = ds_xfrac; + yfrac = ds_yfrac; + + dest = ylookup[ds_y] + columnofs[ds_x1]; + count = ds_x2 - ds_x1; + do + { + spot = ((yfrac >> (16 - 6)) & (63 * 64)) + ((xfrac >> 16) & 63); + *dest++ = ds_colormap[ds_source[spot]]; + xfrac += ds_xstep; + yfrac += ds_ystep; + } + while (count--); +} + + + +/* +================ += += R_InitBuffer += +================= +*/ + +void R_InitBuffer(int width, int height) +{ + int i; + + viewwindowx = (SCREENWIDTH - width) >> 1; + for (i = 0; i < width; i++) + columnofs[i] = viewwindowx + i; + if (width == SCREENWIDTH) + viewwindowy = 0; + else + viewwindowy = (SCREENHEIGHT - SBARHEIGHT - height) >> 1; + for (i = 0; i < height; i++) + ylookup[i] = screen + (i + viewwindowy) * SCREENWIDTH; +} + + +/* +================== += += R_DrawViewBorder += += Draws the border around the view for different size windows +================== +*/ + boolean BorderNeedRefresh; -void R_DrawViewBorder (void) -{ - byte *src, *dest; - int x,y; - - if (scaledviewwidth == SCREENWIDTH) - return; +void R_DrawViewBorder(void) +{ + byte *src, *dest; + int x, y; + + if (scaledviewwidth == SCREENWIDTH) + return; + + if (shareware) + { + src = W_CacheLumpName("FLOOR04", PU_CACHE); + } + else + { + src = W_CacheLumpName("FLAT513", PU_CACHE); + } + dest = screen; + + for (y = 0; y < SCREENHEIGHT - SBARHEIGHT; y++) + { + for (x = 0; x < SCREENWIDTH / 64; x++) + { + memcpy(dest, src + ((y & 63) << 6), 64); + dest += 64; + } + if (SCREENWIDTH & 63) + { + memcpy(dest, src + ((y & 63) << 6), SCREENWIDTH & 63); + dest += (SCREENWIDTH & 63); + } + } + for (x = viewwindowx; x < viewwindowx + viewwidth; x += 16) + { + V_DrawPatch(x, viewwindowy - 4, W_CacheLumpName("bordt", PU_CACHE)); + V_DrawPatch(x, viewwindowy + viewheight, W_CacheLumpName("bordb", + PU_CACHE)); + } + for (y = viewwindowy; y < viewwindowy + viewheight; y += 16) + { + V_DrawPatch(viewwindowx - 4, y, W_CacheLumpName("bordl", PU_CACHE)); + V_DrawPatch(viewwindowx + viewwidth, y, W_CacheLumpName("bordr", + PU_CACHE)); + } + V_DrawPatch(viewwindowx - 4, viewwindowy - 4, W_CacheLumpName("bordtl", + PU_CACHE)); + V_DrawPatch(viewwindowx + viewwidth, viewwindowy - 4, + W_CacheLumpName("bordtr", PU_CACHE)); + V_DrawPatch(viewwindowx + viewwidth, viewwindowy + viewheight, + W_CacheLumpName("bordbr", PU_CACHE)); + V_DrawPatch(viewwindowx - 4, viewwindowy + viewheight, + W_CacheLumpName("bordbl", PU_CACHE)); +} + +/* +================== += += R_DrawTopBorder += += Draws the top border around the view for different size windows +================== +*/ - if(shareware) - { - src = W_CacheLumpName ("FLOOR04", PU_CACHE); - } - else - { - src = W_CacheLumpName ("FLAT513", PU_CACHE); - } - dest = screen; - - for (y=0 ; y