⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_draw.c

📁 Nxdoom真的满好用的
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: r_draw.c,v 1.2 2003/09/08 22:34:31 jasonk Exp $//// Copyright (C) 1993-1996 by id Software, Inc.//// This source is available for distribution and/or modification// only under the terms of the DOOM Source Code License as// published by id Software. All rights reserved.//// The source is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License// for more details.//// $Log: r_draw.c,v $// Revision 1.2  2003/09/08 22:34:31  jasonk// Updated files because this fucker won't build for no fucking good reason.//// Revision 1.1.1.1  2003/09/04 21:08:13  jasonk// Initial import//// Revision 1.1  2000/12/08 21:07:54  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	The actual span/column drawing functions.//	Here find the main potential for optimization,//	 e.g. inline assembly, different algorithms.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: r_draw.c,v 1.2 2003/09/08 22:34:31 jasonk Exp $";#include "doomdef.h"#include "i_system.h"#include "z_zone.h"#include "w_wad.h"#include "r_local.h"// Needs access to LFB (guess what).#include "v_video.h"// State.#include "doomstat.h"// ?#define MAXWIDTH			1120#define MAXHEIGHT			832// status bar height at bottom of screen#define SBARHEIGHT		32//// 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.// Conveniently, the frame buffer is a linear one,//  and we need only the base address,//  and the total size == width*height*depth/8.,//byte*		viewimage; int		viewwidth;int		scaledviewwidth;int		viewheight;int		viewwindowx;int		viewwindowy; byte*		ylookup[MAXHEIGHT]; int		columnofs[MAXWIDTH]; // Color tables for different players,//  translate a limited part to another//  (color ramps used for  suit colors).//byte		translations[3][256];	  //// 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;// first pixel in a column (possibly virtual) byte*			dc_source;		// just for profiling int			dccount;//// A column is a vertical slice/span from a wall texture that,//  given the DOOM style restrictions on the view orientation,//  will always have constant z depth.// Thus a special case loop for very fast rendering can//  be used. It has also been used with Wolfenstein 3D.// void R_DrawColumn (void) {     int			count;     byte*		dest;     fixed_t		frac;    fixed_t		fracstep;	      count = dc_yh - dc_yl;     // Zero length, column does not exceed a pixel.    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     // Framebuffer destination address.    // Use ylookup LUT to avoid multiply with ScreenWidth.    // Use columnofs LUT for subwindows?     dest = ylookup[dc_yl] + columnofs[dc_x];      // Determine scaling,    //  which is the only mapping to be done.    fracstep = dc_iscale;     frac = dc_texturemid + (dc_yl-centery)*fracstep;     // Inner loop that does the actual texture mapping,    //  e.g. a DDA-lile scaling.    // This is as fast as it gets.    do     {	// Re-map color indices from wall texture column	//  using a lighting/special effects LUT.	*dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];		dest += SCREENWIDTH; 	frac += fracstep;	    } while (count--); } // UNUSED.// Loop unrolled.#if 0void R_DrawColumn (void) {     int			count;     byte*		source;    byte*		dest;    byte*		colormap;        unsigned		frac;    unsigned		fracstep;    unsigned		fracstep2;    unsigned		fracstep3;    unsigned		fracstep4;	      count = dc_yh - dc_yl + 1;     source = dc_source;    colormap = dc_colormap;		     dest = ylookup[dc_yl] + columnofs[dc_x];  	     fracstep = dc_iscale<<9;     frac = (dc_texturemid + (dc_yl-centery)*dc_iscale)<<9;      fracstep2 = fracstep+fracstep;    fracstep3 = fracstep2+fracstep;    fracstep4 = fracstep3+fracstep;	    while (count >= 8)     { 	dest[0] = colormap[source[frac>>25]]; 	dest[SCREENWIDTH] = colormap[source[(frac+fracstep)>>25]]; 	dest[SCREENWIDTH*2] = colormap[source[(frac+fracstep2)>>25]]; 	dest[SCREENWIDTH*3] = colormap[source[(frac+fracstep3)>>25]];		frac += fracstep4; 	dest[SCREENWIDTH*4] = colormap[source[frac>>25]]; 	dest[SCREENWIDTH*5] = colormap[source[(frac+fracstep)>>25]]; 	dest[SCREENWIDTH*6] = colormap[source[(frac+fracstep2)>>25]]; 	dest[SCREENWIDTH*7] = colormap[source[(frac+fracstep3)>>25]]; 	frac += fracstep4; 	dest += SCREENWIDTH*8; 	count -= 8;    } 	    while (count > 0)    { 	*dest = colormap[source[frac>>25]]; 	dest += SCREENWIDTH; 	frac += fracstep; 	count--;    } }#endifvoid R_DrawColumnLow (void) {     int			count;     byte*		dest;     byte*		dest2;    fixed_t		frac;    fixed_t		fracstep;	      count = dc_yh - dc_yl;     // Zero length.    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     // Blocky mode, need to multiply by 2.    dc_x <<= 1;        dest = ylookup[dc_yl] + columnofs[dc_x];    dest2 = ylookup[dc_yl] + columnofs[dc_x+1];        fracstep = dc_iscale;     frac = dc_texturemid + (dc_yl-centery)*fracstep;        do     {	// Hack. Does not work corretly.	*dest2 = *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];	dest += SCREENWIDTH;	dest2 += SCREENWIDTH;	frac += fracstep;     } while (count--);}//// Spectre/Invisibility.//#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; //// Framebuffer postprocessing.// Creates a fuzzy image by copying pixels//  from adjacent ones to left and right.// Used with an all black colormap, this//  could create the SHADOW effect,//  i.e. spectres and invisible players.//void R_DrawFuzzColumn (void) {     int			count;     byte*		dest;     fixed_t		frac;    fixed_t		fracstep;	     // Adjust borders. Low...     if (!dc_yl) 	dc_yl = 1;    // .. and high.    if (dc_yh == viewheight-1) 	dc_yh = viewheight - 2; 		     count = dc_yh - dc_yl;     // Zero length.    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    // Keep till detailshift bug in blocky mode fixed,    //  or blocky mode removed.    /* WATCOM code     if (detailshift)    {	if (dc_x & 1)	{	    outpw (GC_INDEX,GC_READMAP+(2<<8) ); 	    outp (SC_INDEX+1,12); 	}	else	{	    outpw (GC_INDEX,GC_READMAP); 	    outp (SC_INDEX+1,3); 	}	dest = destview + dc_yl*80 + (dc_x>>1);     }    else    {	outpw (GC_INDEX,GC_READMAP+((dc_x&3)<<8) ); 	outp (SC_INDEX+1,1<<(dc_x&3)); 	dest = destview + dc_yl*80 + (dc_x>>2);     }*/        // Does not work with blocky mode.    dest = ylookup[dc_yl] + columnofs[dc_x];    // Looks familiar.    fracstep = dc_iscale;     frac = dc_texturemid + (dc_yl-centery)*fracstep;     // Looks like an attempt at dithering,    //  using the colormap #6 (of 0-31, a bit    //  brighter than average).    do     {	// Lookup framebuffer, and retrieve	//  a pixel that is either one column	//  left or right of the current one.	// Add index from colormap to index.	*dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]]; 	// Clamp table lookup index.	if (++fuzzpos == FUZZTABLE) 	    fuzzpos = 0;		dest += SCREENWIDTH;	frac += fracstep;     } while (count--); }     //// R_DrawTranslatedColumn// Used to draw player sprites//  with the green colorramp mapped to others.// Could be used with different translation//  tables, e.g. the lighter colored version//  of the BaronOfHell, the HellKnight, uses//  identical sprites, kinda brightened up.//byte*	dc_translation;byte*	translationtables;void R_DrawTranslatedColumn (void) {     int			count;     byte*		dest;     fixed_t		frac;    fixed_t		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     // WATCOM VGA specific.    /* Keep for fixing.    if (detailshift)    {	if (dc_x & 1)	    outp (SC_INDEX+1,12); 	else	    outp (SC_INDEX+1,3);		dest = destview + dc_yl*80 + (dc_x>>1);     }    else    {	outp (SC_INDEX+1,1<<(dc_x&3)); 	dest = destview + dc_yl*80 + (dc_x>>2);     }*/        // FIXME. As above.    dest = ylookup[dc_yl] + columnofs[dc_x];     // Looks familiar.    fracstep = dc_iscale;     frac = dc_texturemid + (dc_yl-centery)*fracstep;     // Here we do an additional index re-mapping.    do 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -