]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake3/q3map2/lightmaps.c
q3map2: use ~/Library/Application Support on Mac
[xonotic/netradiant.git] / tools / quake3 / q3map2 / lightmaps.c
1 /*
2    Copyright (C) 1999-2007 id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #include "qbsp.h"
23
24
25 /*
26
27    Lightmap allocation has to be done after all flood filling and
28    visible surface determination.
29
30  */
31
32 int numSortShaders;
33 mapDrawSurface_t    **surfsOnShader;
34 int allocatedSurfsOnShader;
35
36
37 int allocated[ LIGHTMAP_WIDTH ];
38
39 int numLightmaps = 1;
40 int c_exactLightmap = 0;
41 int c_planarPatch = 0;
42 int c_nonplanarLightmap = 0;
43
44
45 void PrepareNewLightmap( void ) {
46         memset( allocated, 0, sizeof( allocated ) );
47         numLightmaps++;
48 }
49
50 /*
51    ===============
52    AllocLMBlock
53
54    returns a texture number and the position inside it
55    ===============
56  */
57 qboolean AllocLMBlock( int w, int h, int *x, int *y ){
58         int i, j;
59         int best, best2;
60
61         best = LIGHTMAP_HEIGHT;
62
63         for ( i = 0 ; i <= LIGHTMAP_WIDTH - w ; i++ ) {
64                 best2 = 0;
65
66                 for ( j = 0 ; j < w ; j++ ) {
67                         if ( allocated[i + j] >= best ) {
68                                 break;
69                         }
70                         if ( allocated[i + j] > best2 ) {
71                                 best2 = allocated[i + j];
72                         }
73                 }
74                 if ( j == w ) {   // this is a valid spot
75                         *x = i;
76                         *y = best = best2;
77                 }
78         }
79
80         if ( best + h > LIGHTMAP_HEIGHT ) {
81                 return qfalse;
82         }
83
84         for ( i = 0 ; i < w ; i++ ) {
85                 allocated[*x + i] = best + h;
86         }
87
88         return qtrue;
89 }
90
91
92 /*
93    ===================
94    AllocateLightmapForPatch
95    ===================
96  */
97 //#define LIGHTMAP_PATCHSHIFT
98
99
100
101 /*
102    ===================
103    AllocateLightmapForSurface
104    ===================
105  */
106
107 //#define       LIGHTMAP_BLOCK  16
108
109
110
111 /*
112    ===================
113    AllocateLightmaps
114    ===================
115  */