You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
6.4 KiB
310 lines
6.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
#ifndef BSPFILE_H |
|
#define BSPFILE_H |
|
|
|
// upper design bounds |
|
|
|
#define MAX_MAP_HULLS 4 |
|
|
|
#define MAX_MAP_MODELS 400 |
|
#define MAX_MAP_BRUSHES 4096 |
|
#define MAX_MAP_ENTITIES 1024 |
|
#define MAX_MAP_ENTSTRING (128*1024) |
|
|
|
#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 8192 |
|
#define MAX_MAP_EDGES 256000 |
|
#define MAX_MAP_SURFEDGES 512000 |
|
#define MAX_MAP_TEXTURES 512 |
|
#define MAX_MAP_MIPTEX 0x400000 |
|
#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 30 |
|
#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; |
|
|
|
|
|
/*** -1..-6 now in const.h ***/ |
|
#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 |
|
|
|
#define CONTENTS_TRANSLUCENT -15 |
|
|
|
|
|
// !!! 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 |
|
|
|
#endif
|
|
|