123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577 |
- //**************************************************************************
- //**
- //** r_draw.c : Heretic 2 : Raven Software, Corp.
- //**
- //** $RCSfile: r_draw.c,v $
- //** $Revision: 1.11 $
- //** $Date: 96/01/06 18:37:37 $
- //** $Author: bgokey $
- //**
- //**************************************************************************
- #include "h2def.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
- /*
- ==================
- =
- = R_DrawColumn
- =
- = Source is the top of the column to scale
- =
- ==================
- */
- 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
- #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
- #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 fuzzpos = 0;
- */
- #ifndef __WATCOMC__
- 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 += SCREENWIDTH;
- frac += fracstep;
- } while (count--);
- */
- do
- {
- *dest = tinttable[*dest+
- (dc_colormap[dc_source[(frac>>FRACBITS)&127]]<<8)];
- dest += SCREENWIDTH;
- frac += fracstep;
- } while(count--);
- }
- #endif
- //============================================================================
- //
- // R_DrawAltFuzzColumn
- //
- //============================================================================
- void R_DrawAltFuzzColumn (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;
- do
- {
- *dest = tinttable[((*dest)<<8)
- +dc_colormap[dc_source[(frac>>FRACBITS)&127]]];
- dest += SCREENWIDTH;
- frac += fracstep;
- } while(count--);
- }
- /*
- ========================
- =
- = R_DrawTranslatedColumn
- =
- ========================
- */
- 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--);
- }
- //============================================================================
- //
- // R_DrawTranslatedFuzzColumn
- //
- //============================================================================
- 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--);
- }
- //============================================================================
- //
- // R_DrawTranslatedAltFuzzColumn
- //
- //============================================================================
- /*
- void R_DrawTranslatedAltFuzzColumn (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
- +(dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]<<8)];
- dest += SCREENWIDTH;
- frac += fracstep;
- } while (count--);
- }
- */
- //--------------------------------------------------------------------------
- //
- // PROC R_InitTranslationTables
- //
- //--------------------------------------------------------------------------
- void R_InitTranslationTables (void)
- {
- int i;
- byte *transLump;
- // Load tint table
- tinttable = W_CacheLumpName("TINTTAB", PU_STATIC);
- // Allocate translation tables
- translationtables = Z_Malloc(256*3*(MAXPLAYERS-1)+255,
- PU_STATIC, 0);
- translationtables = (byte *)(((int)translationtables+255)&~255);
- for(i = 0; i < 3*(MAXPLAYERS-1); i++)
- {
- transLump = W_CacheLumpNum(W_GetNumForName("trantbl0")+i, PU_STATIC);
- memcpy(translationtables+i*256, transLump, 256);
- Z_Free(transLump);
- }
- }
- /*
- ================
- =
- = 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
- 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<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;
- src = W_CacheLumpName("F_022", 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
- ==================
- */
- boolean BorderTopRefresh;
- void R_DrawTopBorder (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);
- }
- */
- src = W_CacheLumpName("F_022", PU_CACHE);
- dest = screen;
-
- for (y=0 ; y<34 ; 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);
- }
- }
- if(viewwindowy < 35)
- {
- for(x=viewwindowx; x < viewwindowx+viewwidth; x += 16)
- {
- V_DrawPatch(x, viewwindowy-4, W_CacheLumpName("bordt", PU_CACHE));
- }
- V_DrawPatch(viewwindowx-4, viewwindowy, W_CacheLumpName("bordl",
- PU_CACHE));
- V_DrawPatch(viewwindowx+viewwidth, viewwindowy,
- W_CacheLumpName("bordr", PU_CACHE));
- V_DrawPatch(viewwindowx-4, viewwindowy+16, W_CacheLumpName("bordl",
- PU_CACHE));
- V_DrawPatch(viewwindowx+viewwidth, viewwindowy+16,
- 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));
- }
- }
|