diff options
Diffstat (limited to 'source/r_shared.h')
-rw-r--r-- | source/r_shared.h | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/source/r_shared.h b/source/r_shared.h new file mode 100644 index 0000000..ff1e43c --- /dev/null +++ b/source/r_shared.h @@ -0,0 +1,382 @@ +/* +Copyright (C) 2003-2006 Andrey Nazarov + +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. + +*/ + +#ifdef SOFTWARE_RENDERER +#ifdef TRUECOLOR_RENDERER +#define VID_BPP 32 +#define VID_BYTES 4 +#define VID_SHIFT 2 +#define VID_IS32BIT 1 +#else +#define VID_BPP 8 +#define VID_BYTES 1 +#define VID_SHIFT 0 +#define VID_IS32BIT 0 +#endif +#endif + +#ifdef USE_BGRA_FORMAT +#define MakeColor( r, g, b, a ) MakeLong( b, g, r, a ) +#else +#define MakeColor( r, g, b, a ) MakeLong( r, g, b, a ) +#endif + +// absolute limit for OpenGL renderer +#define MAX_TEXTURE_SIZE 2048 + +/* + + skins will be outline flood filled and mip mapped + pics and sprites with alpha will be outline flood filled + pic won't be mip mapped + + model skin + sprite frame + wall texture + pic + +*/ + +typedef enum { + if_transparent = ( 1 << 0 ), + if_paletted = ( 1 << 1 ), + if_scrap = ( 1 << 2 ), + if_replace_wal = ( 1 << 3 ), + if_replace_pcx = ( 1 << 4 ), + if_auto = ( 1 << 5 ), + if_charset = ( 1 << 6 ) +} imageflags_t; + +typedef enum { + it_skin, + it_sprite, + it_wall, + it_pic, + it_sky, + it_lightmap, + it_charset +} imagetype_t; + +#define EXTENSION_PNG MakeLong( '.', 'p', 'n', 'g' ) +#define EXTENSION_TGA MakeLong( '.', 't', 'g', 'a' ) +#define EXTENSION_JPG MakeLong( '.', 'j', 'p', 'g' ) +#define EXTENSION_PCX MakeLong( '.', 'p', 'c', 'x' ) +#define EXTENSION_WAL MakeLong( '.', 'w', 'a', 'l' ) + +typedef struct image_s { + list_t entry; + char name[MAX_QPATH]; // game path, without extension + int baselength; // length of the path without extension + imagetype_t type; + int width, height; // source image + int upload_width, upload_height; // after power of two and picmip + int registration_sequence; // 0 = free +#ifdef OPENGL_RENDERER + uint32 texnum; // gl texture binding + float sl, sh, tl, th; +#elif SOFTWARE_RENDERER + byte *pixels[4]; // mip levels +#else +#error Neither OPENGL_RENDERER nor SOFTWARE_RENDERER defined +#endif + imageflags_t flags; +} image_t; + + +#define MAX_RIMAGES 1024 +#define RIMAGES_HASH 256 + +extern image_t r_images[MAX_RIMAGES]; +extern list_t r_imageHash[RIMAGES_HASH]; +extern int r_numImages; + +extern uint32 d_8to24table[256]; + +#define R_Malloc( size ) com.TagMalloc( size, TAG_RENDERER ) + +/* these are implemented in r_images.c */ +image_t *R_FindImage( const char *name, imagetype_t type ); +image_t *R_AllocImage( const char *name ); +image_t *R_CreateImage( const char *name, byte *pic, int width, int height, + imagetype_t type, imageflags_t flags ); +void R_FreeUnusedImages( void ); +void R_FreeAllImages( void ); +void R_InitImageManager( void ); +void R_ShutdownImageManager( void ); +void R_ResampleTexture( const byte *in, int inwidth, int inheight, byte *out, + int outwidth, int outheight ); +void R_GetPalette( byte **dest ); + +void Image_LoadPCX( const char *filename, byte **pic, byte *palette, int *width, int *height ); +void Image_LoadTGA( const char *filename, byte **pic, int *width, int *height ); +qboolean Image_WriteTGA( const char *filename, const byte *rgb, int width, int height ); +#ifdef USE_JPEG +void Image_LoadJPG( const char *filename, byte **pic, int *width, int *height ); +qboolean Image_WriteJPG( const char *filename, const byte *rgb, int width, int height, int quality ); +#endif + +/* these should be implemented by renderer library itself */ +void R_FreeImage( image_t *image ); +void R_LoadImage( image_t *image, byte *pic, int width, int height, imagetype_t type, imageflags_t flags ); +image_t *R_LoadWal( const char *name ); + +extern int registration_sequence; +extern image_t *r_notexture; + +// +// BSP MODELS +// + +#ifdef SOFTWARE_RENDERER + +// FIXME: differentiate from texinfo SURF_ flags +#define SURF_PLANEBACK 0x02 +#define SURF_DRAWSKY 0x04 // sky brush face +#define SURF_FLOW 0x08 //PGM +#define SURF_DRAWTURB 0x10 +#define SURF_DRAWBACKGROUND 0x40 +#define SURF_DRAWSKYBOX 0x80 // sky box + +#define EXTRA_SURFACES 6 +#define EXTRA_VERTICES 8 +#define EXTRA_EDGES 12 +#define EXTRA_SURFEDGES 24 + +#else // SOFTWARE_RENDERER + +#define EXTRA_SURFACES 0 +#define EXTRA_VERTICES 0 +#define EXTRA_EDGES 0 +#define EXTRA_SURFEDGES 0 + +#endif // !SOFTWARE_RENDERER + +typedef struct bspTexinfo_s { + char name[MAX_QPATH]; + uint32 contents; + uint32 flags; + vec3_t axis[2]; +#ifdef OPENGL_RENDERER + vec3_t normalizedAxis[2]; +#endif + vec2_t offset; + int numFrames; + struct bspTexinfo_s *animNext; + image_t *image; +} bspTexinfo_t; + +#ifdef OPENGL_RENDERER +typedef enum { + DSURF_POLY, + DSURF_WARP, + DSURF_NOLM, + DSURF_MESH, + + DSURF_NUM_TYPES +} drawSurfType_t; +#endif + +typedef struct bspSurface_s { +#ifdef OPENGL_RENDERER +/* ======> */ + drawSurfType_t type; +/* <====== */ +#endif + + int index; + + vec3_t origin; + vec3_t mins; + vec3_t maxs; + + bspTexinfo_t *texinfo; + byte *lightmap; + int *firstSurfEdge; + int numSurfEdges; + + cplane_t *plane; + int side; + + int texturemins[2]; + int extents[2]; + +#ifdef OPENGL_RENDERER + struct tcoord_s *normalizedTC; + struct bspPoly_s *polys; + + int lightmapnum; + + int drawframe; + int dlightframe; + int dlightbits; + int testframe; + + struct bspSurface_s *next; +#endif +} bspSurface_t; + +typedef struct bspNode_s { +/* ======> */ + cplane_t *plane; /* should never be NULL for nodes */ + int index; + + vec3_t mins; + vec3_t maxs; + + int visframe; + + struct bspNode_s *parent; +/* <====== */ + + int numFaces; + bspSurface_t *firstFace; + + struct bspNode_s *children[2]; +} bspNode_t; + +typedef struct bspLeaf_s { +/* ======> */ + cplane_t *plane; /* should always be NULL for leafs */ + int index; + + vec3_t mins; + vec3_t maxs; + + int visframe; + + struct bspNode_s *parent; +/* <====== */ + + int cluster; + int area; + int contents; + + int numLeafFaces; + bspSurface_t **firstLeafFace; +} bspLeaf_t; + +typedef enum { + MODEL_NULL, + MODEL_BSP, + MODEL_ALIAS, + MODEL_SPRITE +} modelType_t; + +typedef struct bspSubmodel_s { + modelType_t type; + + vec3_t mins; + vec3_t maxs; + float radius; + + vec3_t origin; + + int numFaces; + bspSurface_t *firstFace; + + bspNode_t *headnode; +} bspSubmodel_t; + +typedef struct bspModel_s { + char name[MAX_QPATH]; + mempool_t pool; + + bspSubmodel_t *submodels; + int numSubmodels; + + bspTexinfo_t *texinfos; + int numTexinfos; + + bspSurface_t *surfaces; + int numSurfaces; + + bspSurface_t **leafFaces; + int numLeafFaces; + + cplane_t *planes; + int numPlanes; + + bspLeaf_t *leafs; + int numLeafs; + + bspNode_t *nodes; + int numNodes; + + byte *vis; + int numClusters; + int rowsize; + + byte *lightmap; + uint32 lightmapSize; + +// char *entityString; + + dvertex_t *vertices; + int numVertices; + + dedge_t *edges; + int numEdges; + + int *surfEdges; + int numSurfEdges; +} bspModel_t; + + +extern bspModel_t r_world; + +void Bsp_FreeWorld( void ); +qboolean Bsp_LoadWorld( const char *path ); +bspLeaf_t *Bsp_FindLeaf( vec3_t origin ); +byte *Bsp_ClusterPVS( int clusterNum ); + +#ifdef OPENGL_RENDERER +extern bspTexinfo_t *upload_texinfo; +int GL_PostProcessSurface( bspSurface_t *surf ); +#endif + +#ifdef BIGENDIAN_TARGET +#define LL(x) ( dst->x = LongSwap( src->x ) ) +#define LF(x) ( dst->x = FloatSwap( src->x ) ) +#define LV(x) ( dst->x[0] = FloatSwap( src->x[0] ), \ + dst->x[1] = FloatSwap( src->x[1] ), \ + dst->x[2] = FloatSwap( src->x[2] ) ) +#define LLV(x) ( dst->x[0] = LongSwap( src->x[0] ), \ + dst->x[1] = LongSwap( src->x[1] ), \ + dst->x[2] = LongSwap( src->x[2] ) ) +#define LSV(x) ( dst->x[0] = ShortSwap( src->x[0] ), \ + dst->x[1] = ShortSwap( src->x[1] ), \ + dst->x[2] = ShortSwap( src->x[2] ) ) +#else +#define LL(x) ( dst->x = src->x ) +#define LF(x) ( dst->x = src->x ) +#define LV(x) ( dst->x[0] = src->x[0], \ + dst->x[1] = src->x[1], \ + dst->x[2] = src->x[2] ) +#define LLV(x) ( dst->x[0] = src->x[0], \ + dst->x[1] = src->x[1], \ + dst->x[2] = src->x[2] ) +#define LSV(x) ( dst->x[0] = src->x[0], \ + dst->x[1] = src->x[1], \ + dst->x[2] = src->x[2] ) +#endif + + + + |