3 * Daniel Nelson - 10/13/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 lists and textures for candy external to the game.
33 #include "TextureLoader.h"
35 #include "Displayer.h"
36 #include "MetaState.h"
37 #include "GarbageFlavorImage.h"
39 GLuint
Displayer::logo_texture
;
40 GLuint
Displayer::losebar_texture
;
42 GLuint
Displayer::logo_list
;
44 void Displayer::generateExternalCandy ( )
48 glGenTextures(1, &logo_texture
);
50 glBindTexture(GL_TEXTURE_2D
, logo_texture
);
52 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
53 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
54 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
55 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
58 if (MetaState::mode
& CM_X
)
59 texture
= TextureLoader::loadNoAlphaTGA(GC_X_LOGO_TEX_FILE_NAME
,
60 DC_LOGO_TEX_LENGTH
, DC_LOGO_TEX_LENGTH
);
62 texture
= TextureLoader::loadNoAlphaTGA(GC_LOGO_TEX_FILE_NAME
,
63 DC_LOGO_TEX_LENGTH
, DC_LOGO_TEX_LENGTH
);
65 #if 0 // use to see the first entry in the garbage flavor texture set
66 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, DC_GARBAGE_TEX_LENGTH
,
67 DC_GARBAGE_TEX_LENGTH
, GL_FALSE
, GL_RGBA
, GL_UNSIGNED_BYTE
,
68 garbage_texture_data
[0]);
70 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB
, DC_LOGO_TEX_LENGTH
,
71 DC_LOGO_TEX_LENGTH
, GL_FALSE
, GL_RGB
, GL_UNSIGNED_BYTE
, texture
);
74 if (texture
!= null
) {
79 logo_list
= glGenLists(1);
81 glNewList(logo_list
, GL_COMPILE
);
82 glBegin(GL_TRIANGLE_STRIP
);
84 glTexCoord2f(0.0f
, 1.0f
);
85 glVertex3f(DC_LEFT_EXTERNAL_CENTER
- DC_LOGO_LENGTH
/ 2.0f
,
86 DC_LOGO_OFFSET_Y
- DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
87 glTexCoord2f(1.0f
, 1.0f
);
88 glVertex3f(DC_LEFT_EXTERNAL_CENTER
+ DC_LOGO_LENGTH
/ 2.0f
,
89 DC_LOGO_OFFSET_Y
- DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
90 glTexCoord2f(0.0f
, 0.0f
);
91 glVertex3f(DC_LEFT_EXTERNAL_CENTER
- DC_LOGO_LENGTH
/ 2.0f
,
92 DC_LOGO_OFFSET_Y
+ DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
93 glTexCoord2f(1.0f
, 0.0f
);
94 glVertex3f(DC_LEFT_EXTERNAL_CENTER
+ DC_LOGO_LENGTH
/ 2.0f
,
95 DC_LOGO_OFFSET_Y
+ DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
102 glGenTextures(1, &losebar_texture
);
104 glBindTexture(GL_TEXTURE_2D
, losebar_texture
);
106 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP
);
107 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP
);
108 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
109 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
111 GLfloat lb_texture
[DC_LOSEBAR_TEX_LENGTH_T
][DC_LOSEBAR_TEX_LENGTH_S
][2];
113 // calculate the losebar texture, because I'm better at math than at drawing
115 for (int s
= DC_LOSEBAR_TEX_LENGTH_S
; s
--; ) {
117 // clamp left and right edges
118 if (s
== 0 || s
== DC_LOSEBAR_TEX_LENGTH_S
- 1) {
119 for (int t
= DC_LOSEBAR_TEX_LENGTH_T
; t
--; ) {
120 lb_texture
[t
][s
][0] = 0.0f
;
121 lb_texture
[t
][s
][1] = 0.0f
;
126 GLfloat left
= s
* (1.0f
/ (GLfloat
) DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
);
127 for (int t
= DC_LOSEBAR_TEX_LENGTH_T
; t
--; ) {
128 GLfloat top
= t
* (1.0f
/ (GLfloat
) DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
);
130 GLfloat lumin
= 0.0f
;
131 GLfloat alpha
= 0.0f
;
133 for (int i
= DC_LOSEBAR_ANTIALIAS_LENGTH
; i
--; ) {
134 // runs from 0.0f to 1.0f
135 GLfloat x
= left
+ (i
+ 0.5f
) * (1.0f
136 / (GLfloat
) (DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
137 * DC_LOSEBAR_ANTIALIAS_LENGTH
));
139 for (int j
= DC_LOSEBAR_ANTIALIAS_LENGTH
; j
--; ) {
140 // runs from 0.0f to 2.0f * DC_LOSEBAR_END_RATIO
141 GLfloat y
= top
+ (j
+ 0.5f
) * (1.0f
142 / (GLfloat
) (DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
143 * DC_LOSEBAR_ANTIALIAS_LENGTH
));
148 if (x
< DC_LOSEBAR_END_RATIO
) {
149 GLfloat r_sqrd
= (y
- DC_LOSEBAR_END_RATIO
)
150 * (y
- DC_LOSEBAR_END_RATIO
) + (DC_LOSEBAR_END_RATIO
- x
)
151 * (DC_LOSEBAR_END_RATIO
- x
);
152 if (r_sqrd
>= (DC_LOSEBAR_END_RATIO
* DC_LOSEBAR_END_RATIO
))
155 normal
[0] = sin((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
156 / DC_LOSEBAR_END_RATIO
));
157 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
158 * cos((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
159 / DC_LOSEBAR_END_RATIO
));
160 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
161 * cos((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
162 / DC_LOSEBAR_END_RATIO
));
165 } else if (x
> (1.0f
- DC_LOSEBAR_END_RATIO
)) {
166 GLfloat r_sqrd
= (y
- DC_LOSEBAR_END_RATIO
)
167 * (y
- DC_LOSEBAR_END_RATIO
) + ((1.0f
- DC_LOSEBAR_END_RATIO
) - x
)
168 * ((1.0f
- DC_LOSEBAR_END_RATIO
) - x
);
169 if (r_sqrd
>= (DC_LOSEBAR_END_RATIO
* DC_LOSEBAR_END_RATIO
))
172 normal
[0] = sin(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
173 / DC_LOSEBAR_END_RATIO
));
174 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
175 * cos(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
176 / DC_LOSEBAR_END_RATIO
));
177 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
178 * cos(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
179 / DC_LOSEBAR_END_RATIO
));
184 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
));
185 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
));
188 float light
= normal
[0] * DC_LOSEBAR_LIGHT_VECTOR_X
189 + normal
[1] * DC_LOSEBAR_LIGHT_VECTOR_Y
190 + normal
[2] * DC_LOSEBAR_LIGHT_VECTOR_Z
;
192 lumin
+= 1.0f
- pow(1.0f
- light
, DC_LOSEBAR_LIGHT_SPECULAR_POWER
);
194 alpha
+= DC_LOSEBAR_LIGHT_AMBIENT_RATIO
195 + (1.0f
- DC_LOSEBAR_LIGHT_AMBIENT_RATIO
) * light
;
199 lb_texture
[t
][s
][0] = lumin
* (1.0f
200 / (GLfloat
) (DC_LOSEBAR_ANTIALIAS_LENGTH
* DC_LOSEBAR_ANTIALIAS_LENGTH
));
201 lb_texture
[t
][s
][1] = alpha
* (1.0f
202 / (GLfloat
) (DC_LOSEBAR_ANTIALIAS_LENGTH
* DC_LOSEBAR_ANTIALIAS_LENGTH
));
206 glTexImage2D(GL_TEXTURE_2D
, 0, GL_LUMINANCE_ALPHA
, DC_LOSEBAR_TEX_LENGTH_S
,
207 DC_LOSEBAR_TEX_LENGTH_T
, GL_FALSE
, GL_LUMINANCE_ALPHA
, GL_FLOAT
,