2 Copyright (C) 1996-1997 Id Software, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 // upper design bounds
24 #define MAX_MAP_HULLS 4
26 #define MAX_MAP_MODELS 256
27 #define MAX_MAP_BRUSHES 4096
28 #define MAX_MAP_ENTITIES 1024
29 #define MAX_MAP_ENTSTRING 65536
31 #define MAX_MAP_PLANES 32767
32 #define MAX_MAP_NODES 32767 // because negative shorts are contents
33 #define MAX_MAP_CLIPNODES 32767 //
34 #define MAX_MAP_LEAFS 32767 // was 8192
35 #define MAX_MAP_VERTS 65535
36 #define MAX_MAP_FACES 65535
37 #define MAX_MAP_MARKSURFACES 65535
38 #define MAX_MAP_TEXINFO 4096
39 #define MAX_MAP_EDGES 256000
40 #define MAX_MAP_SURFEDGES 512000
41 #define MAX_MAP_TEXTURES 512
42 #define MAX_MAP_MIPTEX 0x200000
43 #define MAX_MAP_LIGHTING 0x100000
44 #define MAX_MAP_VISIBILITY 0x100000
46 #define MAX_MAP_PORTALS 65536
48 // key / value pair sizes
51 #define MAX_VALUE 1024
53 //=============================================================================
64 #define LUMP_ENTITIES 0
66 #define LUMP_TEXTURES 2
67 #define LUMP_VERTEXES 3
68 #define LUMP_VISIBILITY 4
70 #define LUMP_TEXINFO 6
72 #define LUMP_LIGHTING 8
73 #define LUMP_CLIPNODES 9
75 #define LUMP_MARKSURFACES 11
77 #define LUMP_SURFEDGES 13
78 #define LUMP_MODELS 14
80 #define HEADER_LUMPS 15
84 float mins[3], maxs[3];
86 int headnode[MAX_MAP_HULLS];
87 int visleafs; // not including the solid leaf 0
88 int firstface, numfaces;
94 lump_t lumps[HEADER_LUMPS];
100 int dataofs[4]; // [nummiptex]
104 typedef struct miptex_s
107 unsigned width, height;
108 unsigned offsets[MIPLEVELS]; // four mip maps stored
118 // 0-2 are axial planes
123 // 3-5 are non-axial planes snapped to the nearest
132 int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
137 #define CONTENTS_EMPTY -1
138 #define CONTENTS_SOLID -2
139 #define CONTENTS_WATER -3
140 #define CONTENTS_SLIME -4
141 #define CONTENTS_LAVA -5
142 #define CONTENTS_SKY -6
143 #define CONTENTS_ORIGIN -7 // removed at csg time
144 #define CONTENTS_CLIP -8 // changed to contents_solid
146 // LordHavoc: Q2 water
148 #define CONTENTS_CURRENT_0 -9
149 #define CONTENTS_CURRENT_90 -10
150 #define CONTENTS_CURRENT_180 -11
151 #define CONTENTS_CURRENT_270 -12
152 #define CONTENTS_CURRENT_UP -13
153 #define CONTENTS_CURRENT_DOWN -14
157 // !!! if this is changed, it must be changed in asm_i386.h too !!!
161 short children[2]; // negative numbers are -(leafs+1), not nodes
162 short mins[3]; // for sphere culling
164 unsigned short firstface;
165 unsigned short numfaces; // counting both sides
171 short children[2]; // negative numbers are contents
175 typedef struct texinfo_s
177 float vecs[2][4]; // [s/t][xyz offset]
181 #define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision
183 // note that edge 0 is never used, because negative edge nums are used for
184 // counterclockwise use of the edge in a face
187 unsigned short v[2]; // vertex numbers
190 #define MAXLIGHTMAPS 4
196 int firstedge; // we must support > 64k edges
201 byte styles[MAXLIGHTMAPS];
202 int lightofs; // start of [numstyles*surfsize] samples
207 #define AMBIENT_WATER 0
208 #define AMBIENT_SKY 1
209 #define AMBIENT_SLIME 2
210 #define AMBIENT_LAVA 3
212 #define NUM_AMBIENTS 4 // automatic ambient sounds
214 // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
215 // all other leafs need visibility info
219 int visofs; // -1 = no visibility info
221 short mins[3]; // for frustum culling
224 unsigned short firstmarksurface;
225 unsigned short nummarksurfaces;
227 byte ambient_level[NUM_AMBIENTS];
231 //============================================================================
236 #define ANGLE_DOWN -2
239 // the utilities get to be lazy and just use large static arrays
241 extern int nummodels;
242 extern dmodel_t dmodels[MAX_MAP_MODELS];
244 extern int visdatasize;
245 extern byte dvisdata[MAX_MAP_VISIBILITY];
247 extern int lightdatasize;
248 extern byte dlightdata[MAX_MAP_LIGHTING];
250 extern int texdatasize;
251 extern byte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
253 extern int entdatasize;
254 extern char dentdata[MAX_MAP_ENTSTRING];
257 extern dleaf_t dleafs[MAX_MAP_LEAFS];
259 extern int numplanes;
260 extern dplane_t dplanes[MAX_MAP_PLANES];
262 extern int numvertexes;
263 extern dvertex_t dvertexes[MAX_MAP_VERTS];
266 extern dnode_t dnodes[MAX_MAP_NODES];
268 extern int numtexinfo;
269 extern texinfo_t texinfo[MAX_MAP_TEXINFO];
272 extern dface_t dfaces[MAX_MAP_FACES];
274 extern int numclipnodes;
275 extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
278 extern dedge_t dedges[MAX_MAP_EDGES];
280 extern int nummarksurfaces;
281 extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES];
283 extern int numsurfedges;
284 extern int dsurfedges[MAX_MAP_SURFEDGES];
287 void DecompressVis (byte *in, byte *decompressed);
288 int CompressVis (byte *vis, byte *dest);
290 void LoadBSPFile (char *filename);
291 void WriteBSPFile (char *filename);
292 void PrintBSPFileSizes (void);
297 typedef struct epair_s
299 struct epair_s *next;
312 extern int num_entities;
313 extern entity_t entities[MAX_MAP_ENTITIES];
315 void ParseEntities (void);
316 void UnparseEntities (void);
318 void SetKeyValue (entity_t *ent, char *key, char *value);
319 char *ValueForKey (entity_t *ent, char *key);
320 // will return "" if not present
322 vec_t FloatForKey (entity_t *ent, char *key);
323 void GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
325 epair_t *ParseEpair (void);