]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake2/q2map/qbsp.h
Merge branch 'sysfprintf' into 'master'
[xonotic/netradiant.git] / tools / quake2 / q2map / qbsp.h
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];