/***************************************************************************/ /* */ /* */ /* Raven 3D Engine */ /* Copyright (C) 1995 by Softdisk Publishing */ /* */ /* Original Design: */ /* John Carmack of id Software */ /* */ /* Enhancements by: */ /* Robert Morgan of Channel 7............................Main Engine Code */ /* Todd Lewis of Softdisk Publishing......Tools,Utilities,Special Effects */ /* John Bianca of Softdisk Publishing..............Low-level Optimization */ /* Carlos Hasan..........................................Music/Sound Code */ /* */ /* */ /***************************************************************************/ #ifndef R_REFDEF_H #define R_REFDEF_H #include "r_public.h" #define rint(x) (int)(x+0.5) /**** CONSTANTS ****/ #define TANANGLES 8192 // one quadrant #define FINESHIFT 5 #define MAXVISVERTEXES 1536 // max tile corners visible at once // for spans #define MAXSPANS 4096 #define ZSHIFT 12 #define ZTOFRAC 4 // shift the Z into frac position #define ZMASK (0xfffff< 0 int floory, ceilingy; } vertex_t; typedef struct { int tilex, tiley, xmin, xmax, mapspot, counter; } entry_t; typedef enum { sp_flat, sp_slope, sp_door, sp_shape, sp_maskeddoor, sp_transparentwall, sp_step, sp_sky, sp_slopesky, sp_flatsky, sp_inviswall } spanobj_t; typedef struct { spanobj_t spantype; byte *picture; void *structure; // either doorobj or scaleobj fixed_t x2, y, yh; int light, shadow; } span_t; typedef struct { short leftoffset, width; short collumnofs[256]; // only uses [width] entries } scalepic_t; typedef struct { fixed_t tx, ty, tz; int px, py; } clippoint_t; /**** VARIABLES ****/ extern void (*actionhook)(void); extern vertex_t vertexlist[MAXVISVERTEXES], *vertexlist_p; extern fixed_t yslope[MAX_VIEW_HEIGHT+MAXSCROLL2], xslope[MAX_VIEW_WIDTH+1]; extern byte **wallposts; extern byte *colormaps; extern int numcolormaps; extern byte *zcolormap[(MAXZ>>FRACBITS)+1]; extern fixed_t viewx, viewy, viewz; extern fixed_t viewcos, viewsin; extern fixed_t xscale, yscale; extern int viewangle, viewfineangle; extern int viewtilex, viewtiley; extern int side; extern int walltype; extern int wallshadow; extern vertex_t *vertex[4]; // points to the for corner vertexes in vert extern vertex_t *p1, *p2; extern int xclipl, xcliph; // clip window for current tile extern int tilex, tiley; // coordinates of the tile being rendered extern int mapspot; // tiley*MAPSIZE+tilex extern boolean doortile; // true if the tile being renderd has a door extern fixed_t tangents[TANANGLES *2]; extern fixed_t sines[TANANGLES *5]; extern int backtangents[TANANGLES*2]; extern fixed_t *cosines; // point 1/4 phase into sines extern int pixelangle[MAX_VIEW_WIDTH+1]; // +1 because span ends go one past extern fixed_t pixelcosine[MAX_VIEW_WIDTH+1]; extern int wallpixelangle[MAX_VIEW_WIDTH+1]; extern fixed_t wallpixelcosine[MAX_VIEW_WIDTH+1]; extern int campixelangle[MAX_VIEW_WIDTH+1]; extern fixed_t campixelcosine[MAX_VIEW_WIDTH+1]; extern fixed_t wallz[MAX_VIEW_WIDTH]; extern byte *mr_picture; // pointer to a raw 64*64 pixel picture extern fixed_t mf_deltaheight; extern scaleobj_t firstscaleobj, lastscaleobj; extern scaleobj_t scaleobjlist[MAXSPRITES], *freescaleobj_p; extern doorobj_t doorlist[MAXDOORS]; extern int numdoors; extern elevobj_t firstelevobj, lastelevobj; extern elevobj_t elevlist[MAXELEVATORS], *freeelevobj_p; extern spawnarea_t spawnareas[MAXSPAWNAREAS]; extern int numspawnareas; extern int doorxl, doorxh; extern byte *sp_dest; // the bottom most pixel to be drawn (in vie extern byte *sp_source; // the first pixel in the vertical post (may extern byte *sp_colormap; // pointer to a 256 byte color number to pal extern long sp_frac; // fixed point location past sp_source extern long sp_fracstep; // fixed point step value extern int sp_count; // the number of pixels to draw extern long sp_loopvalue; extern byte *mr_dest; // the left most pixel to be drawn (in viewb extern byte *mr_picture; // pointer to a raw 64*64 pixel picture extern byte *mr_colormap; // pointer to a 256 byte color number to pal extern int mr_xfrac; // starting texture coordinate extern int mr_yfrac; // starting texture coordinate extern int mr_xstep; // fixed point step value extern int mr_ystep; // fixed point step value extern int mr_count; // the number of pixels to draw extern int mr_shadow; extern unsigned spantags[MAXSPANS]; extern unsigned *starttaglist_p, *endtaglist_p; extern span_t spans[MAXSPANS], *spans_p; extern int spansx[MAXSPANS]; extern int numspans; extern int wallglow; // wallshadow = 1 extern int wallglowindex; // counter for wall glow extern int wallrotate; extern int maplight; extern byte *tpwalls_dest[MAXPEND]; // transparentposts extern byte *tpwalls_colormap[MAXPEND]; extern int tpwalls_count[MAXPEND]; extern int transparentposts; extern int autoangle[MAXAUTO*2+1][MAXAUTO*2+1]; extern int autoangle2[MAXAUTO][MAXAUTO]; extern int wallflicker1, wallflicker2, wallflicker3, wallcycle, wallflicker4; extern int wallflags; extern fixed_t afrac, hfrac; /**** FUNCTIONS ****/ void SetupFrame(void); vertex_t *TransformVertex(int tilex, int tiley); void FlowView(); void InitWalls(void); void RenderTileWalls(entry_t *e); void DrawWall(int x1,int x2); void DrawSteps(int x1, int x2); void InitPlane(void); void ClearMapCache(void); void RenderTileEnds(void); void FindBackVertex(void); void RenderDoor(void); void RenderSprites(); void ScalePost(void); void ScaleMaskedPost(void); void MapRow(void); void DrawSpans(void); void MS_Error(char *error, ...); #pragma aux ScalePost "*" parm [] modify [edi esi ebx]; #pragma aux ScaleMaskedPost "*" parm [] modify [edi esi ebx]; #pragma aux MapRow "*" parm [] modify [edi esi ebx]; #pragma aux sp_dest "*"; #pragma aux sp_source "*"; #pragma aux sp_colormap "*"; #pragma aux sp_frac "*"; #pragma aux sp_fracstep "*"; #pragma aux sp_count "*"; #pragma aux sp_loopvalue "*"; #pragma aux mr_xfrac "*"; #pragma aux mr_yfrac "*"; #pragma aux mr_xstep "*"; #pragma aux mr_ystep "*"; #pragma aux mr_count "*"; #pragma aux mr_picture "*"; #pragma aux mr_colormap "*"; #pragma aux mr_dest "*"; #pragma aux actionhook "*"; #endif