qfiles.h (11319B)
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 #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 // surface geometry should not exceed these limits 31 #define SHADER_MAX_VERTEXES 1000 32 #define SHADER_MAX_INDEXES (6*SHADER_MAX_VERTEXES) 33 34 35 // the maximum size of game relative pathnames 36 #define MAX_QPATH 64 37 38 /* 39 ======================================================================== 40 41 QVM files 42 43 ======================================================================== 44 */ 45 46 #define VM_MAGIC 0x12721444 47 typedef struct { 48 int vmMagic; 49 50 int instructionCount; 51 52 int codeOffset; 53 int codeLength; 54 55 int dataOffset; 56 int dataLength; 57 int litLength; // ( dataLength - litLength ) should be byteswapped on load 58 int bssLength; // zero filled memory appended to datalength 59 } vmHeader_t; 60 61 62 /* 63 ======================================================================== 64 65 PCX files are used for 8 bit images 66 67 ======================================================================== 68 */ 69 70 typedef struct { 71 char manufacturer; 72 char version; 73 char encoding; 74 char bits_per_pixel; 75 unsigned short xmin,ymin,xmax,ymax; 76 unsigned short hres,vres; 77 unsigned char palette[48]; 78 char reserved; 79 char color_planes; 80 unsigned short bytes_per_line; 81 unsigned short palette_type; 82 char filler[58]; 83 unsigned char data; // unbounded 84 } pcx_t; 85 86 87 /* 88 ======================================================================== 89 90 TGA files are used for 24/32 bit images 91 92 ======================================================================== 93 */ 94 95 typedef struct _TargaHeader { 96 unsigned char id_length, colormap_type, image_type; 97 unsigned short colormap_index, colormap_length; 98 unsigned char colormap_size; 99 unsigned short x_origin, y_origin, width, height; 100 unsigned char pixel_size, attributes; 101 } TargaHeader; 102 103 104 105 /* 106 ======================================================================== 107 108 .MD3 triangle model file format 109 110 ======================================================================== 111 */ 112 113 #define MD3_IDENT (('3'<<24)+('P'<<16)+('D'<<8)+'I') 114 #define MD3_VERSION 15 115 116 // limits 117 #define MD3_MAX_LODS 3 118 #define MD3_MAX_TRIANGLES 8192 // per surface 119 #define MD3_MAX_VERTS 4096 // per surface 120 #define MD3_MAX_SHADERS 256 // per surface 121 #define MD3_MAX_FRAMES 1024 // per model 122 #define MD3_MAX_SURFACES 32 // per model 123 #define MD3_MAX_TAGS 16 // per frame 124 125 // vertex scales 126 #define MD3_XYZ_SCALE (1.0/64) 127 128 typedef struct md3Frame_s { 129 vec3_t bounds[2]; 130 vec3_t localOrigin; 131 float radius; 132 char name[16]; 133 } md3Frame_t; 134 135 typedef struct md3Tag_s { 136 char name[MAX_QPATH]; // tag name 137 vec3_t origin; 138 vec3_t axis[3]; 139 } md3Tag_t; 140 141 /* 142 ** md3Surface_t 143 ** 144 ** CHUNK SIZE 145 ** header sizeof( md3Surface_t ) 146 ** shaders sizeof( md3Shader_t ) * numShaders 147 ** triangles[0] sizeof( md3Triangle_t ) * numTriangles 148 ** st sizeof( md3St_t ) * numVerts 149 ** XyzNormals sizeof( md3XyzNormal_t ) * numVerts * numFrames 150 */ 151 typedef struct { 152 int ident; // 153 154 char name[MAX_QPATH]; // polyset name 155 156 int flags; 157 int numFrames; // all surfaces in a model should have the same 158 159 int numShaders; // all surfaces in a model should have the same 160 int numVerts; 161 162 int numTriangles; 163 int ofsTriangles; 164 165 int ofsShaders; // offset from start of md3Surface_t 166 int ofsSt; // texture coords are common for all frames 167 int ofsXyzNormals; // numVerts * numFrames 168 169 int ofsEnd; // next surface follows 170 } md3Surface_t; 171 172 typedef struct { 173 char name[MAX_QPATH]; 174 int shaderIndex; // for in-game use 175 } md3Shader_t; 176 177 typedef struct { 178 int indexes[3]; 179 } md3Triangle_t; 180 181 typedef struct { 182 float st[2]; 183 } md3St_t; 184 185 typedef struct { 186 short xyz[3]; 187 short normal; 188 } md3XyzNormal_t; 189 190 typedef struct { 191 int ident; 192 int version; 193 194 char name[MAX_QPATH]; // model name 195 196 int flags; 197 198 int numFrames; 199 int numTags; 200 int numSurfaces; 201 202 int numSkins; 203 204 int ofsFrames; // offset for first frame 205 int ofsTags; // numFrames * numTags 206 int ofsSurfaces; // first surface, others follow 207 208 int ofsEnd; // end of file 209 } md3Header_t; 210 211 /* 212 ============================================================================== 213 214 MD4 file format 215 216 ============================================================================== 217 */ 218 219 #define MD4_IDENT (('4'<<24)+('P'<<16)+('D'<<8)+'I') 220 #define MD4_VERSION 1 221 #define MD4_MAX_BONES 128 222 223 typedef struct { 224 int boneIndex; // these are indexes into the boneReferences, 225 float boneWeight; // not the global per-frame bone list 226 vec3_t offset; 227 } md4Weight_t; 228 229 typedef struct { 230 vec3_t normal; 231 vec2_t texCoords; 232 int numWeights; 233 md4Weight_t weights[1]; // variable sized 234 } md4Vertex_t; 235 236 typedef struct { 237 int indexes[3]; 238 } md4Triangle_t; 239 240 typedef struct { 241 int ident; 242 243 char name[MAX_QPATH]; // polyset name 244 char shader[MAX_QPATH]; 245 int shaderIndex; // for in-game use 246 247 int ofsHeader; // this will be a negative number 248 249 int numVerts; 250 int ofsVerts; 251 252 int numTriangles; 253 int ofsTriangles; 254 255 // Bone references are a set of ints representing all the bones 256 // present in any vertex weights for this surface. This is 257 // needed because a model may have surfaces that need to be 258 // drawn at different sort times, and we don't want to have 259 // to re-interpolate all the bones for each surface. 260 int numBoneReferences; 261 int ofsBoneReferences; 262 263 int ofsEnd; // next surface follows 264 } md4Surface_t; 265 266 typedef struct { 267 float matrix[3][4]; 268 } md4Bone_t; 269 270 typedef struct { 271 vec3_t bounds[2]; // bounds of all surfaces of all LOD's for this frame 272 vec3_t localOrigin; // midpoint of bounds, used for sphere cull 273 float radius; // dist from localOrigin to corner 274 md4Bone_t bones[1]; // [numBones] 275 } md4Frame_t; 276 277 typedef struct { 278 int numSurfaces; 279 int ofsSurfaces; // first surface, others follow 280 int ofsEnd; // next lod follows 281 } md4LOD_t; 282 283 typedef struct { 284 int ident; 285 int version; 286 287 char name[MAX_QPATH]; // model name 288 289 // frames and bones are shared by all levels of detail 290 int numFrames; 291 int numBones; 292 int ofsBoneNames; // char name[ MAX_QPATH ] 293 int ofsFrames; // md4Frame_t[numFrames] 294 295 // each level of detail has completely separate sets of surfaces 296 int numLODs; 297 int ofsLODs; 298 299 int ofsEnd; // end of file 300 } md4Header_t; 301 302 303 /* 304 ============================================================================== 305 306 .BSP file format 307 308 ============================================================================== 309 */ 310 311 312 #define BSP_IDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I') 313 // little-endian "IBSP" 314 315 #define BSP_VERSION 46 316 317 318 // there shouldn't be any problem with increasing these values at the 319 // expense of more memory allocation in the utilities 320 #define MAX_MAP_MODELS 0x400 321 #define MAX_MAP_BRUSHES 0x8000 322 #define MAX_MAP_ENTITIES 0x800 323 #define MAX_MAP_ENTSTRING 0x40000 324 #define MAX_MAP_SHADERS 0x400 325 326 #define MAX_MAP_AREAS 0x100 // MAX_MAP_AREA_BYTES in q_shared must match! 327 #define MAX_MAP_FOGS 0x100 328 #define MAX_MAP_PLANES 0x20000 329 #define MAX_MAP_NODES 0x20000 330 #define MAX_MAP_BRUSHSIDES 0x20000 331 #define MAX_MAP_LEAFS 0x20000 332 #define MAX_MAP_LEAFFACES 0x20000 333 #define MAX_MAP_LEAFBRUSHES 0x40000 334 #define MAX_MAP_PORTALS 0x20000 335 #define MAX_MAP_LIGHTING 0x800000 336 #define MAX_MAP_LIGHTGRID 0x800000 337 #define MAX_MAP_VISIBILITY 0x200000 338 339 #define MAX_MAP_DRAW_SURFS 0x20000 340 #define MAX_MAP_DRAW_VERTS 0x80000 341 #define MAX_MAP_DRAW_INDEXES 0x80000 342 343 344 // key / value pair sizes in the entities lump 345 #define MAX_KEY 32 346 #define MAX_VALUE 1024 347 348 // the editor uses these predefined yaw angles to orient entities up or down 349 #define ANGLE_UP -1 350 #define ANGLE_DOWN -2 351 352 #define LIGHTMAP_WIDTH 128 353 #define LIGHTMAP_HEIGHT 128 354 355 #define MAX_WORLD_COORD ( 128*1024 ) 356 #define MIN_WORLD_COORD ( -128*1024 ) 357 #define WORLD_SIZE ( MAX_WORLD_COORD - MIN_WORLD_COORD ) 358 359 //============================================================================= 360 361 362 typedef struct { 363 int fileofs, filelen; 364 } lump_t; 365 366 #define LUMP_ENTITIES 0 367 #define LUMP_SHADERS 1 368 #define LUMP_PLANES 2 369 #define LUMP_NODES 3 370 #define LUMP_LEAFS 4 371 #define LUMP_LEAFSURFACES 5 372 #define LUMP_LEAFBRUSHES 6 373 #define LUMP_MODELS 7 374 #define LUMP_BRUSHES 8 375 #define LUMP_BRUSHSIDES 9 376 #define LUMP_DRAWVERTS 10 377 #define LUMP_DRAWINDEXES 11 378 #define LUMP_FOGS 12 379 #define LUMP_SURFACES 13 380 #define LUMP_LIGHTMAPS 14 381 #define LUMP_LIGHTGRID 15 382 #define LUMP_VISIBILITY 16 383 #define HEADER_LUMPS 17 384 385 typedef struct { 386 int ident; 387 int version; 388 389 lump_t lumps[HEADER_LUMPS]; 390 } dheader_t; 391 392 typedef struct { 393 float mins[3], maxs[3]; 394 int firstSurface, numSurfaces; 395 int firstBrush, numBrushes; 396 } dmodel_t; 397 398 typedef struct { 399 char shader[MAX_QPATH]; 400 int surfaceFlags; 401 int contentFlags; 402 } dshader_t; 403 404 // planes x^1 is allways the opposite of plane x 405 406 typedef struct { 407 float normal[3]; 408 float dist; 409 } dplane_t; 410 411 typedef struct { 412 int planeNum; 413 int children[2]; // negative numbers are -(leafs+1), not nodes 414 int mins[3]; // for frustom culling 415 int maxs[3]; 416 } dnode_t; 417 418 typedef struct { 419 int cluster; // -1 = opaque cluster (do I still store these?) 420 int area; 421 422 int mins[3]; // for frustum culling 423 int maxs[3]; 424 425 int firstLeafSurface; 426 int numLeafSurfaces; 427 428 int firstLeafBrush; 429 int numLeafBrushes; 430 } dleaf_t; 431 432 typedef struct { 433 int planeNum; // positive plane side faces out of the leaf 434 int shaderNum; 435 } dbrushside_t; 436 437 typedef struct { 438 int firstSide; 439 int numSides; 440 int shaderNum; // the shader that determines the contents flags 441 } dbrush_t; 442 443 typedef struct { 444 char shader[MAX_QPATH]; 445 int brushNum; 446 int visibleSide; // the brush side that ray tests need to clip against (-1 == none) 447 } dfog_t; 448 449 typedef struct { 450 vec3_t xyz; 451 float st[2]; 452 float lightmap[2]; 453 vec3_t normal; 454 byte color[4]; 455 } drawVert_t; 456 457 typedef enum { 458 MST_BAD, 459 MST_PLANAR, 460 MST_PATCH, 461 MST_TRIANGLE_SOUP, 462 MST_FLARE 463 } mapSurfaceType_t; 464 465 typedef struct { 466 int shaderNum; 467 int fogNum; 468 int surfaceType; 469 470 int firstVert; 471 int numVerts; 472 473 int firstIndex; 474 int numIndexes; 475 476 int lightmapNum; 477 int lightmapX, lightmapY; 478 int lightmapWidth, lightmapHeight; 479 480 vec3_t lightmapOrigin; 481 vec3_t lightmapVecs[3]; // for patches, [0] and [1] are lodbounds 482 483 int patchWidth; 484 int patchHeight; 485 } dsurface_t; 486 487 488 #endif