aboutsummaryrefslogtreecommitdiffstats
path: root/code/bspc/l_bsp_q1.h
blob: 7cf459cedbe88a1531103dfc4a85acbfd4d7a1dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.

This file is part of Quake III Arena source code.

Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/


// upper design bounds

#define	Q1_MAX_MAP_HULLS		4

#define	Q1_MAX_MAP_MODELS		256
#define	Q1_MAX_MAP_BRUSHES		4096
#define	Q1_MAX_MAP_ENTITIES	1024
#define	Q1_MAX_MAP_ENTSTRING	65536

#define	Q1_MAX_MAP_PLANES		8192
#define	Q1_MAX_MAP_NODES		32767		// because negative shorts are contents
#define	Q1_MAX_MAP_CLIPNODES	32767		//
#define	Q1_MAX_MAP_LEAFS		32767		// 
#define	Q1_MAX_MAP_VERTS		65535
#define	Q1_MAX_MAP_FACES		65535
#define	Q1_MAX_MAP_MARKSURFACES 65535
#define	Q1_MAX_MAP_TEXINFO		4096
#define	Q1_MAX_MAP_EDGES		256000
#define	Q1_MAX_MAP_SURFEDGES	512000
#define	Q1_MAX_MAP_MIPTEX		0x200000
#define	Q1_MAX_MAP_LIGHTING	0x100000
#define	Q1_MAX_MAP_VISIBILITY	0x100000

// key / value pair sizes

#define	MAX_KEY		32
#define	MAX_VALUE	1024

//=============================================================================


#define Q1_BSPVERSION	29

typedef struct
{
	int fileofs, filelen;
} q1_lump_t;

#define	Q1_LUMP_ENTITIES	0
#define	Q1_LUMP_PLANES		1
#define	Q1_LUMP_TEXTURES	2
#define	Q1_LUMP_VERTEXES	3
#define	Q1_LUMP_VISIBILITY	4
#define	Q1_LUMP_NODES		5
#define	Q1_LUMP_TEXINFO	6
#define	Q1_LUMP_FACES		7
#define	Q1_LUMP_LIGHTING	8
#define	Q1_LUMP_CLIPNODES	9
#define	Q1_LUMP_LEAFS		10
#define	Q1_LUMP_MARKSURFACES 11
#define	Q1_LUMP_EDGES		12
#define	Q1_LUMP_SURFEDGES	13
#define	Q1_LUMP_MODELS		14

#define	Q1_HEADER_LUMPS	15

typedef struct
{
	float		mins[3], maxs[3];
	float		origin[3];
	int		headnode[Q1_MAX_MAP_HULLS];
	int		visleafs;		// not including the solid leaf 0
	int		firstface, numfaces;
} q1_dmodel_t;

typedef struct
{
	int			version;	
	q1_lump_t	lumps[Q1_HEADER_LUMPS];
} q1_dheader_t;

typedef struct
{
	int		nummiptex;
	int		dataofs[4];		// [nummiptex]
} q1_dmiptexlump_t;

#define	MIPLEVELS	4
typedef struct q1_miptex_s
{
	char		name[16];
	unsigned	width, height;
	unsigned	offsets[MIPLEVELS];		// four mip maps stored
} q1_miptex_t;


typedef struct
{
	float	point[3];
} q1_dvertex_t;


// 0-2 are axial planes
#define	PLANE_X			0
#define	PLANE_Y			1
#define	PLANE_Z			2

// 3-5 are non-axial planes snapped to the nearest
#define	PLANE_ANYX		3
#define	PLANE_ANYY		4
#define	PLANE_ANYZ		5

typedef struct
{
	float	normal[3];
	float	dist;
	int		type;		// PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
} q1_dplane_t;



#define	Q1_CONTENTS_EMPTY		-1
#define	Q1_CONTENTS_SOLID		-2
#define	Q1_CONTENTS_WATER		-3
#define	Q1_CONTENTS_SLIME		-4
#define	Q1_CONTENTS_LAVA		-5
#define	Q1_CONTENTS_SKY		-6

// !!! if this is changed, it must be changed in asm_i386.h too !!!
typedef struct
{
	int		planenum;
	short		children[2];	// negative numbers are -(leafs+1), not nodes
	short		mins[3];		// for sphere culling
	short		maxs[3];
	unsigned short	firstface;
	unsigned short	numfaces;	// counting both sides
} q1_dnode_t;

