File: bspfile.h

package info (click to toggle)
darkplaces 0~20180412~beta1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 18,200 kB
  • sloc: ansic: 176,886; makefile: 485; pascal: 455; perl: 372; objc: 245; sh: 102
file content (321 lines) | stat: -rw-r--r-- 9,802 bytes parent folder | download | duplicates (4)
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
315
316
317
318
319
320
321
/*
Copyright (C) 1996-1997 Id Software, Inc.

This program 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.

This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/


#define MAX_MAP_HULLS 16 // Q1BSP has 4, Hexen2 Q1BSP has 8, MCBSP has 16

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


#define BSPVERSION	29

typedef struct lump_s
{
	int		fileofs, filelen;
} lump_t;

#define	LUMP_ENTITIES	0
#define	LUMP_PLANES		1
#define	LUMP_TEXTURES	2
#define	LUMP_VERTEXES	3
#define	LUMP_VISIBILITY	4
#define	LUMP_NODES		5
#define	LUMP_TEXINFO	6
#define	LUMP_FACES		7
#define	LUMP_LIGHTING	8
#define	LUMP_CLIPNODES	9
#define	LUMP_LEAFS		10
#define	LUMP_MARKSURFACES 11
#define	LUMP_EDGES		12
#define	LUMP_SURFEDGES	13
#define	LUMP_MODELS		14
#define	HEADER_LUMPS	15

typedef struct hullinfo_s
{
	int			filehulls;
	float		hullsizes[MAX_MAP_HULLS][2][3];
} hullinfo_t;

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

/*
// WARNING: this struct does NOT match q1bsp's disk format because MAX_MAP_HULLS has been changed by Sajt's MCBSP code, this struct is only being used in memory as a result
typedef struct dmodel_s
{
	float		mins[3], maxs[3];
	float		origin[3];
	int			headnode[MAX_MAP_HULLS];
	int			visleafs;		// not including the solid leaf 0
	int			firstface, numfaces;
} dmodel_t;

typedef struct dheader_s
{
	int			version;
	lump_t		lumps[HEADER_LUMPS];
} dheader_t;

typedef struct dmiptexlump_s
{
	int			nummiptex;
	int			dataofs[4];		// [nummiptex]
} dmiptexlump_t;
*/

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


typedef struct dvertex_s
{
	float	point[3];
} 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 dplane_s
{
	float	normal[3];
	float	dist;
	int		type;		// PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
} dplane_t;
*/


// contents values in Q1 maps
#define CONTENTS_EMPTY			-1
#define CONTENTS_SOLID			-2
#define CONTENTS_WATER			-3
#define CONTENTS_SLIME			-4
#define CONTENTS_LAVA				-5
#define CONTENTS_SKY				-6
// these were #ifdef QUAKE2 in the quake source
#define CONTENTS_ORIGIN			-7 // removed at csg time
#define CONTENTS_CLIP				-8 // changed to contents_solid
#define CONTENTS_CURRENT_0		-9
#define CONTENTS_CURRENT_90		-10
#define CONTENTS_CURRENT_180		-11
#define CONTENTS_CURRENT_270		-12
#define CONTENTS_CURRENT_UP		-13
#define CONTENTS_CURRENT_DOWN		-14

//contents flags in Q2 maps
#define CONTENTSQ2_SOLID			0x00000001 // an eye is never valid in a solid
#define CONTENTSQ2_WINDOW			0x00000002 // translucent, but not watery
#define CONTENTSQ2_AUX				0x00000004
#define CONTENTSQ2_LAVA				0x00000008
#define CONTENTSQ2_SLIME			0x00000010
#define CONTENTSQ2_WATER			0x00000020
#define CONTENTSQ2_MIST				0x00000040
#define CONTENTSQ2_AREAPORTAL		0x00008000
#define CONTENTSQ2_PLAYERCLIP		0x00010000
#define CONTENTSQ2_MONSTERCLIP		0x00020000
#define CONTENTSQ2_CURRENT_0		0x00040000
#define CONTENTSQ2_CURRENT_90		0x00080000
#define CONTENTSQ2_CURRENT_180		0x00100000
#define CONTENTSQ2_CURRENT_270		0x00200000
#define CONTENTSQ2_CURRENT_UP		0x00400000
#define CONTENTSQ2_CURRENT_DOWN		0x00800000
#define CONTENTSQ2_ORIGIN			0x01000000 // removed before bsping an entity
#define CONTENTSQ2_MONSTER			0x02000000 // should never be on a brush, only in game
#define CONTENTSQ2_DEADMONSTER		0x04000000
#define CONTENTSQ2_DETAIL			0x08000000 // brushes to be added after vis leafs
#define CONTENTSQ2_TRANSLUCENT		0x10000000 // auto set if any surface has trans
#define CONTENTSQ2_LADDER			0x20000000

