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
37 #include "TextureLoader.h"
39 #include "Displayer.h"
40 #include "GarbageFlavorImage.h"
41 #include "MetaState.h"
44 const char *garbage_lightmap_files
[DC_NUMBER_GARBAGE_LIGHTMAPS
]
45 = { GC_DATA_DIRECTORY("garbage_lightmap_0.png"),
46 GC_DATA_DIRECTORY("garbage_lightmap_1.png"),
47 GC_DATA_DIRECTORY("garbage_lightmap_2.png"),
48 GC_DATA_DIRECTORY("garbage_lightmap_3.png"),
49 GC_DATA_DIRECTORY("garbage_lightmap_4.png"),
50 GC_DATA_DIRECTORY("garbage_lightmap_5.png") };
52 GLuint
Displayer::garbage_lightmap
;
53 GLuint
Displayer::garbage_texture
;
55 GLuint
Displayer::garbage_flavor_list
;
57 GLubyte
*Displayer::garbage_texture_data
[DC_NUMBER_USE_GARBAGE_TEX
];
59 void Displayer::generateGarbageExtras ( )
63 glGenTextures(1, &garbage_lightmap
);
65 glBindTexture(GL_TEXTURE_2D
, garbage_lightmap
);
67 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
68 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
69 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
70 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
72 // choose a random lightmap for this game
73 GLubyte
*texture
= TextureLoader::loadImageAlpha(
74 garbage_lightmap_files
[Random::number(DC_NUMBER_GARBAGE_LIGHTMAPS
)],
75 DC_GARBAGE_LIGHTMAP_LENGTH
, DC_GARBAGE_LIGHTMAP_LENGTH
);
77 for (int s
= DC_GARBAGE_LIGHTMAP_LENGTH
; s
--; )
78 for (int t
= DC_GARBAGE_LIGHTMAP_LENGTH
; t
--; )
79 texture
[s
* DC_GARBAGE_LIGHTMAP_LENGTH
+ t
]
80 = (GLubyte
) (255.0f
* (DC_GARBAGE_LIGHTMAP_MIN_LUMINANCE
81 + ((1.0f
- DC_GARBAGE_LIGHTMAP_MIN_LUMINANCE
) / 255.0f
)
82 * (float) texture
[s
* DC_GARBAGE_LIGHTMAP_LENGTH
+ t
]));
84 glTexImage2D(GL_TEXTURE_2D
, 0, GL_LUMINANCE
, DC_GARBAGE_LIGHTMAP_LENGTH
,
85 DC_GARBAGE_LIGHTMAP_LENGTH
, GL_FALSE
, GL_LUMINANCE
, GL_UNSIGNED_BYTE
,
88 if (texture
!= null
) {
93 glGenTextures(1, &garbage_texture
);
95 glBindTexture(GL_TEXTURE_2D
, garbage_texture
);
97 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
98 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
99 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
100 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
102 // identify which texture files exist
103 int texture_file_count
= 0;
104 bool texture_file_flag
[GC_GARBAGE_TEX_MAX_NUMBER
];
105 for (int n
= GC_GARBAGE_TEX_MAX_NUMBER
; n
--; ) {
106 GarbageFlavorImage::buildGarbageTextureFileName(file_name
, n
);
108 if (TextureLoader::fileExists(file_name
)) {
109 texture_file_count
++;
110 texture_file_flag
[n
] = true;
112 texture_file_flag
[n
] = false;
115 // if for some reason we don't have enough textures
116 if (texture_file_count
< DC_NUMBER_USE_GARBAGE_TEX
) {
117 GarbageFlavorImage::buildGarbageTextureFileName(file_name
, 0);
119 for (int n
= 0; n
< DC_NUMBER_USE_GARBAGE_TEX
; n
++) {
120 garbage_texture_data
[n
] = TextureLoader::loadImage(file_name
,
121 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
124 // otherwise, we have plenty
126 int use_textures
[DC_NUMBER_USE_GARBAGE_TEX
];
127 for (int n
= 0; n
< DC_NUMBER_USE_GARBAGE_TEX
; n
++) {
129 // always put the net tex in zero, if there is one
130 if (n
== 0 && (MetaState::mode
& CM_SOLO
)
131 && GarbageFlavorImage::personalGarbageFlavorImageExists())
132 GarbageFlavorImage::handleNetworkGarbageFlavorImage(
133 garbage_texture_data
[0]
134 = GarbageFlavorImage::loadPersonalGarbageFlavorImage());
136 else if (n
== 0 && !(MetaState::mode
& CM_SOLO
)
137 && GarbageFlavorImage::network_texture
) {
138 char net_tex_file_name
[256];
139 TextureLoader::buildLocalDataFileName(GC_GARBAGE_NET_TEX_FILE_NAME
,
142 garbage_texture_data
[0] = TextureLoader::loadImage(net_tex_file_name
,
143 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
151 int choice
= Random::number(texture_file_count
);
152 for (i
= 0; choice
--; i
++)
153 while (!texture_file_flag
[i
])
157 for (int m
= 0; m
< n
; m
++)
158 if (use_textures
[n
] == use_textures
[m
]) {
164 GarbageFlavorImage::buildGarbageTextureFileName(file_name
,
167 garbage_texture_data
[n
] = TextureLoader::loadImage(file_name
,
168 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
173 // the logo may replace the second texture
174 if (Random::chanceIn(DC_CHANCE_IN_NOT_USE_LOGO_FLAVOR_TEX
)) {
175 if (garbage_texture_data
[1] != null
) {
176 delete [] garbage_texture_data
[1];
177 garbage_texture_data
[1] = null
;
180 if (MetaState::mode
& CM_X
)
181 garbage_texture_data
[1]
182 = TextureLoader::loadImage(GC_GARBAGE_X_LOGO_TEX_FILE_NAME
,
183 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
185 garbage_texture_data
[1]
186 = TextureLoader::loadImage(GC_GARBAGE_LOGO_TEX_FILE_NAME
,
187 DC_GARBAGE_TEX_LENGTH
, DC_GARBAGE_TEX_LENGTH
);
190 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, DC_GARBAGE_TEX_LENGTH
,
191 DC_GARBAGE_TEX_LENGTH
, GL_FALSE
, GL_RGBA
, GL_UNSIGNED_BYTE
,
192 garbage_texture_data
[GarbageFlavorImage::current_texture
]);
194 GLfloat vertices_0
[3 * 6] = {
203 GLfloat normals_0
[3 * 6] = {
212 GLfloat tex_coords_flavor
[2 * 6] = {
221 #ifndef NO_MULTITEXTURING
222 GLfloat tex_coords_lightmap
[2 * 6] = {
223 -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
224 DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
, -DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
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
,
228 3.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
229 DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
230 3.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
,
234 garbage_flavor_list
= glGenLists(1);
236 glEnableClientState(GL_VERTEX_ARRAY
);
237 glEnableClientState(GL_NORMAL_ARRAY
);
238 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
240 #ifndef NO_MULTITEXTURING
242 if (Displayer::state
& DS_MULTITEXTURING
) {
244 glActiveTextureARB(GL_TEXTURE1_ARB
);
246 glBindTexture(GL_TEXTURE_2D
, garbage_lightmap
);
247 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_MODULATE
);
249 glActiveTextureARB(GL_TEXTURE0_ARB
);
251 glNewList(garbage_flavor_list
, GL_COMPILE
);
253 glVertexPointer(3, GL_FLOAT
, 0, vertices_0
);
254 glNormalPointer(GL_FLOAT
, 0, normals_0
);
255 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_flavor
);
257 glClientActiveTextureARB(GL_TEXTURE1_ARB
);
258 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
259 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_lightmap
);
261 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
263 for (int n
= 6; n
--; ) {
264 vertices_0
[3 * n
+ 0] += 2.0f
;
265 tex_coords_flavor
[2 * n
+ 0] += 0.5f
;
266 tex_coords_lightmap
[2 * n
+ 0]
267 += 2.0f
* DC_GARBAGE_LIGHTMAP_COORD_CONVERTER
;
270 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
272 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);
273 glClientActiveTextureARB(GL_TEXTURE0_ARB
);
277 // if no multitexturing
281 glNewList(garbage_flavor_list
, GL_COMPILE
);
283 glVertexPointer(3, GL_FLOAT
, 0, vertices_0
);
284 glNormalPointer(GL_FLOAT
, 0, normals_0
);
285 glTexCoordPointer(2, GL_FLOAT
, 0, tex_coords_flavor
);
286 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
288 for (int n
= 6; n
--; ) {
289 vertices_0
[3 * n
+ 0] += 2.0f
;
290 tex_coords_flavor
[2 * n
+ 0] += 0.5f
;
293 glDrawArrays(GL_TRIANGLE_STRIP
, 0, 6);
296 #ifndef NO_MULTITEXTURING
300 glDisableClientState(GL_VERTEX_ARRAY
);
301 glDisableClientState(GL_NORMAL_ARRAY
);
302 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);