aboutsummaryrefslogtreecommitdiffstats
path: root/code/bspc/l_bsp_hl.h
blob: 41462020c2cd422e97c1b8c4c189f53ce3ad9354 (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
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/*
===========================================================================
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	HL_MAX_MAP_HULLS			4

#define	HL_MAX_MAP_MODELS			400
#define	HL_MAX_MAP_BRUSHES		4096
#define	HL_MAX_MAP_ENTITIES		1024
#define	HL_MAX_MAP_ENTSTRING		(128*1024)

#define	HL_MAX_MAP_PLANES			32767
#define	HL_MAX_MAP_NODES			32767		// because negative shorts are contents
#define	HL_MAX_MAP_CLIPNODES		32767		//
#define	HL_MAX_MAP_LEAFS			8192
#define	HL_MAX_MAP_VERTS			65535
#define	HL_MAX_MAP_FACES			65535
#define	HL_MAX_MAP_MARKSURFACES 65535
#define	HL_MAX_MAP_TEXINFO		8192
#define	HL_MAX_MAP_EDGES			256000
#define	HL_MAX_MAP_SURFEDGES		512000
#define	HL_MAX_MAP_TEXTURES		512
#define	HL_MAX_MAP_MIPTEX			0x200000
#define	HL_MAX_MAP_LIGHTING		0x200000
#define	HL_MAX_MAP_VISIBILITY	0x200000

#define	HL_MAX_MAP_PORTALS		65536

// key / value pair sizes

#define	MAX_KEY		32
#define	MAX_VALUE	1024

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


#define HL_BSPVERSION	30
#define HL_TOOLVERSION	2


typedef struct
{
	int		fileofs, filelen;
} hl_lump_t;

#define	HL_LUMP_ENTITIES	0
#define	HL_LUMP_PLANES		1
#define	HL_LUMP_TEXTURES	2
#define	HL_LUMP_VERTEXES	3
#define	HL_LUMP_VISIBILITY	4
#define	HL_LUMP_NODES		5
#define	HL_LUMP_TEXINFO	6
#define	HL_LUMP_FACES		7
#define	HL_LUMP_LIGHTING	8
#define	HL_LUMP_CLIPNODES	9
#define	HL_LUMP_LEAFS		10
#define	HL_LUMP_MARKSURFACES 11
#define	HL_LUMP_EDGES		12
#define	HL_LUMP_SURFEDGES	13
#define	HL_LUMP_MODELS		14

#define	HL_HEADER_LUMPS	15

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

typedef struct
{
	int			version;	
	hl_lump_t	lumps[HL_HEADER_LUMPS];
} hl_dheader_t;

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

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


typedef struct
{
	float	point[3];
} hl_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
} hl_dplane_t;



#define	HL_CONTENTS_EMPTY				-1
#define	HL_CONTENTS_SOLID				-2
#define	HL_CONTENTS_WATER				-3
#define	HL_CONTENTS_SLIME				-4
#define	HL_CONTENTS_LAVA				-5
#define	HL_CONTENTS_SKY				-6
#define	HL_CONTENTS_ORIGIN			-7		// removed at csg time
#define	HL_CONTENTS_CLIP				-8		// changed to contents_solid

#define	HL_CONTENTS_CURRENT_0		-9
#define	HL_CONTENTS_CURRENT_90		-10
#define	HL_CONTENTS_CURRENT_180		-11
#define	HL_CONTENTS_CURRENT_270		-12
#define	HL_CONTENTS_CURRENT_UP		-13
#define	HL_CONTENTS_CURRENT_DOWN	-14

#define HL_CONTENTS_TRANSLUCENT		-15

// !!! 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
} hl_dnode_t;

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


typedef struct hl_texinfo_s
{
	float		vecs[2][4];		// [s/t][xyz offset]
	int		miptex;
	int		flags;
} hl_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
} hl_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
} hl_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 HL_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];
} hl_dleaf_t;


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

#ifndef QUAKE_GAME

#define	ANGLE_UP	-1
#define	ANGLE_DOWN	-2


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

extern	int				hl_nummodels;
extern	hl_dmodel_t		*hl_dmodels;//[MAX_MAP_MODELS];
extern	int				hl_dmodels_checksum;

extern	int				hl_visdatasize;
extern	byte				*hl_dvisdata;//[MAX_MAP_VISIBILITY];
extern	int				hl_dvisdata_checksum;

extern	int				hl_lightdatasize;
extern	byte				*hl_dlightdata;//[MAX_MAP_LIGHTING];
extern	int				hl_dlightdata_checksum;

extern	int				hl_texdatasize;
extern	byte				*hl_dtexdata;//[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
extern	int				hl_dtexdata_checksum;

extern	int				hl_entdatasize;
extern	char				*hl_dentdata;//[MAX_MAP_ENTSTRING];
extern	int				hl_dentdata_checksum;

extern	int				hl_numleafs;
extern	hl_dleaf_t		*hl_dleafs;//[MAX_MAP_LEAFS];
extern	int				hl_dleafs_checksum;

extern	int				hl_numplanes;
extern	hl_dplane_t		*hl_dplanes;//[MAX_MAP_PLANES];
extern	int				hl_dplanes_checksum;

extern	int				hl_numvertexes;
extern	hl_dvertex_t	*hl_dvertexes;//[MAX_MAP_VERTS];
extern	int				hl_dvertexes_checksum;

extern	int				hl_numnodes;
extern	hl_dnode_t		*hl_dnodes;//[MAX_MAP_NODES];
extern	int				hl_dnodes_checksum;

extern	int				hl_numtexinfo;
extern	hl_texinfo_t	*hl_texinfo;//[MAX_MAP_TEXINFO];
extern	int				hl_texinfo_checksum;

extern	int				hl_numfaces;
extern	hl_dface_t		*hl_dfaces;//[MAX_MAP_FACES];
extern	int				hl_dfaces_checksum;

extern	int				hl_numclipnodes;
extern	hl_dclipnode_t	*hl_dclipnodes;//[MAX_MAP_CLIPNODES];
extern	int				hl_dclipnodes_checksum;

extern	int				hl_numedges;
extern	hl_dedge_t		*hl_dedges;//[MAX_MAP_EDGES];
extern	int				hl_dedges_checksum;

extern	int				hl_nummarksurfaces;
extern	unsigned short	*hl_dmarksurfaces;//[MAX_MAP_MARKSURFACES];
extern	int				hl_dmarksurfaces_checksum;

extern	int				hl_numsurfedges;
extern	int				*hl_dsurfedges;//[MAX_MAP_SURFEDGES];
extern	int				hl_dsurfedges_checksum;

int FastChecksum(void *buffer, int bytes);

void HL_AllocMaxBSP(void);
void HL_FreeMaxBSP(void);

void HL_DecompressVis(byte *in, byte *decompressed);
int HL_CompressVis(byte *vis, byte *dest);

void HL_LoadBSPFile(char *filename, int offset, int length);
void HL_WriteBSPFile(char *filename);
void HL_PrintBSPFileSizes(void);
void HL_PrintBSPFileSizes(void);
void HL_ParseEntities(void);
void HL_UnparseEntities(void);

#endif