📄 r_data.c
字号:
// 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 + -