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