Home | History | Annotate | Download | only in WinQuake
      1 /*
      2 Copyright (C) 1996-1997 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 #ifndef __MODEL__
     22 #define __MODEL__
     23 
     24 #include "modelgen.h"
     25 #include "spritegn.h"
     26 
     27 /*
     28 
     29 d*_t structures are on-disk representations
     30 m*_t structures are in-memory
     31 
     32 */
     33 
     34 // entity effects
     35 
     36 #define	EF_BRIGHTFIELD			1
     37 #define	EF_MUZZLEFLASH 			2
     38 #define	EF_BRIGHTLIGHT 			4
     39 #define	EF_DIMLIGHT 			8
     40 
     41 
     42 /*
     43 ==============================================================================
     44 
     45 BRUSH MODELS
     46 
     47 ==============================================================================
     48 */
     49 
     50 
     51 //
     52 // in memory representation
     53 //
     54 // !!! if this is changed, it must be changed in asm_draw.h too !!!
     55 typedef struct
     56 {
     57 	vec3_t		position;
     58 } mvertex_t;
     59 
     60 #define	SIDE_FRONT	0
     61 #define	SIDE_BACK	1
     62 #define	SIDE_ON		2
     63 
     64 
     65 // plane_t structure
     66 // !!! if this is changed, it must be changed in asm_i386.h too !!!
     67 typedef struct mplane_s
     68 {
     69 	vec3_t	normal;
     70 	float	dist;
     71 	byte	type;			// for texture axis selection and fast side tests
     72 	byte	signbits;		// signx + signy<<1 + signz<<1
     73 	byte	pad[2];
     74 } mplane_t;
     75 
     76 typedef struct texture_s
     77 {
     78 	char		name[16];
     79 	unsigned	width, height;
     80 	int			gl_texturenum;
     81 	struct msurface_s	*texturechain;	// for gl_texsort drawing
     82 	int			anim_total;				// total tenths in sequence ( 0 = no)
     83 	int			anim_min, anim_max;		// time for this frame min <=time< max
     84 	struct texture_s *anim_next;		// in the animation sequence
     85 	struct texture_s *alternate_anims;	// bmodels in frmae 1 use these
     86 	unsigned	offsets[MIPLEVELS];		// four mip maps stored
     87 } texture_t;
     88 
     89 
     90 #define	SURF_PLANEBACK		2
     91 #define	SURF_DRAWSKY		4
     92 #define SURF_DRAWSPRITE		8
     93 #define SURF_DRAWTURB		0x10
     94 #define SURF_DRAWTILED		0x20
     95 #define SURF_DRAWBACKGROUND	0x40
     96 #define SURF_UNDERWATER		0x80
     97 
     98 // !!! if this is changed, it must be changed in asm_draw.h too !!!
     99 typedef struct
    100 {
    101 	unsigned short	v[2];
    102 	unsigned int	cachededgeoffset;
    103 } medge_t;
    104 
    105 typedef struct
    106 {
    107 	float		vecs[2][4];
    108 	float		mipadjust;
    109 	texture_t	*texture;
    110 	int			flags;
    111 } mtexinfo_t;
    112 
    113 #define	VERTEXSIZE	7
    114 
    115 typedef struct glpoly_s
    116 {
    117 	struct	glpoly_s	*next;
    118 	struct	glpoly_s	*chain;
    119 	int		numverts;
    120 	int		flags;			// for SURF_UNDERWATER
    121 	float	verts[4][VERTEXSIZE];	// variable sized (xyz s1t1 s2t2)
    122 } glpoly_t;
    123 
    124 typedef struct msurface_s
    125 {
    126 	int			visframe;		// should be drawn when node is crossed
    127 
    128 	mplane_t	*plane;
    129 	int			flags;
    130 
    131 	int			firstedge;	// look up in model->surfedges[], negative numbers
    132 	int			numedges;	// are backwards edges
    133 
    134 	short		texturemins[2];
    135 	short		extents[2];
    136 
    137 	int			light_s, light_t;	// gl lightmap coordinates
    138 
    139 	glpoly_t	*polys;				// multiple if warped
    140 	struct	msurface_s	*texturechain;
    141 
    142 	mtexinfo_t	*texinfo;
    143 
    144 // lighting info
    145 	int			dlightframe;
    146 	int			dlightbits;
    147 
    148 	int			lightmaptexturenum;
    149 	byte		styles[MAXLIGHTMAPS];
    150 	int			cached_light[MAXLIGHTMAPS];	// values currently used in lightmap
    151 	qboolean	cached_dlight;				// true if dynamic light in cache
    152 	byte		*samples;		// [numstyles*surfsize]
    153 } msurface_t;
    154 
    155 typedef struct mnode_s
    156 {
    157 // common with leaf
    158 	int			contents;		// 0, to differentiate from leafs
    159 	int			visframe;		// node needs to be traversed if current
    160 
    161 	float		minmaxs[6];		// for bounding box culling
    162 
    163 	struct mnode_s	*parent;
    164 
    165 // node specific
    166 	mplane_t	*plane;
    167 	struct mnode_s	*children[2];
    168 
    169 	unsigned short		firstsurface;
    170 	unsigned short		numsurfaces;
    171 } mnode_t;
    172 
    173 
    174 
    175 typedef struct mleaf_s
    176 {
    177 // common with node
    178 	int			contents;		// wil be a negative contents number
    179 	int			visframe;		// node needs to be traversed if current
    180 
    181 	float		minmaxs[6];		// for bounding box culling
    182 
    183 	struct mnode_s	*parent;
    184 
    185 // leaf specific
    186 	byte		*compressed_vis;
    187 	efrag_t		*efrags;
    188 
    189 	msurface_t	**firstmarksurface;
    190 	int			nummarksurfaces;
    191 	int			key;			// BSP sequence number for leaf's contents
    192 	byte		ambient_sound_level[NUM_AMBIENTS];
    193 } mleaf_t;
    194 
    195 // !!! if this is changed, it must be changed in asm_i386.h too !!!
    196 typedef struct
    197 {
    198 	dclipnode_t	*clipnodes;
    199 	mplane_t	*planes;
    200 	int			firstclipnode;
    201 	int			lastclipnode;
    202 	vec3_t		clip_mins;
    203 	vec3_t		clip_maxs;
    204 } hull_t;
    205 
    206 /*
    207 ==============================================================================
    208 
    209 SPRITE MODELS
    210 
    211 ==============================================================================
    212 */
    213 
    214 
    215 // FIXME: shorten these?
    216 typedef struct mspriteframe_s
    217 {
    218 	int		width;
    219 	int		height;
    220 	float	up, down, left, right;
    221 	int		gl_texturenum;
    222 } mspriteframe_t;
    223 
    224 typedef struct
    225 {
    226 	int				numframes;
    227 	float			*intervals;
    228 	mspriteframe_t	*frames[1];
    229 } mspritegroup_t;
    230 
    231 typedef struct
    232 {
    233 	spriteframetype_t	type;
    234 	mspriteframe_t		*frameptr;
    235 } mspriteframedesc_t;
    236 
    237 typedef struct
    238 {
    239 	int					type;
    240 	int					maxwidth;
    241 	int					maxheight;
    242 	int					numframes;
    243 	float				beamlength;		// remove?
    244 	void				*cachespot;		// remove?
    245 	mspriteframedesc_t	frames[1];
    246 } msprite_t;
    247 
    248 
    249 /*
    250 ==============================================================================
    251 
    252 ALIAS MODELS
    253 
    254 Alias models are position independent, so the cache manager can move them.
    255 ==============================================================================
    256 */
    257 
    258 typedef struct
    259 {
    260 	int					firstpose;
    261 	int					numposes;
    262 	float				interval;
    263 	trivertx_t			bboxmin;
    264 	trivertx_t			bboxmax;
    265 	int					frame;
    266 	char				name[16];
    267 } maliasframedesc_t;
    268 
    269 typedef struct
    270 {
    271 	trivertx_t			bboxmin;
    272 	trivertx_t			bboxmax;
    273 	int					frame;
    274 } maliasgroupframedesc_t;
    275 
    276 typedef struct
    277 {
    278 	int						numframes;
    279 	int						intervals;
    280 	maliasgroupframedesc_t	frames[1];
    281 } maliasgroup_t;
    282 
    283 // !!! if this is changed, it must be changed in asm_draw.h too !!!
    284 typedef struct mtriangle_s {
    285 	int					facesfront;
    286 	int					vertindex[3];
    287 } mtriangle_t;
    288 
    289 
    290 #define	MAX_SKINS	32
    291 typedef struct {
    292 	int			ident;
    293 	int			version;
    294 	vec3_t		scale;
    295 	vec3_t		scale_origin;
    296 	float		boundingradius;
    297 	vec3_t		eyeposition;
    298 	int			numskins;
    299 	int			skinwidth;
    300 	int			skinheight;
    301 	int			numverts;
    302 	int			numtris;
    303 	int			numframes;
    304 	synctype_t	synctype;
    305 	int			flags;
    306 	float		size;
    307 
    308 	int					numposes;
    309 	int					poseverts;
    310 	int					posedata;	// numposes*poseverts trivert_t
    311 	int					commands;	// gl command list with embedded s/t
    312 	int					gl_texturenum[MAX_SKINS][4];
    313 	int					texels[MAX_SKINS];	// only for player skins
    314 	maliasframedesc_t	frames[1];	// variable sized
    315 } aliashdr_t;
    316 
    317 #define	MAXALIASVERTS	1024
    318 #define	MAXALIASFRAMES	256
    319 #define	MAXALIASTRIS	2048
    320 extern	aliashdr_t	*pheader;
    321 extern	stvert_t	stverts[MAXALIASVERTS];
    322 extern	mtriangle_t	triangles[MAXALIASTRIS];
    323 extern	trivertx_t	*poseverts[MAXALIASFRAMES];
    324 
    325 //===================================================================
    326 
    327 //
    328 // Whole model
    329 //
    330 
    331 typedef enum {mod_brush, mod_sprite, mod_alias, modtype_t_max = 1 << 30} modtype_t;
    332 
    333 #define	EF_ROCKET	1			// leave a trail
    334 #define	EF_GRENADE	2			// leave a trail
    335 #define	EF_GIB		4			// leave a trail
    336 #define	EF_ROTATE	8			// rotate (bonus items)
    337 #define	EF_TRACER	16			// green split trail
    338 #define	EF_ZOMGIB	32			// small blood trail
    339 #define	EF_TRACER2	64			// orange split trail + rotate
    340 #define	EF_TRACER3	128			// purple trail
    341 
    342 typedef struct model_s
    343 {
    344 	char		name[MAX_QPATH];
    345 	qboolean	needload;		// bmodels and sprites don't cache normally
    346 
    347 	modtype_t	type;
    348 	int			numframes;
    349 	synctype_t	synctype;
    350 
    351 	int			flags;
    352 
    353 //
    354 // volume occupied by the model graphics
    355 //
    356 	vec3_t		mins, maxs;
    357 	float		radius;
    358 
    359 //
    360 // solid volume for clipping
    361 //
    362 	qboolean	clipbox;
    363 	vec3_t		clipmins, clipmaxs;
    364 
    365 //
    366 // brush model
    367 //
    368 	int			firstmodelsurface, nummodelsurfaces;
    369 
    370 	int			numsubmodels;
    371 	dmodel_t	*submodels;
    372 
    373 	int			numplanes;
    374 	mplane_t	*planes;
    375 
    376 	int			numleafs;		// number of visible leafs, not counting 0
    377 	mleaf_t		*leafs;
    378 
    379 	int			numvertexes;
    380 	mvertex_t	*vertexes;
    381 
    382 	int			numedges;
    383 	medge_t		*edges;
    384 
    385 	int			numnodes;
    386 	mnode_t		*nodes;
    387 
    388 	int			numtexinfo;
    389 	mtexinfo_t	*texinfo;
    390 
    391 	int			numsurfaces;
    392 	msurface_t	*surfaces;
    393 
    394 	int			numsurfedges;
    395 	int			*surfedges;
    396 
    397 	int			numclipnodes;
    398 	dclipnode_t	*clipnodes;
    399 
    400 	int			nummarksurfaces;
    401 	msurface_t	**marksurfaces;
    402 
    403 	hull_t		hulls[MAX_MAP_HULLS];
    404 
    405 	int			numtextures;
    406 	texture_t	**textures;
    407 
    408 	byte		*visdata;
    409 	byte		*lightdata;
    410 	char		*entities;
    411 
    412 //
    413 // additional model data
    414 //
    415 	cache_user_t	cache;		// only access through Mod_Extradata
    416 
    417 } model_t;
    418 
    419 //============================================================================
    420 
    421 void	Mod_Init (void);
    422 void	Mod_ClearAll (void);
    423 model_t *Mod_ForName (const char *name, qboolean crash);
    424 void	*Mod_Extradata (model_t *mod);	// handles caching
    425 void	Mod_TouchModel (const char *name);
    426 
    427 mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
    428 byte	*Mod_LeafPVS (mleaf_t *leaf, model_t *model);
    429 
    430 #endif	// __MODEL__
    431