]> icculus.org git repositories - divverent/netradiant.git/blob - tools/quake2/q2map/qbsp.h
initial
[divverent/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];