//contents flags in Q3 maps
#define CONTENTSQ3_SOLID			0x00000001 // solid (opaque and transparent)
#define CONTENTSQ3_LAVA				0x00000008 // lava
#define CONTENTSQ3_SLIME			0x00000010 // slime
#define CONTENTSQ3_WATER			0x00000020 // water
#define CONTENTSQ3_FOG				0x00000040 // unused?
#define CONTENTSQ3_AREAPORTAL		0x00008000 // areaportal (separates areas)
#define CONTENTSQ3_PLAYERCLIP		0x00010000 // block players
#define CONTENTSQ3_MONSTERCLIP		0x00020000 // block monsters
#define CONTENTSQ3_TELEPORTER		0x00040000 // hint for Q3's bots
#define CONTENTSQ3_JUMPPAD			0x00080000 // hint for Q3's bots
#define CONTENTSQ3_CLUSTERPORTAL	0x00100000 // hint for Q3's bots
#define CONTENTSQ3_DONOTENTER		0x00200000 // hint for Q3's bots
#define CONTENTSQ3_BOTCLIP			0x00400000 // hint for Q3's bots
#define CONTENTSQ3_ORIGIN			0x01000000 // used by origin brushes to indicate origin of bmodel (removed by map compiler)
#define CONTENTSQ3_BODY				0x02000000 // used by bbox entities (should never be on a brush)
#define CONTENTSQ3_CORPSE			0x04000000 // used by dead bodies (SOLID_CORPSE in darkplaces)
#define CONTENTSQ3_DETAIL			0x08000000 // brushes that do not split the bsp tree (decorations)
#define CONTENTSQ3_STRUCTURAL		0x10000000 // brushes that split the bsp tree
#define CONTENTSQ3_TRANSLUCENT		0x20000000 // leaves surfaces that are inside for rendering
#define CONTENTSQ3_TRIGGER			0x40000000 // used by trigger entities
#define CONTENTSQ3_NODROP			0x80000000 // remove items that fall into this brush

#define SUPERCONTENTS_SOLID			0x00000001
#define SUPERCONTENTS_WATER			0x00000002
#define SUPERCONTENTS_SLIME			0x00000004
#define SUPERCONTENTS_LAVA			0x00000008
#define SUPERCONTENTS_SKY			0x00000010
#define SUPERCONTENTS_BODY			0x00000020
#define SUPERCONTENTS_CORPSE		0x00000040
#define SUPERCONTENTS_NODROP		0x00000080
#define SUPERCONTENTS_PLAYERCLIP	0x00000100
#define SUPERCONTENTS_MONSTERCLIP	0x00000200
#define SUPERCONTENTS_DONOTENTER	0x00000400
#define SUPERCONTENTS_BOTCLIP		0x00000800
#define SUPERCONTENTS_OPAQUE		0x00001000
// TODO: is there any reason to define:
//   fog?
//   areaportal?
//   teleporter?
//   jumppad?
//   clusterportal?
//   detail?         (div0) no, game code should not be allowed to differentiate between structural and detail
//   structural?     (div0) no, game code should not be allowed to differentiate between structural and detail
//   trigger?        (div0) no, as these are always solid anyway, and that's all that matters for trigger brushes
#define SUPERCONTENTS_LIQUIDSMASK	(SUPERCONTENTS_LAVA | SUPERCONTENTS_SLIME | SUPERCONTENTS_WATER)
#define SUPERCONTENTS_VISBLOCKERMASK	SUPERCONTENTS_OPAQUE

/*
#define SUPERCONTENTS_DEADMONSTER	0x00000000
#define SUPERCONTENTS_CURRENT_0		0x00000000
#define SUPERCONTENTS_CURRENT_90	0x00000000
#define SUPERCONTENTS_CURRENT_180	0x00000000
#define SUPERCONTENTS_CURRENT_270	0x00000000
#define SUPERCONTENTS_CURRENT_DOWN	0x00000000
#define SUPERCONTENTS_CURRENT_UP	0x00000000
#define SUPERCONTENTS_AREAPORTAL	0x00000000
#define SUPERCONTENTS_AUX			0x00000000
#define SUPERCONTENTS_CLUSTERPORTAL	0x00000000
#define SUPERCONTENTS_DETAIL		0x00000000
#define SUPERCONTENTS_STRUCTURAL	0x00000000
#define SUPERCONTENTS_DONOTENTER	0x00000000
#define SUPERCONTENTS_JUMPPAD		0x00000000
#define SUPERCONTENTS_LADDER		0x00000000
#define SUPERCONTENTS_MONSTER		0x00000000
#define SUPERCONTENTS_MONSTERCLIP	0x00000000
#define SUPERCONTENTS_PLAYERCLIP	0x00000000
#define SUPERCONTENTS_TELEPORTER	0x00000000
#define SUPERCONTENTS_TRANSLUCENT	0x00000000
#define SUPERCONTENTS_TRIGGER		0x00000000
#define SUPERCONTENTS_WINDOW		0x00000000
*/

/*
typedef struct dnode_s
{
	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
} dnode_t;

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


typedef struct texinfo_s
{
	float		vecs[2][4];		// [s/t][xyz offset]
	int			miptex;
	int			flags;
} 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 dedge_s
{
	unsigned short	v[2];		// vertex numbers
} dedge_t;
*/

#define	MAXLIGHTMAPS	4
/*
typedef struct dface_s
{
	// LordHavoc: changed from short to unsigned short for q2 support
	unsigned short	planenum;
	short		side;

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

// lighting info
	unsigned char		styles[MAXLIGHTMAPS];
	int			lightofs;		// start of [numstyles*surfsize] samples
} 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 CONTENTS_SOLID leaf, used for all solid areas
// all other leafs need visibility info
/*
typedef struct dleaf_s
{
	int			contents;
	int			visofs;				// -1 = no visibility info

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

	unsigned short		firstmarksurface;
	unsigned short		nummarksurfaces;

	unsigned char		ambient_level[NUM_AMBIENTS];
} dleaf_t;
*/