1 /*
2 ===========================================================================
3 Copyright (C) 1997-2006 Id Software, Inc.
4 
5 This file is part of Quake 2 Tools source code.
6 
7 Quake 2 Tools 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 2 Tools 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 2 Tools 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 
23 //
24 // qfiles.h: quake file formats
25 // This file must be identical in the quake and utils directories
26 //
27 
28 /*
29 ========================================================================
30 
31 .MD2 triangle model file format
32 
33 ========================================================================
34 */
35 
36 #define IDALIASHEADER		(('2'<<24)+('P'<<16)+('D'<<8)+'I')
37 #define ALIAS_VERSION	8
38 
39 #define	MAX_TRIANGLES	4096
40 #define MAX_VERTS		2048
41 #define MAX_FRAMES		512
42 #define MAX_MD2SKINS	32
43 #define	MAX_SKINNAME	64
44 
45 typedef struct
46 {
47 	short	s;
48 	short	t;
49 } dstvert_t;
50 
51 typedef struct
52 {
53 	short	index_xyz[3];
54 	short	index_st[3];
55 } dtriangle_t;
56 
57 typedef struct
58 {
59 	byte	v[3];			// scaled byte to fit in frame mins/maxs
60 	byte	lightnormalindex;
61 } dtrivertx_t;
62 
63 typedef struct
64 {
65 	float		scale[3];	// multiply byte verts by this
66 	float		translate[3];	// then add this
67 	char		name[16];	// frame name from grabbing
68 	dtrivertx_t	verts[1];	// variable sized
69 } daliasframe_t;
70 
71 
72 // the glcmd format:
73 // a positive integer starts a tristrip command, followed by that many
74 // vertex structures.
75 // a negative integer starts a trifan command, followed by -x vertexes
76 // a zero indicates the end of the command list.
77 // a vertex consists of a floating point s, a floating point t,
78 // and an integer vertex index.
79 
80 
81 typedef struct
82 {
83 	int			ident;
84 	int			version;
85 
86 	int			skinwidth;
87 	int			skinheight;
88 	int			framesize;		// byte size of each frame
89 
90 	int			num_skins;
91 	int			num_xyz;
92 	int			num_st;			// greater than num_xyz for seams
93 	int			num_tris;
94 	int			num_glcmds;		// dwords in strip/fan command list
95 	int			num_frames;
96 
97 	int			ofs_skins;		// each skin is a MAX_SKINNAME string
98 	int			ofs_st;			// byte offset from start for stverts
99 	int			ofs_tris;		// offset for dtriangles
100 	int			ofs_frames;		// offset for first frame
101 	int			ofs_glcmds;
102 	int			ofs_end;		// end of file
103 
104 } dmdl_t;
105 
106 /*
107 ========================================================================
108 
109 .SP2 sprite file format
110 
111 ========================================================================
112 */
113 
114 #define IDSPRITEHEADER	(('2'<<24)+('S'<<16)+('D'<<8)+'I')
115 		// little-endian "IDS2"
116 #define SPRITE_VERSION	2
117 
118 typedef struct
119 {
120 	int		width, height;
121 	int		origin_x, origin_y;		// raster coordinates inside pic
122 	char	name[MAX_SKINNAME];		// name of pcx file
123 } dsprframe_t;
124 
125 typedef struct {
126 	int			ident;
127 	int			version;
128 	int			numframes;
129 	dsprframe_t	frames[1];			// variable sized
130 } dsprite_t;
131 
132 /*
133 ==============================================================================
134 
135   .WAL texture file format
136 
137 ==============================================================================
138 */
139 
140 
141 #define	MIPLEVELS	4
142 typedef struct miptex_s
143 {
144 	char		name[32];
145 	unsigned	width, height;
146 	unsigned	offsets[MIPLEVELS];		// four mip maps stored
147 	char		animname[32];			// next frame in animation chain
148 	int			flags;
149 	int			contents;
150 	int			value;
151 } miptex_t;
152 
153 
154 
155 /*
156 ==============================================================================
157 
158   .BSP file format
159 
160 ==============================================================================
161 */
162 
163 #define IDBSPHEADER	(('P'<<24)+('S'<<16)+('B'<<8)+'I')
164 		// little-endian "IBSP"
165 
166 #define BSPVERSION	36
167 
168 
169 // upper design bounds
170 // leaffaces, leafbrushes, planes, and verts are still bounded by
171 // 16 bit short limits
172 #define	MAX_MAP_MODELS		1024
173 #define	MAX_MAP_BRUSHES		8192
174 #define	MAX_MAP_ENTITIES	2048
175 #define	MAX_MAP_ENTSTRING	0x20000
176 #define	MAX_MAP_TEXINFO		8192
177 
178 #define	MAX_MAP_PLANES		65536
179 #define	MAX_MAP_NODES		65536
180 #define	MAX_MAP_BRUSHSIDES	65536
181 #define	MAX_MAP_LEAFS		65536
182 #define	MAX_MAP_VERTS		65536
183 #define	MAX_MAP_FACES		65536
184 #define	MAX_MAP_LEAFFACES	65536
185 #define	MAX_MAP_LEAFBRUSHES 65536
186 #define	MAX_MAP_PORTALS		65536
187 #define	MAX_MAP_EDGES		128000
188 #define	MAX_MAP_SURFEDGES	256000
189 #define	MAX_MAP_LIGHTING	0x200000
190 #define	MAX_MAP_VISIBILITY	0x100000
191 
192 // key / value pair sizes
193 
194 #define	MAX_KEY		32
195 #define	MAX_VALUE	1024
196 
197 //=============================================================================
198 
199 typedef struct
200 {
201 	int		fileofs, filelen;
202 } lump_t;
203 
204 #define	LUMP_ENTITIES		0
205 #define	LUMP_PLANES			1
206 #define	LUMP_VERTEXES		2
207 #define	LUMP_VISIBILITY		3
208 #define	LUMP_NODES			4
209 #define	LUMP_TEXINFO		5
210 #define	LUMP_FACES			6
211 #define	LUMP_LIGHTING		7
212 #define	LUMP_LEAFS			8
213 #define	LUMP_LEAFFACES		9
214 #define	LUMP_LEAFBRUSHES	10
215 #define	LUMP_EDGES			11
216 #define	LUMP_SURFEDGES		12
217 #define	LUMP_MODELS			13
218 #define	LUMP_BRUSHES		14
219 #define	LUMP_BRUSHSIDES		15
220 #define	LUMP_POP			16
221 
222 #define	HEADER_LUMPS		17
223 
224 typedef struct
225 {
226 	int			ident;
227 	int			version;
228 	lump_t		lumps[HEADER_LUMPS];
229 } dheader_t;
230 
231 typedef struct
232 {
233 	float		mins[3], maxs[3];
234 	float		origin[3];		// for sounds or lights
235 	int			headnode;
236 	int			firstface, numfaces;	// submodels just draw faces
237 										// without walking the bsp tree
238 } dmodel_t;
239 
240 
241 typedef struct
242 {
243 	float	point[3];
244 } dvertex_t;
245 
246 
247 // 0-2 are axial planes
248 #define	PLANE_X			0
249 #define	PLANE_Y			1
250 #define	PLANE_Z			2
251 
252 // 3-5 are non-axial planes snapped to the nearest
253 #define	PLANE_ANYX		3
254 #define	PLANE_ANYY		4
255 #define	PLANE_ANYZ		5
256 
257 // planes (x&~1) and (x&~1)+1 are allways opposites
258 
259 typedef struct
260 {
261 	float	normal[3];
262 	float	dist;
263 	int		type;		// PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
264 } dplane_t;
265 
266 
267 // contents flags are seperate bits
268 // a given brush can contribute multiple content bits
269 // multiple brushes can be in a single leaf
270 
271 // lower bits are stronger, and will eat weaker brushes completely
272 #define	CONTENTS_SOLID			1		// an eye is never valid in a solid
273 #define	CONTENTS_WINDOW			2		// translucent, but not watery
274 #define	CONTENTS_AUX			4
275 #define	CONTENTS_LAVA			8
276 #define	CONTENTS_SLIME			16
277 #define	CONTENTS_WATER			32
278 #define	CONTENTS_MIST			64
279 #define	LAST_VISIBLE_CONTENTS	64
280 
281 // remaining contents are non-visible, and don't eat brushes
282 #define	CONTENTS_PLAYERCLIP		0x10000
283 #define	CONTENTS_MONSTERCLIP	0x20000
284 
285 // currents can be added to any other contents, and may be mixed
286 #define	CONTENTS_CURRENT_0		0x40000
287 #define	CONTENTS_CURRENT_90		0x80000
288 #define	CONTENTS_CURRENT_180	0x100000
289 #define	CONTENTS_CURRENT_270	0x200000
290 #define	CONTENTS_CURRENT_UP		0x400000
291 #define	CONTENTS_CURRENT_DOWN	0x800000
292 
293 #define	CONTENTS_ORIGIN			0x1000000	// removed before bsping an entity
294 
295 #define	CONTENTS_MONSTER		0x2000000	// should never be on a brush, only in game
296 #define	CONTENTS_DEADMONSTER	0x4000000
297 #define	CONTENTS_DETAIL			0x8000000	// brushes to be added after vis leafs
298 #define	CONTENTS_TRANSLUCENT	0x10000000	// auto set if any surface has trans
299 
300 
301 
302 typedef struct
303 {
304 	int			planenum;
305 	int			children[2];	// negative numbers are -(leafs+1), not nodes
306 	short		mins[3];		// for frustom culling
307 	short		maxs[3];
308 	unsigned short	firstface;
309 	unsigned short	numfaces;	// counting both sides
310 } dnode_t;
311 
312 
313 typedef struct texinfo_s
314 {
315 	float		vecs[2][4];		// [s/t][xyz offset]
316 	int			flags;			// miptex flags + overrides
317 	int			value;			// light emission, etc
318 	char		texture[32];	// texture name (textures/*.wal)
319 	int			nexttexinfo;	// for animations, -1 = end of chain
320 } texinfo_t;
321 
322 
323 #define	SURF_LIGHT		0x1		// value will hold the light strength
324 
325 #define	SURF_SLICK		0x2		// effects game physics
326 
327 #define	SURF_SKY		0x4		// don't draw, but add to skybox
328 #define	SURF_WARP		0x8		// turbulent water warp
329 #define	SURF_TRANS33	0x10
330 #define	SURF_TRANS66	0x20
331 #define	SURF_FLOWING	0x40	// scroll towards angle
332 #define	SURF_NODRAW		0x80	// don't bother referencing the texture
333 
334 
335 // note that edge 0 is never used, because negative edge nums are used for
336 // counterclockwise use of the edge in a face
337 typedef struct
338 {
339 	unsigned short	v[2];		// vertex numbers
340 } dedge_t;
341 
342 #define	MAXLIGHTMAPS	4
343 typedef struct
344 {
345 	unsigned short	planenum;
346 	short		side;
347 
348 	int			firstedge;		// we must support > 64k edges
349 	short		numedges;
350 	short		texinfo;
351 
352 // lighting info
353 	byte		styles[MAXLIGHTMAPS];
354 	int			lightofs;		// start of [numstyles*surfsize] samples
355 } dface_t;
356 
357 typedef struct
358 {
359 	int			contents;			// OR of all brushes (not needed?)
360 
361 	int			pvsofs;				// -1 = no info
362 	int			phsofs;				// -1 = no info
363 
364 	short		mins[3];			// for frustum culling
365 	short		maxs[3];
366 
367 	unsigned short		firstleafface;
368 	unsigned short		numleaffaces;
369 
370 	unsigned short		firstleafbrush;
371 	unsigned short		numleafbrushes;
372 } dleaf_t;
373 
374 typedef struct
375 {
376 	unsigned short	planenum;		// facing out of the leaf
377 	short	texinfo;
378 } dbrushside_t;
379 
380 typedef struct
381 {
382 	int			firstside;
383 	int			numsides;
384 	int			contents;
385 } dbrush_t;
386 
387 #define	ANGLE_UP	-1
388 #define	ANGLE_DOWN	-2
389 
390