Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

qfiles.h (11211B)


      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;