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

📄 r_data.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: r_data.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_data.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////// Revision 1.3  1997/01/29 20:10// DESCRIPTION://	Preparation of data for rendering,//	generation of lookups, caching, retrieval by name.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: r_data.c,v 1.2 2003/09/08 22:34:31 jasonk Exp $";#ifdef __BEOS__#ifdef __GNUC__extern void *alloca(int);#else#include <alloca.h>#endif#endif /* __BEOS__ */#include "m_swap.h"#include "i_system.h"#include "z_zone.h"#include "w_wad.h"#include "doomdef.h"#include "r_local.h"#include "p_local.h"#include "doomstat.h"#include "r_sky.h"#include "r_data.h"//// Graphics.// DOOM graphics for walls and sprites// is stored in vertical runs of opaque pixels (posts).// A column is composed of zero or more posts,// a patch or sprite is composed of zero or more columns.// //// Texture definition.// Each texture is composed of one or more patches,// with patches being lumps stored in the WAD.// The lumps are referenced by number, and patched// into the rectangular texture space using origin// and possibly other attributes.//typedef __attribute__ ((packed)) struct{    short __attribute__ ((packed)) 	originx;    short __attribute__ ((packed)) 	originy;    short __attribute__ ((packed)) 	patch;    short __attribute__ ((packed)) 	stepdir;    short __attribute__ ((packed)) 	colormap;} mappatch_t;//// Texture definition.// A DOOM wall texture is a list of patches// which are to be combined in a predefined order.//typedef __attribute__ ((packed)) struct{    char		name[8];    boolean		masked;	    short		width;    short		height;    void		**columndirectory;	// OBSOLETE    short __attribute__ ((packed)) patchcount;    mappatch_t	__attribute__ ((packed)) patches[1];} maptexture_t;// A single patch from a texture definition,//  basically a rectangular area within//  the texture rectangle.typedef struct{    // Block origin (allways UL),    // which has allready accounted    // for the internal origin of the patch.    int		originx;	    int		originy;    int		patch;} texpatch_t;// A maptexturedef_t describes a rectangular texture,//  which is composed of one or more mappatch_t structures//  that arrange graphic patches.typedef struct{    // Keep name for switch changing, etc.    char	name[8];		    short	width;    short	height;        // All the patches[patchcount]    //  are drawn back to front into the cached texture.    short	patchcount;    texpatch_t	patches[1];		    } texture_t;int		firstflat;int		lastflat;int		numflats;int		firstpatch;int		lastpatch;int		numpatches;int		firstspritelump;int		lastspritelump;int		numspritelumps;int		numtextures;texture_t**	textures;int*			texturewidthmask;// needed for texture peggingfixed_t*		textureheight;		int*			texturecompositesize;short**			texturecolumnlump;unsigned short**	texturecolumnofs;byte**			texturecomposite;// for global animationint*		flattranslation;int*		texturetranslation;// needed for pre renderingfixed_t*	spritewidth;	fixed_t*	spriteoffset;fixed_t*	spritetopoffset;lighttable_t	*colormaps;//// MAPTEXTURE_T CACHING// When a texture is first needed,//  it counts the number of composite columns//  required in the texture and allocates space//  for a column directory and any new columns.// The directory will simply point inside other patches//  if there is only one patch in a given column,//  but any columns with multiple patches//  will have new column_ts generated.////// R_DrawColumnInCache// Clip and draw a column//  from a patch into a cached post.//voidR_DrawColumnInCache( column_t*	patch,  byte*		cache,  int		originy,  int		cacheheight ){    int		count;    int		position;    byte*	source;    byte*	dest;	    dest = (byte *)cache + 3;	    while (patch->topdelta != 0xff)    {	source = (byte *)patch + 3;	count = patch->length;	position = originy + patch->topdelta;	if (position < 0)	{	    count += position;	    position = 0;	}	if (position + count > cacheheight)	    count = cacheheight - position;	if (count > 0)	    memcpy (cache + position, source, count);			patch = (column_t *)(  (byte *)patch + patch->length + 4);     }}//// R_GenerateComposite// Using the texture definition,//  the composite texture is created from the patches,//  and each column is cached.//void R_GenerateComposite (int texnum){    byte*		block;    texture_t*		texture;    texpatch_t*		patch;	    patch_t*		realpatch;    int			x;    int			x1;    int			x2;    int			i;    column_t*		patchcol;    short*		collump;    unsigned short*	colofs;	    texture = textures[texnum];    block = Z_Malloc (texturecompositesize[texnum],		      PU_STATIC, 		      &texturecomposite[texnum]);	    collump = texturecolumnlump[texnum];    colofs = texturecolumnofs[texnum];        // Composite the columns together.    patch = texture->patches;		    for (i=0 , patch = texture->patches;	 i<texture->patchcount;	 i++, patch++)    {	realpatch = W_CacheLumpNum (patch->patch, PU_CACHE);	x1 = patch->originx;	x2 = x1 + SHORT(realpatch->width);	if (x1<0)	    x = 0;	else	    x = x1;		if (x2 > texture->width)	    x2 = texture->width;	for ( ; x<x2 ; x++)	{	    // Column does not have multiple patches?	    if (collump[x] >= 0)		continue;	    	    patchcol = (column_t *)((byte *)realpatch				    + LONG(realpatch->columnofs[x-x1]));	    R_DrawColumnInCache (patchcol,				 block + colofs[x],				 patch->originy,				 texture->height);	}						    }    // Now that the texture has been built in column cache,    //  it is purgable from zone memory.    Z_ChangeTag (block, PU_CACHE);}//// R_GenerateLookup//void R_GenerateLookup (int texnum){    texture_t*		texture;    byte*		patchcount;	// patchcount[texture->width]    texpatch_t*		patch;	    patch_t*		realpatch;    int			x;    int			x1;    int			x2;    int			i;    short*		collump;    unsigned short*	colofs;	    texture = textures[texnum];    // Composited texture not created yet.    texturecomposite[texnum] = 0;        texturecompositesize[texnum] = 0;    collump = texturecolumnlump[texnum];    colofs = texturecolumnofs[texnum];        // Now count the number of columns    //  that are covered by more than one patch.    // Fill in the lump / offset, so columns    //  with only a single patch are all done.    patchcount = (byte *)alloca (texture->width);    memset (patchcount, 0, texture->width);    patch = texture->patches;		    for (i=0 , patch = texture->patches;	 i<texture->patchcount;	 i++, patch++)    {	realpatch = W_CacheLumpNum (patch->patch, PU_CACHE);	x1 = patch->originx;	x2 = x1 + SHORT(realpatch->width);		if (x1 < 0)	    x = 0;	else	    x = x1;	if (x2 > texture->width)	    x2 = texture->width;	for ( ; x<x2 ; x++)	{	    patchcount[x]++;	    collump[x] = patch->patch;	    colofs[x] = LONG(realpatch->columnofs[x-x1])+3;	}    }	    for (x=0 ; x<texture->width ; x++)    {	if (!patchcount[x])	{	    printf ("R_GenerateLookup: column without a patch (%s)\n",		    texture->name);	    return;	}	// I_Error ("R_GenerateLookup: column without a patch");		if (patchcount[x] > 1)	{	    // Use the cached block.	    collump[x] = -1;		    colofs[x] = texturecompositesize[texnum];	    	    if (texturecompositesize[texnum] > 0x10000-texture->height)	    {		I_Error ("R_GenerateLookup: texture %i is >64k",			 texnum);	    }	    	    texturecompositesize[texnum] += texture->height;	}    }	}//// R_GetColumn//byte*R_GetColumn( int		tex,  int		col ){    int		lump;    int		ofs;	    col &= texturewidthmask[tex];    lump = texturecolumnlump[tex][col];    ofs = texturecolumnofs[tex][col];        if (lump > 0)	return (byte *)W_CacheLumpNum(lump,PU_CACHE)+ofs;    if (!texturecomposite[tex])	R_GenerateComposite (tex);    return texturecomposite[tex] + ofs;}//// R_InitTextures// Initializes the texture list//  with the textures from the world map.//void R_InitTextures (void){    maptexture_t*	mtexture;    texture_t*		texture;    mappatch_t*		mpatch;    texpatch_t*		patch;    int			i;    int			j;    int*		maptex;    int*		maptex2;    int*		maptex1;        char		name[9];    char*		names;    char*		name_p;        int*		patchlookup;        int			totalwidth;    int			nummappatches;    int			offset;    int			maxoff;    int			maxoff2;

⌨️ 快捷键说明

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