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.
35 #include "TextureLoader.h"
37 #include "Displayer.h"
38 #include "MetaState.h"
39 #include "GarbageFlavorImage.h"
41 GLuint
Displayer::logo_texture
;
42 GLuint
Displayer::losebar_texture
;
44 GLuint
Displayer::logo_list
;
46 void Displayer::generateExternalCandy ( )
50 glGenTextures(1, &logo_texture
);
52 glBindTexture(GL_TEXTURE_2D
, logo_texture
);
54 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
55 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
56 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
57 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
60 if (MetaState::mode
& CM_X
)
61 texture
= TextureLoader::loadNoAlphaTGA(GC_X_LOGO_TEX_FILE_NAME
,
62 DC_LOGO_TEX_LENGTH
, DC_LOGO_TEX_LENGTH
);
64 texture
= TextureLoader::loadNoAlphaTGA(GC_LOGO_TEX_FILE_NAME
,
65 DC_LOGO_TEX_LENGTH
, DC_LOGO_TEX_LENGTH
);
67 #if 0 // use to see the first entry in the garbage flavor texture set
68 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, DC_GARBAGE_TEX_LENGTH
,
69 DC_GARBAGE_TEX_LENGTH
, GL_FALSE
, GL_RGBA
, GL_UNSIGNED_BYTE
,
70 garbage_texture_data
[0]);
72 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB
, DC_LOGO_TEX_LENGTH
,
73 DC_LOGO_TEX_LENGTH
, GL_FALSE
, GL_RGB
, GL_UNSIGNED_BYTE
, texture
);
76 if (texture
!= null
) {
81 logo_list
= glGenLists(1);
83 glNewList(logo_list
, GL_COMPILE
);
84 glBegin(GL_TRIANGLE_STRIP
);
86 glTexCoord2f(0.0f
, 1.0f
);
87 glVertex3f(DC_LEFT_EXTERNAL_CENTER
- DC_LOGO_LENGTH
/ 2.0f
,
88 DC_LOGO_OFFSET_Y
- DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
89 glTexCoord2f(1.0f
, 1.0f
);
90 glVertex3f(DC_LEFT_EXTERNAL_CENTER
+ DC_LOGO_LENGTH
/ 2.0f
,
91 DC_LOGO_OFFSET_Y
- DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
92 glTexCoord2f(0.0f
, 0.0f
);
93 glVertex3f(DC_LEFT_EXTERNAL_CENTER
- DC_LOGO_LENGTH
/ 2.0f
,
94 DC_LOGO_OFFSET_Y
+ DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
95 glTexCoord2f(1.0f
, 0.0f
);
96 glVertex3f(DC_LEFT_EXTERNAL_CENTER
+ DC_LOGO_LENGTH
/ 2.0f
,
97 DC_LOGO_OFFSET_Y
+ DC_LOGO_LENGTH
/ 2.0f
, DC_EXTERNAL_OFFSET_Z
);
104 glGenTextures(1, &losebar_texture
);
106 glBindTexture(GL_TEXTURE_2D
, losebar_texture
);
108 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP
);
109 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP
);
110 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
111 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
113 GLfloat lb_texture
[DC_LOSEBAR_TEX_LENGTH_T
][DC_LOSEBAR_TEX_LENGTH_S
][2];
115 // calculate the losebar texture, because I'm better at math than at drawing
117 for (int s
= DC_LOSEBAR_TEX_LENGTH_S
; s
--; ) {
119 // clamp left and right edges
120 if (s
== 0 || s
== DC_LOSEBAR_TEX_LENGTH_S
- 1) {
121 for (int t
= DC_LOSEBAR_TEX_LENGTH_T
; t
--; ) {
122 lb_texture
[t
][s
][0] = 0.0f
;
123 lb_texture
[t
][s
][1] = 0.0f
;
128 GLfloat left
= s
* (1.0f
/ (GLfloat
) DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
);
129 for (int t
= DC_LOSEBAR_TEX_LENGTH_T
; t
--; ) {
130 GLfloat top
= t
* (1.0f
/ (GLfloat
) DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
);
132 GLfloat lumin
= 0.0f
;
133 GLfloat alpha
= 0.0f
;
135 for (int i
= DC_LOSEBAR_ANTIALIAS_LENGTH
; i
--; ) {
136 // runs from 0.0f to 1.0f
137 GLfloat x
= left
+ (i
+ 0.5f
) * (1.0f
138 / (GLfloat
) (DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
139 * DC_LOSEBAR_ANTIALIAS_LENGTH
));
141 for (int j
= DC_LOSEBAR_ANTIALIAS_LENGTH
; j
--; ) {
142 // runs from 0.0f to 2.0f * DC_LOSEBAR_END_RATIO
143 GLfloat y
= top
+ (j
+ 0.5f
) * (1.0f
144 / (GLfloat
) (DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S
145 * DC_LOSEBAR_ANTIALIAS_LENGTH
));
150 if (x
< DC_LOSEBAR_END_RATIO
) {
151 GLfloat r_sqrd
= (y
- DC_LOSEBAR_END_RATIO
)
152 * (y
- DC_LOSEBAR_END_RATIO
) + (DC_LOSEBAR_END_RATIO
- x
)
153 * (DC_LOSEBAR_END_RATIO
- x
);
154 if (r_sqrd
>= (DC_LOSEBAR_END_RATIO
* DC_LOSEBAR_END_RATIO
))
157 normal
[0] = sin((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
158 / DC_LOSEBAR_END_RATIO
));
159 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
160 * cos((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
161 / DC_LOSEBAR_END_RATIO
));
162 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
163 * cos((DC_LOSEBAR_END_RATIO
- x
) * (0.5f
* PI
164 / DC_LOSEBAR_END_RATIO
));
167 } else if (x
> (1.0f
- DC_LOSEBAR_END_RATIO
)) {
168 GLfloat r_sqrd
= (y
- DC_LOSEBAR_END_RATIO
)
169 * (y
- DC_LOSEBAR_END_RATIO
) + ((1.0f
- DC_LOSEBAR_END_RATIO
) - x
)
170 * ((1.0f
- DC_LOSEBAR_END_RATIO
) - x
);
171 if (r_sqrd
>= (DC_LOSEBAR_END_RATIO
* DC_LOSEBAR_END_RATIO
))
174 normal
[0] = sin(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
175 / DC_LOSEBAR_END_RATIO
));
176 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
177 * cos(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
178 / DC_LOSEBAR_END_RATIO
));
179 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
))
180 * cos(((1.0f
- DC_LOSEBAR_END_RATIO
) - x
) * (0.5f
* PI
181 / DC_LOSEBAR_END_RATIO
));
186 normal
[1] = cos(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
));
187 normal
[2] = sin(y
* (0.5f
* PI
/ DC_LOSEBAR_END_RATIO
));
190 float light
= normal
[0] * DC_LOSEBAR_LIGHT_VECTOR_X
191 + normal
[1] * DC_LOSEBAR_LIGHT_VECTOR_Y
192 + normal
[2] * DC_LOSEBAR_LIGHT_VECTOR_Z
;
194 lumin
+= 1.0f
- pow(1.0f
- light
, DC_LOSEBAR_LIGHT_SPECULAR_POWER
);
196 alpha
+= DC_LOSEBAR_LIGHT_AMBIENT_RATIO
197 + (1.0f
- DC_LOSEBAR_LIGHT_AMBIENT_RATIO
) * light
;
201 lb_texture
[t
][s
][0] = lumin
* (1.0f
202 / (GLfloat
) (DC_LOSEBAR_ANTIALIAS_LENGTH
* DC_LOSEBAR_ANTIALIAS_LENGTH
));
203 lb_texture
[t
][s
][1] = alpha
* (1.0f
204 / (GLfloat
) (DC_LOSEBAR_ANTIALIAS_LENGTH
* DC_LOSEBAR_ANTIALIAS_LENGTH
));
208 glTexImage2D(GL_TEXTURE_2D
, 0, GL_LUMINANCE_ALPHA
, DC_LOSEBAR_TEX_LENGTH_S
,
209 DC_LOSEBAR_TEX_LENGTH_T
, GL_FALSE
, GL_LUMINANCE_ALPHA
, GL_FLOAT
,