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