]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake3/q3map2/q3map2.h
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / tools / quake3 / q3map2 / q3map2.h
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 \r
21 ----------------------------------------------------------------------------------\r
22 \r
23 This code has been altered significantly from its original form, to support\r
24 several games based on the Quake III Arena engine, in the form of "Q3Map2."\r
25 \r
26 ------------------------------------------------------------------------------- */\r
27 \r
28 \r
29 \r
30 /* marker */\r
31 #ifndef Q3MAP2_H\r
32 #define Q3MAP2_H\r
33 \r
34 \r
35 \r
36 /* version */\r
37 #define Q3MAP_VERSION   "2.5.11"\r
38 #define Q3MAP_MOTD              "A well-oiled toaster oven"\r
39 \r
40 \r
41 \r
42 /* -------------------------------------------------------------------------------\r
43 \r
44 dependencies\r
45 \r
46 ------------------------------------------------------------------------------- */\r
47 \r
48 /* platform-specific */\r
49 #if defined( __linux__ ) || defined( __APPLE__ )\r
50         #define Q_UNIX\r
51 #endif\r
52 \r
53 #ifdef Q_UNIX\r
54         #include <unistd.h>\r
55         #include <pwd.h>\r
56         #include <limits.h>\r
57 #endif\r
58 \r
59 #ifdef _WIN32\r
60         #include <windows.h>\r
61 #endif\r
62 \r
63 \r
64 /* general */\r
65 #include "version.h"                    /* ttimo: might want to guard that if built outside of the GtkRadiant tree */\r
66 \r
67 #include "cmdlib.h"\r
68 #include "mathlib.h"\r
69 #include "md5lib.h"\r
70 #include "ddslib.h"\r
71 \r
72 #include "picomodel.h"\r
73 \r
74 #include "scriplib.h"\r
75 #include "polylib.h"\r
76 #include "imagelib.h"\r
77 #include "qthreads.h"\r
78 #include "inout.h"\r
79 #include "vfs.h"\r
80 #include "png.h"\r
81 #include "radiant_jpeglib.h"\r
82 \r
83 #include <stdlib.h>\r
84 \r
85 \r
86 \r
87 /* -------------------------------------------------------------------------------\r
88 \r
89 port-related hacks\r
90 \r
91 ------------------------------------------------------------------------------- */\r
92 \r
93 #define MAC_STATIC_HACK                 0\r
94 #if defined( __APPLE__ ) && MAC_STATIC_HACK \r
95         #define MAC_STATIC                      static\r
96 #else\r
97         #define MAC_STATIC                      \r
98 #endif\r
99 \r
100 #if 1\r
101         #ifdef _WIN32\r
102                 #define Q_stricmp                       stricmp\r
103                 #define Q_strncasecmp           strnicmp\r
104         #else\r
105                 #define Q_stricmp                       strcasecmp\r
106                 #define Q_strncasecmp           strncasecmp\r
107         #endif\r
108 #endif\r
109 \r
110 /* macro version */\r
111 #define VectorMA( a, s, b, c )  ((c)[ 0 ] = (a)[ 0 ] + (s) * (b)[ 0 ], (c)[ 1 ] = (a)[ 1 ] + (s) * (b)[ 1 ], (c)[ 2 ] = (a)[ 2 ] + (s) * (b)[ 2 ])\r
112 \r
113 \r
114 \r
115 /* -------------------------------------------------------------------------------\r
116 \r
117 constants\r
118 \r
119 ------------------------------------------------------------------------------- */\r
120 \r
121 /* general */\r
122 #define MAX_QPATH                               64\r
123 \r
124 #define MAX_IMAGES                              512\r
125 #define DEFAULT_IMAGE                   "*default"\r
126 \r
127 #define MAX_MODELS                              512\r
128 \r
129 #define DEF_BACKSPLASH_FRACTION 0.05f   /* 5% backsplash by default */\r
130 #define DEF_BACKSPLASH_DISTANCE 23\r
131 \r
132 #define DEF_RADIOSITY_BOUNCE    1.0f    /* ydnar: default to 100% re-emitted light */\r
133 \r
134 #define MAX_SHADER_INFO                 8192\r
135 #define MAX_CUST_SURFACEPARMS   64\r
136 \r
137 #define SHADER_MAX_VERTEXES             1000\r
138 #define SHADER_MAX_INDEXES              (6 * SHADER_MAX_VERTEXES)\r
139 \r
140 #define MAX_JITTERS                             256\r
141 \r
142 \r
143 /* epair parsing (note case-sensitivity directive) */\r
144 #define CASE_INSENSITIVE_EPAIRS 1\r
145 \r
146 #if CASE_INSENSITIVE_EPAIRS\r
147         #define EPAIR_STRCMP            Q_stricmp\r
148 #else\r
149         #define EPAIR_STRCMP            strcmp\r
150 #endif\r
151 \r
152 \r
153 /* ydnar: compiler flags, because games have widely varying content/surface flags */\r
154 #define C_SOLID                                 0x00000001\r
155 #define C_TRANSLUCENT                   0x00000002\r
156 #define C_STRUCTURAL                    0x00000004\r
157 #define C_HINT                                  0x00000008\r
158 #define C_NODRAW                                0x00000010\r
159 #define C_LIGHTGRID                             0x00000020\r
160 #define C_ALPHASHADOW                   0x00000040\r
161 #define C_LIGHTFILTER                   0x00000080\r
162 #define C_VERTEXLIT                             0x00000100\r
163 #define C_LIQUID                                0x00000200\r
164 #define C_FOG                                   0x00000400\r
165 #define C_SKY                                   0x00000800\r
166 #define C_ORIGIN                                0x00001000\r
167 #define C_AREAPORTAL                    0x00002000\r
168 #define C_ANTIPORTAL                    0x00004000      /* like hint, but doesn't generate portals */\r
169 #define C_SKIP                                  0x00008000      /* like hint, but skips this face (doesn't split bsp) */\r
170 #define C_NOMARKS                               0x00010000      /* no decals */\r
171 \r
172 #define C_DETAIL                                0x08000000      /* THIS MUST BE THE SAME AS IN RADIANT! */\r
173 \r
174 \r
175 /* shadow flags */\r
176 #define WORLDSPAWN_CAST_SHADOWS 1\r
177 #define WORLDSPAWN_RECV_SHADOWS 1\r
178 #define ENTITY_CAST_SHADOWS             0\r
179 #define ENTITY_RECV_SHADOWS             1\r
180 \r
181 \r
182 /* bsp */\r
183 #define MAX_PATCH_SIZE                  32\r
184 #define MAX_BRUSH_SIDES                 1024\r
185 #define MAX_BUILD_SIDES                 300\r
186 \r
187 #define MAX_EXPANDED_AXIS               128\r
188 \r
189 #define CLIP_EPSILON                    0.1f\r
190 #define PLANESIDE_EPSILON               0.001f\r
191 #define PLANENUM_LEAF                   -1\r
192 \r
193 #define HINT_PRIORITY                   1000            /* ydnar: force hint splits first and antiportal/areaportal splits last */\r
194 #define ANTIPORTAL_PRIORITY             -1000\r
195 #define AREAPORTAL_PRIORITY             -1000\r
196 \r
197 #define PSIDE_FRONT                             1\r
198 #define PSIDE_BACK                              2\r
199 #define PSIDE_BOTH                              (PSIDE_FRONT | PSIDE_BACK)\r
200 #define PSIDE_FACING                    4\r
201 \r
202 #define BPRIMIT_UNDEFINED               0\r
203 #define BPRIMIT_OLDBRUSHES              1\r
204 #define BPRIMIT_NEWBRUSHES              2\r
205 \r
206 \r
207 /* vis */\r
208 #define VIS_HEADER_SIZE                 8\r
209 \r
210 #define SEPERATORCACHE                  /* seperator caching helps a bit */\r
211 \r
212 #define PORTALFILE                              "PRT1"\r
213 \r
214 #define MAX_PORTALS                             32768\r
215 #define MAX_SEPERATORS                  MAX_POINTS_ON_WINDING\r
216 #define MAX_POINTS_ON_FIXED_WINDING     24      /* ydnar: increased this from 12 at the expense of more memory */\r
217 #define MAX_PORTALS_ON_LEAF             128\r
218 \r
219 \r
220 /* light */\r
221 #define EMIT_POINT                              0\r
222 #define EMIT_AREA                               1\r
223 #define EMIT_SPOT                               2\r
224 #define EMIT_SUN                                3\r
225 \r
226 #define LIGHT_ATTEN_LINEAR              1\r
227 #define LIGHT_ATTEN_ANGLE               2\r
228 #define LIGHT_ATTEN_DISTANCE    4\r
229 #define LIGHT_TWOSIDED                  8\r
230 #define LIGHT_GRID                              16\r
231 #define LIGHT_SURFACES                  32\r
232 #define LIGHT_DARK                              64              /* probably never use this */\r
233 #define LIGHT_FAST                              256\r
234 #define LIGHT_FAST_TEMP                 512\r
235 #define LIGHT_FAST_ACTUAL               (LIGHT_FAST | LIGHT_FAST_TEMP)\r
236 #define LIGHT_NEGATIVE                  1024\r
237 \r
238 #define LIGHT_SUN_DEFAULT               (LIGHT_ATTEN_ANGLE | LIGHT_GRID | LIGHT_SURFACES)\r
239 #define LIGHT_AREA_DEFAULT              (LIGHT_ATTEN_ANGLE | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES)        /* q3a and wolf are the same */\r
240 #define LIGHT_Q3A_DEFAULT               (LIGHT_ATTEN_ANGLE | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES | LIGHT_FAST)\r
241 #define LIGHT_WOLF_DEFAULT              (LIGHT_ATTEN_LINEAR | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES | LIGHT_FAST)\r
242 \r
243 #define MAX_TRACE_TEST_NODES    256\r
244 #define DEFAULT_INHIBIT_RADIUS  1.5f\r
245 \r
246 #define LUXEL_EPSILON                   0.125f\r
247 #define VERTEX_EPSILON                  -0.125f\r
248 #define GRID_EPSILON                    0.0f\r
249 \r
250 #define DEFAULT_LIGHTMAP_SAMPLE_SIZE    16\r
251 #define DEFAULT_LIGHTMAP_SAMPLE_OFFSET  1.0f\r
252 #define DEFAULT_SUBDIVIDE_THRESHOLD             1.0f\r
253 \r
254 #define EXTRA_SCALE                             2       /* -extrawide = -super 2 */\r
255 #define EXTRAWIDE_SCALE                 2       /* -extrawide = -super 2 -filter */\r
256 \r
257 #define CLUSTER_UNMAPPED                -1\r
258 #define CLUSTER_OCCLUDED                -2\r
259 #define CLUSTER_FLOODED                 -3\r
260 \r
261 #define VERTEX_LUXEL_SIZE               3\r
262 #define BSP_LUXEL_SIZE                  3\r
263 #define RAD_LUXEL_SIZE                  3\r
264 #define SUPER_LUXEL_SIZE                4\r
265 #define SUPER_ORIGIN_SIZE               3\r
266 #define SUPER_NORMAL_SIZE               3\r
267 #define SUPER_DELUXEL_SIZE              3\r
268 #define BSP_DELUXEL_SIZE                3\r
269 \r
270 #define VERTEX_LUXEL( s, v )    (vertexLuxels[ s ] + ((v) * VERTEX_LUXEL_SIZE))\r
271 #define RAD_VERTEX_LUXEL( s, v )(radVertexLuxels[ s ] + ((v) * VERTEX_LUXEL_SIZE))\r
272 #define BSP_LUXEL( s, x, y )    (lm->bspLuxels[ s ] + ((((y) * lm->w) + (x)) * BSP_LUXEL_SIZE))\r
273 #define RAD_LUXEL( s, x, y )    (lm->radLuxels[ s ] + ((((y) * lm->w) + (x)) * RAD_LUXEL_SIZE))\r
274 #define SUPER_LUXEL( s, x, y )  (lm->superLuxels[ s ] + ((((y) * lm->sw) + (x)) * SUPER_LUXEL_SIZE))\r
275 #define SUPER_ORIGIN( x, y )    (lm->superOrigins + ((((y) * lm->sw) + (x)) * SUPER_ORIGIN_SIZE))\r
276 #define SUPER_NORMAL( x, y )    (lm->superNormals + ((((y) * lm->sw) + (x)) * SUPER_NORMAL_SIZE))\r
277 #define SUPER_CLUSTER( x, y )   (lm->superClusters + (((y) * lm->sw) + (x)))\r
278 #define SUPER_DELUXEL( x, y )   (lm->superDeluxels + ((((y) * lm->sw) + (x)) * SUPER_DELUXEL_SIZE))\r
279 #define BSP_DELUXEL( x, y )             (lm->bspDeluxels + ((((y) * lm->w) + (x)) * BSP_DELUXEL_SIZE))\r
280 \r
281 \r
282 \r
283 /* -------------------------------------------------------------------------------\r
284 \r
285 abstracted bsp file\r
286 \r
287 ------------------------------------------------------------------------------- */\r
288 \r
289 #define EXTERNAL_LIGHTMAP               "lm_%04d.tga"\r
290 \r
291 #define MAX_LIGHTMAPS                   4                       /* RBSP */\r
292 #define MAX_LIGHT_STYLES                64\r
293 #define MAX_SWITCHED_LIGHTS             32\r
294 #define LS_NORMAL                               0x00\r
295 #define LS_UNUSED                               0xFE\r
296 #define LS_NONE                                 0xFF\r
297 \r
298 #define MAX_LIGHTMAP_SHADERS    256\r
299 \r
300 /* ok to increase these at the expense of more memory */\r
301 #define MAX_MAP_MODELS                  0x400\r
302 #define MAX_MAP_BRUSHES                 0x8000\r
303 #define MAX_MAP_ENTITIES                0x1000          //%     0x800   /* ydnar */\r
304 #define MAX_MAP_ENTSTRING               0x80000         //%     0x40000 /* ydnar */\r
305 #define MAX_MAP_SHADERS                 0x400\r
306 \r
307 #define MAX_MAP_AREAS                   0x100           /* MAX_MAP_AREA_BYTES in q_shared must match! */\r
308 #define MAX_MAP_FOGS                    30                      //& 0x100       /* RBSP (32 - world fog - goggles) */\r
309 #define MAX_MAP_PLANES                  0x100000        //%     0x20000 /* ydnar for md */\r
310 #define MAX_MAP_NODES                   0x20000\r
311 #define MAX_MAP_BRUSHSIDES              0x100000        //%     0x20000 /* ydnar */\r
312 #define MAX_MAP_LEAFS                   0x20000\r
313 #define MAX_MAP_LEAFFACES               0x20000\r
314 #define MAX_MAP_LEAFBRUSHES             0x40000\r
315 #define MAX_MAP_PORTALS                 0x20000\r
316 #define MAX_MAP_LIGHTING                0x800000\r
317 #define MAX_MAP_LIGHTGRID               0x100000        //%     0x800000 /* ydnar: set to points, not bytes */\r
318 #define MAX_MAP_VISIBILITY              0x200000\r
319 \r
320 #define MAX_MAP_DRAW_SURFS              0x20000\r
321 #define MAX_MAP_DRAW_VERTS              0x80000\r
322 #define MAX_MAP_DRAW_INDEXES    0x80000\r
323 \r
324 \r
325 /* key / value pair sizes in the entities lump */\r
326 #define MAX_KEY                                 32\r
327 #define MAX_VALUE                               1024\r
328 \r
329 /* the editor uses these predefined yaw angles to orient entities up or down */\r
330 #define ANGLE_UP                                -1\r
331 #define ANGLE_DOWN                              -2\r
332 \r
333 #define LIGHTMAP_WIDTH                  128\r
334 #define LIGHTMAP_HEIGHT                 128\r
335 \r
336 #define MIN_WORLD_COORD                 (-65536)\r
337 #define MAX_WORLD_COORD                 (65536)\r
338 #define WORLD_SIZE                              (MAX_WORLD_COORD - MIN_WORLD_COORD)\r
339 \r
340 \r
341 typedef void                                    (*bspFunc)( const char * );\r
342 \r
343 \r
344 typedef struct\r
345 {\r
346         int             offset, length;\r
347 }\r
348 bspLump_t;\r
349 \r
350 \r
351 typedef struct\r
352 {\r
353         char            ident[ 4 ];\r
354         int                     version;\r
355         \r
356         bspLump_t       lumps[ 100 ];   /* theoretical maximum # of bsp lumps */\r
357 }\r
358 bspHeader_t;\r
359 \r
360 \r
361 typedef struct\r
362 {\r
363         float           mins[ 3 ], maxs[ 3 ];\r
364         int                     firstBSPSurface, numBSPSurfaces;\r
365         int                     firstBSPBrush, numBSPBrushes;\r
366 }\r
367 bspModel_t;\r
368 \r
369 \r
370 typedef struct\r
371 {\r
372         char            shader[ MAX_QPATH ];\r
373         int                     surfaceFlags;\r
374         int                     contentFlags;\r
375 }\r
376 bspShader_t;\r
377 \r
378 \r
379 /* planes x^1 is allways the opposite of plane x */\r
380 \r
381 typedef struct\r
382 {\r
383         float           normal[ 3 ];\r
384         float           dist;\r
385 }\r
386 bspPlane_t;\r
387 \r
388 \r
389 typedef struct\r
390 {\r
391         int                     planeNum;\r
392         int                     children[ 2 ];          /* negative numbers are -(leafs+1), not nodes */\r
393         int                     mins[ 3 ];                      /* for frustom culling */\r
394         int                     maxs[ 3 ];\r
395 }\r
396 bspNode_t;\r
397 \r
398 \r
399 typedef struct\r
400 {\r
401         int                     cluster;                        /* -1 = opaque cluster (do I still store these?) */\r
402         int                     area;\r
403         \r
404         int                     mins[ 3 ];                      /* for frustum culling */\r
405         int                     maxs[ 3 ];\r
406         \r
407         int                     firstBSPLeafSurface;\r
408         int                     numBSPLeafSurfaces;\r
409         \r
410         int                     firstBSPLeafBrush;\r
411         int                     numBSPLeafBrushes;\r
412 }\r
413 bspLeaf_t;\r
414 \r
415 \r
416 typedef struct\r
417 {\r
418         int                     planeNum;                       /* positive plane side faces out of the leaf */\r
419         int                     shaderNum;\r
420         int                     surfaceNum;                     /* RBSP */\r
421 }\r
422 bspBrushSide_t;\r
423 \r
424 \r
425 typedef struct\r
426 {\r
427         int                     firstSide;\r
428         int                     numSides;\r
429         int                     shaderNum;                      /* the shader that determines the content flags */\r
430 }\r
431 bspBrush_t;\r
432 \r
433 \r
434 typedef struct\r
435 {\r
436         char            shader[ MAX_QPATH ];\r
437         int                     brushNum;\r
438         int                     visibleSide;            /* the brush side that ray tests need to clip against (-1 == none) */\r
439 }\r
440 bspFog_t;\r
441 \r
442 \r
443 typedef struct\r
444 {\r
445         vec3_t          xyz;\r
446         float           st[ 2 ];\r
447         float           lightmap[ MAX_LIGHTMAPS ][ 2 ]; /* RBSP */\r
448         vec3_t          normal;\r
449         byte            color[ MAX_LIGHTMAPS ][ 4 ];    /* RBSP */\r
450 }\r
451 bspDrawVert_t;\r
452 \r
453 \r
454 typedef enum\r
455 {\r
456         MST_BAD,\r
457         MST_PLANAR,\r
458         MST_PATCH,\r
459         MST_TRIANGLE_SOUP,\r
460         MST_FLARE,\r
461         MST_FOLIAGE\r
462 }\r
463 bspSurfaceType_t;\r
464 \r
465 \r
466 typedef struct bspGridPoint_s\r
467 {\r
468         byte            ambient[ MAX_LIGHTMAPS ][ 3 ];\r
469         byte            directed[ MAX_LIGHTMAPS ][ 3 ];\r
470         byte            styles[ MAX_LIGHTMAPS ];\r
471         byte            latLong[ 2 ];\r
472 }\r
473 bspGridPoint_t;\r
474 \r
475 \r
476 typedef struct\r
477 {\r
478         int                     shaderNum;\r
479         int                     fogNum;\r
480         int                     surfaceType;\r
481         \r
482         int                     firstVert;\r
483         int                     numVerts;\r
484         \r
485         int                     firstIndex;\r
486         int                     numIndexes;\r
487         \r
488         byte            lightmapStyles[ MAX_LIGHTMAPS ];                                                /* RBSP */\r
489         byte            vertexStyles[ MAX_LIGHTMAPS ];                                                  /* RBSP */\r
490         int                     lightmapNum[ MAX_LIGHTMAPS ];                                                   /* RBSP */\r
491         int                     lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ]; /* RBSP */\r
492         int                     lightmapWidth, lightmapHeight;\r
493         \r
494         vec3_t          lightmapOrigin;\r
495         vec3_t          lightmapVecs[ 3 ];      /* on patches, [ 0 ] and [ 1 ] are lodbounds */\r
496         \r
497         int                     patchWidth;\r
498         int                     patchHeight;\r
499 }\r
500 bspDrawSurface_t;\r
501 \r
502 \r
503 \r
504 /* -------------------------------------------------------------------------------\r
505 \r
506 general types\r
507 \r
508 ------------------------------------------------------------------------------- */\r
509 \r
510 /* ydnar: for smaller structs */\r
511 typedef char    qb_t;\r
512 \r
513 \r
514 /* ydnar: for q3map_tcMod */\r
515 typedef float   tcMod_t[ 3 ][ 3 ];\r
516 \r
517 \r
518 /* ydnar: for multiple game support */\r
519 typedef struct surfaceParm_s\r
520 {\r
521         char            *name;\r
522         int                     contentFlags, contentFlagsClear;\r
523         int                     surfaceFlags, surfaceFlagsClear;\r
524         int                     compileFlags, compileFlagsClear;\r
525 }\r
526 surfaceParm_t;\r
527 \r
528 \r
529 typedef struct game_s\r
530 {\r
531         char                            *arg;                                                   /* -game matches this */\r
532         char                            *gamePath;                                              /* main game data dir */\r
533         char                            *homeBasePath;                                  /* home sub-dir on unix */\r
534         char                            *magic;                                                 /* magic word for figuring out base path */\r
535         char                            *shaderPath;                                    /* shader directory */\r
536         qboolean                        wolfLight;                                              /* when true, lights work like wolf q3map  */\r
537         qboolean                        emitFlares;                                             /* when true, emit flare surfaces */\r
538         char                            *flareShader;                                   /* default flare shader (MUST BE SET) */\r
539         char                            *bspIdent;                                              /* 4-letter bsp file prefix */\r
540         int                                     bspVersion;                                             /* BSP version to use */\r
541         bspFunc                         load, write;                                    /* load/write function pointers */\r
542         surfaceParm_t           surfaceParms[ 128 ];                    /* surfaceparm array */\r
543 }\r
544 game_t;\r
545 \r
546 \r
547 typedef struct image_s\r
548 {\r
549         char                            *name, *filename;\r
550         int                                     refCount;\r
551         int                                     width, height;\r
552         byte                            *pixels;\r
553 }\r
554 image_t;\r
555 \r
556 \r
557 typedef struct sun_s\r
558 {\r
559         struct sun_s            *next;\r
560         vec3_t                          direction, color;\r
561         float                           photons, deviance, filterRadius;\r
562         int                                     numSamples;\r
563 }\r
564 sun_t;\r
565 \r
566 \r
567 typedef struct surfaceModel_s \r
568 {\r
569         struct surfaceModel_s   *next;\r
570         char                            model[ MAX_QPATH ];\r
571         float                           density, odds;\r
572         float                           minScale, maxScale;\r
573         float                           minAngle, maxAngle;\r
574         qboolean                        oriented;\r
575 }\r
576 surfaceModel_t;\r
577 \r
578 \r
579 /* ydnar/sd: foliage stuff for wolf et (engine-supported optimization of the above) */\r
580 typedef struct foliage_s \r
581 {\r
582         struct foliage_s        *next;\r
583         char                            model[ MAX_QPATH ];\r
584         float                           scale, density, odds;\r
585         qboolean                        inverseAlpha;\r
586 }\r
587 foliage_t;\r
588 \r
589 typedef struct foliageInstance_s\r
590 {\r
591         vec3_t                          xyz, normal;\r
592 }\r
593 foliageInstance_t;\r
594 \r
595 \r
596 typedef struct remap_s\r
597 {\r
598         struct remap_s          *next;\r
599         char                            from[ 1024 ];\r
600         char                            to[ MAX_QPATH ];\r
601 }\r
602 remap_t;\r
603 \r
604 \r
605 typedef enum\r
606 {\r
607         AM_NONE,\r
608         AM_DOT_PRODUCT\r
609 }\r
610 alphaModType_t;\r
611 \r
612 \r
613 typedef struct alphaMod_s\r
614 {\r
615         struct alphaMod_s       *next;\r
616         alphaModType_t          type;\r
617         vec_t                           data[ 16 ];\r
618 }\r
619 alphaMod_t;\r
620 \r
621 \r
622 typedef enum\r
623 {\r
624         IM_NONE,\r
625         IM_OPAQUE,\r
626         IM_MASKED,\r
627         IM_BLEND\r
628 }\r
629 implicitMap_t;\r
630 \r
631 \r
632 typedef struct shaderInfo_s\r
633 {\r
634         char                            shader[ MAX_QPATH ];\r
635         int                                     surfaceFlags;\r
636         int                                     contentFlags;\r
637         int                                     compileFlags;\r
638         float                           value;                                                  /* light value */\r
639         \r
640         char                            backShader[ MAX_QPATH ];                /* for surfaces that generate different front and back passes */\r
641         char                            flareShader[ MAX_QPATH ];               /* for light flares */\r
642         char                            cloneShader[ MAX_QPATH ];               /* ydnar: for cloning of a surface */\r
643         char                            damageShader[ MAX_QPATH ];              /* ydnar: sof2 damage shader name */\r
644 \r
645         surfaceModel_t          *surfaceModel;                                  /* ydnar: for distribution of models */\r
646         foliage_t                       *foliage;                                               /* ydnar/splash damage: wolf et foliage */\r
647         \r
648         float                           subdivisions;                                   /* from a "tesssize xxx" */\r
649         float                           backsplashFraction;                             /* floating point value, usually 0.05 */\r
650         float                           backsplashDistance;                             /* default 16 */\r
651         float                           lightSubdivide;                                 /* default 999 */\r
652         float                           lightFilterRadius;                              /* ydnar: lightmap filtering/blurring radius for lights created by this shader (default: 0) */\r
653         \r
654         int                                     lightmapSampleSize;                             /* lightmap sample size */\r
655         float                           lightmapSampleOffset;                   /* ydnar: lightmap sample offset (default: 1.0) */\r
656         \r
657         float                           bounceScale;                                    /* ydnar: radiosity re-emission [0,1.0+] */\r
658         float                           offset;                                                 /* ydnar: offset in units */\r
659         float                           shadeAngleDegrees;                              /* ydnar: breaking angle for smooth shading (degrees) */\r
660         \r
661         vec3_t                          mins, maxs;                                             /* ydnar: for particle studio vertexDeform move support */\r
662         \r
663         qb_t                            legacyTerrain;                                  /* ydnar: enable legacy terrain crutches */\r
664         qb_t                            indexed;                                                /* ydnar: attempt to use indexmap (terrain alphamap style) */\r
665         qb_t                            forceMeta;                                              /* ydnar: force metasurface path */\r
666         qb_t                            noClip;                                                 /* ydnar: don't clip into bsp, preserve original face winding */\r
667         qb_t                            noFast;                                                 /* ydnar: supress fast lighting for surfaces with this shader */\r
668         qb_t                            invert;                                                 /* ydnar: reverse facing */\r
669         qb_t                            nonplanar;                                              /* ydnar: for nonplanar meta surface merging */\r
670         qb_t                            tcGen;                                                  /* ydnar: has explicit texcoord generation */\r
671         vec3_t                          vecs[ 2 ];                                              /* ydnar: explicit texture vectors for [0,1] texture space */\r
672         tcMod_t                         mod;                                                    /* ydnar: q3map_tcMod matrix for djbob :) */\r
673         vec3_t                          lightmapAxis;                                   /* ydnar: explicit lightmap axis projection */\r
674         alphaMod_t                      *alphaMod;                                              /* ydnar: q3map_alphaMod support */\r
675         \r
676         int                                     furNumLayers;                                   /* ydnar: number of fur layers */\r
677         float                           furOffset;                                              /* ydnar: offset of each layer */\r
678         float                           furFade;                                                /* ydnar: alpha fade amount per layer */\r
679 \r
680         qb_t                            splotchFix;                                             /* ydnar: filter splotches on lightmaps */\r
681         \r
682         qb_t                            hasPasses;                                              /* false if the shader doesn't define any rendering passes */\r
683         qb_t                            globalTexture;                                  /* don't normalize texture repeats */\r
684         qb_t                            twoSided;                                               /* cull none */\r
685         qb_t                            autosprite;                                             /* autosprite shaders will become point lights instead of area lights */\r
686         qb_t                            polygonOffset;                                  /* ydnar: don't face cull this or against this */\r
687         qb_t                            patchShadows;                                   /* have patches casting shadows when using -light for this surface */\r
688         qb_t                            vertexShadows;                                  /* shadows will be casted at this surface even when vertex lit */\r
689         qb_t                            forceSunlight;                                  /* force sun light at this surface even tho we might not calculate shadows in vertex lighting */\r
690         qb_t                            notjunc;                                                /* don't use this surface for tjunction fixing */\r
691         qb_t                            fogParms;                                               /* ydnar: has fogparms */\r
692         qb_t                            noFog;                                                  /* ydnar: supress fogging */\r
693         \r
694         qb_t                            clipModel;                                              /* ydnar: solid model hack */\r
695         \r
696         byte                            styleMarker;                                    /* ydnar: light styles hack */\r
697         \r
698         float                           vertexScale;                                    /* vertex light scale */\r
699         \r
700         char                            skyParmsImageBase[ MAX_QPATH ]; /* ydnar: for skies */\r
701         \r
702         char                            editorImagePath[ MAX_QPATH ];   /* use this image to generate texture coordinates */\r
703         char                            lightImagePath[ MAX_QPATH ];    /* use this image to generate color / averageColor */\r
704         char                            normalImagePath[ MAX_QPATH ];   /* ydnar: normalmap image for bumpmapping */\r
705         \r
706         implicitMap_t           implicitMap;                                    /* ydnar: enemy territory implicit shaders */\r
707         char                            implicitImagePath[ MAX_QPATH ];\r
708         \r
709         image_t                         *shaderImage;\r
710         image_t                         *lightImage;\r
711         image_t                         *normalImage;\r
712         \r
713         float                           skyLightValue;                                  /* ydnar */\r
714         int                                     skyLightIterations;                             /* ydnar */\r
715         sun_t                           *sun;                                                   /* ydnar */\r
716         \r
717         vec3_t                          color;                                                  /* normalized color */\r
718         vec3_t                          averageColor;\r
719         byte                            lightStyle;\r
720         \r
721         qb_t                            lmMergable;                                             /* ydnar */\r
722         int                                     lmCustomWidth, lmCustomHeight;  /* ydnar */\r
723         float                           lmGamma;                                                /* ydnar */\r
724         float                           lmFilterRadius;                                 /* ydnar: lightmap filtering/blurring radius for this shader (default: 0) */\r
725         \r
726         int                                     shaderWidth, shaderHeight;              /* ydnar */\r
727         float                           stFlat[ 2 ];\r
728         \r
729         vec3_t                          fogDir;                                                 /* ydnar */\r
730         \r
731         char                            *shaderText;                                    /* ydnar */\r
732         qb_t                            custom;\r
733         qb_t                            finished;\r
734 }\r
735 shaderInfo_t;\r
736 \r
737 \r
738 \r
739 /* -------------------------------------------------------------------------------\r
740 \r
741 bsp structures\r
742 \r
743 ------------------------------------------------------------------------------- */\r
744 \r
745 typedef struct face_s\r
746 {\r
747         struct face_s           *next;\r
748         int                                     planenum;\r
749         int                                     priority;\r
750         qboolean                        checked;\r
751         int                                     compileFlags;\r
752         winding_t                       *w;\r
753 }\r
754 face_t;\r
755 \r
756 \r
757 typedef struct plane_s\r
758 {\r
759         vec3_t                          normal;\r
760         vec_t                           dist;\r
761         int                                     type;\r
762         struct plane_s          *hash_chain;\r
763 }\r
764 plane_t;\r
765 \r
766 \r
767 typedef struct side_s\r
768 {\r
769         int                                     planenum;\r
770         \r
771         int                                     outputNum;                      /* set when the side is written to the file list */\r
772         \r
773         float                           texMat[ 2 ][ 3 ];       /* brush primitive texture matrix */\r
774         float                           vecs[ 2 ][ 4 ];         /* old-style texture coordinate mapping */\r
775 \r
776         winding_t                       *winding;\r
777         winding_t                       *visibleHull;           /* convex hull of all visible fragments */\r
778 \r
779         shaderInfo_t            *shaderInfo;\r
780 \r
781         int                                     contentFlags;           /* from shaderInfo */\r
782         int                                     surfaceFlags;           /* from shaderInfo */\r
783         int                                     compileFlags;           /* from shaderInfo */\r
784         int                                     value;                          /* from shaderInfo */\r
785 \r
786         qboolean                        visible;                        /* choose visble planes first */\r
787         qboolean                        bevel;                          /* don't ever use for bsp splitting, and don't bother making windings for it */\r
788         qboolean                        backSide;                       /* generated side for a q3map_backShader */\r
789         \r
790         qboolean                        culled;                         /* ydnar: face culling */\r
791 }\r
792 side_t;\r
793 \r
794 \r
795 typedef struct sideRef_s\r
796 {\r
797         struct sideRef_s        *next;\r
798         side_t                          *side;\r
799 }\r
800 sideRef_t;\r
801 \r
802 \r
803 /* ydnar: generic index mapping for entities (natural extension of terrain texturing) */\r
804 typedef struct indexMap_s\r
805 {\r
806         int                                     w, h, numLayers;\r
807         char                            name[ MAX_QPATH ], shader[ MAX_QPATH ];\r
808         float                           offsets[ 256 ];\r
809         byte                            *pixels;\r
810 }\r
811 indexMap_t;\r
812 \r
813 \r
814 typedef struct brush_s\r
815 {\r
816         struct brush_s          *next;\r
817         struct brush_s          *original;                      /* chopped up brushes will reference the originals */\r
818         \r
819         int                                     entityNum, brushNum;/* editor numbering */\r
820         int                                     outputNum;                      /* set when the brush is written to the file list */\r
821         \r
822         /* ydnar: for shadowcasting entities */\r
823         int                                     castShadows;\r
824         int                                     recvShadows;\r
825         \r
826         shaderInfo_t            *contentShader;\r
827         shaderInfo_t            *celShader;                     /* :) */\r
828         \r
829         /* ydnar: gs mods */\r
830         float                           lightmapScale;\r
831         vec3_t                          eMins, eMaxs;\r
832         indexMap_t                      *im;\r
833 \r
834         int                                     contentFlags;\r
835         int                                     compileFlags;           /* ydnar */\r
836         qboolean                        detail;\r
837         qboolean                        opaque;\r
838 \r
839         int                                     portalareas[ 2 ];\r
840 \r
841         vec3_t                          mins, maxs;\r
842         int                                     numsides;\r
843         \r
844         side_t                          sides[ 6 ];                     /* variably sized */\r
845 }\r
846 brush_t;\r
847 \r
848 \r
849 typedef struct fog_s\r
850 {\r
851         shaderInfo_t            *si;\r
852         brush_t                         *brush;\r
853         int                                     visibleSide;            /* the brush side that ray tests need to clip against (-1 == none) */\r
854 }\r
855 fog_t;\r
856 \r
857 \r
858 typedef struct\r
859 {\r
860         int                                     width, height;\r
861         bspDrawVert_t           *verts;\r
862 }\r
863 mesh_t;\r
864 \r
865 \r
866 typedef struct parseMesh_s\r
867 {\r
868         struct parseMesh_s      *next;\r
869         \r
870         int                                     entityNum, brushNum;    /* ydnar: editor numbering */\r
871         \r
872         /* ydnar: for shadowcasting entities */\r
873         int                                     castShadows;\r
874         int                                     recvShadows;\r
875         \r
876         mesh_t                          mesh;\r
877         shaderInfo_t            *shaderInfo;\r
878         shaderInfo_t            *celShader;                             /* :) */\r
879         \r
880         /* ydnar: gs mods */\r
881         float                           lightmapScale;\r
882         vec3_t                          eMins, eMaxs;\r
883         indexMap_t                      *im;\r
884         \r
885         /* grouping */\r
886         qboolean                        grouped;\r
887         float                           longestCurve;\r
888         int                                     maxIterations;\r
889 }\r
890 parseMesh_t;\r
891 \r
892 \r
893 /*\r
894         ydnar: the drawsurf struct was extended to allow for:\r
895         - non-convex planar surfaces\r
896         - non-planar brushface surfaces\r
897         - lightmapped terrain\r
898         - planar patches\r
899 */\r
900 \r
901 typedef enum\r
902 {\r
903         /* ydnar: these match up exactly with bspSurfaceType_t */\r
904         SURFACE_BAD,\r
905         SURFACE_FACE,\r
906         SURFACE_PATCH,\r
907         SURFACE_TRIANGLES,\r
908         SURFACE_FLARE,\r
909         SURFACE_FOLIAGE,        /* wolf et */\r
910         \r
911         /* ydnar: compiler-relevant surface types */\r
912         SURFACE_FORCED_META,\r
913         SURFACE_META,\r
914         SURFACE_FOGHULL,\r
915         SURFACE_DECAL,\r
916         SURFACE_SHADER,\r
917         \r
918         NUM_SURFACE_TYPES\r
919 }\r
920 surfaceType_t;\r
921 \r
922 char                    *surfaceTypes[ NUM_SURFACE_TYPES ]\r
923 #ifndef MAIN_C\r
924                                 ;\r
925 #else\r
926                                 =\r
927                                 {\r
928                                         "SURFACE_BAD",\r
929                                         "SURFACE_FACE",\r
930                                         "SURFACE_PATCH",\r
931                                         "SURFACE_TRIANGLES",\r
932                                         "SURFACE_FLARE",\r
933                                         "SURFACE_FOLIAGE",\r
934                                         "SURFACE_FORCED_META",\r
935                                         "SURFACE_META",\r
936                                         "SURFACE_FOGHULL",\r
937                                         "SURFACE_DECAL",\r
938                                         "SURFACE_SHADER"\r
939                                 };\r
940 #endif\r
941 \r
942 \r
943 /* ydnar: this struct needs an overhaul (again, heh) */\r
944 typedef struct mapDrawSurface_s\r
945 {\r
946         surfaceType_t           type;\r
947         qboolean                        planar;\r
948         int                                     outputNum;                      /* ydnar: to match this sort of thing up */\r
949         \r
950         qboolean                        fur;                            /* ydnar: this is kind of a hack, but hey... */\r
951         qboolean                        skybox;                         /* ydnar: yet another fun hack */\r
952         \r
953         struct mapDrawSurface_s *parent;                /* ydnar: for cloned (skybox) surfaces to share lighting data */\r
954         \r
955         shaderInfo_t            *shaderInfo;\r
956         shaderInfo_t            *celShader;\r
957         brush_t                         *mapBrush;\r
958         parseMesh_t                     *mapMesh;\r
959         sideRef_t                       *sideRef;\r
960         \r
961         int                                     fogNum;\r
962         \r
963         int                                     numVerts;                       /* vertexes and triangles */\r
964         bspDrawVert_t           *verts;\r
965         int                                     numIndexes;\r
966         int                                     *indexes;\r
967         \r
968         int                                     planeNum;\r
969         vec3_t                          lightmapOrigin;         /* also used for flares */\r
970         vec3_t                          lightmapVecs[ 3 ];      /* also used for flares */\r
971         int                                     lightStyle;                     /* used for flares */\r
972         \r
973         /* ydnar: per-surface (per-entity, actually) lightmap sample size scaling */\r
974         float                           lightmapScale;\r
975         \r
976         /* ydnar: surface classification */\r
977         vec3_t                          mins, maxs;\r
978         vec3_t                          lightmapAxis;\r
979         int                                     sampleSize;\r
980         \r
981         /* ydnar: shadow group support */\r
982         int                                     castShadows, recvShadows;\r
983         \r
984         /* ydnar: texture coordinate range monitoring for hardware with limited texcoord precision (in texel space) */\r
985         float                           bias[ 2 ];\r
986         int                                     texMins[ 2 ], texMaxs[ 2 ], texRange[ 2 ];\r
987                 \r
988         /* ydnar: for patches */\r
989         float                           longestCurve;\r
990         int                                     maxIterations;\r
991         int                                     patchWidth, patchHeight;\r
992         vec3_t                          bounds[ 2 ];\r
993         \r
994         /* ydnar/sd: for foliage */\r
995         int                                     numFoliageInstances;\r
996         \r
997         /* ydnar: editor/useful numbering */\r
998         int                                     entityNum;\r
999         int                                     surfaceNum;\r
1000 }\r
1001 mapDrawSurface_t;\r
1002 \r
1003 \r
1004 typedef struct drawSurfRef_s\r
1005 {\r
1006         struct drawSurfRef_s    *nextRef;\r
1007         int                                     outputNum;\r
1008 }\r
1009 drawSurfRef_t;\r
1010 \r
1011 \r
1012 /* ydnar: metasurfaces are constructed from lists of metatriangles so they can be merged in the best way */\r
1013 typedef struct metaTriangle_s\r
1014 {\r
1015         shaderInfo_t            *si;\r
1016         side_t                          *side;\r
1017         int                                     entityNum, surfaceNum, planeNum, fogNum, sampleSize, castShadows, recvShadows;\r
1018         vec4_t                          plane;\r
1019         vec3_t                          lightmapAxis;\r
1020         int                                     indexes[ 3 ];\r
1021 }\r
1022 metaTriangle_t;\r
1023 \r
1024 \r
1025 typedef struct epair_s\r
1026 {\r
1027         struct epair_s          *next;\r
1028         char                            *key, *value;\r
1029 }\r
1030 epair_t;\r
1031 \r
1032 \r
1033 typedef struct\r
1034 {\r
1035         vec3_t                          origin;\r
1036         brush_t                         *brushes, *lastBrush;\r
1037         parseMesh_t                     *patches;\r
1038         int                                     mapEntityNum, firstDrawSurf;\r
1039         int                                     firstBrush, numBrushes;         /* only valid during BSP compile */\r
1040         epair_t                         *epairs;\r
1041 }\r
1042 entity_t;\r
1043 \r
1044 \r
1045 typedef struct node_s\r
1046 {\r
1047         /* both leafs and nodes */\r
1048         int                                     planenum;               /* -1 = leaf node */\r
1049         struct node_s           *parent;\r
1050         vec3_t                          mins, maxs;             /* valid after portalization */\r
1051         brush_t                         *volume;                /* one for each leaf/node */\r
1052 \r
1053         /* nodes only */\r
1054         side_t                          *side;                  /* the side that created the node */\r
1055         struct node_s           *children[ 2 ];\r
1056         int                                     compileFlags;   /* ydnar: hint, antiportal */\r
1057         int                                     tinyportals;\r
1058         vec3_t                          referencepoint;\r
1059 \r
1060         /* leafs only */\r
1061         qboolean                        opaque;                 /* view can never be inside */\r
1062         qboolean                        areaportal;\r
1063         qboolean                        skybox;                 /* ydnar: a skybox leaf */\r
1064         qboolean                        sky;                    /* ydnar: a sky leaf */\r
1065         int                                     cluster;                /* for portalfile writing */\r
1066         int                                     area;                   /* for areaportals */\r
1067         brush_t                         *brushlist;             /* fragments of all brushes in this leaf */\r
1068         drawSurfRef_t           *drawSurfReferences;\r
1069 \r
1070         int                                     occupied;               /* 1 or greater can reach entity */\r
1071         entity_t                        *occupant;              /* for leak file testing */\r
1072 \r
1073         struct portal_s         *portals;               /* also on nodes during construction */\r
1074 }\r
1075 node_t;\r
1076 \r
1077 \r
1078 typedef struct portal_s\r
1079 {\r
1080         plane_t                         plane;\r
1081         node_t                          *onnode;                /* NULL = outside box */\r
1082         node_t                          *nodes[ 2 ];    /* [ 0 ] = front side of plane */\r
1083         struct portal_s         *next[ 2 ];\r
1084         winding_t                       *winding;\r
1085 \r
1086         qboolean                        sidefound;              /* false if ->side hasn't been checked */\r
1087         int                                     compileFlags;   /* from original face that caused the split */\r
1088         side_t                          *side;                  /* NULL = non-visible */\r
1089 }\r
1090 portal_t;\r
1091 \r
1092 \r
1093 typedef struct\r
1094 {\r
1095         node_t                          *headnode;\r
1096         node_t                          outside_node;\r
1097         vec3_t                          mins, maxs;\r
1098 }\r
1099 tree_t;\r
1100 \r
1101 \r
1102 \r
1103 /* -------------------------------------------------------------------------------\r
1104 \r
1105 vis structures\r
1106 \r
1107 ------------------------------------------------------------------------------- */\r
1108 \r
1109 typedef struct\r
1110 {\r
1111         vec3_t                          normal;\r
1112         float                           dist;\r
1113 }\r
1114 visPlane_t;\r
1115 \r
1116 \r
1117 typedef struct\r
1118 {\r
1119         int                                     numpoints;\r
1120         vec3_t                          points[ MAX_POINTS_ON_FIXED_WINDING     ];              /* variable sized */\r
1121\r
1122 fixedWinding_t;\r
1123 \r
1124 \r
1125 typedef struct passage_s\r
1126 {\r
1127         struct passage_s        *next;\r
1128         byte                            cansee[ 1 ];    /* all portals that can be seen through this passage */\r
1129 } passage_t;\r
1130 \r
1131 \r
1132 typedef enum\r
1133 {\r
1134         stat_none,\r
1135         stat_working,\r
1136         stat_done\r
1137 }\r
1138 vstatus_t;\r
1139 \r
1140 \r
1141 typedef struct\r
1142 {\r
1143         int                                     num;\r
1144         qboolean                        hint;                   /* true if this portal was created from a hint splitter */\r
1145         qboolean                        removed;\r
1146         visPlane_t                      plane;                  /* normal pointing into neighbor */\r
1147         int                                     leaf;                   /* neighbor */\r
1148         \r
1149         vec3_t                          origin;                 /* for fast clip testing */\r
1150         float                           radius;\r
1151 \r
1152         fixedWinding_t          *winding;\r
1153         vstatus_t                       status;\r
1154         byte                            *portalfront;   /* [portals], preliminary */\r
1155         byte                            *portalflood;   /* [portals], intermediate */\r
1156         byte                            *portalvis;             /* [portals], final */\r
1157 \r
1158         int                                     nummightsee;    /* bit count on portalflood for sort */\r
1159         passage_t                       *passages;              /* there are just as many passages as there */\r
1160                                                                                 /* are portals in the leaf this portal leads */\r
1161 }\r
1162 vportal_t;\r
1163 \r
1164 \r
1165 typedef struct leaf_s\r
1166 {\r
1167         int                                     numportals;\r
1168         int                                     merged;\r
1169         vportal_t                       *portals[MAX_PORTALS_ON_LEAF];\r
1170 }\r
1171 leaf_t;\r
1172 \r
1173         \r
1174 typedef struct pstack_s\r
1175 {\r
1176         byte                            mightsee[ MAX_PORTALS / 8 ];\r
1177         struct pstack_s         *next;\r
1178         leaf_t                          *leaf;\r
1179         vportal_t                       *portal;                /* portal exiting */\r
1180         fixedWinding_t          *source;\r
1181         fixedWinding_t          *pass;\r
1182 \r
1183         fixedWinding_t          windings[ 3 ];  /* source, pass, temp in any order */\r
1184         int                                     freewindings[ 3 ];\r
1185 \r
1186         visPlane_t                      portalplane;\r
1187         int depth;\r
1188 #ifdef SEPERATORCACHE\r
1189         visPlane_t                      seperators[ 2 ][ MAX_SEPERATORS ];\r
1190         int                                     numseperators[ 2 ];\r
1191 #endif\r
1192 }\r
1193 pstack_t;\r
1194 \r
1195 \r
1196 typedef struct\r
1197 {\r
1198         vportal_t                       *base;\r
1199         int                                     c_chains;\r
1200         pstack_t                        pstack_head;\r
1201 }\r
1202 threaddata_t;\r
1203 \r
1204 \r
1205 \r
1206 /* -------------------------------------------------------------------------------\r
1207 \r
1208 light structures\r
1209 \r
1210 ------------------------------------------------------------------------------- */\r
1211 \r
1212 /* ydnar: new light struct with flags */\r
1213 typedef struct light_s\r
1214 {\r
1215         struct light_s          *next;\r
1216         \r
1217         int                                     type;\r
1218         int                                     flags;                  /* ydnar: condensed all the booleans into one flags int */\r
1219         shaderInfo_t            *si;\r
1220         \r
1221         vec3_t                          origin;\r
1222         vec3_t                          normal;                 /* for surfaces, spotlights, and suns */\r
1223         float                           dist;                   /* plane location along normal */\r
1224         \r
1225         float                           photons;\r
1226         int                                     style;\r
1227         vec3_t                          color;\r
1228         float                           radiusByDist;   /* for spotlights */\r
1229         float                           fade;                   /* ydnar: from wolf, for linear lights */\r
1230         float                           angleScale;             /* ydnar: stolen from vlight for K */\r
1231 \r
1232         float                           add;                    /* ydnar: used for area lights */\r
1233         float                           envelope;               /* ydnar: units until falloff < tolerance */\r
1234         float                           envelope2;              /* ydnar: envelope squared (tiny optimization) */\r
1235         vec3_t                          mins, maxs;             /* ydnar: pvs envelope */\r
1236         int                                     cluster;                /* ydnar: cluster light falls into */\r
1237         \r
1238         winding_t                       *w;\r
1239         vec3_t                          emitColor;              /* full out-of-gamut value */\r
1240         \r
1241         float                           falloffTolerance;       /* ydnar: minimum attenuation threshold */\r
1242         float                           filterRadius;   /* ydnar: lightmap filter radius in world units, 0 == default */\r
1243 }\r
1244 light_t;\r
1245 \r
1246 \r
1247 typedef struct\r
1248 {\r
1249         /* constant input */\r
1250         qboolean                        testOcclusion, forceSunlight, testAll;\r
1251         int                                     recvShadows;\r
1252         \r
1253         int                                     numSurfaces;\r
1254         int                                     *surfaces;\r
1255         \r
1256         int                                     numLights;\r
1257         light_t                         **lights;\r
1258         \r
1259         qboolean                        twoSided;\r
1260         \r
1261         /* per-sample input */\r
1262         int                                     cluster;\r
1263         vec3_t                          origin, normal;\r
1264         vec_t                           inhibitRadius;  /* sphere in which occluding geometry is ignored */\r
1265         \r
1266         /* per-light input */\r
1267         light_t                         *light;\r
1268         vec3_t                          end;\r
1269         \r
1270         /* calculated input */\r
1271         vec3_t                          displacement, direction;\r
1272         vec_t                           distance;\r
1273         \r
1274         /* input and output */\r
1275         vec3_t                          color;                  /* starts out at full color, may be reduced if transparent surfaces are crossed */\r
1276         \r
1277         /* output */\r
1278         int                                     compileFlags;   /* for determining surface compile flags traced through */\r
1279         qboolean                        passSolid;\r
1280         qboolean                        opaque;\r
1281         \r
1282         /* working data */\r
1283         int                                     numTestNodes;\r
1284         int                                     testNodes[ MAX_TRACE_TEST_NODES ]; \r
1285 }\r
1286 trace_t;\r
1287 \r
1288 \r
1289 \r
1290 /* must be identical to bspDrawVert_t except for float color! */\r
1291 typedef struct\r
1292 {\r
1293         vec3_t                          xyz;\r
1294         float                           st[ 2 ];\r
1295         float                           lightmap[ MAX_LIGHTMAPS ][ 2 ];\r
1296         vec3_t                          normal;\r
1297         float                           color[ MAX_LIGHTMAPS ][ 4 ];\r
1298 }\r
1299 radVert_t;\r
1300 \r
1301 \r
1302 typedef struct\r
1303 {\r
1304         int                                     numVerts;\r
1305         radVert_t                       verts[ MAX_POINTS_ON_WINDING ];\r
1306 }\r
1307 radWinding_t;\r
1308 \r
1309 \r
1310 /* crutch for poor local allocations in win32 smp */\r
1311 typedef struct\r
1312 {\r
1313         vec_t                           dists[ MAX_POINTS_ON_WINDING + 4 ];\r
1314         int                                     sides[ MAX_POINTS_ON_WINDING + 4 ];\r
1315 }\r
1316 clipWork_t;\r
1317 \r
1318 \r
1319 /* ydnar: new lightmap handling code */\r
1320 typedef struct outLightmap_s\r
1321 {\r
1322         int                                     lightmapNum, extLightmapNum;\r
1323         int                                     customWidth, customHeight;\r
1324         int                                     numLightmaps;\r
1325         int                                     freeLuxels;\r
1326         int                                     numShaders;\r
1327         shaderInfo_t            *shaders[ MAX_LIGHTMAP_SHADERS ];\r
1328         byte                            *lightBits;\r
1329         byte                            *bspLightBytes;\r
1330         byte                            *bspDirBytes;\r
1331 }\r
1332 outLightmap_t;\r
1333 \r
1334 \r
1335 typedef struct rawLightmap_s\r
1336 {\r
1337         qboolean                                finished, splotchFix, wrap[ 2 ];\r
1338         int                                             customWidth, customHeight;\r
1339         float                                   gamma;\r
1340         float                                   filterRadius;\r
1341         \r
1342         int                                             firstLightSurface, numLightSurfaces;    /* index into lightSurfaces */\r
1343         int                                             numLightClusters, *lightClusters;\r
1344         \r
1345         int                                             sampleSize, actualSampleSize, axisNum;\r
1346         int                                             entityNum;\r
1347         int                                             recvShadows;\r
1348         vec3_t                                  mins, maxs, axis, origin, *vecs;\r
1349         float                                   *plane;\r
1350         int                                             w, h, sw, sh, used;\r
1351         \r
1352         int                                             numStyledTwins;\r
1353         struct rawLightmap_s    *twins[ MAX_LIGHTMAPS ];\r
1354 \r
1355         int                                             outLightmapNums[ MAX_LIGHTMAPS ];\r
1356         int                                             twinNums[ MAX_LIGHTMAPS ];\r
1357         int                                             lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ];\r
1358         byte                                    styles[ MAX_LIGHTMAPS ];\r
1359         float                                   *bspLuxels[ MAX_LIGHTMAPS ];\r
1360         float                                   *radLuxels[ MAX_LIGHTMAPS ];\r
1361         float                                   *superLuxels[ MAX_LIGHTMAPS ];\r
1362         float                                   *superOrigins;\r
1363         float                                   *superNormals;\r
1364         int                                             *superClusters;\r
1365         \r
1366         float                                   *superDeluxels; /* average light direction */\r
1367         float                                   *bspDeluxels;\r
1368 }\r
1369 rawLightmap_t;\r
1370 \r
1371 \r
1372 typedef struct rawGridPoint_s\r
1373 {\r
1374         vec3_t                          ambient[ MAX_LIGHTMAPS ];\r
1375         vec3_t                          directed[ MAX_LIGHTMAPS ];\r
1376         vec3_t                          dir;\r
1377         byte                            styles[ MAX_LIGHTMAPS ];\r
1378 }\r
1379 rawGridPoint_t;\r
1380 \r
1381 \r
1382 typedef struct surfaceInfo_s\r
1383 {\r
1384         bspModel_t                      *model;\r
1385         shaderInfo_t            *si;\r
1386         rawLightmap_t           *lm;\r
1387         int                                     parentSurfaceNum, childSurfaceNum;\r
1388         int                                     entityNum, castShadows, recvShadows, sampleSize, patchIterations;\r
1389         float                           longestCurve;\r
1390         float                           *plane;\r
1391         vec3_t                          axis, mins, maxs;\r
1392         qboolean                        hasLightmap, approximated;\r
1393         int                                     firstSurfaceCluster, numSurfaceClusters;\r
1394 }\r
1395 surfaceInfo_t;\r
1396 \r
1397 \r
1398 \r
1399 /* -------------------------------------------------------------------------------\r
1400 \r
1401 prototypes\r
1402 \r
1403 ------------------------------------------------------------------------------- */\r
1404 \r
1405 /* main.c */\r
1406 vec_t                                           Random( void );\r
1407 int                                                     BSPInfo( int count, char **fileNames );\r
1408 int                                                     ScaleBSPMain( int argc, char **argv );\r
1409 int                                                     ConvertMain( int argc, char **argv );\r
1410 \r
1411 \r
1412 /* path_init.c */\r
1413 void                                            InitPaths( int *argc, char **argv );\r
1414 \r
1415 \r
1416 /* bsp.c */\r
1417 int                                                     BSPMain( int argc, char **argv );\r
1418 \r
1419 \r
1420 /* convert_map.c */\r
1421 int                                                     ConvertBSPToMap( char *bspName );\r
1422 \r
1423 \r
1424 /* convert_ase.c */\r
1425 int                                                     ConvertBSPToASE( char *bspName );\r
1426 \r
1427 \r
1428 /* brush.c */\r
1429 sideRef_t                                       *AllocSideRef( side_t *side, sideRef_t *next );\r
1430 int                                                     CountBrushList( brush_t *brushes );\r
1431 brush_t                                         *AllocBrush( int numsides );\r
1432 void                                            FreeBrush( brush_t *brushes );\r
1433 void                                            FreeBrushList( brush_t *brushes );\r
1434 brush_t                                         *CopyBrush( brush_t *brush );\r
1435 qboolean                                        BoundBrush( brush_t *brush );\r
1436 qboolean                                        CreateBrushWindings( brush_t *brush );\r
1437 brush_t                                         *BrushFromBounds( vec3_t mins, vec3_t maxs );\r
1438 vec_t                                           BrushVolume( brush_t *brush );\r
1439 void                                            WriteBSPBrushMap( char *name, brush_t *list );\r
1440 \r
1441 void                                            FilterDetailBrushesIntoTree( entity_t *e, tree_t *tree );\r
1442 void                                            FilterStructuralBrushesIntoTree( entity_t *e, tree_t *tree );\r
1443 \r
1444 int                                                     BoxOnPlaneSide( vec3_t mins, vec3_t maxs, plane_t *plane );\r
1445 qboolean                                        WindingIsTiny( winding_t *w );\r
1446 \r
1447 void                                            SplitBrush( brush_t *brush, int planenum, brush_t **front, brush_t **back);\r
1448 \r
1449 tree_t                                          *AllocTree( void );\r
1450 node_t                                          *AllocNode( void );\r
1451 \r
1452 \r
1453 /* mesh.c */\r
1454 void                                            LerpDrawVert( bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *out );\r
1455 void                                            LerpDrawVertAmount( bspDrawVert_t *a, bspDrawVert_t *b, float amount, bspDrawVert_t *out );\r
1456 void                                            FreeMesh( mesh_t *m );\r
1457 mesh_t                                          *CopyMesh( mesh_t *mesh );\r
1458 void                                            PrintMesh( mesh_t *m );\r
1459 mesh_t                                          *TransposeMesh( mesh_t *in );\r
1460 void                                            InvertMesh( mesh_t *m );\r
1461 mesh_t                                          *SubdivideMesh( mesh_t in, float maxError, float minLength );\r
1462 int                                                     IterationsForCurve( float len, int subdivisions );\r
1463 mesh_t                                          *SubdivideMesh2( mesh_t in, int iterations );\r
1464 mesh_t                                          *SubdivideMeshQuads( mesh_t *in, float minLength, int maxsize, int *widthtable, int *heighttable );\r
1465 mesh_t                                          *RemoveLinearMeshColumnsRows( mesh_t *in );\r
1466 void                                            MakeMeshNormals( mesh_t in );\r
1467 void                                            PutMeshOnCurve( mesh_t in );\r
1468 \r
1469 void                                            MakeNormalVectors( vec3_t forward, vec3_t right, vec3_t up );\r
1470 \r
1471 \r
1472 /* map.c */\r
1473 void                                            LoadMapFile( char *filename, qboolean onlyLights );\r
1474 int                                                     FindFloatPlane( vec3_t normal, vec_t dist, int numPoints, vec3_t *points );\r
1475 int                                                     PlaneTypeForNormal( vec3_t normal );\r
1476 void                                            AddBrushBevels( void );\r
1477 brush_t                                         *FinishBrush( void );\r
1478 \r
1479 \r
1480 /* portals.c */\r
1481 void                                            MakeHeadnodePortals( tree_t *tree );\r
1482 void                                            MakeNodePortal( node_t *node );\r
1483 void                                            SplitNodePortals( node_t *node );\r
1484 \r
1485 qboolean                                        PortalPassable( portal_t *p );\r
1486 \r
1487 qboolean                                        FloodEntities( tree_t *tree );\r
1488 void                                            FillOutside( node_t *headnode);\r
1489 void                                            FloodAreas( tree_t *tree);\r
1490 face_t                                          *VisibleFaces( entity_t *e, tree_t *tree );\r
1491 void                                            FreePortal( portal_t *p );\r
1492 \r
1493 void                                            MakeTreePortals( tree_t *tree );\r
1494 \r
1495 \r
1496 /* leakfile.c */\r
1497 xmlNodePtr                                      LeakFile( tree_t *tree );\r
1498 \r
1499 \r
1500 /* prtfile.c */\r
1501 void                                            NumberClusters( tree_t *tree );\r
1502 void                                            WritePortalFile( tree_t *tree );\r
1503 \r
1504 \r
1505 /* writebsp.c */\r
1506 void                                            SetModelNumbers( void );\r
1507 void                                            SetLightStyles( void );\r
1508 \r
1509 int                                                     EmitShader( const char *shader, int *contentFlags, int *surfaceFlags );\r
1510 \r
1511 void                                            BeginBSPFile( void );\r
1512 void                                            EndBSPFile( void );\r
1513 void                                            EmitBrushes( brush_t *brushes, int *firstBrush, int *numBrushes );\r
1514 void                                            EmitFogs( void );\r
1515 \r
1516 void                                            BeginModel( void );\r
1517 void                                            EndModel( entity_t *e, node_t *headnode );\r
1518 \r
1519 \r
1520 /* tree.c */\r
1521 void                                            FreeTree( tree_t *tree );\r
1522 void                                            FreeTree_r( node_t *node );\r
1523 void                                            PrintTree_r( node_t *node, int depth );\r
1524 void                                            FreeTreePortals_r( node_t *node );\r
1525 \r
1526 \r
1527 /* patch.c */\r
1528 void                                            ParsePatch( qboolean onlyLights );\r
1529 mesh_t                                          *SubdivideMesh( mesh_t in, float maxError, float minLength );\r
1530 void                                            PatchMapDrawSurfs( entity_t *e );\r
1531 \r
1532 \r
1533 /* tjunction.c */\r
1534 void                                            FixTJunctions( entity_t *e );\r
1535 \r
1536 \r
1537 /* fog.c */\r
1538 winding_t                                       *WindingFromDrawSurf( mapDrawSurface_t *ds );\r
1539 void                                            FogDrawSurfaces( entity_t *e );\r
1540 int                                                     FogForPoint( vec3_t point, float epsilon );\r
1541 int                                                     FogForBounds( vec3_t mins, vec3_t maxs, float epsilon );\r
1542 void                                            CreateMapFogs( void );\r
1543 \r
1544 \r
1545 /* facebsp.c */\r
1546 face_t                                          *MakeStructuralBSPFaceList( brush_t *list );\r
1547 face_t                                          *MakeVisibleBSPFaceList( brush_t *list );\r
1548 tree_t                                          *FaceBSP( face_t *list );\r
1549 \r
1550 \r
1551 /* model.c */\r
1552 void                                            PicoPrintFunc( int level, const char *str );\r
1553 void                                            PicoLoadFileFunc( char *name, byte **buffer, int *bufSize );\r
1554 picoModel_t                                     *FindModel( char *name, int frame );\r
1555 picoModel_t                                     *LoadModel( char *name, int frame );\r
1556 void                                            InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale );\r
1557 void                                            AddTriangleModels( entity_t *e );\r
1558 \r
1559 \r
1560 /* surface.c */\r
1561 mapDrawSurface_t                        *AllocDrawSurface( surfaceType_t type );\r
1562 void                                            FinishSurface( mapDrawSurface_t *ds );\r
1563 void                                            StripFaceSurface( mapDrawSurface_t *ds );\r
1564 qboolean                                        CalcSurfaceTextureRange( mapDrawSurface_t *ds );\r
1565 qboolean                                        CalcLightmapAxis( vec3_t normal, vec3_t axis );\r
1566 void                                            ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds );\r
1567 void                                            ClassifyEntitySurfaces( entity_t *e );\r
1568 void                                            TidyEntitySurfaces( entity_t *e );\r
1569 mapDrawSurface_t                        *CloneSurface( mapDrawSurface_t *src, shaderInfo_t *si );\r
1570 mapDrawSurface_t                        *MakeCelSurface( mapDrawSurface_t *src, shaderInfo_t *si );\r
1571 qboolean                                        IsTriangleDegenerate( bspDrawVert_t *points, int a, int b, int c );\r
1572 void                                            ClearSurface( mapDrawSurface_t *ds );\r
1573 void                                            AddEntitySurfaceModels( entity_t *e );\r
1574 mapDrawSurface_t                        *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, winding_t *w );\r
1575 mapDrawSurface_t                        *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh );\r
1576 mapDrawSurface_t                        *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, vec3_t color, char *flareShader, int lightStyle );\r
1577 mapDrawSurface_t                        *DrawSurfaceForShader( char *shader );\r
1578 void                                            ClipSidesIntoTree( entity_t *e, tree_t *tree );\r
1579 void                                            MakeDebugPortalSurfs( tree_t *tree );\r
1580 void                                            MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader );\r
1581 void                                            SubdivideFaceSurfaces( entity_t *e, tree_t *tree );\r
1582 void                                            AddEntitySurfaceModels( entity_t *e );\r
1583 int                                                     AddSurfaceModels( mapDrawSurface_t *ds );\r
1584 void                                            FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree );\r
1585 \r
1586 \r
1587 /* surface_fur.c */\r
1588 void                                            Fur( mapDrawSurface_t *src );\r
1589 \r
1590 \r
1591 /* surface_foliage.c */\r
1592 void                                            Foliage( mapDrawSurface_t *src );\r
1593 \r
1594 \r
1595 /* ydnar: surface_meta.c */\r
1596 void                                            ClearMetaTriangles( void );\r
1597 int                                                     FindMetaTriangle( metaTriangle_t *src, bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *c, int planeNum );\r
1598 void                                            MakeEntityMetaTriangles( entity_t *e );\r
1599 void                                            FixMetaTJunctions( void );\r
1600 void                                            SmoothMetaTriangles( void );\r
1601 void                                            MergeMetaTriangles( void );\r
1602 \r
1603 \r
1604 /* surface_extra.c */\r
1605 void                                            SetDefaultSampleSize( int sampleSize );\r
1606 \r
1607 void                                            SetSurfaceExtra( mapDrawSurface_t *ds, int num );\r
1608 \r
1609 shaderInfo_t                            *GetSurfaceExtraShaderInfo( int num );\r
1610 int                                                     GetSurfaceExtraParentSurfaceNum( int num );\r
1611 int                                                     GetSurfaceExtraEntityNum( int num );\r
1612 int                                                     GetSurfaceExtraCastShadows( int num );\r
1613 int                                                     GetSurfaceExtraRecvShadows( int num );\r
1614 int                                                     GetSurfaceExtraSampleSize( int num );\r
1615 float                                           GetSurfaceExtraLongestCurve( int num );\r
1616 void                                            GetSurfaceExtraLightmapAxis( int num, vec3_t lightmapAxis );\r
1617 \r
1618 void                                            WriteSurfaceExtraFile( const char *path );\r
1619 void                                            LoadSurfaceExtraFile( const char *path );\r
1620 \r
1621 \r
1622 /* decals.c */\r
1623 void                                            ProcessDecals( void );\r
1624 void                                            MakeEntityDecals( entity_t *e );\r
1625 \r
1626 \r
1627 /* brush_primit.c */\r
1628 void                                            ComputeAxisBase( vec3_t normal, vec3_t texX, vec3_t texY);\r
1629 \r
1630 \r
1631 /* vis.c */\r
1632 fixedWinding_t                          *NewFixedWinding( int points );\r
1633 int                                                     VisMain( int argc, char **argv );\r
1634 \r
1635 /* visflow.c */\r
1636 int                                                     CountBits( byte *bits, int numbits );\r
1637 void                                            PassageFlow( int portalnum );\r
1638 void                                            CreatePassages( int portalnum );\r
1639 void                                            PassageMemory( void );\r
1640 void                                            BasePortalVis( int portalnum );\r
1641 void                                            BetterPortalVis( int portalnum );\r
1642 void                                            PortalFlow( int portalnum );\r
1643 void                                            PassagePortalFlow( int portalnum );\r
1644 \r
1645 \r
1646 \r
1647 /* light.c  */\r
1648 float                                           PointToPolygonFormFactor( const vec3_t point, const vec3_t normal, const winding_t *w );\r
1649 int                                                     LightContributionToSample( trace_t *trace );\r
1650 void                                            LightingAtSample( trace_t *trace, byte styles[ MAX_LIGHTMAPS ], vec3_t colors[ MAX_LIGHTMAPS ] );\r
1651 int                                                     LightContributionToPoint( trace_t *trace );\r
1652 int                                                     LightMain( int argc, char **argv );\r
1653 \r
1654 \r
1655 /* light_trace.c */\r
1656 void                                            SetupTraceNodes( void );\r
1657 void                                            TraceLine( trace_t *trace );\r
1658 float                                           SetupTrace( trace_t *trace );\r
1659 \r
1660 \r
1661 /* light_bounce.c */\r
1662 qboolean                                        RadSampleImage( byte *pixels, int width, int height, float st[ 2 ], float color[ 4 ] );\r
1663 void                                            RadLightForTriangles( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw );\r
1664 void                                            RadLightForPatch( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw );\r
1665 void                                            RadCreateDiffuseLights( void );\r
1666 void                                            RadFreeLights();\r
1667 \r
1668 \r
1669 /* light_ydnar.c */\r
1670 void                                            ColorToBytes( const float *color, byte *colorBytes, float scale );\r
1671 void                                            SmoothNormals( void );\r
1672 \r
1673 void                                            MapRawLightmap( int num );\r
1674 void                                            IlluminateRawLightmap( int num );\r
1675 void                                            IlluminateVertexes( int num );\r
1676 \r
1677 void                                            SetupBrushes( void );\r
1678 void                                            SetupClusters( void );\r
1679 qboolean                                        ClusterVisible( int a, int b );\r
1680 qboolean                                        ClusterVisibleToPoint( vec3_t point, int cluster );\r
1681 int                                                     ClusterForPoint( vec3_t point );\r
1682 int                                                     ClusterForPointExt( vec3_t point, float epsilon );\r
1683 int                                                     ClusterForPointExtFilter( vec3_t point, float epsilon, int numClusters, int *clusters );\r
1684 int                                                     ShaderForPointInLeaf( vec3_t point, int leafNum, float epsilon, int wantContentFlags, int wantSurfaceFlags, int *contentFlags, int *surfaceFlags );\r
1685 void                                            SetupEnvelopes( qboolean forGrid, qboolean fastFlag );\r
1686 void                                            FreeTraceLights( trace_t *trace );\r
1687 void                                            CreateTraceLightsForBounds( vec3_t mins, vec3_t maxs, vec3_t normal, int numClusters, int *clusters, int flags, trace_t *trace );\r
1688 void                                            CreateTraceLightsForSurface( int num, trace_t *trace );\r
1689 \r
1690 \r
1691 /* lightmaps_ydnar.c */\r
1692 void                                            ExportLightmaps( void );\r
1693 \r
1694 int                                                     ExportLightmapsMain( int argc, char **argv );\r
1695 int                                                     ImportLightmapsMain( int argc, char **argv );\r
1696 \r
1697 void                                            SetupSurfaceLightmaps( void );\r
1698 void                                            StitchSurfaceLightmaps( void );\r
1699 void                                            StoreSurfaceLightmaps( void );\r
1700 \r
1701 \r
1702 /* image.c */\r
1703 void                                            ImageFree( image_t *image );\r
1704 image_t                                         *ImageFind( const char *filename );\r
1705 image_t                                         *ImageLoad( const char *filename );\r
1706 \r
1707 \r
1708 /* shaders.c */\r
1709 void                                            AlphaMod( alphaMod_t *am, int numVerts, bspDrawVert_t *drawVerts );\r
1710 \r
1711 void                                            TcMod( tcMod_t mod, float st[ 2 ] );\r
1712 void                                            TcModIdentity( tcMod_t mod );\r
1713 void                                            TcModMultiply( tcMod_t a, tcMod_t b, tcMod_t out );\r
1714 void                                            TcModTranslate( tcMod_t mod, float s, float t );\r
1715 void                                            TcModScale( tcMod_t mod, float s, float t );\r
1716 void                                            TcModRotate( tcMod_t mod, float euler );\r
1717 \r
1718 qboolean                                        ApplySurfaceParm( char *name, int *contentFlags, int *surfaceFlags, int *compileFlags );\r
1719 \r
1720 void                                            BeginMapShaderFile( const char *mapFile );\r
1721 void                                            WriteMapShaderFile( void );\r
1722 shaderInfo_t                            *CustomShader( shaderInfo_t *si, char *find, char *replace );\r
1723 void                                            EmitVertexRemapShader( char *from, char *to );\r
1724 \r
1725 void                                            LoadShaderInfo( void );\r
1726 shaderInfo_t                            *ShaderInfoForShader( const char *shader );\r
1727 \r
1728 \r
1729 /* bspfile_abstract.c */\r
1730 void                                            SetGridPoints( int n );\r
1731 void                                            SetDrawVerts( int n );\r
1732 void                                            IncDrawVerts();\r
1733 void                                            SetDrawSurfaces(int n);\r
1734 void                                            SetDrawSurfacesBuffer();\r
1735 void                                            BSPFilesCleanup();\r
1736 \r
1737 void                                            SwapBlock( int *block, int size );\r
1738 \r
1739 int                                                     GetLumpElements( bspHeader_t *header, int lump, int size );\r
1740 void                                            *GetLump( bspHeader_t *header, int lump );\r
1741 int                                                     CopyLump( bspHeader_t *header, int lump, void *dest, int size );\r
1742 void                                            AddLump( FILE *file, bspHeader_t *header, int lumpNum, const void *data, int length );\r
1743 \r
1744 void                                            LoadBSPFile( const char *filename );\r
1745 void                                            WriteBSPFile( const char *filename );\r
1746 void                                            PrintBSPFileSizes( void );\r
1747 \r
1748 epair_t                                         *ParseEPair( void );\r
1749 void                                            ParseEntities( void );\r
1750 void                                            UnparseEntities( void );\r
1751 void                                            PrintEntity( const entity_t *ent );\r
1752 void                                            SetKeyValue( entity_t *ent, const char *key, const char *value );\r
1753 const char                                      *ValueForKey( const entity_t *ent, const char *key );\r
1754 int                                                     IntForKey( const entity_t *ent, const char *key );\r
1755 vec_t                                           FloatForKey( const entity_t *ent, const char *key );\r
1756 void                                            GetVectorForKey( const entity_t *ent, const char *key, vec3_t vec );\r
1757 entity_t                                        *FindTargetEntity( const char *target );\r
1758 void                                            GetEntityShadowFlags( const entity_t *ent, const entity_t *ent2, int *castShadows, int *recvShadows );\r
1759 \r
1760 \r
1761 /* bspfile_ibsp.c */\r
1762 void                                            LoadIBSPFile( const char *filename );\r
1763 void                                            WriteIBSPFile( const char *filename );\r
1764 \r
1765 \r
1766 /* bspfile_rbsp.c */\r
1767 void                                            LoadRBSPFile( const char *filename );\r
1768 void                                            WriteRBSPFile( const char *filename );\r
1769 \r
1770 \r
1771 \r
1772 /* -------------------------------------------------------------------------------\r
1773 \r
1774 bsp/general global variables\r
1775 \r
1776 ------------------------------------------------------------------------------- */\r
1777 \r
1778 #ifdef MAIN_C\r
1779         #define Q_EXTERN\r
1780         #define Q_ASSIGN( a )   = a\r
1781 #else\r
1782         #define Q_EXTERN extern\r
1783         #define Q_ASSIGN( a )   \r
1784 #endif\r
1785 \r
1786 /* game support */\r
1787 Q_EXTERN game_t                         games[]\r
1788 #ifndef MAIN_C\r
1789                                                         ;\r
1790 #else\r
1791                                                         =\r
1792                                                         {\r
1793                                                                 #include "game_quake3.h"\r
1794                                                                 ,\r
1795                                                                 #include "game_tenebrae.h"\r
1796                                                                 ,\r
1797                                                                 #include "game_wolf.h"\r
1798                                                                 ,\r
1799                                                                 #include "game_wolfet.h"/* most be after game_wolf.h as they share defines! */\r
1800                                                                 ,\r
1801                                                                 #include "game_ef.h"\r
1802                                                                 ,\r
1803                                                                 #include "game_sof2.h"\r
1804                                                                 ,\r
1805                                                                 #include "game_jk2.h"   /* most be after game_sof2.h as they share defines! */\r
1806                                                                 ,\r
1807                                                                 #include "game_ja.h"    /* most be after game_jk2.h as they share defines! */\r
1808                                                                 ,\r
1809                                                                 { NULL, NULL, NULL, NULL, NULL, qfalse, 0, 0, NULL }    /* null game */\r
1810                                                         };\r
1811 #endif\r
1812 Q_EXTERN game_t                         *game Q_ASSIGN( &games[ 0 ] );\r
1813 \r
1814 \r
1815 /* general */\r
1816 Q_EXTERN int                            numImages Q_ASSIGN( 0 );\r
1817 Q_EXTERN image_t                        images[ MAX_IMAGES ];\r
1818 \r
1819 Q_EXTERN int                            numPicoModels Q_ASSIGN( 0 );\r
1820 Q_EXTERN picoModel_t            *picoModels[ MAX_MODELS ];\r
1821 \r
1822 Q_EXTERN shaderInfo_t           *shaderInfo Q_ASSIGN( NULL );\r
1823 Q_EXTERN int                            numShaderInfo Q_ASSIGN( 0 );\r
1824 Q_EXTERN int                            numVertexRemaps Q_ASSIGN( 0 );\r
1825 \r
1826 Q_EXTERN surfaceParm_t          custSurfaceParms[ MAX_CUST_SURFACEPARMS ];\r
1827 Q_EXTERN int                            numCustSurfaceParms Q_ASSIGN( 0 );\r
1828 \r
1829 Q_EXTERN char                           mapName[ MAX_QPATH ];   /* ydnar: per-map custom shaders for larger lightmaps */\r
1830 Q_EXTERN char                           mapShaderFile[ 1024 ];\r
1831 Q_EXTERN qboolean                       warnImage Q_ASSIGN( qtrue );\r
1832 \r
1833 /* ydnar: sinusoid samples */\r
1834 Q_EXTERN float                          jitters[ MAX_JITTERS ];\r
1835 \r
1836 \r
1837 /* commandline arguments */\r
1838 Q_EXTERN qboolean                       verbose;\r
1839 Q_EXTERN qboolean                       verboseEntities Q_ASSIGN( qfalse );\r
1840 Q_EXTERN qboolean                       force Q_ASSIGN( qfalse );\r
1841 Q_EXTERN qboolean                       infoMode Q_ASSIGN( qfalse );\r
1842 Q_EXTERN qboolean                       useCustomInfoParms Q_ASSIGN( qfalse );\r
1843 Q_EXTERN qboolean                       noprune Q_ASSIGN( qfalse );\r
1844 Q_EXTERN qboolean                       leaktest Q_ASSIGN( qfalse );\r
1845 Q_EXTERN qboolean                       nodetail Q_ASSIGN( qfalse );\r
1846 Q_EXTERN qboolean                       nosubdivide Q_ASSIGN( qfalse );\r
1847 Q_EXTERN qboolean                       notjunc Q_ASSIGN( qfalse );\r
1848 Q_EXTERN qboolean                       fulldetail Q_ASSIGN( qfalse );\r
1849 Q_EXTERN qboolean                       nowater Q_ASSIGN( qfalse );\r
1850 Q_EXTERN qboolean                       noCurveBrushes Q_ASSIGN( qfalse );\r
1851 Q_EXTERN qboolean                       fakemap Q_ASSIGN( qfalse );\r
1852 Q_EXTERN qboolean                       coplanar Q_ASSIGN( qfalse );\r
1853 Q_EXTERN qboolean                       nofog Q_ASSIGN( qfalse );\r
1854 Q_EXTERN qboolean                       noHint Q_ASSIGN( qfalse );                              /* ydnar */\r
1855 Q_EXTERN qboolean                       renameModelShaders Q_ASSIGN( qfalse );  /* ydnar */\r
1856 Q_EXTERN qboolean                       skyFixHack Q_ASSIGN( qfalse );                  /* ydnar */\r
1857 \r
1858 Q_EXTERN int                            patchSubdivisions Q_ASSIGN( 8 );                /* ydnar: -patchmeta subdivisions */\r
1859 \r
1860 Q_EXTERN int                            maxSurfaceVerts Q_ASSIGN( 64 );                 /* ydnar */\r
1861 Q_EXTERN int                            maxSurfaceIndexes Q_ASSIGN( 1000 );             /* ydnar */\r
1862 Q_EXTERN float                          npDegrees Q_ASSIGN( 0.0f );                             /* ydnar: nonplanar degrees */\r
1863 Q_EXTERN int                            bevelSnap Q_ASSIGN( 0 );                                /* ydnar: bevel plane snap */\r
1864 Q_EXTERN int                            texRange Q_ASSIGN( 0 );\r
1865 Q_EXTERN qboolean                       flat Q_ASSIGN( qfalse );\r
1866 Q_EXTERN qboolean                       meta Q_ASSIGN( qfalse );\r
1867 Q_EXTERN qboolean                       patchMeta Q_ASSIGN( qfalse );\r
1868 Q_EXTERN qboolean                       emitFlares Q_ASSIGN( qfalse );\r
1869 Q_EXTERN qboolean                       debugSurfaces Q_ASSIGN( qfalse );\r
1870 Q_EXTERN qboolean                       debugInset Q_ASSIGN( qfalse );\r
1871 Q_EXTERN qboolean                       debugPortals Q_ASSIGN( qfalse );\r
1872 \r
1873 Q_EXTERN double                         normalEpsilon Q_ASSIGN( 0.00001 );\r
1874 Q_EXTERN double                         distanceEpsilon Q_ASSIGN( 0.01 );\r
1875 \r
1876 \r
1877 /* bsp */\r
1878 Q_EXTERN int                            numMapEntities Q_ASSIGN( 0 );\r
1879 \r
1880 Q_EXTERN int                            blockSize[ 3 ]                                  /* should be the same as in radiant */\r
1881 #ifndef MAIN_C\r
1882                                                         ;\r
1883 #else\r
1884                                                         = { 1024, 1024, 1024 };\r
1885 #endif\r
1886 \r
1887 Q_EXTERN char                           name[ 1024 ];\r
1888 Q_EXTERN char                           source[ 1024 ];\r
1889 Q_EXTERN char                           outbase[ 32 ];\r
1890 \r
1891 Q_EXTERN int                            sampleSize;                                             /* lightmap sample size in units */\r
1892 \r
1893 Q_EXTERN int                            mapEntityNum Q_ASSIGN( 0 );\r
1894 \r
1895 Q_EXTERN int                            entitySourceBrushes;\r
1896 \r
1897 Q_EXTERN plane_t                        mapplanes[ MAX_MAP_PLANES ];    /* mapplanes[ num ^ 1 ] will always be the mirror or mapplanes[ num ] */\r
1898 Q_EXTERN int                            nummapplanes;                                   /* nummapplanes will always be even */\r
1899 Q_EXTERN int                            numMapPatches;\r
1900 Q_EXTERN vec3_t                         mapMins, mapMaxs;\r
1901 \r
1902 Q_EXTERN int                            defaultFogNum Q_ASSIGN( -1 );   /* ydnar: cleaner fog handling */\r
1903 Q_EXTERN int                            numMapFogs Q_ASSIGN( 0 );\r
1904 Q_EXTERN fog_t                          mapFogs[ MAX_MAP_FOGS ];\r
1905 \r
1906 Q_EXTERN entity_t                       *mapEnt;\r
1907 Q_EXTERN brush_t                        *buildBrush;\r
1908 Q_EXTERN int                            numActiveBrushes;\r
1909 Q_EXTERN int                            g_bBrushPrimit;\r
1910 \r
1911 Q_EXTERN int                            numStrippedLights Q_ASSIGN( 0 );\r
1912 \r
1913 \r
1914 /* surface stuff */\r
1915 Q_EXTERN mapDrawSurface_t       *mapDrawSurfs Q_ASSIGN( NULL );\r
1916 Q_EXTERN int                            numMapDrawSurfs;\r
1917 \r
1918 Q_EXTERN int                            numSurfacesByType[ NUM_SURFACE_TYPES ];\r
1919 Q_EXTERN int                            numClearedSurfaces;\r
1920 Q_EXTERN int                            numStripSurfaces;\r
1921 Q_EXTERN int                            numFanSurfaces;\r
1922 Q_EXTERN int                            numMergedSurfaces;\r
1923 Q_EXTERN int                            numMergedVerts;\r
1924 \r
1925 Q_EXTERN int                            numRedundantIndexes;\r
1926 \r
1927 Q_EXTERN int                            numSurfaceModels Q_ASSIGN( 0 );\r
1928 \r
1929 Q_EXTERN byte                           debugColors[ 12 ][ 3 ]\r
1930 #ifndef MAIN_C\r
1931                                                         ;\r
1932 #else\r
1933                                                         =\r
1934                                                         {\r
1935                                                                 { 255, 0, 0 },\r
1936                                                                 { 192, 128, 128 },\r
1937                                                                 { 255, 255, 0 },\r
1938                                                                 { 192, 192, 128 },\r
1939                                                                 { 0, 255, 255 },\r
1940                                                                 { 128, 192, 192 },\r
1941                                                                 { 0, 0, 255 },\r
1942                                                                 { 128, 128, 192 },\r
1943                                                                 { 255, 0, 255 },\r
1944                                                                 { 192, 128, 192 },\r
1945                                                                 { 0, 255, 0 },\r
1946                                                                 { 128, 192, 128 }\r
1947                                                         };\r
1948 #endif\r
1949 \r
1950 Q_EXTERN qboolean                       skyboxPresent Q_ASSIGN( qfalse );\r
1951 Q_EXTERN int                            skyboxArea Q_ASSIGN( -1 );\r
1952 Q_EXTERN m4x4_t                         skyboxTransform;\r
1953 \r
1954 \r
1955 \r
1956 /* -------------------------------------------------------------------------------\r
1957 \r
1958 vis global variables\r
1959 \r
1960 ------------------------------------------------------------------------------- */\r
1961 \r
1962 /* commandline arguments */\r
1963 Q_EXTERN qboolean                       fastvis;\r
1964 Q_EXTERN qboolean                       noPassageVis;\r
1965 Q_EXTERN qboolean                       passageVisOnly;\r
1966 Q_EXTERN qboolean                       mergevis;\r
1967 Q_EXTERN qboolean                       nosort;\r
1968 Q_EXTERN qboolean                       saveprt;\r
1969 Q_EXTERN qboolean                       hint;   /* ydnar */\r
1970 Q_EXTERN char                           inbase[ MAX_QPATH ];\r
1971 \r
1972 /* other bits */\r
1973 Q_EXTERN int                            totalvis;\r
1974 \r
1975 Q_EXTERN float                          farPlaneDist;   /* rr2do2, rf, mre, ydnar all contributed to this one... */\r
1976 \r
1977 Q_EXTERN int                            numportals;\r
1978 Q_EXTERN int                            portalclusters;\r
1979 \r
1980 Q_EXTERN vportal_t                      *portals;\r
1981 Q_EXTERN leaf_t                         *leafs;\r
1982 \r
1983 Q_EXTERN vportal_t                      *faces;\r
1984 Q_EXTERN leaf_t                         *faceleafs;\r
1985 \r
1986 Q_EXTERN int                            numfaces;\r
1987 \r
1988 Q_EXTERN int                            c_portaltest, c_portalpass, c_portalcheck;\r
1989 Q_EXTERN int                            c_portalskip, c_leafskip;\r
1990 Q_EXTERN int                            c_vistest, c_mighttest;\r
1991 Q_EXTERN int                            c_chains;\r
1992 \r
1993 Q_EXTERN byte                           *vismap, *vismap_p, *vismap_end;\r
1994 \r
1995 Q_EXTERN int                            testlevel;\r
1996 \r
1997 Q_EXTERN byte                           *uncompressed;\r
1998 \r
1999 Q_EXTERN int                            leafbytes, leaflongs;\r
2000 Q_EXTERN int                            portalbytes, portallongs;\r
2001 \r
2002 Q_EXTERN vportal_t                      *sorted_portals[ MAX_MAP_PORTALS * 2 ];\r
2003 \r
2004 \r
2005 \r
2006 /* -------------------------------------------------------------------------------\r
2007 \r
2008 light global variables\r
2009 \r
2010 ------------------------------------------------------------------------------- */\r
2011 \r
2012 /* commandline arguments */\r
2013 Q_EXTERN qboolean                       noSurfaces;\r
2014 \r
2015 Q_EXTERN qboolean                       deluxemap;\r
2016 Q_EXTERN qboolean                       debugDeluxemap;\r
2017 \r
2018 Q_EXTERN qboolean                       loMem Q_ASSIGN( qfalse );\r
2019 \r
2020 Q_EXTERN qboolean                       fast;\r
2021 Q_EXTERN qboolean                       faster;\r
2022 Q_EXTERN qboolean                       fastgrid;\r
2023 Q_EXTERN qboolean                       fastbounce;\r
2024 Q_EXTERN qboolean                       cheap;\r
2025 Q_EXTERN qboolean                       cheapgrid;\r
2026 Q_EXTERN qboolean                       smooth;\r
2027 Q_EXTERN int                            bounce;\r
2028 Q_EXTERN qboolean                       bounceOnly;\r
2029 Q_EXTERN qboolean                       bouncing;\r
2030 Q_EXTERN qboolean                       bouncegrid;\r
2031 Q_EXTERN qboolean                       normalmap;\r
2032 Q_EXTERN qboolean                       trisoup;\r
2033 Q_EXTERN qboolean                       shade;\r
2034 Q_EXTERN float                          shadeAngleDegrees Q_ASSIGN( 0.0f );\r
2035 Q_EXTERN int                            superSample Q_ASSIGN( 0 );\r
2036 Q_EXTERN int                            lightSamples Q_ASSIGN( 1 );\r
2037 Q_EXTERN qboolean                       filter;\r
2038 Q_EXTERN qboolean                       sunOnly;\r
2039 Q_EXTERN int                            approximateTolerance Q_ASSIGN( 0 );\r
2040 Q_EXTERN qboolean                       noCollapse;\r
2041 Q_EXTERN qboolean                       debug;\r
2042 Q_EXTERN qboolean                       debugSurfaces;\r
2043 Q_EXTERN qboolean                       debugUnused;\r
2044 Q_EXTERN qboolean                       debugAxis;\r
2045 Q_EXTERN qboolean                       debugCluster;\r
2046 Q_EXTERN qboolean                       debugOrigin;\r
2047 Q_EXTERN qboolean                       exportLightmaps;\r
2048 Q_EXTERN qboolean                       externalLightmaps;\r
2049 Q_EXTERN int                            lmCustomSize Q_ASSIGN( LIGHTMAP_WIDTH );\r
2050 \r
2051 /* standard flags */\r
2052 Q_EXTERN qboolean                       noTrace;\r
2053 Q_EXTERN qboolean                       patchShadows;\r
2054 Q_EXTERN qboolean                       dump;\r
2055 Q_EXTERN qboolean                       extra;\r
2056 Q_EXTERN qboolean                       extraWide;\r
2057 Q_EXTERN qboolean                       lightmapBorder;\r
2058 \r
2059 Q_EXTERN qboolean                       noSurfaces;\r
2060 \r
2061 Q_EXTERN int                            sampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_SAMPLE_SIZE );\r
2062 Q_EXTERN qboolean                       noVertexLighting Q_ASSIGN( qfalse );\r
2063 Q_EXTERN qboolean                       noGridLighting Q_ASSIGN( qfalse );\r
2064 \r
2065 /* longest distance across the map */\r
2066 Q_EXTERN float                          maxMapDistance Q_ASSIGN( 0 );\r
2067 \r
2068 /* for run time tweaking of light sources */\r
2069 Q_EXTERN float                          pointScale Q_ASSIGN( 7500.0f );\r
2070 Q_EXTERN float                          areaScale Q_ASSIGN( 0.25f );\r
2071 Q_EXTERN float                          skyScale Q_ASSIGN( 1.0f );\r
2072 Q_EXTERN float                          bounceScale Q_ASSIGN( 0.25f );\r
2073 \r
2074 /* ydnar: for runtime tweaking of falloff tolerance */\r
2075 Q_EXTERN float                          falloffTolerance Q_ASSIGN( 1.0f );\r
2076 \r
2077 Q_EXTERN qboolean                       exactPointToPolygon Q_ASSIGN( qtrue );\r
2078 \r
2079 Q_EXTERN float                          formFactorValueScale Q_ASSIGN( 3.0f );\r
2080 \r
2081 Q_EXTERN float                          linearScale Q_ASSIGN( 1.0f / 8000.0f );\r
2082 \r
2083 Q_EXTERN light_t                        *lights;\r
2084 Q_EXTERN int                            numPointLights;\r
2085 Q_EXTERN int                            numSpotLights;\r
2086 Q_EXTERN int                            numSunLights;\r
2087 Q_EXTERN int                            numAreaLights;\r
2088 \r
2089 /* ydnar: for luxel placement */\r
2090 Q_EXTERN int                            numSurfaceClusters, maxSurfaceClusters;\r
2091 Q_EXTERN int                            *surfaceClusters;\r
2092 \r
2093 /* ydnar: for radiosity */\r
2094 Q_EXTERN int                            numDiffuseLights;\r
2095 Q_EXTERN int                            numBrushDiffuseLights;\r
2096 Q_EXTERN int                            numTriangleDiffuseLights;\r
2097 Q_EXTERN int                            numPatchDiffuseLights;\r
2098 \r
2099 /* ydnar: general purpose extra copy of drawvert list */\r
2100 Q_EXTERN bspDrawVert_t          *yDrawVerts;\r
2101 \r
2102 /* ydnar: for tracing statistics */\r
2103 Q_EXTERN int                            minSurfacesTested;\r
2104 Q_EXTERN int                            maxSurfacesTested;\r
2105 Q_EXTERN int                            totalSurfacesTested;\r
2106 Q_EXTERN int                            totalTraces;\r
2107 \r
2108 Q_EXTERN FILE                           *dumpFile;\r
2109 \r
2110 Q_EXTERN int                            c_visible, c_occluded;\r
2111 Q_EXTERN int                            c_subsampled;   /* ydnar */\r
2112 \r
2113 Q_EXTERN int                            defaultLightSubdivide Q_ASSIGN( 999 );\r
2114 \r
2115 Q_EXTERN vec3_t                         ambientColor;\r
2116 Q_EXTERN vec3_t                         minLight, minVertexLight, minGridLight;\r
2117 \r
2118 Q_EXTERN int                            *entitySurface;\r
2119 Q_EXTERN vec3_t                         *surfaceOrigin;\r
2120 \r
2121 Q_EXTERN vec3_t                         sunDirection;\r
2122 Q_EXTERN vec3_t                         sunLight;\r
2123 \r
2124 /* tracing */\r
2125 Q_EXTERN int                            c_totalTrace;\r
2126 Q_EXTERN int                            c_cullTrace, c_testTrace;\r
2127 Q_EXTERN int                            c_testFacets;\r
2128 \r
2129 /* ydnar: light optimization */\r
2130 Q_EXTERN float                          subdivideThreshold Q_ASSIGN( DEFAULT_SUBDIVIDE_THRESHOLD );\r
2131 \r
2132 Q_EXTERN int                            numOpaqueBrushes, maxOpaqueBrush;\r
2133 Q_EXTERN byte                           *opaqueBrushes;\r
2134 \r
2135 Q_EXTERN int                            numLights;\r
2136 Q_EXTERN int                            numCulledLights;\r
2137 \r
2138 Q_EXTERN int                            gridBoundsCulled;\r
2139 Q_EXTERN int                            gridEnvelopeCulled;\r
2140 \r
2141 Q_EXTERN int                            lightsBoundsCulled;\r
2142 Q_EXTERN int                            lightsEnvelopeCulled;\r
2143 Q_EXTERN int                            lightsPlaneCulled;\r
2144 Q_EXTERN int                            lightsClusterCulled;\r
2145 \r
2146 /* ydnar: radiosity */\r
2147 Q_EXTERN float                          diffuseSubdivide Q_ASSIGN( 256.0f );\r
2148 Q_EXTERN float                          minDiffuseSubdivide Q_ASSIGN( 64.0f );\r
2149 Q_EXTERN int                            numDiffuseSurfaces Q_ASSIGN( 0 );\r
2150 \r
2151 /* ydnar: list of surface information necessary for lightmap calculation */\r
2152 Q_EXTERN surfaceInfo_t          *surfaceInfos Q_ASSIGN( NULL );\r
2153 \r
2154 /* ydnar: sorted list of surfaces */\r
2155 Q_EXTERN int                            *sortSurfaces Q_ASSIGN( NULL );\r
2156 \r
2157 /* clumps of surfaces that share a raw lightmap */\r
2158 Q_EXTERN int                            numLightSurfaces Q_ASSIGN( 0 );\r
2159 Q_EXTERN int                            *lightSurfaces Q_ASSIGN( NULL );\r
2160 \r
2161 /* raw lightmaps */\r
2162 Q_EXTERN int                            numRawSuperLuxels Q_ASSIGN( 0 );\r
2163 Q_EXTERN int                            numRawLightmaps Q_ASSIGN( 0 );\r
2164 Q_EXTERN rawLightmap_t          *rawLightmaps Q_ASSIGN( NULL );\r
2165 Q_EXTERN int                            *sortLightmaps Q_ASSIGN( NULL );\r
2166 \r
2167 /* vertex luxels */\r
2168 Q_EXTERN float                          *vertexLuxels[ MAX_LIGHTMAPS ];\r
2169 Q_EXTERN float                          *radVertexLuxels[ MAX_LIGHTMAPS ];\r
2170 \r
2171 /* bsp lightmaps */\r
2172 Q_EXTERN int                            numLightmapShaders Q_ASSIGN( 0 );\r
2173 Q_EXTERN int                            numOutLightmaps Q_ASSIGN( 0 );\r
2174 Q_EXTERN int                            numBSPLightmaps Q_ASSIGN( 0 );\r
2175 Q_EXTERN int                            numExtLightmaps Q_ASSIGN( 0 );\r
2176 Q_EXTERN outLightmap_t          *outLightmaps Q_ASSIGN( NULL );\r
2177 \r
2178 /* grid points */\r
2179 Q_EXTERN int                            numRawGridPoints Q_ASSIGN( 0 );\r
2180 Q_EXTERN rawGridPoint_t         *rawGridPoints Q_ASSIGN( NULL );\r
2181 \r
2182 Q_EXTERN int                            numSurfsVertexLit Q_ASSIGN( 0 );\r
2183 Q_EXTERN int                            numSurfsVertexForced Q_ASSIGN( 0 );\r
2184 Q_EXTERN int                            numSurfsVertexApproximated Q_ASSIGN( 0 );\r
2185 Q_EXTERN int                            numSurfsLightmapped Q_ASSIGN( 0 );\r
2186 Q_EXTERN int                            numPlanarsLightmapped Q_ASSIGN( 0 );\r
2187 Q_EXTERN int                            numNonPlanarsLightmapped Q_ASSIGN( 0 );\r
2188 Q_EXTERN int                            numPatchesLightmapped Q_ASSIGN( 0 );\r
2189 Q_EXTERN int                            numPlanarPatchesLightmapped Q_ASSIGN( 0 );\r
2190 \r
2191 Q_EXTERN int                            numLuxels Q_ASSIGN( 0 );\r
2192 Q_EXTERN int                            numLuxelsMapped Q_ASSIGN( 0 );\r
2193 Q_EXTERN int                            numLuxelsOccluded Q_ASSIGN( 0 );\r
2194 Q_EXTERN int                            numLuxelsIlluminated Q_ASSIGN( 0 );\r
2195 Q_EXTERN int                            numVertsIlluminated Q_ASSIGN( 0 );\r
2196 \r
2197 /* lightgrid */\r
2198 Q_EXTERN vec3_t                         gridMins;\r
2199 Q_EXTERN int                            gridBounds[ 3 ];\r
2200 Q_EXTERN vec3_t                         gridSize\r
2201 #ifndef MAIN_C\r
2202                                                         ;\r
2203 #else\r
2204                                                         = { 64, 64, 128 };\r
2205 #endif\r
2206 \r
2207 \r
2208 \r
2209 /* -------------------------------------------------------------------------------\r
2210 \r
2211 abstracted bsp globals\r
2212 \r
2213 ------------------------------------------------------------------------------- */\r
2214 \r
2215 Q_EXTERN int                            numEntities Q_ASSIGN( 0 );\r
2216 Q_EXTERN int                            numBSPEntities Q_ASSIGN( 0 );\r
2217 Q_EXTERN entity_t                       entities[ MAX_MAP_ENTITIES ];\r
2218 \r
2219 Q_EXTERN int                            numBSPModels Q_ASSIGN( 0 );\r
2220 Q_EXTERN bspModel_t                     bspModels[ MAX_MAP_MODELS ];\r
2221 \r
2222 Q_EXTERN int                            numBSPShaders Q_ASSIGN( 0 );\r
2223 Q_EXTERN bspShader_t            bspShaders[ MAX_MAP_MODELS ];\r
2224 \r
2225 Q_EXTERN int                            bspEntDataSize Q_ASSIGN( 0 );\r
2226 Q_EXTERN char                           bspEntData[ MAX_MAP_ENTSTRING ];\r
2227 \r
2228 Q_EXTERN int                            numBSPLeafs Q_ASSIGN( 0 );\r
2229 Q_EXTERN bspLeaf_t                      bspLeafs[ MAX_MAP_LEAFS ];\r
2230 \r
2231 Q_EXTERN int                            numBSPPlanes Q_ASSIGN( 0 );\r
2232 Q_EXTERN bspPlane_t                     bspPlanes[ MAX_MAP_PLANES ];\r
2233 \r
2234 Q_EXTERN int                            numBSPNodes Q_ASSIGN( 0 );\r
2235 Q_EXTERN bspNode_t                      bspNodes[ MAX_MAP_NODES ];\r
2236 \r
2237 Q_EXTERN int                            numBSPLeafSurfaces Q_ASSIGN( 0 );\r
2238 Q_EXTERN int                            bspLeafSurfaces[ MAX_MAP_LEAFFACES ];\r
2239 \r
2240 Q_EXTERN int                            numBSPLeafBrushes Q_ASSIGN( 0 );\r
2241 Q_EXTERN int                            bspLeafBrushes[ MAX_MAP_LEAFBRUSHES ];\r
2242 \r
2243 Q_EXTERN int                            numBSPBrushes Q_ASSIGN( 0 );\r
2244 Q_EXTERN bspBrush_t                     bspBrushes[ MAX_MAP_BRUSHES ];\r
2245 \r
2246 Q_EXTERN int                            numBSPBrushSides Q_ASSIGN( 0 );\r
2247 Q_EXTERN bspBrushSide_t         bspBrushSides[ MAX_MAP_BRUSHSIDES ];\r
2248 \r
2249 Q_EXTERN int                            numBSPLightBytes Q_ASSIGN( 0 );\r
2250 Q_EXTERN byte                           *bspLightBytes Q_ASSIGN( NULL );\r
2251 \r
2252 //%     Q_EXTERN int                            numBSPGridPoints Q_ASSIGN( 0 );\r
2253 //%     Q_EXTERN byte                           *bspGridPoints Q_ASSIGN( NULL );\r
2254 \r
2255 Q_EXTERN int                            numBSPGridPoints Q_ASSIGN( 0 );\r
2256 Q_EXTERN bspGridPoint_t         *bspGridPoints Q_ASSIGN( NULL );\r
2257 \r
2258 Q_EXTERN int                            numBSPVisBytes Q_ASSIGN( 0 );\r
2259 Q_EXTERN byte                           bspVisBytes[ MAX_MAP_VISIBILITY ];\r
2260 \r
2261 Q_EXTERN int                            numBSPDrawVerts Q_ASSIGN( 0 );\r
2262 Q_EXTERN bspDrawVert_t          *bspDrawVerts Q_ASSIGN( NULL );\r
2263 \r
2264 Q_EXTERN int                            numBSPDrawIndexes Q_ASSIGN( 0 );\r
2265 Q_EXTERN int                            bspDrawIndexes[ MAX_MAP_DRAW_INDEXES ];\r
2266 \r
2267 Q_EXTERN int                            numBSPDrawSurfaces Q_ASSIGN( 0 );\r
2268 Q_EXTERN bspDrawSurface_t       *bspDrawSurfaces Q_ASSIGN( NULL );\r
2269 \r
2270 Q_EXTERN int                            numBSPFogs Q_ASSIGN( 0 );\r
2271 Q_EXTERN bspFog_t                       bspFogs[ MAX_MAP_FOGS ];\r
2272 \r
2273 \r
2274 \r
2275 /* end marker */\r
2276 #endif\r