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