Each module now includes its own header first. Removed sstream.h and the definition...
[crack-attack.git] / src / obj_external_candy.cxx
blob5bcf1273a1c71180dc43f1acab7edc6e2f783540
1 /*
2 * external_candy.cxx
3 * Daniel Nelson - 10/13/0
5 * Copyright (C) 2000 Daniel Nelson
6 * Copyright (C) 2004 Andrew Sayman
7 *
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
23 * 174 W. 18th Ave.
24 * Columbus, OH 43210
26 * Generates lists and textures for candy external to the game.
29 #include <GL/glut.h>
31 #include "glext.h"
33 #include "TextureLoader.h"
34 #include "Game.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 ( )
46 // the logo
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);
57 GLubyte *texture;
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);
61 else
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]);
69 #else
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);
72 #endif
74 if (texture != null) {
75 delete [] texture;
76 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);
97 glEnd();
98 glEndList();
100 // the losebar
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;
123 continue;
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));
145 GLfloat normal[3];
147 // left end
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))
153 continue;
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));
164 // right end
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))
170 continue;
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));
181 // center
182 } else {
183 normal[0] = 0.0f;
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,
208 lb_texture);