ref: aa5529bc6cbd5424c33f624d8a33fc482d18c489
dir: /src/hexen/r_local.h/
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 1993-2008 Raven Software
// Copyright(C) 2008 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
// 02111-1307, USA.
//
//-----------------------------------------------------------------------------
#ifndef __R_LOCAL__
#define __R_LOCAL__
#include "i_video.h"
#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
} 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
} 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;
typedef struct subsector_s
{
sector_t *sector;
short numlines;
short firstline;
polyobj_t *poly;
} 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;
lighttable_t *colormap;
int mobjflags; // for color translation and shadow draw
boolean psprite; // true if psprite
int class; // 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;
extern angle_t clipangle;
extern int viewangletox[FINEANGLES / 2];
extern angle_t xtoviewangle[SCREENWIDTH + 1];
extern fixed_t rw_distance;
extern angle_t rw_normalangle;
//
// R_main.c
//
extern int screenblocks;
extern int viewwidth, viewheight, viewwindowx, viewwindowy;
extern int centerx, centery;
extern int flyheight;
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 (*tlcolfunc) (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_debug.m
//
extern int drawbsp;
void RD_OpenMapWindow(void);
void RD_ClearMapWindow(void);
void RD_DisplayLine(int x1, int y1, int x2, int y2, float gray);
void RD_DrawNodeLine(node_t * node);
void RD_DrawLineCheck(seg_t * line);
void RD_DrawLine(seg_t * line);
void RD_DrawBBox(fixed_t * bbox);
//
// R_data.c
//
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(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_DrawTLColumn(void);
void R_DrawTLColumnLow(void);
void R_DrawTranslatedColumn(void);
void R_DrawTranslatedTLColumn(void);
void R_DrawTranslatedColumnLow(void);
void R_DrawAltTLColumn(void);
//void R_DrawTranslatedAltTLColumn(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__