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
160 short children[2]; // negative numbers are -(leafs+1), not nodes
161 short mins[3]; // for sphere culling
163 unsigned short firstface;
164 unsigned short numfaces; // counting both sides
170 short children[2]; // negative numbers are contents
174 typedef struct texinfo_s
176 float vecs[2][4]; // [s/t][xyz offset]
180 #define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision
182 // note that edge 0 is never used, because negative edge nums are used for
183 // counterclockwise use of the edge in a face
186 unsigned short v[2]; // vertex numbers
189 #define MAXLIGHTMAPS 4
195 int firstedge; // we must support > 64k edges
200 qbyte styles[MAXLIGHTMAPS];
201 int lightofs; // start of [numstyles*surfsize] samples
206 #define AMBIENT_WATER 0
207 #define AMBIENT_SKY 1
208 #define AMBIENT_SLIME 2
209 #define AMBIENT_LAVA 3
211 #define NUM_AMBIENTS 4 // automatic ambient sounds
213 // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
214 // all other leafs need visibility info
218 int visofs; // -1 = no visibility info
220 short mins[3]; // for frustum culling
223 unsigned short firstmarksurface;
224 unsigned short nummarksurfaces;
226 qbyte ambient_level[NUM_AMBIENTS];
230 //============================================================================
235 #define ANGLE_DOWN -2
238 // the utilities get to be lazy and just use large static arrays
240 extern int nummodels;
241 extern dmodel_t dmodels[MAX_MAP_MODELS];
243 extern int visdatasize;
244 extern qbyte dvisdata[MAX_MAP_VISIBILITY];
246 extern int lightdatasize;
247 extern qbyte dlightdata[MAX_MAP_LIGHTING];
249 extern int texdatasize;
250 extern qbyte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
252 extern int entdatasize;
253 extern char dentdata[MAX_MAP_ENTSTRING];
256 extern dleaf_t dleafs[MAX_MAP_LEAFS];
258 extern int numplanes;
259 extern dplane_t dplanes[MAX_MAP_PLANES];
261 extern int numvertexes;
262 extern dvertex_t dvertexes[MAX_MAP_VERTS];
265 extern dnode_t dnodes[MAX_MAP_NODES];
267 extern int numtexinfo;
268 extern texinfo_t texinfo[MAX_MAP_TEXINFO];
271 extern dface_t dfaces[MAX_MAP_FACES];
273 extern int numclipnodes;
274 extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
277 extern dedge_t dedges[MAX_MAP_EDGES];
279 extern int nummarksurfaces;
280 extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES];
282 extern int numsurfedges;
283 extern int dsurfedges[MAX_MAP_SURFEDGES];
286 void DecompressVis (qbyte *in, qbyte *decompressed);
287 int CompressVis (qbyte *vis, qbyte *dest);
289 void LoadBSPFile (char *filename);
290 void WriteBSPFile (char *filename);
291 void PrintBSPFileSizes (void);
296 typedef struct epair_s
298 struct epair_s *next;
311 extern entity_t entities[MAX_MAP_ENTITIES];
313 void ParseEntities (void);
314 void UnparseEntities (void);
316 void SetKeyValue (entity_t *ent, char *key, char *value);
317 char *ValueForKey (entity_t *ent, char *key);
318 // will return "" if not present
320 vec_t FloatForKey (entity_t *ent, char *key);
321 void GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
323 epair_t *ParseEpair (void);