/* | |
Copyright (C) 1996-1997 Id Software, Inc. | |
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. | |
*/ | |
// upper design bounds | |
#define MAX_MAP_HULLS 4 | |
#define MAX_MAP_MODELS 256 | |
#define MAX_MAP_BRUSHES 4096 | |
#define MAX_MAP_ENTITIES 1024 | |
#define MAX_MAP_ENTSTRING 65536 | |
#define MAX_MAP_PLANES 32767 | |
#define MAX_MAP_NODES 32767 // because negative shorts are contents | |
#define MAX_MAP_CLIPNODES 32767 // | |
#define MAX_MAP_LEAFS 8192 | |
#define MAX_MAP_VERTS 65535 | |
#define MAX_MAP_FACES 65535 | |
#define MAX_MAP_MARKSURFACES 65535 | |
#define MAX_MAP_TEXINFO 4096 | |
#define MAX_MAP_EDGES 256000 | |
#define MAX_MAP_SURFEDGES 512000 | |
#define MAX_MAP_TEXTURES 512 | |
#define MAX_MAP_MIPTEX 0x200000 | |
#define MAX_MAP_LIGHTING 0x100000 | |
#define MAX_MAP_VISIBILITY 0x100000 | |
#define MAX_MAP_PORTALS 65536 | |
// key / value pair sizes | |
#define MAX_KEY 32 | |
#define MAX_VALUE 1024 | |
//============================================================================= | |
#define BSPVERSION 29 | |
#define TOOLVERSION 2 | |
typedef struct | |
{ | |
int fileofs, filelen; | |
} lump_t; | |
#define LUMP_ENTITIES 0 | |
#define LUMP_PLANES 1 | |
#define LUMP_TEXTURES 2 | |
#define LUMP_VERTEXES 3 | |
#define LUMP_VISIBILITY 4 | |
#define LUMP_NODES 5 | |
#define LUMP_TEXINFO 6 | |
#define LUMP_FACES 7 | |
#define LUMP_LIGHTING 8 | |
#define LUMP_CLIPNODES 9 | |
#define LUMP_LEAFS 10 | |
#define LUMP_MARKSURFACES 11 | |
#define LUMP_EDGES 12 | |
#define LUMP_SURFEDGES 13 | |
#define LUMP_MODELS 14 | |
#define HEADER_LUMPS 15 | |
typedef struct | |
{ | |
float mins[3], maxs[3]; | |
float origin[3]; | |
int headnode[MAX_MAP_HULLS]; | |
int visleafs; // not including the solid leaf 0 | |
int firstface, numfaces; | |
} dmodel_t; | |
typedef struct | |
{ | |
int version; | |
lump_t lumps[HEADER_LUMPS]; | |
} dheader_t; | |
typedef struct | |
{ | |
int nummiptex; | |
int dataofs[4]; // [nummiptex] | |
} dmiptexlump_t; | |
#define MIPLEVELS 4 | |
typedef struct miptex_s | |
{ | |
char name[16]; | |
unsigned width, height; | |
unsigned offsets[MIPLEVELS]; // four mip maps stored | |
} miptex_t; | |
typedef struct | |
{ | |
float point[3]; | |
} dvertex_t; | |
// 0-2 are axial planes | |
#define PLANE_X 0 | |
#define PLANE_Y 1 | |
#define PLANE_Z 2 | |
// 3-5 are non-axial planes snapped to the nearest | |
#define PLANE_ANYX 3 | |
#define PLANE_ANYY 4 | |
#define PLANE_ANYZ 5 | |
typedef struct | |
{ | |
float normal[3]; | |
float dist; | |
int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate | |
} dplane_t; | |
#define CONTENTS_EMPTY -1 | |
#define CONTENTS_SOLID -2 | |
#define CONTENTS_WATER -3 | |
#define CONTENTS_SLIME -4 | |
#define CONTENTS_LAVA -5 | |
#define CONTENTS_SKY -6 | |
#define CONTENTS_ORIGIN -7 // removed at csg time | |
#define CONTENTS_CLIP -8 // changed to contents_solid | |
#define CONTENTS_CURRENT_0 -9 | |
#define CONTENTS_CURRENT_90 -10 | |
#define CONTENTS_CURRENT_180 -11 | |
#define CONTENTS_CURRENT_270 -12 | |
#define CONTENTS_CURRENT_UP -13 | |
#define CONTENTS_CURRENT_DOWN -14 | |
// !!! if this is changed, it must be changed in asm_i386.h too !!! | |
typedef struct | |
{ | |
int planenum; | |
short children[2]; // negative numbers are -(leafs+1), not nodes | |
short mins[3]; // for sphere culling | |
short maxs[3]; | |
unsigned short firstface; | |
unsigned short numfaces; // counting both sides | |
} dnode_t; | |
typedef struct | |
{ | |
int planenum; | |
short children[2]; // negative numbers are contents | |
} dclipnode_t; | |
typedef struct texinfo_s | |
{ | |
float vecs[2][4]; // [s/t][xyz offset] | |
int miptex; | |
int flags; | |
} texinfo_t; | |
#define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision | |
// note that edge 0 is never used, because negative edge nums are used for | |
// counterclockwise use of the edge in a face | |
typedef struct | |
{ | |
unsigned short v[2]; // vertex numbers | |
} dedge_t; | |
#define MAXLIGHTMAPS 4 | |
typedef struct | |
{ | |
short planenum; | |
short side; | |
int firstedge; // we must support > 64k edges | |
short numedges; | |
short texinfo; | |
// lighting info | |
byte styles[MAXLIGHTMAPS]; | |
int lightofs; // start of [numstyles*surfsize] samples | |
} dface_t; | |
#define AMBIENT_WATER 0 | |
#define AMBIENT_SKY 1 | |
#define AMBIENT_SLIME 2 | |
#define AMBIENT_LAVA 3 | |
#define NUM_AMBIENTS 4 // automatic ambient sounds | |
// leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas | |
// all other leafs need visibility info | |
typedef struct | |
{ | |
int contents; | |
int visofs; // -1 = no visibility info | |
short mins[3]; // for frustum culling | |
short maxs[3]; | |
unsigned short firstmarksurface; | |
unsigned short nummarksurfaces; | |
byte ambient_level[NUM_AMBIENTS]; | |
} dleaf_t; | |
//============================================================================ | |
#ifndef QUAKE_GAME | |
#define ANGLE_UP -1 | |
#define ANGLE_DOWN -2 | |
// the utilities get to be lazy and just use large static arrays | |
extern int nummodels; | |
extern dmodel_t dmodels[MAX_MAP_MODELS]; | |
extern int visdatasize; | |
extern byte dvisdata[MAX_MAP_VISIBILITY]; | |
extern int lightdatasize; | |
extern byte dlightdata[MAX_MAP_LIGHTING]; | |
extern int texdatasize; | |
extern byte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t) | |
extern int entdatasize; | |
extern char dentdata[MAX_MAP_ENTSTRING]; | |
extern int numleafs; | |
extern dleaf_t dleafs[MAX_MAP_LEAFS]; | |
extern int numplanes; | |
extern dplane_t dplanes[MAX_MAP_PLANES]; | |
extern int numvertexes; | |
extern dvertex_t dvertexes[MAX_MAP_VERTS]; | |
extern int numnodes; | |
extern dnode_t dnodes[MAX_MAP_NODES]; | |
extern int numtexinfo; | |
extern texinfo_t texinfo[MAX_MAP_TEXINFO]; | |
extern int numfaces; | |
extern dface_t dfaces[MAX_MAP_FACES]; | |
extern int numclipnodes; | |
extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES]; | |
extern int numedges; | |
extern dedge_t dedges[MAX_MAP_EDGES]; | |
extern int nummarksurfaces; | |
extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES]; | |
extern int numsurfedges; | |
extern int dsurfedges[MAX_MAP_SURFEDGES]; | |
void DecompressVis (byte *in, byte *decompressed); | |
int CompressVis (byte *vis, byte *dest); | |
void LoadBSPFile (char *filename); | |
void WriteBSPFile (char *filename); | |
void PrintBSPFileSizes (void); | |
//=============== | |
typedef struct epair_s | |
{ | |
struct epair_s *next; | |
char *key; | |
char *value; | |
} epair_t; | |
typedef struct | |
{ | |
vec3_t origin; | |
int firstbrush; | |
int numbrushes; | |
epair_t *epairs; | |
} entity_t; | |
extern int num_entities; | |
extern entity_t entities[MAX_MAP_ENTITIES]; | |
void ParseEntities (void); | |
void UnparseEntities (void); | |
void SetKeyValue (entity_t *ent, char *key, char *value); | |
char *ValueForKey (entity_t *ent, char *key); | |
// will return "" if not present | |
vec_t FloatForKey (entity_t *ent, char *key); | |
void GetVectorForKey (entity_t *ent, char *key, vec3_t vec); | |
epair_t *ParseEpair (void); | |
#endif |