Updated to work with freeglut 2.4.0
[crack-attack.git] / src / obj_external_candy.cxx
blob791c8fdbbfb99be05c05b161fdaf2892b07c66e8
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 using namespace std;
35 #include "TextureLoader.h"
36 #include "Game.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 ( )
48 // the logo
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);
59 GLubyte *texture;
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);
63 else
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]);
71 #else
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);
74 #endif
76 if (texture != null) {
77 delete [] texture;
78 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);
99 glEnd();
100 glEndList();
102 // the losebar
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;
125 continue;
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));
147 GLfloat normal[3];
149 // left end
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))
155 continue;
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));
166 // right end
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))
172 continue;
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));
183 // center
184 } else {
185 normal[0] = 0.0f;
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,
210 lb_texture);