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