3 * Daniel Nelson - 10/1/0
5 * Copyright (C) 2000 Daniel Nelson
6 * Copyright (C) 2004 Andrew Sayman
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 * Daniel Nelson - aluminumangel.org
26 * Generates the lightmap and flavor textures for the garbage.
29 #define GL_GLEXT_LEGACY
30 #define GL_GLEXT_PROTOTYPES
39 #include "TextureLoader.h"
41 #include "Displayer.h"
42 #include "GarbageFlavorImage.h"
43 #include "MetaState.h"
46 const char *garbage_lightmap_files
[DC_NUMBER_GARBAGE_LIGHTMAPS
]
47 = { GC_DATA_DIRECTORY("garbage_lightmap_0.tga"),
48 GC_DATA_DIRECTORY("garbage_lightmap_1.tga"),
49 GC_DATA_DIRECTORY("garbage_lightmap_2.tga"),
50 GC_DATA_DIRECTORY("garbage_lightmap_3.tga"),
51 GC_DATA_DIRECTORY("garbage_lightmap_4.tga"),
52 GC_DATA_DIRECTORY("garbage_lightmap_5.tga") };
54 GLuint
Displayer::garbage_lightmap
;
55 GLuint
Displayer::garbage_texture
;
57 GLuint
Displayer::garbage_flavor_list
;
59 GLubyte
*Displayer::garbage_texture_data
[DC_NUMBER_USE_GARBAGE_TEX
];
61 void Displayer::generateGarbageExtras ( )
65 glGenTextures(1, &garbage_lightmap
);
67 glBindTexture(GL_TEXTURE_2D
, garbage_lightmap
);
69 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
70 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
71 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
72 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
74 // choose a random lightmap for this game
75 GLubyte
*texture
= TextureLoader::loadAlphaTGA(
76 garbage_lightmap_files
[Random::number(DC_NUMBER_GARBAGE_LIGHTMAPS
)],
77 DC_GARBAGE_LIGHTMAP_LENGTH
, DC_GARBAGE_LIGHTMAP_LENGTH
);
79 for (int s
= DC_GARBAGE_LIGHTMAP_LENGTH
; s
--; )
80 for (int t
= DC_GARBAGE_LIGHTMAP_LENGTH
; t
--; )
81 texture
[s
* DC_GARBAGE_LIGHTMAP_LENGTH
+ t
]
82 = (GLubyte
) (255.0f
* (DC_GARBAGE_LIGHTMAP_MIN_LUMINANCE
83 + ((1.0f
- DC_GARBAGE_LIGHTMAP_MIN_LUMINANCE
) / 255.0f
)
84 * (float) texture
[s
* DC_GARBAGE_LIGHTMAP_LENGTH
+ t
]));
86 glTexImage2D(GL_TEXTURE_2D
, 0, GL_LUMINANCE
, DC_GARBAGE_LIGHTMAP_LENGTH
,
87 DC_GARBAGE_LIGHTMAP_LENGTH
, GL_FALSE
, GL_LUMINANCE
, GL_UNSIGNED_BYTE
,
90 if (texture
!= null
) {
95 glGenTextures(1, &garbage_texture
);
97 glBindTexture(GL_TEXTURE_2D
, garbage_texture
);
99 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
100 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
101 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
102 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
104 // identify which texture files exist
105 int texture_file_count
= 0;
106 bool texture_file_flag
[GC_GARBAGE_TEX_MAX_NUMBER
];
107 for (int n
= GC_GARBAGE_TEX_MAX_NUMBER
; n
--; ) {
108 GarbageFlavorImage::buildGarbageTextureFileName(file_name
, n
);
110 if (TextureLoader::fileExists(file_name
)) {
111 texture_file_count
++;
112 texture_file_flag
[n
] = true;
114 texture_file_flag
[n
] = false;
117 // if for some reason we don't have enough textures
118 if (texture_file_count
< DC_NUMBER_USE_GARBAGE_TEX
) {
119 GarbageFlavorImage::buildGarbageTextureFileName(file_name
, 0);
121 for (int n
= 0; n
< DC_NUMBER_USE_GARBAGE_TEX
; n
++) {
122 garbage_texture_data
[n
] = TextureLoader::loadTGA(file_name
,
123 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
126 // otherwise, we have plenty
128 int use_textures
[DC_NUMBER_USE_GARBAGE_TEX
];
129 for (int n
= 0; n
< DC_NUMBER_USE_GARBAGE_TEX
; n
++) {
131 // always put the net tex in zero, if there is one
132 if (n
== 0 && (MetaState::mode
& CM_SOLO
)
133 && GarbageFlavorImage::personalGarbageFlavorImageExists())
134 GarbageFlavorImage::handleNetworkGarbageFlavorImage(
135 garbage_texture_data
[0]
136 = GarbageFlavorImage::loadPersonalGarbageFlavorImage());
138 else if (n
== 0 && !(MetaState::mode
& CM_SOLO
)
139 && GarbageFlavorImage::network_texture
) {
140 char net_tex_file_name
[256];
141 TextureLoader::buildLocalDataFileName(GC_GARBAGE_NET_TEX_FILE_NAME
,
144 garbage_texture_data
[0] = TextureLoader::loadTGA(net_tex_file_name
,
145 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
153 int choice
= Random::number(texture_file_count
);
154 for (i
= 0; choice
--; i
++)
155 while (!texture_file_flag
[i
])
159 for (int m
= 0; m
< n
; m
++)
160 if (use_textures
[n
] == use_textures
[m
]) {
166 GarbageFlavorImage::buildGarbageTextureFileName(file_name
,
169 garbage_texture_data
[n
] = TextureLoader::loadTGA(file_name
,
170 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
175 // the logo may replace the second texture
176 if (Random::chanceIn(DC_CHANCE_IN_NOT_USE_LOGO_FLAVOR_TEX
)) {
177 if (garbage_texture_data
[1] != null
) {
178 delete [] garbage_texture_data
[1];
179 garbage_texture_data
[1] = null
;
182 if (MetaState::mode
& CM_X
)
183 garbage_texture_data
[1]
184 = TextureLoader::loadTGA(GC_GARBAGE_X_LOGO_TEX_FILE_NAME
,
185 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
187 garbage_texture_data
[1]
188 = TextureLoader::loadTGA(GC_GARBAGE_LOGO_TEX_FILE_NAME
,
189 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
192 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, DC_GARBAGE_TEX_LENGTH
,
193 DC_GARBAGE_TEX_LENGTH
, GL_FALSE
, GL_RGBA
, GL_UNSIGNED_BYTE
,
194 garbage_texture_data
[GarbageFlavorImage::current_texture
]);
196 GLfloat vertices_0
[3 * 6] = {
205 GLfloat normals_0
[3 * 6] = {
214 GLfloat tex_coords_flavor
[2 * 6] = {
223 #ifndef NO_MULTITEXTURING
224 GLfloat tex_coords_lightmap
[2 * 6] = {
225 -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
226 DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
227 -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
228 DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
229 -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
230 3.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
231 DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
232 3.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
236 garbage_flavor_list
= glGenLists(1);
238 glEnableClientState(GL_VERTEX_ARRAY
);
239 glEnableClientState(GL_NORMAL_ARRAY
);
240 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
242 #ifndef NO_MULTITEXTURING
244 if (Displayer::state
& DS_MULTITEXTURING
) {
246 glActiveTextureARB(GL_TEXTURE1_ARB
);
248 glBindTexture(GL_TEXTURE_2D
, garbage_lightmap
);
249 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
251 glActiveTextureARB(GL_TEXTURE0_ARB
);
253 glNewList(garbage_flavor_list
, GL_COMPILE
);
255 glVertexPointer(3, GL_FLOAT
, 0, vertices_0
);
256 glNormalPointer(GL_FLOAT
, 0, normals_0
);
257 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_flavor
);
259 glClientActiveTextureARB(GL_TEXTURE1_ARB
);
260 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
261 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_lightmap
);
263 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
265 for (int n
= 6; n
--; ) {
266 vertices_0
[3 * n
+ 0] += 2.0f
;
267 tex_coords_flavor
[2 * n
+ 0] += 0.5f
;
268 tex_coords_lightmap
[2 * n
+ 0]
269 += 2.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
;
272 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
274 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);
275 glClientActiveTextureARB(GL_TEXTURE0_ARB
);
279 // if no multitexturing
283 glNewList(garbage_flavor_list
, GL_COMPILE
);
285 glVertexPointer(3, GL_FLOAT
, 0, vertices_0
);
286 glNormalPointer(GL_FLOAT
, 0, normals_0
);
287 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_flavor
);
288 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
290 for (int n
= 6; n
--; ) {
291 vertices_0
[3 * n
+ 0] += 2.0f
;
292 tex_coords_flavor
[2 * n
+ 0] += 0.5f
;
295 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
298 #ifndef NO_MULTITEXTURING
302 glDisableClientState(GL_VERTEX_ARRAY
);
303 glDisableClientState(GL_NORMAL_ARRAY
);
304 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);