q2files.h (11637B)
1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with Foobar; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 23 // 24 // qfiles.h: quake file formats 25 // This file must be identical in the quake and utils directories 26 // 27 28 /* 29 ======================================================================== 30 31 The .pak files are just a linear collapse of a directory tree 32 33 ======================================================================== 34 */ 35 36 #define IDPAKHEADER (('K'<<24)+('C'<<16)+('A'<<8)+'P') 37 38 typedef struct 39 { 40 char name[56]; 41 int filepos, filelen; 42 } dpackfile_t; 43 44 typedef struct 45 { 46 int ident; // == IDPAKHEADER 47 int dirofs; 48 int dirlen; 49 } dpackheader_t; 50 51 #define MAX_FILES_IN_PACK 4096 52 53 54 /* 55 ======================================================================== 56 57 PCX files are used for as many images as possible 58 59 ======================================================================== 60 */ 61 62 typedef struct 63 { 64 char manufacturer; 65 char version; 66 char encoding; 67 char bits_per_pixel; 68 unsigned short xmin,ymin,xmax,ymax; 69 unsigned short hres,vres; 70 unsigned char palette[48]; 71 char reserved; 72 char color_planes; 73 unsigned short bytes_per_line; 74 unsigned short palette_type; 75 char filler[58]; 76 unsigned char data; // unbounded 77 } pcx_t; 78 79 80 /* 81 ======================================================================== 82 83 .MD2 triangle model file format 84 85 ======================================================================== 86 */ 87 88 #define IDALIASHEADER (('2'<<24)+('P'<<16)+('D'<<8)+'I') 89 #define ALIAS_VERSION 8 90 91 #define MAX_TRIANGLES 4096 92 #define MAX_VERTS 2048 93 #define MAX_FRAMES 512 94 #define MAX_MD2SKINS 32 95 #define MAX_SKINNAME 64 96 97 typedef struct 98 { 99 short s; 100 short t; 101 } dstvert_t; 102 103 typedef struct 104 { 105 short index_xyz[3]; 106 short index_st[3]; 107 } dtriangle_t; 108 109 typedef struct 110 { 111 byte v[3]; // scaled byte to fit in frame mins/maxs 112 byte lightnormalindex; 113 } dtrivertx_t; 114 115 #define DTRIVERTX_V0 0 116 #define DTRIVERTX_V1 1 117 #define DTRIVERTX_V2 2 118 #define DTRIVERTX_LNI 3 119 #define DTRIVERTX_SIZE 4 120 121 typedef struct 122 { 123 float scale[3]; // multiply byte verts by this 124 float translate[3]; // then add this 125 char name[16]; // frame name from grabbing 126 dtrivertx_t verts[1]; // variable sized 127 } daliasframe_t; 128 129 130 // the glcmd format: 131 // a positive integer starts a tristrip command, followed by that many 132 // vertex structures. 133 // a negative integer starts a trifan command, followed by -x vertexes 134 // a zero indicates the end of the command list. 135 // a vertex consists of a floating point s, a floating point t, 136 // and an integer vertex index. 137 138 139 typedef struct 140 { 141 int ident; 142 int version; 143 144 int skinwidth; 145 int skinheight; 146 int framesize; // byte size of each frame 147 148 int num_skins; 149 int num_xyz; 150 int num_st; // greater than num_xyz for seams 151 int num_tris; 152 int num_glcmds; // dwords in strip/fan command list 153 int num_frames; 154 155 int ofs_skins; // each skin is a MAX_SKINNAME string 156 int ofs_st; // byte offset from start for stverts 157 int ofs_tris; // offset for dtriangles 158 int ofs_frames; // offset for first frame 159 int ofs_glcmds; 160 int ofs_end; // end of file 161 162 } dmdl_t; 163 164 /* 165 ======================================================================== 166 167 .SP2 sprite file format 168 169 ======================================================================== 170 */ 171 172 #define IDSPRITEHEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') 173 // little-endian "IDS2" 174 #define SPRITE_VERSION 2 175 176 typedef struct 177 { 178 int width, height; 179 int origin_x, origin_y; // raster coordinates inside pic 180 char name[MAX_SKINNAME]; // name of pcx file 181 } dsprframe_t; 182 183 typedef struct { 184 int ident; 185 int version; 186 int numframes; 187 dsprframe_t frames[1]; // variable sized 188 } dsprite_t; 189 190 /* 191 ============================================================================== 192 193 .WAL texture file format 194 195 ============================================================================== 196 */ 197 198 199 #define MIPLEVELS 4 200 typedef struct miptex_s 201 { 202 char name[32]; 203 unsigned width, height; 204 unsigned offsets[MIPLEVELS]; // four mip maps stored 205 char animname[32]; // next frame in animation chain 206 int flags; 207 int contents; 208 int value; 209 } miptex_t; 210 211 212 213 /* 214 ============================================================================== 215 216 .BSP file format 217 218 ============================================================================== 219 */ 220 221 #define IDBSPHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') 222 // little-endian "IBSP" 223 224 #define BSPVERSION 38 225 226 227 // upper design bounds 228 // leaffaces, leafbrushes, planes, and verts are still bounded by 229 // 16 bit short limits 230 #define MAX_MAP_MODELS 1024 231 #define MAX_MAP_BRUSHES 8192 232 #define MAX_MAP_ENTITIES 2048 233 #define MAX_MAP_ENTSTRING 0x40000 234 #define MAX_MAP_TEXINFO 8192 235 236 #define MAX_MAP_AREAS 256 237 #define MAX_MAP_AREAPORTALS 1024 238 #define MAX_MAP_PLANES 65536 239 #define MAX_MAP_NODES 65536 240 #define MAX_MAP_BRUSHSIDES 65536 241 #define MAX_MAP_LEAFS 65536 242 #define MAX_MAP_VERTS 65536 243 #define MAX_MAP_FACES 65536 244 #define MAX_MAP_LEAFFACES 65536 245 #define MAX_MAP_LEAFBRUSHES 65536 246 #define MAX_MAP_PORTALS 65536 247 #define MAX_MAP_EDGES 128000 248 #define MAX_MAP_SURFEDGES 256000 249 #define MAX_MAP_LIGHTING 0x320000 250 #define MAX_MAP_VISIBILITY 0x280000 251 252 // key / value pair sizes 253 254 #define MAX_KEY 32 255 #define MAX_VALUE 1024 256 257 //============================================================================= 258 259 typedef struct 260 { 261 int fileofs, filelen; 262 } lump_t; 263 264 #define LUMP_ENTITIES 0 265 #define LUMP_PLANES 1 266 #define LUMP_VERTEXES 2 267 #define LUMP_VISIBILITY 3 268 #define LUMP_NODES 4 269 #define LUMP_TEXINFO 5 270 #define LUMP_FACES 6 271 #define LUMP_LIGHTING 7 272 #define LUMP_LEAFS 8 273 #define LUMP_LEAFFACES 9 274 #define LUMP_LEAFBRUSHES 10 275 #define LUMP_EDGES 11 276 #define LUMP_SURFEDGES 12 277 #define LUMP_MODELS 13 278 #define LUMP_BRUSHES 14 279 #define LUMP_BRUSHSIDES 15 280 #define LUMP_POP 16 281 #define LUMP_AREAS 17 282 #define LUMP_AREAPORTALS 18 283 #define HEADER_LUMPS 19 284 285 typedef struct 286 { 287 int ident; 288 int version; 289 lump_t lumps[HEADER_LUMPS]; 290 } dheader_t; 291 292 typedef struct 293 { 294 float mins[3], maxs[3]; 295 float origin[3]; // for sounds or lights 296 int headnode; 297 int firstface, numfaces; // submodels just draw faces 298 // without walking the bsp tree 299 } dmodel_t; 300 301 302 typedef struct 303 { 304 float point[3]; 305 } dvertex_t; 306 307 308 // 0-2 are axial planes 309 #define PLANE_X 0 310 #define PLANE_Y 1 311 #define PLANE_Z 2 312 313 // 3-5 are non-axial planes snapped to the nearest 314 #define PLANE_ANYX 3 315 #define PLANE_ANYY 4 316 #define PLANE_ANYZ 5 317 318 // planes (x&~1) and (x&~1)+1 are allways opposites 319 320 typedef struct 321 { 322 float normal[3]; 323 float dist; 324 int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate 325 } dplane_t; 326 327 328 // contents flags are seperate bits 329 // a given brush can contribute multiple content bits 330 // multiple brushes can be in a single leaf 331 332 // these definitions also need to be in q_shared.h! 333 334 // lower bits are stronger, and will eat weaker brushes completely 335 #define CONTENTS_SOLID 1 // an eye is never valid in a solid 336 #define CONTENTS_WINDOW 2 // translucent, but not watery 337 #define CONTENTS_AUX 4 338 #define CONTENTS_LAVA 8 339 #define CONTENTS_SLIME 16 340 #define CONTENTS_WATER 32 341 #define CONTENTS_MIST 64 342 #define LAST_VISIBLE_CONTENTS 64 343 344 // remaining contents are non-visible, and don't eat brushes 345 346 #define CONTENTS_AREAPORTAL 0x8000 347 348 #define CONTENTS_PLAYERCLIP 0x10000 349 #define CONTENTS_MONSTERCLIP 0x20000 350 351 // currents can be added to any other contents, and may be mixed 352 #define CONTENTS_CURRENT_0 0x40000 353 #define CONTENTS_CURRENT_90 0x80000 354 #define CONTENTS_CURRENT_180 0x100000 355 #define CONTENTS_CURRENT_270 0x200000 356 #define CONTENTS_CURRENT_UP 0x400000 357 #define CONTENTS_CURRENT_DOWN 0x800000 358 359 #define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity 360 361 #define CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game 362 #define CONTENTS_DEADMONSTER 0x4000000 363 #define CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs 364 //renamed because it's in conflict with the Q3A translucent contents 365 #define CONTENTS_Q2TRANSLUCENT 0x10000000 // auto set if any surface has trans 366 #define CONTENTS_LADDER 0x20000000 367 368 369 370 #define SURF_LIGHT 0x1 // value will hold the light strength 371 372 #define SURF_SLICK 0x2 // effects game physics 373 374 #define SURF_SKY 0x4 // don't draw, but add to skybox 375 #define SURF_WARP 0x8 // turbulent water warp 376 #define SURF_TRANS33 0x10 377 #define SURF_TRANS66 0x20 378 #define SURF_FLOWING 0x40 // scroll towards angle 379 #define SURF_NODRAW 0x80 // don't bother referencing the texture 380 381 #define SURF_HINT 0x100 // make a primary bsp splitter 382 #define SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes 383 384 385 386 typedef struct 387 { 388 int planenum; 389 int children[2]; // negative numbers are -(leafs+1), not nodes 390 short mins[3]; // for frustom culling 391 short maxs[3]; 392 unsigned short firstface; 393 unsigned short numfaces; // counting both sides 394 } dnode_t; 395 396 397 typedef struct texinfo_s 398 { 399 float vecs[2][4]; // [s/t][xyz offset] 400 int flags; // miptex flags + overrides 401 int value; // light emission, etc 402 char texture[32]; // texture name (textures/*.wal) 403 int nexttexinfo; // for animations, -1 = end of chain 404 } texinfo_t; 405 406 407 // note that edge 0 is never used, because negative edge nums are used for 408 // counterclockwise use of the edge in a face 409 typedef struct 410 { 411 unsigned short v[2]; // vertex numbers 412 } dedge_t; 413 414 #define MAXLIGHTMAPS 4 415 typedef struct 416 { 417 unsigned short planenum; 418 short side; 419 420 int firstedge; // we must support > 64k edges 421 short numedges; 422 short texinfo; 423 424 // lighting info 425 byte styles[MAXLIGHTMAPS]; 426 int lightofs; // start of [numstyles*surfsize] samples 427 } dface_t; 428 429 typedef struct 430 { 431 int contents; // OR of all brushes (not needed?) 432 433 short cluster; 434 short area; 435 436 short mins[3]; // for frustum culling 437 short maxs[3]; 438 439 unsigned short firstleafface; 440 unsigned short numleaffaces; 441 442 unsigned short firstleafbrush; 443 unsigned short numleafbrushes; 444 } dleaf_t; 445 446 typedef struct 447 { 448 unsigned short planenum; // facing out of the leaf 449 short texinfo; 450 } dbrushside_t; 451 452 typedef struct 453 { 454 int firstside; 455 int numsides; 456 int contents; 457 } dbrush_t; 458 459 #define ANGLE_UP -1 460 #define ANGLE_DOWN -2 461 462 463 // the visibility lump consists of a header with a count, then 464 // byte offsets for the PVS and PHS of each cluster, then the raw 465 // compressed bit vectors 466 #define DVIS_PVS 0 467 #define DVIS_PHS 1 468 typedef struct 469 { 470 int numclusters; 471 int bitofs[8][2]; // bitofs[numclusters][2] 472 } dvis_t; 473 474 // each area has a list of portals that lead into other areas 475 // when portals are closed, other areas may not be visible or 476 // hearable even if the vis info says that it should be 477 typedef struct 478 { 479 int portalnum; 480 int otherarea; 481 } dareaportal_t; 482 483 typedef struct 484 { 485 int numareaportals; 486 int firstareaportal; 487 } darea_t;