1 /* 2 Copyright (C) 1996-1997 Id Software, Inc. 3 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. 8 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. 12 13 See the GNU General Public License for more details. 14 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. 18 19 */ 20 21 22 // upper design bounds 23 24 #define MAX_MAP_HULLS 4 25 26 #define MAX_MAP_MODELS 256 27 #define MAX_MAP_BRUSHES 4096 28 #define MAX_MAP_ENTITIES 1024 29 #define MAX_MAP_ENTSTRING 65536 30 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 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 45 46 #define MAX_MAP_PORTALS 65536 47 48 // key / value pair sizes 49 50 #define MAX_KEY 32 51 #define MAX_VALUE 1024 52 53 //============================================================================= 54 55 56 #define BSPVERSION 29 57 #define TOOLVERSION 2 58 59 typedef struct 60 { 61 int fileofs, filelen; 62 } lump_t; 63 64 #define LUMP_ENTITIES 0 65 #define LUMP_PLANES 1 66 #define LUMP_TEXTURES 2 67 #define LUMP_VERTEXES 3 68 #define LUMP_VISIBILITY 4 69 #define LUMP_NODES 5 70 #define LUMP_TEXINFO 6 71 #define LUMP_FACES 7 72 #define LUMP_LIGHTING 8 73 #define LUMP_CLIPNODES 9 74 #define LUMP_LEAFS 10 75 #define LUMP_MARKSURFACES 11 76 #define LUMP_EDGES 12 77 #define LUMP_SURFEDGES 13 78 #define LUMP_MODELS 14 79 80 #define HEADER_LUMPS 15 81 82 typedef struct 83 { 84 float mins[3], maxs[3]; 85 float origin[3]; 86 int headnode[MAX_MAP_HULLS]; 87 int visleafs; // not including the solid leaf 0 88 int firstface, numfaces; 89 } dmodel_t; 90 91 typedef struct 92 { 93 int version; 94 lump_t lumps[HEADER_LUMPS]; 95 } dheader_t; 96 97 typedef struct 98 { 99 int nummiptex; 100 int dataofs[4]; // [nummiptex] 101 } dmiptexlump_t; 102 103 #define MIPLEVELS 4 104 typedef struct miptex_s 105 { 106 char name[16]; 107 unsigned width, height; 108 unsigned offsets[MIPLEVELS]; // four mip maps stored 109 } miptex_t; 110 111 112 typedef struct 113 { 114 float point[3]; 115 } dvertex_t; 116 117 118 // 0-2 are axial planes 119 #define PLANE_X 0 120 #define PLANE_Y 1 121 #define PLANE_Z 2 122 123 // 3-5 are non-axial planes snapped to the nearest 124 #define PLANE_ANYX 3 125 #define PLANE_ANYY 4 126 #define PLANE_ANYZ 5 127 128 typedef struct 129 { 130 float normal[3]; 131 float dist; 132 int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate 133 } dplane_t; 134 135 136 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 145 146 #define CONTENTS_CURRENT_0 -9 147 #define CONTENTS_CURRENT_90 -10 148 #define CONTENTS_CURRENT_180 -11 149 #define CONTENTS_CURRENT_270 -12 150 #define CONTENTS_CURRENT_UP -13 151 #define CONTENTS_CURRENT_DOWN -14 152 153 154 // !!! if this is changed, it must be changed in asm_i386.h too !!! 155 typedef struct 156 { 157 int planenum; 158 short children[2]; // negative numbers are -(leafs+1), not nodes 159 short mins[3]; // for sphere culling 160 short maxs[3]; 161 unsigned short firstface; 162 unsigned short numfaces; // counting both sides 163 } dnode_t; 164 165 typedef struct 166 { 167 int planenum; 168 short children[2]; // negative numbers are contents 169 } dclipnode_t; 170 171 172 typedef struct texinfo_s 173 { 174 float vecs[2][4]; // [s/t][xyz offset] 175 int miptex; 176 int flags; 177 } texinfo_t; 178 #define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision 179 180 // note that edge 0 is never used, because negative edge nums are used for 181 // counterclockwise use of the edge in a face 182 typedef struct 183 { 184 unsigned short v[2]; // vertex numbers 185 } dedge_t; 186 187 #define MAXLIGHTMAPS 4 188 typedef struct 189 { 190 short planenum; 191 short side; 192 193 int firstedge; // we must support > 64k edges 194 short numedges; 195 short texinfo; 196 197 // lighting info 198 byte styles[MAXLIGHTMAPS]; 199 int lightofs; // start of [numstyles*surfsize] samples 200 } dface_t; 201 202 203 204 #define AMBIENT_WATER 0 205 #define AMBIENT_SKY 1 206 #define AMBIENT_SLIME 2 207 #define AMBIENT_LAVA 3 208 209 #define NUM_AMBIENTS 4 // automatic ambient sounds 210 211 // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas 212 // all other leafs need visibility info 213 typedef struct 214 { 215 int contents; 216 int visofs; // -1 = no visibility info 217 218 short mins[3]; // for frustum culling 219 short maxs[3]; 220 221 unsigned short firstmarksurface; 222 unsigned short nummarksurfaces; 223 224 byte ambient_level[NUM_AMBIENTS]; 225 } dleaf_t; 226 227 228 //============================================================================ 229 230 #ifndef QUAKE_GAME 231 232 #define ANGLE_UP -1 233 #define ANGLE_DOWN -2 234 235 236 // the utilities get to be lazy and just use large static arrays 237 238 extern int nummodels; 239 extern dmodel_t dmodels[MAX_MAP_MODELS]; 240 241 extern int visdatasize; 242 extern byte dvisdata[MAX_MAP_VISIBILITY]; 243 244 extern int lightdatasize; 245 extern byte dlightdata[MAX_MAP_LIGHTING]; 246 247 extern int texdatasize; 248 extern byte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t) 249 250 extern int entdatasize; 251 extern char dentdata[MAX_MAP_ENTSTRING]; 252 253 extern int numleafs; 254 extern dleaf_t dleafs[MAX_MAP_LEAFS]; 255 256 extern int numplanes; 257 extern dplane_t dplanes[MAX_MAP_PLANES]; 258 259 extern int numvertexes; 260 extern dvertex_t dvertexes[MAX_MAP_VERTS]; 261 262 extern int numnodes; 263 extern dnode_t dnodes[MAX_MAP_NODES]; 264 265 extern int numtexinfo; 266 extern texinfo_t texinfo[MAX_MAP_TEXINFO]; 267 268 extern int numfaces; 269 extern dface_t dfaces[MAX_MAP_FACES]; 270 271 extern int numclipnodes; 272 extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES]; 273 274 extern int numedges; 275 extern dedge_t dedges[MAX_MAP_EDGES]; 276 277 extern int nummarksurfaces; 278 extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES]; 279 280 extern int numsurfedges; 281 extern int dsurfedges[MAX_MAP_SURFEDGES]; 282 283 284 void DecompressVis (byte *in, byte *decompressed); 285 int CompressVis (byte *vis, byte *dest); 286 287 void LoadBSPFile (char *filename); 288 void WriteBSPFile (char *filename); 289 void PrintBSPFileSizes (void); 290 291 //=============== 292 293 294 typedef struct epair_s 295 { 296 struct epair_s *next; 297 char *key; 298 char *value; 299 } epair_t; 300 301 typedef struct 302 { 303 vec3_t origin; 304 int firstbrush; 305 int numbrushes; 306 epair_t *epairs; 307 } entity_t; 308 309 extern int num_entities; 310 extern entity_t entities[MAX_MAP_ENTITIES]; 311 312 void ParseEntities (void); 313 void UnparseEntities (void); 314 315 void SetKeyValue (entity_t *ent, char *key, char *value); 316 char *ValueForKey (entity_t *ent, char *key); 317 // will return "" if not present 318 319 vec_t FloatForKey (entity_t *ent, char *key); 320 void GetVectorForKey (entity_t *ent, char *key, vec3_t vec); 321 322 epair_t *ParseEpair (void); 323 324 #endif 325