0,0 → 1,324 |
/* |
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 |