ref: 8bd16fed5b196ae0d0c05e2d8412b2e7b08901ba
dir: /r_local.h/
//************************************************************************** //** //** r_local.h : Heretic 2 : Raven Software, Corp. //** //** $Revision: 373 $ //** $Date: 2009-05-19 21:14:28 +0300 (Tue, 19 May 2009) $ //** //************************************************************************** #ifndef __R_LOCAL__ #define __R_LOCAL__ #define ANGLETOSKYSHIFT 22 /* sky map is 256*128*4 maps */ #define BASEYCENTER 100 #define MAXWIDTH 1120 #define MAXHEIGHT 832 #define PI 3.141592657 #define CENTERY (SCREENHEIGHT / 2) #define MINZ (FRACUNIT * 4) #define FIELDOFVIEW 2048 /* fineangles in the SCREENWIDTH wide window */ /* lighting constants */ #define LIGHTLEVELS 16 #define LIGHTSEGSHIFT 4 #define MAXLIGHTSCALE 48 #define LIGHTSCALESHIFT 12 #define MAXLIGHTZ 128 #define LIGHTZSHIFT 20 #define NUMCOLORMAPS 32 /* number of diminishing */ #define INVERSECOLORMAP 32 /* ------ INTERNAL MAP TYPES ------ */ /* ---- used by play and refresh ---- */ typedef struct { fixed_t x,y; } vertex_t; struct line_s; typedef struct { fixed_t floorheight, ceilingheight; short floorpic, ceilingpic; short lightlevel; short special, tag; int soundtraversed; /* 0 = untraversed, 1,2 = sndlines -1 */ mobj_t *soundtarget; /* thing that made a sound (or null) */ seqtype_t seqType; /* stone, metal, heavy, etc.. */ int blockbox[4]; /* mapblock bounding box for height changes */ degenmobj_t soundorg; /* for any sounds played by the sector */ int validcount; /* if == validcount, already checked */ mobj_t *thinglist; /* list of mobjs in sector */ void *specialdata; /* thinker_t for reversable actions */ int linecount; struct line_s **lines; /* [linecount] size */ #ifdef RENDER3D int flatoffx, flatoffy; /* Scrolling flats. */ int skyfix; /* Offset to ceiling height rendering w/sky. */ #endif } sector_t; typedef struct { fixed_t textureoffset; /* add this to the calculated texture col */ fixed_t rowoffset; /* add this to the calculated texture top */ short toptexture, bottomtexture, midtexture; sector_t *sector; } side_t; typedef enum { ST_HORIZONTAL, ST_VERTICAL, ST_POSITIVE, ST_NEGATIVE } slopetype_t; /* typedef struct line_s { vertex_t *v1, *v2; fixed_t dx,dy; // v2 - v1 for side checking short flags; short special, tag; short sidenum[2]; // sidenum[1] will be -1 if one sided fixed_t bbox[4]; slopetype_t slopetype; // to aid move clipping sector_t *frontsector, *backsector; int validcount; // if == validcount, already checked void *specialdata; // thinker_t for reversable actions } line_t; */ typedef struct line_s { vertex_t *v1; vertex_t *v2; fixed_t dx; fixed_t dy; short flags; byte special; byte arg1; byte arg2; byte arg3; byte arg4; byte arg5; short sidenum[2]; fixed_t bbox[4]; slopetype_t slopetype; sector_t *frontsector; sector_t *backsector; int validcount; void *specialdata; } line_t; typedef struct { vertex_t *v1, *v2; fixed_t offset; angle_t angle; side_t *sidedef; line_t *linedef; sector_t *frontsector; sector_t *backsector; /* NULL for one sided lines */ #ifdef RENDER3D float len; /* Length of the segment (v1 -> v2) for texture mapping. */ #endif } seg_t; /* ---- Polyobj data ---- */ typedef struct { int numsegs; seg_t **segs; degenmobj_t startSpot; vertex_t *originalPts; /* used as the base for the rotations */ vertex_t *prevPts; /* use to restore the old point values */ angle_t angle; int tag; /* reference tag assigned in HereticEd */ int bbox[4]; int validcount; boolean crush; /* should the polyobj attempt to crush mobjs? */ int seqType; fixed_t size; /* polyobj size (area of POLY_AREAUNIT == size of FRACUNIT) */ void *specialdata; /* pointer a thinker, if the poly is moving */ } polyobj_t; typedef struct polyblock_s { polyobj_t *polyobj; struct polyblock_s *prev; struct polyblock_s *next; } polyblock_t; #ifdef RENDER3D typedef struct { float x, y; } fvertex_t; #endif typedef struct subsector_s { sector_t *sector; short numlines; short firstline; polyobj_t *poly; #ifdef RENDER3D /* Sorted edge vertices for rendering floors and ceilings. */ char numedgeverts; fvertex_t *edgeverts; /* A list of edge vertices. */ fvertex_t *origedgeverts; /* Unmodified, accurate edge vertices. */ fvertex_t bbox[2]; /* Min and max points. */ fvertex_t midpoint; /* Center of bounding box. */ #endif } subsector_t; typedef struct { fixed_t x, y, dx, dy; /* partition line */ fixed_t bbox[2][4]; /* bounding box for each child */ unsigned short children[2]; /* if NF_SUBSECTOR its a subsector */ } node_t; /* ------ OTHER TYPES ------ */ typedef byte lighttable_t; /* this could be wider for >8 bit display */ #define MAXVISPLANES 160 #define MAXOPENINGS (SCREENWIDTH * 64) typedef struct { fixed_t height; int picnum; int lightlevel; int special; int minx, maxx; byte pad1; /* leave pads for [minx-1]/[maxx+1] */ byte top[SCREENWIDTH]; byte pad2; byte pad3; byte bottom[SCREENWIDTH]; byte pad4; } visplane_t; typedef struct drawseg_s { seg_t *curline; int x1, x2; fixed_t scale1, scale2, scalestep; int silhouette; /* 0 = none, 1 = bottom, 2 = top, 3 = both */ fixed_t bsilheight; /* don't clip sprites above this */ fixed_t tsilheight; /* don't clip sprites below this */ /* pointers to lists for sprite clipping */ short *sprtopclip; /* adjusted so [x1] is first value */ short *sprbottomclip; /* adjusted so [x1] is first value */ short *maskedtexturecol; /* adjusted so [x1] is first value */ } drawseg_t; #define SIL_NONE 0 #define SIL_BOTTOM 1 #define SIL_TOP 2 #define SIL_BOTH 3 #define MAXDRAWSEGS 256 /* A vissprite_t is a thing that will be drawn during a refresh */ typedef struct vissprite_s { struct vissprite_s *prev, *next; int x1, x2; fixed_t gx, gy; /* for line side calculation */ fixed_t gz, gzt; /* global bottom / top for silhouette clipping */ fixed_t startfrac; /* horizontal position of x1 */ fixed_t scale; fixed_t xiscale; /* negative if flipped */ fixed_t texturemid; int patch; #ifdef RENDER3D int lightlevel; float v1[2], v2[2]; /* The vertices (v1 is the left one). */ float secfloor, secceil; #else lighttable_t *colormap; #endif int mobjflags; /* for color translation and shadow draw */ boolean psprite; /* true if psprite */ int playerclass; /* player class (used in translation) */ fixed_t floorclip; } vissprite_t; extern visplane_t *floorplane, *ceilingplane; /* Sprites are patches with a special naming convention so they can be * recognized by R_InitSprites. The sprite and frame specified by a * thing_t is range checked at run time. * a sprite is a patch_t that is assumed to represent a three dimensional * object and may have multiple rotations pre drawn. Horizontal flipping * is used to save space. Some sprites will only have one picture used * for all views. */ typedef struct { boolean rotate; /* if false use 0 for any position */ short lump[8]; /* lump to use for view angles 0-7 */ byte flip[8]; /* flip (1 = flip) to use for view angles 0-7 */ } spriteframe_t; typedef struct { int numframes; spriteframe_t *spriteframes; } spritedef_t; extern spritedef_t *sprites; extern int numsprites; /*============================================================================*/ extern int numvertexes; extern vertex_t *vertexes; extern int numsegs; extern seg_t *segs; extern int numsectors; extern sector_t *sectors; extern int numsubsectors; extern subsector_t *subsectors; extern int numnodes; extern node_t *nodes; extern int numlines; extern line_t *lines; extern int numsides; extern side_t *sides; extern fixed_t viewx, viewy, viewz; extern angle_t viewangle; extern player_t *viewplayer; #ifdef RENDER3D extern float viewpitch; extern int sbarscale; #endif extern angle_t clipangle; extern int viewangletox[FINEANGLES / 2]; extern angle_t xtoviewangle[SCREENWIDTH + 1]; extern fixed_t finetangent[FINEANGLES / 2]; extern fixed_t rw_distance; extern angle_t rw_normalangle; /* ---- R_main.c ---- */ extern int viewwidth, viewheight, viewwindowx, viewwindowy; extern int centerx, centery; extern fixed_t centerxfrac; extern fixed_t centeryfrac; extern fixed_t projection; extern int validcount; extern int sscount, linecount, loopcount; extern lighttable_t *scalelight[LIGHTLEVELS][MAXLIGHTSCALE]; extern lighttable_t *scalelightfixed[MAXLIGHTSCALE]; extern lighttable_t *zlight[LIGHTLEVELS][MAXLIGHTZ]; extern int extralight; extern lighttable_t *fixedcolormap; extern fixed_t viewcos, viewsin; extern int detailshift; /* 0 = high, 1 = low */ extern void (*colfunc) (void); extern void (*basecolfunc) (void); extern void (*fuzzcolfunc) (void); extern void (*spanfunc) (void); int R_PointOnSide (fixed_t x, fixed_t y, node_t *node); int R_PointOnSegSide (fixed_t x, fixed_t y, seg_t *line); angle_t R_PointToAngle (fixed_t x, fixed_t y); angle_t R_PointToAngle2 (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2); fixed_t R_PointToDist (fixed_t x, fixed_t y); fixed_t R_ScaleFromGlobalAngle (angle_t visangle); subsector_t *R_PointInSubsector (fixed_t x, fixed_t y); /* void R_AddPointToBox (int x, int y, fixed_t *box); */ /* ---- R_bsp.c ---- */ extern seg_t *curline; extern side_t *sidedef; extern line_t *linedef; extern sector_t *frontsector, *backsector; extern int rw_x; extern int rw_stopx; extern boolean segtextured; extern boolean markfloor; /* false if the back side is the same plane */ extern boolean markceiling; extern boolean skymap; extern drawseg_t drawsegs[MAXDRAWSEGS], *ds_p; extern lighttable_t **hscalelight, **vscalelight, **dscalelight; typedef void (*drawfunc_t) (int start, int stop); void R_ClearClipSegs (void); void R_ClearDrawSegs (void); void R_InitSkyMap (void); void R_RenderBSPNode (int bspnum); /* ---- R_segs.c ---- */ extern int rw_angle1; /* angle to line origin */ extern int TransTextureStart; extern int TransTextureEnd; void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2); /* ---- R_plane.c ---- */ typedef void (*planefunction_t) (int top, int bottom); extern planefunction_t floorfunc, ceilingfunc; extern int skyflatnum; extern short openings[MAXOPENINGS], *lastopening; extern short floorclip[SCREENWIDTH]; extern short ceilingclip[SCREENWIDTH]; extern fixed_t yslope[SCREENHEIGHT]; extern fixed_t distscale[SCREENWIDTH]; void R_InitPlanes (void); void R_ClearPlanes (void); void R_MapPlane (int y, int x1, int x2); void R_MakeSpans (int x, int t1, int b1, int t2, int b2); void R_DrawPlanes (void); visplane_t *R_FindPlane (fixed_t height, int picnum, int lightlevel, int special); visplane_t *R_CheckPlane (visplane_t *pl, int start, int stop); /* ---- R_data.c ---- */ typedef struct { int originx; /* block origin (allways UL), which has allready */ int originy; /* accounted for the patch's internal origin */ 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 { char name[8]; /* for switch changing, etc */ short width; short height; short patchcount; texpatch_t patches[1]; /* [patchcount] drawn back to front */ /* into the cached texture */ #ifdef RENDER3D boolean masked; /* from maptexture_t */ #endif } texture_t; extern fixed_t *textureheight; /* needed for texture pegging */ extern fixed_t *spritewidth; /* needed for pre rendering (fracs) */ extern fixed_t *spriteoffset; extern fixed_t *spritetopoffset; extern lighttable_t *colormaps; extern int viewwidth, scaledviewwidth, viewheight; extern int firstflat; extern int numflats; extern int *flattranslation; /* for global animation */ extern int *texturetranslation; /* for global animation */ extern int firstspritelump, lastspritelump, numspritelumps; extern boolean LevelUseFullBright; byte *R_GetColumn (int tex, int col); void R_InitData (void); void R_PrecacheLevel (void); /* ---- R_things.c ---- */ #define MAXVISSPRITES 192 extern vissprite_t vissprites[MAXVISSPRITES], *vissprite_p; extern vissprite_t vsprsortedhead; /* constant arrays used for psprite clipping and initializing clipping */ extern short negonearray[SCREENWIDTH]; extern short screenheightarray[SCREENWIDTH]; /* vars for R_DrawMaskedColumn */ extern short *mfloorclip; extern short *mceilingclip; extern fixed_t spryscale; extern fixed_t sprtopscreen; extern fixed_t sprbotscreen; extern fixed_t pspritescale, pspriteiscale; void R_DrawMaskedColumn (column_t *column, signed int baseclip); void R_SortVisSprites (void); void R_AddSprites (sector_t *sec); void R_AddPSprites (void); void R_DrawSprites (void); void R_InitSprites (const char **namelist); void R_ClearSprites (void); void R_DrawMasked (void); void R_ClipVisSprite (vissprite_t *vis, int xl, int xh); /* ---- R_draw.c ---- */ extern lighttable_t *dc_colormap; extern int dc_x; extern int dc_yl; extern int dc_yh; extern fixed_t dc_iscale; extern fixed_t dc_texturemid; extern byte *dc_source; /* first pixel in a column */ void R_DrawColumn (void); void R_DrawColumnLow (void); void R_DrawFuzzColumn (void); void R_DrawFuzzColumnLow (void); void R_DrawTranslatedColumn (void); void R_DrawTranslatedFuzzColumn (void); void R_DrawTranslatedColumnLow (void); void R_DrawAltFuzzColumn(void); /* void R_DrawTranslatedAltFuzzColumn(void); */ extern int ds_y; extern int ds_x1; extern int ds_x2; extern lighttable_t *ds_colormap; extern fixed_t ds_xfrac; extern fixed_t ds_yfrac; extern fixed_t ds_xstep; extern fixed_t ds_ystep; extern byte *ds_source; /* start of a 64*64 tile image */ extern byte *translationtables; extern byte *dc_translation; void R_DrawSpan (void); void R_DrawSpanLow (void); void R_InitBuffer (int width, int height); void R_InitTranslationTables (void); #endif /* __R_LOCAL__ */