Author: rambetter
[divverent/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 {
59         int             i, j;
60         int             best, best2;
61
62         best = LIGHTMAP_HEIGHT;
63
64         for ( i=0 ; i <= LIGHTMAP_WIDTH-w ; i++ ) {
65                 best2 = 0;
66
67                 for (j=0 ; j<w ; j++) {
68                         if (allocated[i+j] >= best) {
69                                 break;
70                         }
71                         if (allocated[i+j] > best2) {
72                                 best2 = allocated[i+j];
73                         }
74                 }
75                 if (j == w)     {       // this is a valid spot
76                         *x = i;
77                         *y = best = best2;
78                 }
79         }
80
81         if (best + h > LIGHTMAP_HEIGHT) {
82                 return qfalse;
83         }
84
85         for (i=0 ; i<w ; i++) {
86                 allocated[*x + i] = best + h;
87         }
88
89         return qtrue;
90 }
91
92
93 /*
94 ===================
95 AllocateLightmapForPatch
96 ===================
97 */
98 //#define LIGHTMAP_PATCHSHIFT
99
100
101
102 /*
103 ===================
104 AllocateLightmapForSurface
105 ===================
106 */
107
108 //#define       LIGHTMAP_BLOCK  16
109
110
111
112 /*
113 ===================
114 AllocateLightmaps
115 ===================
116 */
117
118
119