1 /*
2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4 
5 This file is part of GtkRadiant.
6 
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11 
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21 
22 /* Files:
23 
24 brushbsp.c
25 csg.c
26 faces.c
27 gldraw.c
28 glfile.c
29 leakfile.c
30 map.c
31 nodraw.c
32 portals.c
33 prtfile.c
34 qbsp3.c
35 textures.c
36 tree.c
37 writebsp.c
38 
39 */
40 
41 #include "cmdlib.h"
42 #include "mathlib.h"
43 #include "scriplib.h"
44 #include "polylib.h"
45 #include "q2_threads.h"
46 #include "bspfile.h"
47 #include "inout.h"
48 
49 #ifdef WIN32
50 	#ifdef NDEBUG							// Don't show in a Release build
51 		#pragma warning(disable : 4305)     // truncate from double to float
52 		#pragma warning(disable : 4244)     // conversion from double to float
53 		#pragma warning(disable : 4018)     // signed/unsigned mismatch
54 	#endif
55 #endif
56 
57 #define	MAX_BRUSH_SIDES	128
58 #define	CLIP_EPSILON	0.1
59 
60 #define	BOGUS_RANGE	8192
61 
62 #define	TEXINFO_NODE		-1		// side is allready on a node
63 
64 typedef struct plane_s
65 {
66 	vec3_t	normal;
67 	vec_t	dist;
68 	int		type;
69 	struct plane_s	*hash_chain;
70 } plane_t;
71 
72 typedef struct
73 {
74 	vec_t	shift[2];
75 	vec_t	rotate;
76 	vec_t	scale[2];
77 	char	name[32];
78 	int		flags;
79 	int		value;
80 } brush_texture_t;
81 
82 typedef struct side_s
83 {
84 	int			planenum;
85 	int			texinfo;
86 	winding_t	*winding;
87 	struct side_s	*original;	// bspbrush_t sides will reference the mapbrush_t sides
88 	int			contents;		// from miptex
89 	int			surf;			// from miptex
90 	qboolean	visible;		// choose visble planes first
91 	qboolean	tested;			// this plane allready checked as a split
92 	qboolean	bevel;			// don't ever use for bsp splitting
93 } side_t;
94 
95 typedef struct brush_s
96 {
97 	int		entitynum;
98 	int		brushnum;
99 
100 	int		contents;
101 
102 	vec3_t	mins, maxs;
103 
104 	int		numsides;
105 	side_t	*original_sides;
106 } mapbrush_t;
107 
108 #define	PLANENUM_LEAF			-1
109 
110 #define	MAXEDGES		20
111 
112 typedef struct face_s
113 {
114 	struct face_s	*next;		// on node
115 
116 	// the chain of faces off of a node can be merged or split,
117 	// but each face_t along the way will remain in the chain
118 	// until the entire tree is freed
119 	struct face_s	*merged;	// if set, this face isn't valid anymore
120 	struct face_s	*split[2];	// if set, this face isn't valid anymore
121 
122 	struct portal_s	*portal;
123 	int				texinfo;
124 	int				planenum;
125 	int				contents;	// faces in different contents can't merge
126 	int				outputnumber;
127 	winding_t		*w;
128 	int				numpoints;
129 	qboolean		badstartvert;	// tjunctions cannot be fixed without a midpoint vertex
130 	int				vertexnums[MAXEDGES];
131 } face_t;
132 
133 
134 
135 typedef struct bspbrush_s
136 {
137 	struct bspbrush_s	*next;
138 	vec3_t	mins, maxs;
139 	int		side, testside;		// side of node during construction
140 	mapbrush_t	*original;
141 	int		numsides;
142 	side_t	sides[6];			// variably sized
143 } bspbrush_t;
144 
145 
146 
147 #define	MAX_NODE_BRUSHES	8
148 typedef struct node_s
149 {
150 	// both leafs and nodes
151 	int				planenum;	// -1 = leaf node
152 	struct node_s	*parent;
153 	vec3_t			mins, maxs;	// valid after portalization
154 	bspbrush_t		*volume;	// one for each leaf/node
155 
156 	// nodes only
157 	qboolean		detail_seperator;	// a detail brush caused the split
158 	side_t			*side;		// the side that created the node
159 	struct node_s	*children[2];
160 	face_t			*faces;
161 
162 	// leafs only
163 	bspbrush_t		*brushlist;	// fragments of all brushes in this leaf
164 	int				contents;	// OR of all brush contents
165 	int				occupied;	// 1 or greater can reach entity
166 	entity_t		*occupant;	// for leak file testing
167 	int				cluster;	// for portalfile writing
168 	int				area;		// for areaportals
169 	struct portal_s	*portals;	// also on nodes during construction
170 } node_t;
171 
172 typedef struct portal_s
173 {
174 	plane_t		plane;
175 	node_t		*onnode;		// NULL = outside box
176 	node_t		*nodes[2];		// [0] = front side of plane
177 	struct portal_s	*next[2];
178 	winding_t	*winding;
179 
180 	qboolean	sidefound;		// false if ->side hasn't been checked
181 	side_t		*side;			// NULL = non-visible
182 	face_t		*face[2];		// output face in bsp file
183 } portal_t;
184 
185 typedef struct
186 {
187 	node_t		*headnode;
188 	node_t		outside_node;
189 	vec3_t		mins, maxs;
190 } tree_t;
191 
192 extern	int			entity_num;
193 
194 extern	plane_t		mapplanes[MAX_MAP_PLANES];
195 extern	int			nummapplanes;
196 
197 extern	int			nummapbrushes;
198 extern	mapbrush_t	mapbrushes[MAX_MAP_BRUSHES];
199 
200 extern	vec3_t		map_mins, map_maxs;
201 
202 #define	MAX_MAP_SIDES		(MAX_MAP_BRUSHES*6)
203 
204 extern	int			nummapbrushsides;
205 extern	side_t		brushsides[MAX_MAP_SIDES];
206 
207 extern	qboolean	noprune;
208 extern	qboolean	nodetail;
209 extern	qboolean	fulldetail;
210 extern	qboolean	nomerge;
211 extern	qboolean	nosubdiv;
212 extern	qboolean	nowater;
213 extern	qboolean	noweld;
214 extern	qboolean	noshare;
215 extern	qboolean	notjunc;
216 
217 extern	vec_t		microvolume;
218 
219 extern	char		outbase[32];
220 
221 extern	char	source[1024];
222 
223 void 	LoadMapFile (char *filename);
224 int		FindFloatPlane (vec3_t normal, vec_t dist);
225 
226 //=============================================================================
227 
228 // textures.c
229 
230 typedef struct
231 {
232 	char	name[64];
233 	int		flags;
234 	int		value;
235 	int		contents;
236 	char	animname[64];
237 } textureref_t;
238 
239 #define	MAX_MAP_TEXTURES	1024
240 
241 extern	textureref_t	textureref[MAX_MAP_TEXTURES];
242 
243 int	FindMiptex (char *name);
244 
245 int TexinfoForBrushTexture (plane_t *plane, brush_texture_t *bt, vec3_t origin);
246 
247 //=============================================================================
248 
249 void FindGCD (int *v);
250 
251 mapbrush_t *Brush_LoadEntity (entity_t *ent);
252 int	PlaneTypeForNormal (vec3_t normal);
253 qboolean MakeBrushPlanes (mapbrush_t *b);
254 int		FindIntPlane (int *inormal, int *iorigin);
255 void	CreateBrush (int brushnum);
256 
257 
258 //=============================================================================
259 
260 // draw.c
261 
262 extern vec3_t	draw_mins, draw_maxs;
263 extern	qboolean	drawflag;
264 
265 void Draw_ClearWindow (void);
266 void DrawWinding (winding_t *w);
267 
268 void GLS_BeginScene (void);
269 void GLS_Winding (winding_t *w, int code);
270 void GLS_EndScene (void);
271 
272 //=============================================================================
273 
274 // csg
275 
276 bspbrush_t *MakeBspBrushList (int startbrush, int endbrush,
277 		vec3_t clipmins, vec3_t clipmaxs);
278 bspbrush_t *ChopBrushes (bspbrush_t *head);
279 bspbrush_t *InitialBrushList (bspbrush_t *list);
280 bspbrush_t *OptimizedBrushList (bspbrush_t *list);
281 
282 void WriteBrushMap (char *name, bspbrush_t *list);
283 
284 //=============================================================================
285 
286 // brushbsp
287 
288 void WriteBrushList (char *name, bspbrush_t *brush, qboolean onlyvis);
289 
290 bspbrush_t *CopyBrush (bspbrush_t *brush);
291 
292 void SplitBrush (bspbrush_t *brush, int planenum,
293 	bspbrush_t **front, bspbrush_t **back);
294 
295 tree_t *AllocTree (void);
296 node_t *AllocNode (void);
297 bspbrush_t *AllocBrush (int numsides);
298 int	CountBrushList (bspbrush_t *brushes);
299 void FreeBrush (bspbrush_t *brushes);
300 vec_t BrushVolume (bspbrush_t *brush);
301 
302 void BoundBrush (bspbrush_t *brush);
303 void FreeBrushList (bspbrush_t *brushes);
304 
305 tree_t *BrushBSP (bspbrush_t *brushlist, vec3_t mins, vec3_t maxs);
306 
307 //=============================================================================
308 
309 // portals.c
310 
311 int VisibleContents (int contents);
312 
313 void MakeHeadnodePortals (tree_t *tree);
314 void MakeNodePortal (node_t *node);
315 void SplitNodePortals (node_t *node);
316 
317 qboolean	Portal_VisFlood (portal_t *p);
318 
319 qboolean FloodEntities (tree_t *tree);
320 void FillOutside (node_t *headnode);
321 void FloodAreas (tree_t *tree);
322 void MarkVisibleSides (tree_t *tree, int start, int end);
323 void FreePortal (portal_t *p);
324 void EmitAreaPortals (node_t *headnode);
325 
326 void MakeTreePortals (tree_t *tree);
327 
328 //=============================================================================
329 
330 // glfile.c
331 
332 void OutputWinding (winding_t *w, FILE *glview);
333 void WriteGLView (tree_t *tree, char *source);
334 
335 //=============================================================================
336 
337 // leakfile.c
338 
339 //void LeakFile (tree_t *tree);
340 xmlNodePtr LeakFile (tree_t *tree);
341 
342 //=============================================================================
343 
344 // prtfile.c
345 
346 void WritePortalFile (tree_t *tree);
347 
348 //=============================================================================
349 
350 // writebsp.c
351 
352 void SetModelNumbers (void);
353 void SetLightStyles (void);
354 
355 void BeginBSPFile (void);
356 void WriteBSP (node_t *headnode);
357 void EndBSPFile (void);
358 void BeginModel (void);
359 void EndModel (void);
360 
361 //=============================================================================
362 
363 // faces.c
364 
365 void MakeFaces (node_t *headnode);
366 void FixTjuncs (node_t *headnode);
367 int GetEdge2 (int v1, int v2,  face_t *f);
368 
369 face_t	*AllocFace (void);
370 void FreeFace (face_t *f);
371 
372 void MergeNodeFaces (node_t *node);
373 
374 //=============================================================================
375 
376 // tree.c
377 
378 void FreeTree (tree_t *tree);
379 void FreeTree_r (node_t *node);
380 void PrintTree_r (node_t *node, int depth);
381 void FreeTreePortals_r (node_t *node);
382 void PruneNodes_r (node_t *node);
383 void PruneNodes (node_t *node);
384 
385 //=============================================================================
386 
387 // externs
388 
389 extern char	*mapname;
390 extern char	game[64];
391