1 /* 2 Copyright (C) 1999-2006 Id Software, Inc. and contributors. 3 For a list of contributors, see the accompanying CONTRIBUTORS file. 4 5 This file is part of GtkRadiant. 6 7 GtkRadiant is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 GtkRadiant is distributed in the hope that it will be useful, 13 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 GtkRadiant; 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 6144 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 .MD2 compressed triangle model file format 83 84 ======================================================================== 85 */ 86 #define IDCOMPRESSEDALIASHEADER (('2'<<24)+('C'<<16)+('D'<<8)+'I') 87 88 /* 89 ======================================================================== 90 91 .MD2 compressed triangle model file format 92 93 ======================================================================== 94 */ 95 #define IDJOINTEDALIASHEADER (('2'<<24)+('J'<<16)+('D'<<8)+'I') 96 97 /* 98 ======================================================================== 99 100 .MD2 triangle model file format 101 102 ======================================================================== 103 */ 104 105 #define IDALIASHEADER (('2'<<24)+('P'<<16)+('D'<<8)+'I') 106 #define ALIAS_VERSION 8 107 108 #define MAX_TRIANGLES 4096 109 #define MAX_VERTS 2048 110 #define MAX_FRAMES 512 111 #define MAX_MD2SKINS 64 112 #define MAX_SKINNAME 64 113 114 typedef struct 115 { 116 short s; 117 short t; 118 } dstvert_t; 119 120 typedef struct 121 { 122 short index_xyz[3]; 123 short index_st[3]; 124 } dtriangle_t; 125 126 typedef struct 127 { 128 union 129 { 130 struct 131 { 132 byte v[3]; // scaled byte to fit in frame mins/maxs 133 byte lightnormalindex; 134 }; 135 136 int vert; 137 }; 138 } dtrivertx_t; 139 140 #define DTRIVERTX_V0 0 141 #define DTRIVERTX_V1 1 142 #define DTRIVERTX_V2 2 143 #define DTRIVERTX_LNI 3 144 #define DTRIVERTX_SIZE 4 145 146 typedef struct 147 { 148 float scale[3]; // multiply byte verts by this 149 float translate[3]; // then add this 150 char name[16]; // frame name from grabbing 151 dtrivertx_t verts[1]; // variable sized 152 } daliasframe_t; 153 154 155 // the glcmd format: 156 // a positive integer starts a tristrip command, followed by that many 157 // vertex structures. 158 // a negative integer starts a trifan command, followed by -x vertexes 159 // a zero indicates the end of the command list. 160 // a vertex consists of a floating point s, a floating point t, 161 // and an integer vertex index. 162 163 164 typedef struct 165 { 166 int ident; 167 int version; 168 169 int skinwidth; 170 int skinheight; 171 int framesize; // byte size of each frame 172 173 int num_skins; 174 int num_xyz; 175 int num_st; // greater than num_xyz for seams 176 int num_tris; 177 int num_glcmds; // dwords in strip/fan command list 178 int num_frames; 179 180 int ofs_skins; // each skin is a MAX_SKINNAME string 181 int ofs_st; // byte offset from start for stverts 182 int ofs_tris; // offset for dtriangles 183 int ofs_frames; // offset for first frame 184 int ofs_glcmds; 185 int ofs_end; // end of file 186 187 } dmdl_t; 188 189 // compressed model 190 typedef struct dcompmdl_s 191 { 192 dmdl_t header; 193 short CompressedFrameSize; 194 short UniqueVerts; 195 short *remap; 196 float *translate; // then add this 197 float *scale; // multiply byte verts by this 198 char *mat; 199 char *frames; 200 char *base; 201 float *ctranslate; 202 float *cscale; 203 char data[1]; 204 } dcompmdl_t; 205 206 typedef struct 207 { 208 dcompmdl_t compModInfo; 209 int rootCluster; 210 int skeletalType; 211 struct ModelSkeleton_s *skeletons; 212 } JointedModel_t; 213 214 /* 215 ======================================================================== 216 217 .BK file format 218 219 ======================================================================== 220 */ 221 222 #define IDBOOKHEADER (('K'<<24)+('O'<<16)+('O'<<8)+'B') 223 #define BOOK_VERSION 2 224 225 typedef struct bookframe_s 226 { 227 int x; 228 int y; 229 int w; 230 int h; 231 char name[MAX_SKINNAME]; // name of gfx file 232 } bookframe_t; 233 234 typedef struct bookheader_s 235 { 236 unsigned int ident; 237 unsigned int version; 238 int num_segments; 239 int total_w; 240 int total_h; 241 } bookheader_t; 242 243 typedef struct book_s 244 { 245 bookheader_t bheader; 246 bookframe_t bframes[MAX_MD2SKINS]; 247 } book_t; 248 249 /* 250 ======================================================================== 251 252 .SP2 sprite file format 253 254 ======================================================================== 255 */ 256 257 #define IDSPRITEHEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') 258 // little-endian "IDS2" 259 #define SPRITE_VERSION 2 260 261 typedef struct 262 { 263 int width, height; 264 int origin_x, origin_y; // raster coordinates inside pic 265 char name[MAX_SKINNAME]; // name of pcx file 266 } dsprframe_t; 267 268 typedef struct { 269 int ident; 270 int version; 271 int numframes; 272 dsprframe_t frames[1]; // variable sized 273 } dsprite_t; 274 275 /* 276 ============================================================================== 277 278 .M8 texture file format 279 280 ============================================================================== 281 */ 282 283 typedef struct palette_s 284 { 285 union 286 { 287 struct 288 { 289 byte r,g,b; 290 }; 291 }; 292 } palette_t; 293 294 #define MIP_VERSION 2 295 #define PAL_SIZE 256 296 #define MIPLEVELS 16 297 298 typedef struct miptex_s 299 { 300 int version; 301 char name[32]; 302 unsigned width[MIPLEVELS], height[MIPLEVELS]; 303 unsigned offsets[MIPLEVELS]; // four mip maps stored 304 char animname[32]; // next frame in animation chain 305 palette_t palette[PAL_SIZE]; 306 int flags; 307 int contents; 308 int value; 309 } miptex_t; 310 311 312 313 #define MIP32_VERSION 4 314 315 typedef struct miptex32_s 316 { 317 int version; 318 char name[128]; 319 char altname[128]; // texture substitution 320 char animname[128]; // next frame in animation chain 321 char damagename[128]; // image that should be shown when damaged 322 unsigned width[MIPLEVELS], height[MIPLEVELS]; 323 unsigned offsets[MIPLEVELS]; 324 int flags; 325 int contents; 326 int value; 327 float scale_x, scale_y; 328 int mip_scale; 329 330 // detail texturing info 331 char dt_name[128]; // detailed texture name 332 float dt_scale_x, dt_scale_y; 333 float dt_u, dt_v; 334 float dt_alpha; 335 int dt_src_blend_mode, dt_dst_blend_mode; 336 337 int unused[20]; // future expansion to maintain compatibility with h2 338 } miptex32_t; 339 340 341 /* 342 ============================================================================== 343 344 .BSP file format 345 346 ============================================================================== 347 */ 348 349 #define IDBSPHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') 350 // little-endian "IBSP" 351 352 #define BSPVERSION 38 353 354 355 // upper design bounds 356 // leaffaces, leafbrushes, planes, and verts are still bounded by 357 // 16 bit short limits 358 #define MAX_MAP_MODELS 1024 359 //#define MAX_MAP_BRUSHES 8192 // Quake 2 original 360 #define MAX_MAP_BRUSHES 10240 361 #define MAX_MAP_ENTITIES 2048 362 #define MAX_MAP_ENTSTRING 0x40000 363 #define MAX_MAP_TEXINFO 8192 364 365 #define MAX_MAP_AREAS 256 366 #define MAX_MAP_AREAPORTALS 1024 367 #define MAX_MAP_PLANES 65536 368 #define MAX_MAP_NODES 65536 369 #define MAX_MAP_BRUSHSIDES 65536 370 #define MAX_MAP_LEAFS 65536 371 #define MAX_MAP_VERTS 65536 372 #define MAX_MAP_FACES 65536 373 #define MAX_MAP_LEAFFACES 65536 374 #define MAX_MAP_LEAFBRUSHES 65536 375 #define MAX_MAP_PORTALS 65536 376 #define MAX_MAP_EDGES 128000 377 #define MAX_MAP_SURFEDGES 256000 378 #define MAX_MAP_LIGHTING 0x200000 379 #define MAX_MAP_VISIBILITY 0x180000 380 381 // key / value pair sizes 382 383 #define MAX_KEY 32 384 #define MAX_VALUE 1024 385 386 //============================================================================= 387 388 typedef struct 389 { 390 int fileofs, filelen; 391 } lump_t; 392 393 #define LUMP_ENTITIES 0 394 #define LUMP_PLANES 1 395 #define LUMP_VERTEXES 2 396 #define LUMP_VISIBILITY 3 397 #define LUMP_NODES 4 398 #define LUMP_TEXINFO 5 399 #define LUMP_FACES 6 400 #define LUMP_LIGHTING 7 401 #define LUMP_LEAFS 8 402 #define LUMP_LEAFFACES 9 403 #define LUMP_LEAFBRUSHES 10 404 #define LUMP_EDGES 11 405 #define LUMP_SURFEDGES 12 406 #define LUMP_MODELS 13 407 #define LUMP_BRUSHES 14 408 #define LUMP_BRUSHSIDES 15 409 #define LUMP_POP 16 410 #define LUMP_AREAS 17 411 #define LUMP_AREAPORTALS 18 412 #define HEADER_LUMPS 19 413 414 typedef struct 415 { 416 int ident; 417 int version; 418 lump_t lumps[HEADER_LUMPS]; 419 } dheader_t; 420 421 typedef struct 422 { 423 float mins[3], maxs[3]; 424 float origin[3]; // for sounds or lights 425 int headnode; 426 int firstface, numfaces; // submodels just draw faces 427 // without walking the bsp tree 428 } dmodel_t; 429 430 431 typedef struct 432 { 433 float point[3]; 434 } dvertex_t; 435 436 437 // 0-2 are axial planes 438 #define PLANE_X 0 439 #define PLANE_Y 1 440 #define PLANE_Z 2 441 442 // 3-5 are non-axial planes snapped to the nearest 443 #define PLANE_ANYX 3 444 #define PLANE_ANYY 4 445 #define PLANE_ANYZ 5 446 447 // planes (x&~1) and (x&~1)+1 are allways opposites 448 449 typedef struct 450 { 451 float normal[3]; 452 float dist; 453 int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate 454 } dplane_t; 455 456 457 // contents flags are seperate bits 458 // a given brush can contribute multiple content bits 459 // multiple brushes can be in a single leaf 460 461 // These definitions also need to be in q_shared.h! 462 463 // ************************************************************************************************ 464 // CONTENTS_XXX 465 // ------------ 466 // Contents flags. 467 // ************************************************************************************************ 468 469 // Lower bits are stronger, and will eat weaker brushes completely. 470 471 #define CONTENTS_SOLID 0x00000001 // An eye is never valid in a solid. 472 #define CONTENTS_WINDOW 0x00000002 // Translucent, but not watery. 473 #define CONTENTS_AUX 0x00000004 474 #define CONTENTS_LAVA 0x00000008 475 #define CONTENTS_SLIME 0x00000010 476 #define CONTENTS_WATER 0x00000020 477 #define CONTENTS_MIST 0x00000040 478 #define LAST_VISIBLE_CONTENTS CONTENTS_MIST 479 480 // Remaining contents are non-visible, and don't eat brushes. 481 482 #define CONTENTS_AREAPORTAL 0x00008000 483 #define CONTENTS_PLAYERCLIP 0x00010000 484 #define CONTENTS_MONSTERCLIP 0x00020000 485 486 // Currents can be added to any other contents, and may be mixed. 487 488 #define CONTENTS_CURRENT_0 0x00040000 489 #define CONTENTS_CURRENT_90 0x00080000 490 #define CONTENTS_CURRENT_180 0x00100000 491 #define CONTENTS_CURRENT_270 0x00200000 492 #define CONTENTS_CURRENT_UP 0x00400000 493 #define CONTENTS_CURRENT_DOWN 0x00800000 494 #define CONTENTS_ORIGIN 0x01000000 // Removed before bsping an entity. 495 #define CONTENTS_MONSTER 0x02000000 // Should never be on a brush, only in game. 496 #define CONTENTS_DEADMONSTER 0x04000000 497 #define CONTENTS_DETAIL 0x08000000 // Brushes to be added after vis leaves. 498 #define CONTENTS_TRANSLUCENT 0x10000000 // Auto set if any surface has transparency. 499 #define CONTENTS_LADDER 0x20000000 500 #define CONTENTS_CAMERANOBLOCK 0x40000000 // Camera LOS ignores any brushes with this flag. 501 502 typedef struct 503 { 504 int planenum; 505 int children[2]; // negative numbers are -(leafs+1), not nodes 506 short mins[3]; // for frustom culling 507 short maxs[3]; 508 unsigned short firstface; 509 unsigned short numfaces; // counting both sides 510 } dnode_t; 511 512 513 typedef struct texinfo_s 514 { 515 float vecs[2][4]; // [s/t][xyz offset] 516 int flags; // miptex flags + overrides 517 int value; // light emission, etc 518 char texture[32]; // texture name (textures/*.wal) 519 int nexttexinfo; // for animations, -1 = end of chain 520 } texinfo_t; 521 522 523 // note that edge 0 is never used, because negative edge nums are used for 524 // counterclockwise use of the edge in a face 525 typedef struct 526 { 527 unsigned short v[2]; // vertex numbers 528 } dedge_t; 529 530 #define MAXLIGHTMAPS 4 531 typedef struct 532 { 533 unsigned short planenum; 534 short side; 535 536 int firstedge; // we must support > 64k edges 537 short numedges; 538 short texinfo; 539 540 // lighting info 541 byte styles[MAXLIGHTMAPS]; 542 int lightofs; // start of [numstyles*surfsize] samples 543 } dface_t; 544 545 typedef struct 546 { 547 int contents; // OR of all brushes (not needed?) 548 549 short cluster; 550 short area; 551 552 short mins[3]; // for frustum culling 553 short maxs[3]; 554 555 unsigned short firstleafface; 556 unsigned short numleaffaces; 557 558 unsigned short firstleafbrush; 559 unsigned short numleafbrushes; 560 } dleaf_t; 561 562 typedef struct 563 { 564 unsigned short planenum; // facing out of the leaf 565 short texinfo; 566 } dbrushside_t; 567 568 typedef struct 569 { 570 int firstside; 571 int numsides; 572 int contents; 573 } dbrush_t; 574 575 #define ANGLE_UP -1 576 #define ANGLE_DOWN -2 577 578 579 // the visibility lump consists of a header with a count, then 580 // byte offsets for the PVS and PHS of each cluster, then the raw 581 // compressed bit vectors 582 #define DVIS_PVS 0 583 #define DVIS_PHS 1 584 typedef struct 585 { 586 int numclusters; 587 int bitofs[8][2]; // bitofs[numclusters][2] 588 } dvis_t; 589 590 // each area has a list of portals that lead into other areas 591 // when portals are closed, other areas may not be visible or 592 // hearable even if the vis info says that it should be 593 typedef struct 594 { 595 int portalnum; 596 int otherarea; 597 } dareaportal_t; 598 599 typedef struct 600 { 601 int numareaportals; 602 int firstareaportal; 603 } darea_t; 604 605