1 /* 2 * Displayer.h 3 * Daniel Nelson - 8/24/0 4 * 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. 12 * 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. 17 * 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. 21 * 22 * Daniel Nelson - aluminumangel.org 23 * 174 W. 18th Ave. 24 * Columbus, OH 43210 25 */ 26 27 #ifndef DISPLAYER_H 28 #define DISPLAYER_H 29 30 #include <GL/glut.h> 31 #include "glext.h" 32 33 using namespace std; 34 35 #include "Game.h" 36 #include "Garbage.h" 37 #include "CountDownManager.h" 38 #include "Creep.h" 39 #include "Spring.h" 40 #include "WinRecord.h" 41 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 54 55 // displayer states 56 #define DS_MULTITEXTURING (1 << 0) 57 58 // clip planes 59 #define GL_CLIP_PLANE_PLAY_FLOOR (GL_CLIP_PLANE0) 60 #define GL_CLIP_PLANE_SHATTERING (GL_CLIP_PLANE1) 61 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) 71 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) 76 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) 80 81 // play area dimensions in GL coordinates 82 #define DC_PLAY_WIDTH (12.0) 83 #define DC_PLAY_HEIGHT (24.0) 84 85 // camera height as a fraction of play height 86 #define DC_CAMERA_HEIGHT_RATIO (0.25) 87 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) 94 95 // grid element size 96 #define DC_GRID_ELEMENT_LENGTH (2.0f) 97 98 // headlight z offset 99 #define DC_HEADLIGHT_Y_OFFSET (2.1f * DC_GRID_ELEMENT_LENGTH) 100 #define DC_HEADLIGHT_Z_OFFSET (-35.0f) 101 102 // acceleration of death rotation 103 #define DC_DYING_ROTATE_SPEED (0.2f) 104 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) 115 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) 122 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) 129 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) 139 140 // general sparkle constants 141 #define DC_SPARKLE_LENGTH (0.4f / 2.0f) 142 #define DC_SPARKLE_TEX_LENGTH (32) 143 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) 158 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) 178 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) 191 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) 203 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) 213 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) 231 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) 259 260 // swapper constants 261 #define DC_SWAPPER_GRAB_LENGTH (0.2f) 262 263 // external candy constants 264 #define DC_LEFT_EXTERNAL_CENTER (-10.5f) 265 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) 270 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) 280 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) 289 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) 296 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) 330 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) 369 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" 383 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) 390 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) 418 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 \ 428 / \ 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 \ 435 / \ 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) 451 452 // screen shot constants 453 #define DC_SCREEN_SHOT_FILE_NAME_BASE "screen_shot" 454 455 class Block; 456 class Sign; 457 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 ( ); 464 465 static void reshape ( int width, int height ); 466 static void displayPlay ( ); 467 static void displayMeta ( ); 468 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 ); 478 479 #ifdef DEVELOPMENT 480 static void screenShot ( ); 481 #endif 482 483 static GLfloat play_offset_y; 484 485 static int message_shape[DC_NUMBER_MESSAGE_TEX]; 486 487 static const GLfloat mote_light_colors[7][3]; 488 489 static GLuint garbage_texture; 490 static GLubyte *garbage_texture_data[DC_NUMBER_USE_GARBAGE_TEX]; 491 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; 496 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 ( ); 507 508 static void drawCountDown_inline_split_ ( ); drawCountDown()509 static inline void drawCountDown ( ) 510 { 511 if (CountDownManager::state == -1) return; 512 if (Game::state & GS_PAUSED) return; 513 drawCountDown_inline_split_(); 514 } 515 516 static void drawScoreToBeatMessage_inline_split_ ( ); drawScoreToBeatMessage()517 static inline void drawScoreToBeatMessage ( ) 518 { 519 if (!(MetaState::mode & CM_SOLO)) return; 520 if (!(MetaState::state & MS_BOTH_KEY_WAIT)) return; 521 drawScoreToBeatMessage_inline_split_(); 522 } 523 524 static void drawScoreRecord_inline_split_ ( ); drawScoreRecord()525 static inline void drawScoreRecord ( ) 526 { 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_(); 532 } 533 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 ); 546 547 static void setWildBlockColor ( Block &block, float flash ); 548 calculatePlayOffset()549 static inline void calculatePlayOffset ( ) 550 { 551 play_offset_y = DC_PLAY_OFFSET_Y 552 + Creep::creep * (DC_GRID_ELEMENT_LENGTH / (float) GC_STEPS_PER_GRID) 553 + Spring::y; 554 } 555 556 static bool checkExtension ( char *extension_name ); 557 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 ( ); 575 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; 596 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; 608 609 static int state; 610 611 static int main_window; 612 613 static bool opengl_version_1_2; 614 static GLenum rescale_method; 615 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]; 619 620 static GLubyte *message_texture_data[DC_NUMBER_MESSAGE_TEX]; 621 622 static const GLfloat block_colors[BF_NUMBER][3]; 623 static const GLfloat garbage_colors[GF_NUMBER][3]; 624 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 634 635 #ifdef DEVELOPMENT 636 static GLint screen_length; 637 #endif 638 }; 639 640 #endif 641