typedef struct
{
	int		planenum;
	short		children[2];	// negative numbers are contents
} q1_dclipnode_t;


typedef struct q1_texinfo_s
{
	float		vecs[2][4];		// [s/t][xyz offset]
	int		miptex;
	int		flags;
} q1_texinfo_t;
#define	TEX_SPECIAL		1		// sky or slime, no lightmap or 256 subdivision

// note that edge 0 is never used, because negative edge nums are used for
// counterclockwise use of the edge in a face
typedef struct
{
	unsigned short	v[2];		// vertex numbers
} q1_dedge_t;

#define	MAXLIGHTMAPS	4
typedef struct
{
	short		planenum;
	short		side;

	int		firstedge;		// we must support > 64k edges
	short		numedges;	
	short		texinfo;

// lighting info
	byte		styles[MAXLIGHTMAPS];
	int		lightofs;		// start of [numstyles*surfsize] samples
} q1_dface_t;



#define	AMBIENT_WATER	0
#define	AMBIENT_SKY		1
#define	AMBIENT_SLIME	2
#define	AMBIENT_LAVA	3

#define	NUM_AMBIENTS			4		// automatic ambient sounds

// leaf 0 is the generic Q1_CONTENTS_SOLID leaf, used for all solid areas
// all other leafs need visibility info
typedef struct
{
	int				contents;
	int				visofs;				// -1 = no visibility info

	short				mins[3];			// for frustum culling
	short				maxs[3];

	unsigned short	firstmarksurface;
	unsigned short	nummarksurfaces;

	byte		ambient_level[NUM_AMBIENTS];
} q1_dleaf_t;

//============================================================================

#ifndef QUAKE_GAME

// the utilities get to be lazy and just use large static arrays

extern	int				q1_nummodels;
extern	q1_dmodel_t		*q1_dmodels;//[MAX_MAP_MODELS];

extern	int				q1_visdatasize;
extern	byte				*q1_dvisdata;//[MAX_MAP_VISIBILITY];

extern	int				q1_lightdatasize;
extern	byte				*q1_dlightdata;//[MAX_MAP_LIGHTING];

extern	int				q1_texdatasize;
extern	byte				*q1_dtexdata;//[MAX_MAP_MIPTEX]; // (dmiptexlump_t)

extern	int				q1_entdatasize;
extern	char				*q1_dentdata;//[MAX_MAP_ENTSTRING];

extern	int				q1_numleafs;
extern	q1_dleaf_t		*q1_dleafs;//[MAX_MAP_LEAFS];

extern	int				q1_numplanes;
extern	q1_dplane_t		*q1_dplanes;//[MAX_MAP_PLANES];

extern	int				q1_numvertexes;
extern	q1_dvertex_t	*q1_dvertexes;//[MAX_MAP_VERTS];

extern	int				q1_numnodes;
extern	q1_dnode_t		*q1_dnodes;//[MAX_MAP_NODES];

extern	int				q1_numtexinfo;
extern	q1_texinfo_t	*q1_texinfo;//[MAX_MAP_TEXINFO];

extern	int				q1_numfaces;
extern	q1_dface_t		*q1_dfaces;//[MAX_MAP_FACES];

extern	int				q1_numclipnodes;
extern	q1_dclipnode_t	*q1_dclipnodes;//[MAX_MAP_CLIPNODES];

extern	int				q1_numedges;
extern	q1_dedge_t		*q1_dedges;//[MAX_MAP_EDGES];

extern	int				q1_nummarksurfaces;
extern	unsigned short	*q1_dmarksurfaces;//[MAX_MAP_MARKSURFACES];

extern	int				q1_numsurfedges;
extern	int				*q1_dsurfedges;//[MAX_MAP_SURFEDGES];


void Q1_AllocMaxBSP(void);
void Q1_FreeMaxBSP(void);
void Q1_LoadBSPFile(char *filename, int offset, int length);
void Q1_WriteBSPFile(char *filename);
void Q1_PrintBSPFileSizes(void);
void Q1_ParseEntities(void);
void Q1_UnparseEntities(void);

#endif