1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifndef __MODEL__
22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define __MODEL__
23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "modelgen.h"
25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "spritegn.h"
26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichd*_t structures are on-disk representations
30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichm*_t structures are in-memory
31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichBRUSH MODELS
38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// in memory representation
45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// !!! if this is changed, it must be changed in asm_draw.h too !!!
47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vec3_t		position;
50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mvertex_t;
51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	SIDE_FRONT	0
53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	SIDE_BACK	1
54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	SIDE_ON		2
55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// plane_t structure
58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// !!! if this is changed, it must be changed in asm_i386.h too !!!
59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct mplane_s
60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vec3_t	normal;
62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float	dist;
63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte	type;			// for texture axis selection and fast side tests
64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte	signbits;		// signx + signy<<1 + signz<<1
65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte	pad[2];
66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mplane_t;
67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct texture_s
69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char		name[16];
71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned	width, height;
72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			anim_total;				// total tenths in sequence ( 0 = no)
73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			anim_min, anim_max;		// time for this frame min <=time< max
74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct texture_s *anim_next;		// in the animation sequence
75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct texture_s *alternate_anims;	// bmodels in frmae 1 use these
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned	offsets[MIPLEVELS];		// four mip maps stored
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} texture_t;
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	SURF_PLANEBACK		2
81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	SURF_DRAWSKY		4
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SURF_DRAWSPRITE		8
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SURF_DRAWTURB		0x10
84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SURF_DRAWTILED		0x20
85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SURF_DRAWBACKGROUND	0x40
86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// !!! if this is changed, it must be changed in asm_draw.h too !!!
88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned short	v[2];
91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned int	cachededgeoffset;
92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} medge_t;
93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float		vecs[2][4];
97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float		mipadjust;
98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	texture_t	*texture;
99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			flags;
100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mtexinfo_t;
101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct msurface_s
103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			visframe;		// should be drawn when node is crossed
105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			dlightframe;
107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			dlightbits;
108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mplane_t	*plane;
110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			flags;
111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			firstedge;	// look up in model->surfedges[], negative numbers
113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numedges;	// are backwards edges
114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// surface generation data
116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct surfcache_s	*cachespots[MIPLEVELS];
117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	short		texturemins[2];
119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	short		extents[2];
120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtexinfo_t	*texinfo;
122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// lighting info
124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		styles[MAXLIGHTMAPS];
125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		*samples;		// [numstyles*surfsize]
126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} msurface_t;
127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct mnode_s
129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// common with leaf
131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			contents;		// 0, to differentiate from leafs
132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			visframe;		// node needs to be traversed if current
133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	short		minmaxs[6];		// for bounding box culling
135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct mnode_s	*parent;
137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// node specific
139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mplane_t	*plane;
140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct mnode_s	*children[2];
141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned short		firstsurface;
143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned short		numsurfaces;
144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mnode_t;
145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct mleaf_s
149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// common with node
151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			contents;		// wil be a negative contents number
152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			visframe;		// node needs to be traversed if current
153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	short		minmaxs[6];		// for bounding box culling
155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct mnode_s	*parent;
157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// leaf specific
159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		*compressed_vis;
160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	efrag_t		*efrags;
161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	msurface_t	**firstmarksurface;
163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			nummarksurfaces;
164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			key;			// BSP sequence number for leaf's contents
165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		ambient_sound_level[NUM_AMBIENTS];
166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mleaf_t;
167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// !!! if this is changed, it must be changed in asm_i386.h too !!!
169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	dclipnode_t	*clipnodes;
172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mplane_t	*planes;
173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			firstclipnode;
174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			lastclipnode;
175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vec3_t		clip_mins;
176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vec3_t		clip_maxs;
177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} hull_t;
178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSPRITE MODELS
183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// FIXME: shorten these?
189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct mspriteframe_s
190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		width;
192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		height;
193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	void	*pcachespot;			// remove?
194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float	up, down, left, right;
195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte	pixels[4];
196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mspriteframe_t;
197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int				numframes;
201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float			*intervals;
202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mspriteframe_t	*frames[1];
203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mspritegroup_t;
204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	spriteframetype_t	type;
208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mspriteframe_t		*frameptr;
209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mspriteframedesc_t;
210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					type;
214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					maxwidth;
215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					maxheight;
216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					numframes;
217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float				beamlength;		// remove?
218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	void				*cachespot;		// remove?
219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mspriteframedesc_t	frames[1];
220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} msprite_t;
221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichALIAS MODELS
227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAlias models are position independent, so the cache manager can move them.
229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==============================================================================
230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	aliasframetype_t	type;
235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t			bboxmin;
236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t			bboxmax;
237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					frame;
238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char				name[16];
239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} maliasframedesc_t;
240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	aliasskintype_t		type;
244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	void				*pcachespot;
245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					skin;
246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} maliasskindesc_t;
247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t			bboxmin;
251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t			bboxmax;
252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					frame;
253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} maliasgroupframedesc_t;
254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int						numframes;
258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int						intervals;
259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	maliasgroupframedesc_t	frames[1];
260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} maliasgroup_t;
261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct
263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					numskins;
265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					intervals;
266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	maliasskindesc_t	skindescs[1];
267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} maliasskingroup_t;
268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// !!! if this is changed, it must be changed in asm_draw.h too !!!
270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct mtriangle_s {
271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					facesfront;
272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					vertindex[3];
273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} mtriangle_t;
274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct {
276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					model;
277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					stverts;
278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					skindesc;
279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int					triangles;
280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	maliasframedesc_t	frames[1];
281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} aliashdr_t;
282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//===================================================================
284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Whole model
287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef enum {mod_brush, mod_sprite, mod_alias, modtype_t_max = 1 << 30} modtype_t;
290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_ROCKET	1			// leave a trail
292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_GRENADE	2			// leave a trail
293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_GIB		4			// leave a trail
294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_ROTATE	8			// rotate (bonus items)
295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_TRACER	16			// green split trail
296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_ZOMGIB	32			// small blood trail
297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_TRACER2	64			// orange split trail + rotate
298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define	EF_TRACER3	128			// purple trail
299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct model_s
301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char		name[MAX_QPATH];
303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	qboolean	needload;		// bmodels and sprites don't cache normally
304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	modtype_t	type;
306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numframes;
307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	synctype_t	synctype;
308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			flags;
310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// volume occupied by the model
313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vec3_t		mins, maxs;
315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float		radius;
316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// brush model
319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			firstmodelsurface, nummodelsurfaces;
321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numsubmodels;
323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	dmodel_t	*submodels;
324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numplanes;
326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mplane_t	*planes;
327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numleafs;		// number of visible leafs, not counting 0
329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mleaf_t		*leafs;
330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numvertexes;
332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mvertex_t	*vertexes;
333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numedges;
335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	medge_t		*edges;
336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numnodes;
338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mnode_t		*nodes;
339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numtexinfo;
341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtexinfo_t	*texinfo;
342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numsurfaces;
344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	msurface_t	*surfaces;
345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numsurfedges;
347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			*surfedges;
348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numclipnodes;
350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	dclipnode_t	*clipnodes;
351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			nummarksurfaces;
353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	msurface_t	**marksurfaces;
354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	hull_t		hulls[MAX_MAP_HULLS];
356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			numtextures;
358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	texture_t	**textures;
359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		*visdata;
361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte		*lightdata;
362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char		*entities;
363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// additional model data
366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//
367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	cache_user_t	cache;		// only access through Mod_Extradata
368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} model_t;
370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================
372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid	Mod_Init (void);
374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid	Mod_ClearAll (void);
375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodel_t *Mod_ForName (const char *name, qboolean crash);
376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid	*Mod_Extradata (model_t *mod);	// handles caching
377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid	Mod_TouchModel (const char *name);
378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmleaf_t *Mod_PointInLeaf (float *p, model_t *model);
380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte	*Mod_LeafPVS (mleaf_t *leaf, model_t *model);
381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif	// __MODEL__
383