1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, 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
29d*_t structures are on-disk representations
30m*_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
45BRUSH 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 !!!
55typedef 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 !!!
67typedef 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
76typedef 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 !!!
99typedef struct
100{
101	unsigned short	v[2];
102	unsigned int	cachededgeoffset;
103} medge_t;
104
105typedef 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
115typedef 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
124typedef 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
155typedef 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
175typedef 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 !!!
196typedef 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
209SPRITE MODELS
210
211==============================================================================
212*/
213
214
215// FIXME: shorten these?
216typedef struct mspriteframe_s
217{
218	int		width;
219	int		height;
220	float	up, down, left, right;
221	int		gl_texturenum;
222} mspriteframe_t;
223
224typedef struct
225{
226	int				numframes;
227	float			*intervals;
228	mspriteframe_t	*frames[1];
229} mspritegroup_t;
230
231typedef struct
232{
233	spriteframetype_t	type;
234	mspriteframe_t		*frameptr;
235} mspriteframedesc_t;
236
237typedef 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
252ALIAS MODELS
253
254Alias models are position independent, so the cache manager can move them.
255==============================================================================
256*/
257
258typedef 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
269typedef struct
270{
271	trivertx_t			bboxmin;
272	trivertx_t			bboxmax;
273	int					frame;
274} maliasgroupframedesc_t;
275
276typedef 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 !!!
284typedef struct mtriangle_s {
285	int					facesfront;
286	int					vertindex[3];
287} mtriangle_t;
288
289
290#define	MAX_SKINS	32
291typedef 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
320extern	aliashdr_t	*pheader;
321extern	stvert_t	stverts[MAXALIASVERTS];
322extern	mtriangle_t	triangles[MAXALIASTRIS];
323extern	trivertx_t	*poseverts[MAXALIASFRAMES];
324
325//===================================================================
326
327//
328// Whole model
329//
330
331typedef 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
342typedef 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
421void	Mod_Init (void);
422void	Mod_ClearAll (void);
423model_t *Mod_ForName (const char *name, qboolean crash);
424void	*Mod_Extradata (model_t *mod);	// handles caching
425void	Mod_TouchModel (const char *name);
426
427mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
428byte	*Mod_LeafPVS (mleaf_t *leaf, model_t *model);
429
430#endif	// __MODEL__
431