Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 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;
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 (char *name, qboolean crash);
424
void	*Mod_Extradata (model_t *mod);	// handles caching
425
void	Mod_TouchModel (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__