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