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 Quake III Arena source code; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 #ifndef __QFILES_H__ 23 #define __QFILES_H__ 24 25 // 26 // qfiles.h: quake file formats 27 // This file must be identical in the quake and utils directories 28 // 29 30 //Ignore __attribute__ on non-gcc platforms 31 #ifndef __GNUC__ 32 #ifndef __attribute__ 33 #define __attribute__(x) 34 #endif 35 #endif 36 37 // surface geometry should not exceed these limits 38 #define SHADER_MAX_VERTEXES 1000 39 #define SHADER_MAX_INDEXES (6*SHADER_MAX_VERTEXES) 40 41 42 // the maximum size of game relative pathnames 43 #define MAX_QPATH 64 44 45 /* 46 ======================================================================== 47 48 QVM files 49 50 ======================================================================== 51 */ 52 53 #define VM_MAGIC 0x12721444 54 #define VM_MAGIC_VER2 0x12721445 55 typedef struct { 56 int vmMagic; 57 58 int instructionCount; 59 60 int codeOffset; 61 int codeLength; 62 63 int dataOffset; 64 int dataLength; 65 int litLength; // ( dataLength - litLength ) should be byteswapped on load 66 int bssLength; // zero filled memory appended to datalength 67 68 //!!! below here is VM_MAGIC_VER2 !!! 69 int jtrgLength; // number of jump table targets 70 } vmHeader_t; 71 72 /* 73 ======================================================================== 74 75 .MD3 triangle model file format 76 77 ======================================================================== 78 */ 79 80 #define MD3_IDENT (('3'<<24)+('P'<<16)+('D'<<8)+'I') 81 #define MD3_VERSION 15 82 83 // limits 84 #define MD3_MAX_LODS 3 85 #define MD3_MAX_TRIANGLES 8192 // per surface 86 #define MD3_MAX_VERTS 4096 // per surface 87 #define MD3_MAX_SHADERS 256 // per surface 88 #define MD3_MAX_FRAMES 1024 // per model 89 #define MD3_MAX_SURFACES 32 // per model 90 #define MD3_MAX_TAGS 16 // per frame 91 92 // vertex scales 93 #define MD3_XYZ_SCALE (1.0/64) 94 95 typedef struct md3Frame_s { 96 vec3_t bounds[2]; 97 vec3_t localOrigin; 98 float radius; 99 char name[16]; 100 } md3Frame_t; 101 102 typedef struct md3Tag_s { 103 char name[MAX_QPATH]; // tag name 104 vec3_t origin; 105 vec3_t axis[3]; 106 } md3Tag_t; 107 108 /* 109 ** md3Surface_t 110 ** 111 ** CHUNK SIZE 112 ** header sizeof( md3Surface_t ) 113 ** shaders sizeof( md3Shader_t ) * numShaders 114 ** triangles[0] sizeof( md3Triangle_t ) * numTriangles 115 ** st sizeof( md3St_t ) * numVerts 116 ** XyzNormals sizeof( md3XyzNormal_t ) * numVerts * numFrames 117 */ 118 typedef struct { 119 int ident; // 120 121 char name[MAX_QPATH]; // polyset name 122 123 int flags; 124 int numFrames; // all surfaces in a model should have the same 125 126 int numShaders; // all surfaces in a model should have the same 127 int numVerts; 128 129 int numTriangles; 130 int ofsTriangles; 131 132 int ofsShaders; // offset from start of md3Surface_t 133 int ofsSt; // texture coords are common for all frames 134 int ofsXyzNormals; // numVerts * numFrames 135 136 int ofsEnd; // next surface follows 137 } md3Surface_t; 138 139 typedef struct { 140 char name[MAX_QPATH]; 141 int shaderIndex; // for in-game use 142 } md3Shader_t; 143 144 typedef struct { 145 int indexes[3]; 146 } md3Triangle_t; 147 148 typedef struct { 149 float st[2]; 150 } md3St_t; 151 152 typedef struct { 153 short xyz[3]; 154 short normal; 155 } md3XyzNormal_t; 156 157 typedef struct { 158 int ident; 159 int version; 160 161 char name[MAX_QPATH]; // model name 162 163 int flags; 164 165 int numFrames; 166 int numTags; 167 int numSurfaces; 168 169 int numSkins; 170 171 int ofsFrames; // offset for first frame 172 int ofsTags; // numFrames * numTags 173 int ofsSurfaces; // first surface, others follow 174 175 int ofsEnd; // end of file 176 } md3Header_t; 177 178 /* 179 ============================================================================== 180 181 MD4 file format 182 183 ============================================================================== 184 */ 185 186 #define MD4_IDENT (('4'<<24)+('P'<<16)+('D'<<8)+'I') 187 #define MD4_VERSION 1 188 #define MD4_MAX_BONES 128 189 190 typedef struct { 191 int boneIndex; // these are indexes into the boneReferences, 192 float boneWeight; // not the global per-frame bone list 193 vec3_t offset; 194 } md4Weight_t; 195 196 typedef struct { 197 vec3_t normal; 198 vec2_t texCoords; 199 int numWeights; 200 md4Weight_t weights[1]; // variable sized 201 } md4Vertex_t; 202 203 typedef struct { 204 int indexes[3]; 205 } md4Triangle_t; 206 207 typedef struct { 208 int ident; 209 210 char name[MAX_QPATH]; // polyset name 211 char shader[MAX_QPATH]; 212 int shaderIndex; // for in-game use 213 214 int ofsHeader; // this will be a negative number 215 216 int numVerts; 217 int ofsVerts; 218 219 int numTriangles; 220 int ofsTriangles; 221 222 // Bone references are a set of ints representing all the bones 223 // present in any vertex weights for this surface. This is 224 // needed because a model may have surfaces that need to be 225 // drawn at different sort times, and we don't want to have 226 // to re-interpolate all the bones for each surface. 227 int numBoneReferences; 228 int ofsBoneReferences; 229 230 int ofsEnd; // next surface follows 231 } md4Surface_t; 232 233 typedef struct { 234 float matrix[3][4]; 235 } md4Bone_t; 236 237 typedef struct { 238 vec3_t bounds[2]; // bounds of all surfaces of all LOD's for this frame 239 vec3_t localOrigin; // midpoint of bounds, used for sphere cull 240 float radius; // dist from localOrigin to corner 241 md4Bone_t bones[1]; // [numBones] 242 } md4Frame_t; 243 244 typedef struct { 245 int numSurfaces; 246 int ofsSurfaces; // first surface, others follow 247 int ofsEnd; // next lod follows 248 } md4LOD_t; 249 250 typedef struct { 251 int ident; 252 int version; 253 254 char name[MAX_QPATH]; // model name 255 256 // frames and bones are shared by all levels of detail 257 int numFrames; 258 int numBones; 259 int ofsBoneNames; // char name[ MAX_QPATH ] 260 int ofsFrames; // md4Frame_t[numFrames] 261 262 // each level of detail has completely separate sets of surfaces 263 int numLODs; 264 int ofsLODs; 265 266 int ofsEnd; // end of file 267 } md4Header_t; 268 269 /* 270 * Here are the definitions for Ravensoft's model format of md4. Raven stores their 271 * playermodels in .mdr files, in some games, which are pretty much like the md4 272 * format implemented by ID soft. It seems like ID's original md4 stuff is not used at all. 273 * MDR is being used in EliteForce, JediKnight2 and Soldiers of Fortune2 (I think). 274 * So this comes in handy for anyone who wants to make it possible to load player 275 * models from these games. 276 * This format has bone tags, which is similar to the thing you have in md3 I suppose. 277 * Raven has released their version of md3view under GPL enabling me to add support 278 * to this codebase. Thanks to Steven Howes aka Skinner for helping with example 279 * source code. 280 * 281 * - Thilo Schulz (arny@ats.s.bawue.de) 282 */ 283 284 // If you want to enable support for Raven's .mdr / md4 format, uncomment the next 285 // line. 286 #define RAVENMD4 287 288 #ifdef RAVENMD4 289 290 #define MDR_IDENT (('5'<<24)+('M'<<16)+('D'<<8)+'R') 291 #define MDR_VERSION 2 292 #define MDR_MAX_BONES 128 293 294 typedef struct { 295 int boneIndex; // these are indexes into the boneReferences, 296 float boneWeight; // not the global per-frame bone list 297 vec3_t offset; 298 } mdrWeight_t; 299 300 typedef struct { 301 vec3_t normal; 302 vec2_t texCoords; 303 int numWeights; 304 mdrWeight_t weights[1]; // variable sized 305 } mdrVertex_t; 306 307 typedef struct { 308 int indexes[3]; 309 } mdrTriangle_t; 310 311 typedef struct { 312 int ident; 313 314 char name[MAX_QPATH]; // polyset name 315 char shader[MAX_QPATH]; 316 int shaderIndex; // for in-game use 317 318 int ofsHeader; // this will be a negative number 319 320 int numVerts; 321 int ofsVerts; 322 323 int numTriangles; 324 int ofsTriangles; 325 326 // Bone references are a set of ints representing all the bones 327 // present in any vertex weights for this surface. This is 328 // needed because a model may have surfaces that need to be 329 // drawn at different sort times, and we don't want to have 330 // to re-interpolate all the bones for each surface. 331 int numBoneReferences; 332 int ofsBoneReferences; 333 334 int ofsEnd; // next surface follows 335 } mdrSurface_t; 336 337 typedef struct { 338 float matrix[3][4]; 339 } mdrBone_t; 340 341 typedef struct { 342 vec3_t bounds[2]; // bounds of all surfaces of all LOD's for this frame 343 vec3_t localOrigin; // midpoint of bounds, used for sphere cull 344 float radius; // dist from localOrigin to corner 345 char name[16]; 346 mdrBone_t bones[1]; // [numBones] 347 } mdrFrame_t; 348 349 typedef struct { 350 unsigned char Comp[24]; // MC_COMP_BYTES is in MatComp.h, but don't want to couple 351 } mdrCompBone_t; 352 353 typedef struct { 354 vec3_t bounds[2]; // bounds of all surfaces of all LOD's for this frame 355 vec3_t localOrigin; // midpoint of bounds, used for sphere cull 356 float radius; // dist from localOrigin to corner 357 mdrCompBone_t bones[1]; // [numBones] 358 } mdrCompFrame_t; 359 360 typedef struct { 361 int numSurfaces; 362 int ofsSurfaces; // first surface, others follow 363 int ofsEnd; // next lod follows 364 } mdrLOD_t; 365 366 typedef struct { 367 int boneIndex; 368 char name[32]; 369 } mdrTag_t; 370 371 typedef struct { 372 int ident; 373 int version; 374 375 char name[MAX_QPATH]; // model name 376 377 // frames and bones are shared by all levels of detail 378 int numFrames; 379 int numBones; 380 int ofsFrames; // mdrFrame_t[numFrames] 381 382 // each level of detail has completely separate sets of surfaces 383 int numLODs; 384 int ofsLODs; 385 386 int numTags; 387 int ofsTags; 388 389 int ofsEnd; // end of file 390 } mdrHeader_t; 391 392 #endif 393 394 /* 395 ============================================================================== 396 397 .BSP file format 398 399 ============================================================================== 400 */ 401 402 403 #define BSP_IDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I') 404 // little-endian "IBSP" 405 406 #define BSP_VERSION 46 407 408 409 // there shouldn't be any problem with increasing these values at the 410 // expense of more memory allocation in the utilities 411 #define MAX_MAP_MODELS 0x400 412 #define MAX_MAP_BRUSHES 0x8000 413 #define MAX_MAP_ENTITIES 0x800 414 #define MAX_MAP_ENTSTRING 0x40000 415 #define MAX_MAP_SHADERS 0x400 416 417 #define MAX_MAP_AREAS 0x100 // MAX_MAP_AREA_BYTES in q_shared must match! 418 #define MAX_MAP_FOGS 0x100 419 #define MAX_MAP_PLANES 0x20000 420 #define MAX_MAP_NODES 0x20000 421 #define MAX_MAP_BRUSHSIDES 0x20000 422 #define MAX_MAP_LEAFS 0x20000 423 #define MAX_MAP_LEAFFACES 0x20000 424 #define MAX_MAP_LEAFBRUSHES 0x40000 425 #define MAX_MAP_PORTALS 0x20000 426 #define MAX_MAP_LIGHTING 0x800000 427 #define MAX_MAP_LIGHTGRID 0x800000 428 #define MAX_MAP_VISIBILITY 0x200000 429 430 #define MAX_MAP_DRAW_SURFS 0x20000 431 #define MAX_MAP_DRAW_VERTS 0x80000 432 #define MAX_MAP_DRAW_INDEXES 0x80000 433 434 435 // key / value pair sizes in the entities lump 436 #define MAX_KEY 32 437 #define MAX_VALUE 1024 438 439 // the editor uses these predefined yaw angles to orient entities up or down 440 #define ANGLE_UP -1 441 #define ANGLE_DOWN -2 442 443 #define LIGHTMAP_WIDTH 128 444 #define LIGHTMAP_HEIGHT 128 445 446 #define MAX_WORLD_COORD ( 128*1024 ) 447 #define MIN_WORLD_COORD ( -128*1024 ) 448 #define WORLD_SIZE ( MAX_WORLD_COORD - MIN_WORLD_COORD ) 449 450 //============================================================================= 451 452 453 typedef struct { 454 int fileofs, filelen; 455 } lump_t; 456 457 #define LUMP_ENTITIES 0 458 #define LUMP_SHADERS 1 459 #define LUMP_PLANES 2 460 #define LUMP_NODES 3 461 #define LUMP_LEAFS 4 462 #define LUMP_LEAFSURFACES 5 463 #define LUMP_LEAFBRUSHES 6 464 #define LUMP_MODELS 7 465 #define LUMP_BRUSHES 8 466 #define LUMP_BRUSHSIDES 9 467 #define LUMP_DRAWVERTS 10 468 #define LUMP_DRAWINDEXES 11 469 #define LUMP_FOGS 12 470 #define LUMP_SURFACES 13 471 #define LUMP_LIGHTMAPS 14 472 #define LUMP_LIGHTGRID 15 473 #define LUMP_VISIBILITY 16 474 #define HEADER_LUMPS 17 475 476 typedef struct { 477 int ident; 478 int version; 479 480 lump_t lumps[HEADER_LUMPS]; 481 } dheader_t; 482 483 typedef struct { 484 float mins[3], maxs[3]; 485 int firstSurface, numSurfaces; 486 int firstBrush, numBrushes; 487 } dmodel_t; 488 489 typedef struct { 490 char shader[MAX_QPATH]; 491 int surfaceFlags; 492 int contentFlags; 493 } dshader_t; 494 495 // planes x^1 is allways the opposite of plane x 496 497 typedef struct { 498 float normal[3]; 499 float dist; 500 } dplane_t; 501 502 typedef struct { 503 int planeNum; 504 int children[2]; // negative numbers are -(leafs+1), not nodes 505 int mins[3]; // for frustom culling 506 int maxs[3]; 507 } dnode_t; 508 509 typedef struct { 510 int cluster; // -1 = opaque cluster (do I still store these?) 511 int area; 512 513 int mins[3]; // for frustum culling 514 int maxs[3]; 515 516 int firstLeafSurface; 517 int numLeafSurfaces; 518 519 int firstLeafBrush; 520 int numLeafBrushes; 521 } dleaf_t; 522 523 typedef struct { 524 int planeNum; // positive plane side faces out of the leaf 525 int shaderNum; 526 } dbrushside_t; 527 528 typedef struct { 529 int firstSide; 530 int numSides; 531 int shaderNum; // the shader that determines the contents flags 532 } dbrush_t; 533 534 typedef struct { 535 char shader[MAX_QPATH]; 536 int brushNum; 537 int visibleSide; // the brush side that ray tests need to clip against (-1 == none) 538 } dfog_t; 539 540 typedef struct { 541 vec3_t xyz; 542 float st[2]; 543 float lightmap[2]; 544 vec3_t normal; 545 byte color[4]; 546 } drawVert_t; 547 548 #define drawVert_t_cleared(x) drawVert_t (x) = {{0, 0, 0}, {0, 0}, {0, 0}, {0, 0, 0}, {0, 0, 0, 0}} 549 550 typedef enum { 551 MST_BAD, 552 MST_PLANAR, 553 MST_PATCH, 554 MST_TRIANGLE_SOUP, 555 MST_FLARE 556 } mapSurfaceType_t; 557 558 typedef struct { 559 int shaderNum; 560 int fogNum; 561 int surfaceType; 562 563 int firstVert; 564 int numVerts; 565 566 int firstIndex; 567 int numIndexes; 568 569 int lightmapNum; 570 int lightmapX, lightmapY; 571 int lightmapWidth, lightmapHeight; 572 573 vec3_t lightmapOrigin; 574 vec3_t lightmapVecs[3]; // for patches, [0] and [1] are lodbounds 575 576 int patchWidth; 577 int patchHeight; 578 } dsurface_t; 579 580 581 #endif 582