Game end works this way now:
[crack-attack.git] / src / Displayer.h
bloba84ede5b22492ceb29cdfaf64946f4a76bd8a60c
1 /*
2 * Displayer.h
3 * Daniel Nelson - 8/24/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
27 #ifndef DISPLAYER_H
28 #define DISPLAYER_H
30 #include <GL/glut.h>
31 #include "glext.h"
33 using namespace std;
35 #include "Game.h"
36 #include "Garbage.h"
37 #include "CountDownManager.h"
38 #include "Creep.h"
39 #include "Spring.h"
40 #include "WinRecord.h"
42 // I can not find a version of glext.h which defines
43 // GL_LIGHT_MODEL_COLOR_CONTROL and its allowed values. The
44 // GL_LIGHT_MODEL_COLOR_CONTROL_EXT defines from OpenGL 1.1 have the same
45 // values as their OpenGL 1.2 partiners. So, here is the work around.
46 #ifndef _WIN32
47 #else
48 #ifndef __MINGW32__
49 # define GL_LIGHT_MODEL_COLOR_CONTROL GL_LIGHT_MODEL_COLOR_CONTROL_EXT
50 # define GL_SEPARATE_SPECULAR_COLOR GL_SEPARATE_SPECULAR_COLOR_EXT
51 # define GL_SINGLE_COLOR GL_SINGLE_COLOR_EXT
52 #endif
53 #endif
55 // displayer states
56 #define DS_MULTITEXTURING (1 << 0)
58 // clip planes
59 #define GL_CLIP_PLANE_PLAY_FLOOR (GL_CLIP_PLANE0)
60 #define GL_CLIP_PLANE_SHATTERING (GL_CLIP_PLANE1)
62 // window dimensions
63 #define DC_WINDOW_PIXEL_WIDTH (1)
64 #define DC_WINDOW_PIXEL_HEIGHT (1)
65 #define DC_WINDOW_PIXEL_ASPECT_RATIO ((float) DC_WINDOW_PIXEL_WIDTH \
66 / DC_WINDOW_PIXEL_HEIGHT)
67 #define DC_WINDOW_PIXEL_STARTING_HEIGHT (700)
68 #define DC_WINDOW_PIXEL_STARTING_WIDTH (DC_WINDOW_PIXEL_WIDTH \
69 * DC_WINDOW_PIXEL_STARTING_HEIGHT\
70 / DC_WINDOW_PIXEL_HEIGHT)
72 // play area dimensions in pixels as ratio of window size; these times the
73 // window dimensions must have a 2:1 ratio - like the play area
74 #define DC_PLAY_PIXEL_WIDTH (0.5f)
75 #define DC_PLAY_PIXEL_HEIGHT (1.0f)
77 // play area offset in pixels as ratio of window size
78 #define DC_PLAY_PIXEL_OFFSET_X (0.4)
79 #define DC_PLAY_PIXEL_OFFSET_Y (0.0f)
81 // play area dimensions in GL coordinates
82 #define DC_PLAY_WIDTH (12.0)
83 #define DC_PLAY_HEIGHT (24.0)
85 // camera height as a fraction of play height
86 #define DC_CAMERA_HEIGHT_RATIO (0.25)
88 // object offset
89 #define DC_PLAY_OFFSET_X (1.0f - DC_PLAY_WIDTH / 2.0f)
90 #define DC_PLAY_OFFSET_Y (-1.0f - DC_PLAY_HEIGHT \
91 * DC_CAMERA_HEIGHT_RATIO)
92 #define DC_PLAY_OFFSET_Z (-42.5f)
93 #define DC_EXTERNAL_OFFSET_Z (-42.5f)
95 // grid element size
96 #define DC_GRID_ELEMENT_LENGTH (2.0f)
98 // headlight z offset
99 #define DC_HEADLIGHT_Y_OFFSET (2.1f * DC_GRID_ELEMENT_LENGTH)
100 #define DC_HEADLIGHT_Z_OFFSET (-35.0f)
102 // acceleration of death rotation
103 #define DC_DYING_ROTATE_SPEED (0.2f)
105 // constants of death animation
106 #define DC_DYING_FLASH_TIME (12)
107 #define DC_DYING_SHRINK_MIN_SIZE (0.1f)
108 #define DC_DYING_SHRINK_SPEED ((1.0f \
109 - DC_DYING_SHRINK_MIN_SIZE) \
110 / (float) (GC_DYING_DELAY \
111 - DC_DYING_FLASH_TIME))
112 #define DC_FLASH_COLOR_RED (1.0f)
113 #define DC_FLASH_COLOR_GREEN (1.0f)
114 #define DC_FLASH_COLOR_BLUE (1.0f)
116 // constants of shattering animation
117 #define DC_CLIP_SHATTER
118 #define DC_SHATTER_TIME (GC_INITIAL_POP_DELAY)
119 #define DC_UNSHATTER_TIME (GC_FINAL_POP_DELAY)
120 #define DC_POP_ROTATE_TIME (4 * GC_INTERNAL_POP_DELAY / 5)
121 #define DC_SHATTER_FLASH_TIME (DC_DYING_FLASH_TIME)
123 // garbage lightmap constants
124 #define DC_GARBAGE_LIGHTMAP_LENGTH (64)
125 #define DC_GARBAGE_LIGHTMAP_MIN_LUMINANCE (0.85f)
126 #define DC_GARBAGE_LIGHTMAP_COORD_CONVERTER (-1.0f / (DC_GRID_ELEMENT_LENGTH \
127 * (float) GC_PLAY_WIDTH))
128 #define DC_NUMBER_GARBAGE_LIGHTMAPS (6)
130 // garbage flavor image constants
131 #define DC_NUMBER_GARBAGE_TEX (4)
132 #define DC_NUMBER_USE_GARBAGE_TEX (4)
133 #define DC_GARBAGE_TEX_LENGTH (128)
134 #define DC_CHANCE_USE_NET_TEX (5)
135 #define DC_MIN_FLAVOR_GARBAGE_LENGTH (4)
136 #define DC_CHANCE_NO_GARBAGE_FLAVOR (8)
137 #define DC_GARBAGE_FLAVOR_TEX_OFFSET_Z (0.01f)
138 #define DC_CHANCE_IN_NOT_USE_LOGO_FLAVOR_TEX (4)
140 // general sparkle constants
141 #define DC_SPARKLE_LENGTH (0.4f / 2.0f)
142 #define DC_SPARKLE_TEX_LENGTH (32)
144 // spark constants
145 #define DC_MAX_SPARK_NUMBER (400)
146 #define DC_SPARK_GRAVITY (0.001f)
147 #define DC_SPARK_DRAG (0.001f)
148 #define DC_MIN_SPARK_VELOCITY (0.02f)
149 #define DC_MAX_SPARK_VELOCITY (0.15f)
150 #define DC_MIN_SPARK_ANGULAR_VELOCITY (1.0f)
151 #define DC_MAX_SPARK_ANGULAR_VELOCITY (15.0f)
152 #define DC_MIN_SPARK_SIZE (0.4f)
153 #define DC_MEDIUM_SPARK_LIFE_TIME (120)
154 #define DC_SPREAD_SPARK_LIFE_TIME (50)
155 #define DC_CHANCE_LONG_SPARK_LIFE_TIME (40)
156 #define DC_SPARK_FADE_TIME (15)
157 #define DC_SPARK_PULSE_TIME (6)
159 // celebration spark constants
160 #define DC_MIN_CSPARK_VELOCITY (0.05f)
161 #define DC_SPREAD_CSPARK_VELOCITY (0.05f)
162 #define DC_SOURCE_1_OFFSET_X (0.0f)
163 #define DC_SOURCE_1_OFFSET_Y (7.0f)
164 #define DC_SOURCE_1_SOLO_OFFSET_X (0.0f)
165 #define DC_SOURCE_1_SOLO_OFFSET_Y (12.0f)
166 #define DC_SOURCE_2_OFFSET_X (0.0f)
167 #define DC_SOURCE_2_OFFSET_Y (19.0f)
168 #define DC_SOURCE_3_OFFSET_X (10.0f)
169 #define DC_SOURCE_3_OFFSET_Y (7.0f)
170 #define DC_SOURCE_3_SOLO_OFFSET_X (10.0f)
171 #define DC_SOURCE_3_SOLO_OFFSET_Y (12.0f)
172 #define DC_SOURCE_4_OFFSET_X (10.0f)
173 #define DC_SOURCE_4_OFFSET_Y (19.0f)
174 #define DC_SOURCE_5_OFFSET_X (5.0f)
175 #define DC_SOURCE_5_OFFSET_Y (4.0f)
176 #define DC_SOURCE_5_SOLO_OFFSET_X (5.0f)
177 #define DC_SOURCE_5_SOLO_OFFSET_Y (3.7f)
179 // mote constants
180 #define DC_MAX_MOTE_NUMBER (40)
181 #define DC_MULTI_MOTE_FIRE_DELAY (25)
182 #define DC_MOTE_COLOR_FADE_TIME (50)
183 #define DC_MEDIUM_MOTE_VELOCITY (0.2f)
184 #define DC_SPREAD_MOTE_VELOCITY (0.02f)
185 #define DC_MEDIUM_MOTE_ANGULAR_VELOCITY (3.0f)
186 #define DC_SPREAD_MOTE_ANGULAR_VELOCITY (1.0f)
187 #define DC_MOTE_UPWARD_FORCE (0.004f)
188 #define DC_MOTE_CENTER_SPRING (0.005f)
189 #define DC_MOTE_TWIST_SPRING (0.0008f)
190 #define DC_MOTE_DRAG (0.005f)
192 // mote types
193 #define DC_NUMBER_MOTE_LEVELS (22)
194 #define DC_NUMBER_MOTE_TYPES (7)
195 #define DC_FIRST_SPECIAL_MOTE_COLOR (4)
196 #define MT_FOUR_POINTED_STAR (0)
197 #define MT_FIVE_POINTED_STAR (1)
198 #define MT_SIX_POINTED_STAR (2)
199 #define MT_SPECIAL_STAR (3)
200 #define MT_MULTIPLIER_ONE_STAR (4)
201 #define MT_MULTIPLIER_TWO_STAR (5)
202 #define MT_MULTIPLIER_THREE_STAR (6)
204 // mote light constants
205 #define DC_NUMBER_EXTRA_LIGHTS (7)
206 #define DC_EXTRA_LIGHT_BASE (GL_LIGHT1)
207 #define DC_MOTE_LIGHT_RANGE (DC_GRID_ELEMENT_LENGTH \
208 + DC_GRID_ELEMENT_LENGTH \
209 * 1.414214f / 2.0f)
210 #define DC_MAX_MOTE_LIGHT_BRIGHTNESS (0.4f)
211 #define DC_MOTE_LIGHT_OFFSET_Z (3.0f)
212 #define DC_MOTE_LIGHT_ATTENUATION (0.1f)
214 // sign constants
215 #define DC_MAX_SIGN_NUMBER (25)
216 #define DC_SIGN_LENGTH (0.33f * DC_GRID_ELEMENT_LENGTH)
217 #define DC_SIGN_OFFSET_X (-0.5f * DC_GRID_ELEMENT_LENGTH)
218 #define DC_SIGN_OFFSET_Y (0.5f * DC_GRID_ELEMENT_LENGTH)
219 #define DC_SIGN_OFFSET_SPREAD (0.1f * DC_GRID_ELEMENT_LENGTH)
220 #define DC_SIGN_HOLD_TIME (100)
221 #define DC_SIGN_FADE_TIME (200)
222 #define DC_SIGN_LIFE_TIME (DC_SIGN_HOLD_TIME \
223 + DC_SIGN_FADE_TIME)
224 #define DC_SIGN_TERMINAL_VELOCITY (DC_GRID_ELEMENT_LENGTH / 500.0f)
225 #define DC_SIGN_ACCELERATION_TIME (DC_SIGN_HOLD_TIME)
226 #define DC_SIGN_ACCELERATION (DC_SIGN_TERMINAL_VELOCITY \
227 / (float) \
228 DC_SIGN_ACCELERATION_TIME)
229 #define DC_SIGN_ALPHA (1.0f)
230 #define DC_FINAL_INFLATE_SIZE (5.0f)
232 // sign texture constants
233 #define DC_NUMBER_SMALL_SIGN_SUBTEXTURES (6)
234 #define DC_SIGN_SMALL_TEX_GRID_LENGTH_S (4)
235 #define DC_SIGN_SMALL_TEX_GRID_LENGTH_T (2)
236 #define DC_SIGN_SMALL_SUBTEX_LENGTH_S (32)
237 #define DC_SIGN_SMALL_SUBTEX_LENGTH_T (32)
238 #define DC_SIGN_SMALL_TEX_LENGTH_S (DC_SIGN_SMALL_SUBTEX_LENGTH_S \
239 * DC_SIGN_SMALL_TEX_GRID_LENGTH_S)
240 #define DC_SIGN_SMALL_TEX_LENGTH_T (DC_SIGN_SMALL_SUBTEX_LENGTH_T \
241 * DC_SIGN_SMALL_TEX_GRID_LENGTH_T)
242 #define DC_SIGN_SMALL_SUBTEX_COORD_S (1.0f / (float) \
243 DC_SIGN_SMALL_TEX_GRID_LENGTH_S)
244 #define DC_SIGN_SMALL_SUBTEX_COORD_T (1.0f / (float) \
245 DC_SIGN_SMALL_TEX_GRID_LENGTH_T)
246 #define DC_NUMBER_LARGE_SIGN_SUBTEXTURES (15)
247 #define DC_SIGN_LARGE_TEX_GRID_LENGTH_S (4)
248 #define DC_SIGN_LARGE_TEX_GRID_LENGTH_T (4)
249 #define DC_SIGN_LARGE_SUBTEX_LENGTH_S (32)
250 #define DC_SIGN_LARGE_SUBTEX_LENGTH_T (64)
251 #define DC_SIGN_LARGE_TEX_LENGTH_S (DC_SIGN_LARGE_SUBTEX_LENGTH_S \
252 * DC_SIGN_LARGE_TEX_GRID_LENGTH_S)
253 #define DC_SIGN_LARGE_TEX_LENGTH_T (DC_SIGN_LARGE_SUBTEX_LENGTH_T \
254 * DC_SIGN_LARGE_TEX_GRID_LENGTH_T)
255 #define DC_SIGN_LARGE_SUBTEX_COORD_S (1.0f / (float) \
256 DC_SIGN_LARGE_TEX_GRID_LENGTH_S)
257 #define DC_SIGN_LARGE_SUBTEX_COORD_T (1.0f / (float) \
258 DC_SIGN_LARGE_TEX_GRID_LENGTH_T)
260 // swapper constants
261 #define DC_SWAPPER_GRAB_LENGTH (0.2f)
263 // external candy constants
264 #define DC_LEFT_EXTERNAL_CENTER (-10.5f)
266 // logo constants
267 #define DC_LOGO_TEX_LENGTH (256)
268 #define DC_LOGO_OFFSET_Y (13.5f)
269 #define DC_LOGO_LENGTH (7.2f)
271 // level lights constants
272 #define DC_LEVEL_LIGHT_FADE_TIME (150)
273 #define DC_LEVEL_LIGHT_IMPACT_FLASH_TIME (20)
274 #define DC_LEVEL_LIGHT_FLASH_INFLECTION (0.9f)
275 #define DC_LEVEL_LIGHT_DEATH_FLASH_TIME (12)
276 #define DC_LEVEL_LIGHT_RED (0.7f)
277 #define DC_LEVEL_LIGHT_BLUE (0.7f)
278 #define DC_LEVEL_LIGHT_LOCAL_OFFSET_X (7.3f)
279 #define DC_LEVEL_LIGHT_OPPONENT_OFFSET_X (-15.0f)
281 // message constants
282 #define DC_NUMBER_MESSAGE_TEX (10)
283 #define DC_COUNT_DOWN_GO_INFLECTION (0.8f)
284 #define DC_COUNT_DOWN_HEIGHT_RATIO (0.4f)
285 #define DC_COUNT_DOWN_MAX_SCALE (7.0f)
286 #define DC_MESSAGE_SCALE (6.0f)
287 #define DC_SYNC_WAIT_LIGHT_LEVEL (0.75f)
288 #define DC_MESSAGE_PULSE_PERIOD (320)
290 // clock constants
291 #define DC_CLOCK_TEX_LENGTH (32)
292 #define DC_CLOCK_OFFSET_Y (-2.5f)
293 #define DC_CLOCK_DIGIT_LENGTH (0.6f)
294 #define DC_CLOCK_DIGIT_OFFSET (1.0f)
295 #define DC_CLOCK_CENTER_OFFSET (0.7f)
297 // celebration constants
298 #define DC_CELEBRATION_FADE_TIME (200)
299 #define DC_CELEBRATION_TIME (225)
300 #define DC_CSPARK_SOURCE_NUMBER (5)
301 #define DC_CSPARK_COLOR_NUMBER (5)
302 #define DC_CSPARK_STARTING_RATE (270)
303 #define DC_CSPARK_FULL_RATE (600)
304 #define DC_CSPARK_LOW_RATE (150)
305 #define DC_CSPARK_QUICK_RATE_DROP (3)
306 #define DC_CSPARK_BOOST_CHANCE_IN (40)
307 #define DC_CSPARK_RATE_BOOST (90)
308 #define DC_CSPARK_COLOR_CHANGE_CHANCE_IN (5)
309 #define DC_STARTING_WIN_SCALE (12.0f)
310 #define DC_STARTING_LOSS_HEIGHT (9.0f * DC_GRID_ELEMENT_LENGTH)
311 #define DC_STARTING_BOUNCE_COUNT (6)
312 #define DC_FINAL_BOUNCE_COUNT (2)
313 #define DC_WIN_FADE_TIME (50)
314 #define DC_WIN_FLASH_1_TIME (8)
315 #define DC_WIN_FLASH_2_TIME (12)
316 #define DC_WIN_FLASH_1_CHANCE_IN (3)
317 #define DC_WIN_FLASH_2_CHANCE_IN (6)
318 #define DC_LOSS_GRAVITY (0.01f)
319 #define DC_LOSS_DRAG (0.005f)
320 #define DC_LOSS_MIN_VELOCITY (10.0f * DC_LOSS_GRAVITY)
321 #define DC_LOSS_BOUNCE_ELASTICITY (0.5f)
322 #define DC_LOSS_END_BOUNCE_ELASTICITY (0.1f)
323 #define DC_WIN_MESSAGE_RED (1.0f)
324 #define DC_WIN_MESSAGE_GREEN (0.7f)
325 #define DC_WIN_MESSAGE_BLUE (0.9f)
326 #define DC_LOSS_MESSAGE_RED (0.7f)
327 #define DC_LOSS_MESSAGE_GREEN (0.2f)
328 #define DC_LOSS_MESSAGE_BLUE (0.9f)
329 #define DC_GAME_OVER_SCALE_RATIO (75.0f / 64.0f)
331 // star constants
332 #define DC_STAR_DISPLACEMENT (2.0f)
333 #define DC_STAR_OFFSET_X (DC_LEFT_EXTERNAL_CENTER \
334 - DC_STAR_DISPLACEMENT \
335 * (GC_GAMES_PER_MATCH - 1) / 2.0f)
336 #define DC_STAR_OFFSET_Y (0.5f)
337 #define DC_STAR_PLAY_ANGULAR_VELOCITY (1.0f)
338 #define DC_STAR_WIN_MIN_ANGULAR_DEVIATION (180.0f)
339 #define DC_STAR_WIN_SPREAD_ANGULAR_DEVIATION (180.0f)
340 #define DC_STAR_WIN_OFFSET_X (0.0f)
341 #define DC_STAR_WIN_OFFSET_Y (13.0f)
342 #define DC_STAR_WIN_SOLO_OFFSET_Y (17.5f)
343 #define DC_STAR_WIN_PRESET_1_VELOCITY_X (0.5f)
344 #define DC_STAR_WIN_PRESET_1_VELOCITY_Y (-0.25f)
345 #define DC_STAR_WIN_PRESET_2_VELOCITY_X (-0.3f)
346 #define DC_STAR_WIN_PRESET_2_VELOCITY_Y (0.35f)
347 #define DC_STAR_WIN_MIN_VELOCITY (0.2f)
348 #define DC_STAR_WIN_SPREAD_VELOCITY (0.2f)
349 #define DC_STAR_SIZE_EQUILIBRIUM (5.0f)
350 #define DC_STAR_WIN_SIZE_SPRING (0.1f)
351 #define DC_STAR_WIN_SIZE_DRAG (0.05f)
352 #define DC_STAR_WIN_SIZE_EPSILON (0.00005f)
353 #define DC_STAR_WIN_SIZE_PULSE_CHANCE_IN (100)
354 #define DC_STAR_WIN_SIZE_PULSE_VELOCITY (1.0f)
355 #define DC_STAR_WIN_ANGULAR_SPRING (0.0001f)
356 #define DC_STAR_WIN_KICK_DELAY (100)
357 #define DC_STAR_WIN_SPRING (0.0025f)
358 #define DC_STAR_WIN_DRAG (0.04f)
359 #define DC_STAR_WIN_EPSILON (0.01f)
360 #define DC_STAR_WIN_VELOCITY_EPSILON (0.01f)
361 #define DC_STAR_WIN_RED (0.85f)
362 #define DC_STAR_WIN_GREEN (0.85f)
363 #define DC_STAR_WIN_BLUE (0.0f)
364 #define DC_STAR_UNPLAYED_RED (0.4f)
365 #define DC_STAR_UNPLAYED_GREEN (0.4f)
366 #define DC_STAR_UNPLAYED_BLUE (0.7f)
367 #define DC_STAR_LOST_ALPHA (0.4f)
368 #define DC_SOLO_STAR_ID (1)
370 // name constants
371 #define DC_NAME_OFFSET_Y (7.0f)
372 #define DC_NAME_SCALE (4.4f)
373 #define DC_LETTER_TEX_LENGTH (32)
374 #define DC_NAME_TEX_LENGTH_S (256)
375 #define DC_NAME_TEX_LENGTH_T (128)
376 #define DC_FONT_NUMBER (1)
377 #define DC_FONT_COLOR_NUMBER (10)
378 #define DC_LETTER_NUMBER (86)
379 #define DC_BACK_SPACE_WIDTH (5)
380 #define DC_SPACE_WIDTH (10)
381 #define DC_DEFAULT_FONT_COLOR (0)
382 #define DC_VS_STRING "vs"
384 // xtreme constants
385 #define DC_GLEAM_PERIOD (64)
386 #define DC_GLEAM_ROTATION_RATE (1.0f / 8.0f)
387 #define DC_GLEAM_ROTATION_AXIS_X (1.0f / 3.741657f)
388 #define DC_GLEAM_ROTATION_AXIS_Y (2.0f / 3.741657f)
389 #define DC_GLEAM_ROTATION_AXIS_Z (3.0f / 3.741657f)
391 // score record constants
392 #define DC_SCORE_TO_BEAT_MESSAGE "Score to Beat:"
393 #define DC_SCORE_TO_BEAT_SCALE (4.9f)
394 #define DC_SCORE_TO_BEAT_TEX_LENGTH_S (256)
395 #define DC_SCORE_TO_BEAT_TEX_LENGTH_T (128)
396 #define DC_SCORE_REC_TEX_LENGTH_S (512)
397 #define DC_SCORE_REC_RANK_STRING_TEX_WIDTH (45)
398 #define DC_SCORE_REC_RANK_TEX_MARGIN (85)
399 #define DC_SCORE_REC_RANK_MIN_SPACE DC_SPACE_WIDTH
400 #define DC_SCORE_REC_NUMBER_DRAW (7)
401 #define DC_SCORE_REC_START_VELOCITY (0.6f)
402 #define DC_SCORE_REC_RANK_HEIGHT (3.4f)
403 #define DC_SCORE_REC_SPRING (0.01f)
404 #define DC_SCORE_REC_SPRING_DRAG (0.05f)
405 #define DC_SCORE_REC_EDGE_BOUNCE_ELASTICITY (0.8f)
406 #define DC_SCORE_REC_VELOCITY_CUTOFF (0.001f)
407 #define DC_SCORE_REC_OFFSET_CUTOFF (0.001f)
408 #define DC_SCORE_REC_CONTROL_VELOCITY_CUTOFF (0.1f)
409 #define DC_SCORE_REC_CONTROL_OFFSET_CUTOFF (0.1f)
410 #define DC_SCORE_REC_BOUNCE_VELOCITY_CUTOFF (0.01f)
411 #define DC_SCORE_REC_CONTROL_VELOCITY (0.1f)
412 #define DC_SCORE_REC_CONTROL_DRAG (0.1f)
413 #define DC_SCORE_REC_CIRCLE_SCALE (6.0f)
414 #define DC_SCORE_REC_Y_OFFSET (8.0f)
415 #define DC_SCORE_REC_SCALE_X (9.8f)
416 #define DC_SCORE_REC_SCALE_Y (4.78f)
417 #define DC_SCORE_REC_RANK_DRAW_HEIGHT (2.0f)
419 // losebar constants
420 #define DC_LOSEBAR_OFFSET_Y (3.0f)
421 #define DC_LOSEBAR_FADE_TIME (20)
422 #define DC_LOSEBAR_TEX_LENGTH_S (128)
423 #define DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S (128 - 2)
424 #define DC_LOSEBAR_TEX_LENGTH_T (16)
425 #define DC_LOSEBAR_LENGTH (7.0f)
426 #define DC_LOSEBAR_HEIGHT (DC_LOSEBAR_LENGTH \
427 * DC_LOSEBAR_TEX_LENGTH_T \
429 DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S)
430 #define DC_LOSEBAR_FADE_LENGTH (2.0f)
431 #define DC_LOSEBAR_FADE_TEX_LENGTH (DC_LOSEBAR_FADE_LENGTH \
432 / (float) DC_LOSEBAR_LENGTH)
433 #define DC_LOSEBAR_ANTIALIAS_LENGTH (4)
434 #define DC_LOSEBAR_END_RATIO (0.5f * DC_LOSEBAR_TEX_LENGTH_T \
436 DC_LOSEBAR_TEX_EFFECTIVE_LENGTH_S)
437 #define DC_LOSEBAR_LIGHT_VECTOR_X (-1.0f / SQRT_3)
438 #define DC_LOSEBAR_LIGHT_VECTOR_Y (1.0f / SQRT_3)
439 #define DC_LOSEBAR_LIGHT_VECTOR_Z (1.0f / SQRT_3)
440 #define DC_LOSEBAR_LIGHT_SPECULAR_POWER (0.45f)
441 #define DC_LOSEBAR_LIGHT_AMBIENT_RATIO (0.5f)
442 #define DC_LOSEBAR_INACTIVE_RED (0.0f)
443 #define DC_LOSEBAR_INACTIVE_GREEN (0.0f)
444 #define DC_LOSEBAR_INACTIVE_BLUE (1.0f)
445 #define DC_LOSEBAR_LOW_ALERT_RED (0.8f)
446 #define DC_LOSEBAR_LOW_ALERT_GREEN (0.0f)
447 #define DC_LOSEBAR_LOW_ALERT_BLUE (0.8f)
448 #define DC_LOSEBAR_HIGH_ALERT_RED (1.0f)
449 #define DC_LOSEBAR_HIGH_ALERT_GREEN (0.0f)
450 #define DC_LOSEBAR_HIGH_ALERT_BLUE (0.0f)
452 // screen shot constants
453 #define DC_SCREEN_SHOT_FILE_NAME_BASE "screen_shot"
455 class Block;
456 class Sign;
458 /* static */ class Displayer {
459 public:
460 static void initialize ( int width, int height );
461 static void gameStart ( );
462 static void gameFinish ( );
463 static void cleanUp ( );
465 static void reshape ( int width, int height );
466 static void displayPlay ( );
467 static void displayMeta ( );
469 static void readyCountDownDisplay ( int state );
470 static void nextCountDownDisplay ( int state );
471 static void freeCountDownDisplay ( );
472 static void readyMessage ( int message );
473 static void nextMessage ( int message );
474 static void freeMessage ( );
475 static void rerankScoreRecord ( );
476 static void generateScoreRankTexture ( int rank, int score, const char *name,
477 GLubyte *texture );
479 #ifdef DEVELOPMENT
480 static void screenShot ( );
481 #endif
483 static GLfloat play_offset_y;
485 static int message_shape[DC_NUMBER_MESSAGE_TEX];
487 static const GLfloat mote_light_colors[7][3];
489 static GLuint garbage_texture;
490 static GLubyte *garbage_texture_data[DC_NUMBER_USE_GARBAGE_TEX];
492 static GLuint score_to_beat_texture;
493 static GLuint record_textures[DC_SCORE_REC_NUMBER_DRAW];
494 static GLubyte **record_texture_data;
495 static GLubyte *player_rank_texture_data;
497 private:
498 static void drawBlocks ( );
499 static void drawGarbage ( );
500 static void drawCandy ( );
501 static void drawSwapper ( );
502 static void drawExternalCandy ( );
503 static void drawLevelLights ( );
504 static void drawMessage ( );
505 static void drawClock ( );
506 static void drawWinRecord ( );
508 static void drawCountDown_inline_split_ ( );
509 static inline void drawCountDown ( )
511 if (CountDownManager::state == -1) return;
512 if (Game::state & GS_PAUSED) return;
513 drawCountDown_inline_split_();
516 static void drawScoreToBeatMessage_inline_split_ ( );
517 static inline void drawScoreToBeatMessage ( )
519 if (!(MetaState::mode & CM_SOLO)) return;
520 if (!(MetaState::state & MS_BOTH_KEY_WAIT)) return;
521 drawScoreToBeatMessage_inline_split_();
524 static void drawScoreRecord_inline_split_ ( );
525 static inline void drawScoreRecord ( )
527 if (!(MetaState::mode & CM_SOLO)) return;
528 if (!(MetaState::state & MS_GAME_OVER_KEY_WAIT)) return;
529 if (!WinRecord::won) return;
530 if (Game::time_step < DC_WIN_FADE_TIME) return;
531 drawScoreRecord_inline_split_();
534 static void drawBlock ( Block &block, bool special );
535 static void drawSign ( Sign &sign, int texture );
536 static void drawTriangle ( float a_x, float a_y, float a_z,
537 float b_x, float b_y, float b_z, float c_x, float c_y, float c_z );
538 static void drawDigit ( GLfloat alpha );
539 static void drawLeftBar ( GLfloat b, GLfloat t, GLfloat color[3] );
540 static void drawRightBar ( GLfloat b, GLfloat t, GLfloat color[3] );
541 static void drawCenterBar ( GLfloat b, GLfloat t, GLfloat color1[3],
542 GLfloat color2[3] );
543 static void drawFullBar ( GLfloat color[3] );
544 static void copyRecordSubTexture ( GLubyte *texture, GLubyte *subtexture,
545 int subtex_width, int s_location, int copy_width );
547 static void setWildBlockColor ( Block &block, float flash );
549 static inline void calculatePlayOffset ( )
551 play_offset_y = DC_PLAY_OFFSET_Y
552 + Creep::creep * (DC_GRID_ELEMENT_LENGTH / (float) GC_STEPS_PER_GRID)
553 + Spring::y;
556 static bool checkExtension ( char *extension_name );
558 static void generateBlockDisplayList ( );
559 static void generateGarbageExtras ( );
560 static void generateGarbageThinCapList ( );
561 static void generateGarbageThinMiddleList ( );
562 static void generateGarbageThickCornerList ( );
563 static void generateGarbageThickEdgeList ( );
564 static void generateGarbageThickMiddleList ( );
565 static void generateGarbageSmallList ( );
566 static void generateSparkleList ( );
567 static void generateSignList ( );
568 static void generateSwapperList ( );
569 static void generateExternalCandy ( );
570 static void generateLevelLights ( );
571 static void generateMessages ( );
572 static void generateClock ( );
573 static void generateNameTexture ( );
574 static void generateScoreRecord ( );
576 static GLuint block_list;
577 static GLuint small_block_list;
578 static GLuint special_block_list;
579 static GLuint garbage_thin_cap_list;
580 static GLuint garbage_thin_middle_list;
581 static GLuint garbage_thick_corner_list;
582 static GLuint garbage_thick_edge_list;
583 static GLuint garbage_thick_middle_list;
584 static GLuint garbage_small_list;
585 static GLuint garbage_flavor_list;
586 static GLuint sparkle_list;
587 static GLuint sign_small_list;
588 static GLuint sign_large_list;
589 static GLuint swapper_list;
590 static GLuint logo_list;
591 static GLuint level_light_list;
592 static GLuint message_1x1_list;
593 static GLuint message_2x1_list;
594 static GLuint message_4x1_list;
595 static GLuint message_16x1_list;
597 static GLuint special_block_lightmap;
598 static GLuint garbage_lightmap;
599 static GLuint mote_textures[DC_NUMBER_MOTE_TYPES];
600 static GLuint spark_texture;
601 static GLuint sign_small_texture;
602 static GLuint sign_large_texture;
603 static GLuint logo_texture;
604 static GLuint message_texture;
605 static GLuint clock_digit_textures[11];
606 static GLuint name_texture;
607 static GLuint losebar_texture;
609 static int state;
611 static int main_window;
613 static bool opengl_version_1_2;
614 static GLenum rescale_method;
616 static GLsizei message_width[DC_NUMBER_MESSAGE_TEX];
617 static GLsizei message_height[DC_NUMBER_MESSAGE_TEX];
618 static GLfloat message_alpha[DC_MESSAGE_PULSE_PERIOD];
620 static GLubyte *message_texture_data[DC_NUMBER_MESSAGE_TEX];
622 static const GLfloat block_colors[BF_NUMBER][3];
623 static const GLfloat garbage_colors[GF_NUMBER][3];
625 #ifndef NO_MULTITEXTURING
626 # ifndef _WIN32
627 # else
628 # ifndef __MINGW32__
629 static PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
630 static PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
631 # endif
632 # endif
633 #endif
635 #ifdef DEVELOPMENT
636 static GLint screen_length;
637 #endif
640 #endif