1// -----------------------------------------------------------------------
2// --- Includes ---
3// -----------------------------------------------------------------------
4
5#include <iostream>
6#include <allegro5/allegro.h>
7#include <allegro5/allegro_image.h>
8#include <allegro5/allegro_primitives.h>
9
10// -----------------------------------------------------------------------
11// --- Global variables ---
12// -----------------------------------------------------------------------
13
14ALLEGRO_KEYBOARD_STATE keyState
;
15ALLEGRO_MOUSE_STATE mouseState
;
16ALLEGRO_DISPLAY * windowDisplay
(NULL
);
17ALLEGRO_BITMAP * windowBuffer
(NULL
);
18
19ALLEGRO_EVENT_QUEUE * eventQueue
(NULL
);
20ALLEGRO_TIMER * framerateTimer
(NULL
);
21int framerate
(0);
22
23// User data
24ALLEGRO_SHADER
* myShader
(NULL
);
25const char * myShaderVertFileName
("myShaderVert.glsl");
26const char * myShaderFragFileName
("myShaderFrag.glsl");
27
28ALLEGRO_BITMAP * myImage
(NULL
);
29const char * myImageFileName
("bg0.png");
30// Window setting
31int screenW
(640);
32int screenH
(360);
33int zoom
(2);
34// Absolute mouse position
35int mouseXi
(0);
36int mouseYi
(0);
37// Relative mouse position
38float mouseXf
(0);
39float mouseYf
(0);
40// Window position in the desktop
41int xWindow
(0);
42int yWindow
(0);
43
44// -----------------------------------------------------------------------
45// --- Global Methods ---
46// -----------------------------------------------------------------------
47
48template <class M>
49int log (int error, M msg
)
50{
51 std::cout
<< msg
;
52
53 return error
;
54}
55
56void setFramerate
(int fps
)
57{
58 eventQueue
= al_create_event_queue();
59 framerate
= fps
;
60 framerateTimer
= al_create_timer(1.
000/framerate
);
61
62 al_register_event_source (eventQueue,
al_get_timer_event_source(framerateTimer
));
63 al_start_timer(framerateTimer
);
64}
65
66void drawGrid
(int screenW,
int screenH,
67 int sizeX,
int sizeY,
68 ALLEGRO_COLOR color
)
69{
70 for (int i
(0); i
<(screenW
/sizeX
); i
++)
71 {
72 al_draw_line(i
*sizeX
+.
5, .
5, i
*sizeX
+.
5, screenH
+.
5, color,
0);
73 }
74
75 for (int i
(0); i
<(screenH
/sizeY
)+1; i
++)
76 {
77 al_draw_line(.
5, i
*sizeY
+.
5, screenW
+.
5, i
*sizeY
+.
5, color,
0);
78 }
79}
80
81ALLEGRO_SHADER
* create_shader
(const char* fileNameVert,
const char* fileNameFrag
)
82{
83 ALLEGRO_SHADER
* shader
= al_create_shader
(ALLEGRO_SHADER_GLSL
);
84// if(!al_attach_shader_source(shader,
85// ALLEGRO_VERTEX_SHADER,
86// al_get_default_shader_source(ALLEGRO_SHADER_GLSL, ALLEGRO_VERTEX_SHADER)))
87 if(!al_attach_shader_source_file
(shader, ALLEGRO_VERTEX_SHADER, fileNameVert
))
88 {
89 printf("%s\n", al_get_shader_log
(shader
));
90 return NULL
;
91 }
92 if(!al_attach_shader_source_file
(shader, ALLEGRO_PIXEL_SHADER, fileNameFrag
))
93 {
94 printf("%s\n", al_get_shader_log
(shader
));
95 return NULL
;
96 }
97 if(!al_build_shader
(shader
))
98 {
99 printf("%s\n", al_get_shader_log
(shader
));
100 return NULL
;
101 }
102 std::cout
<< " >>> "<< al_get_shader_log
(shader
) << " \n";
103
104 return shader
;
105}
106
107// -----------------------------------------------------------------------
108// ---- INIT ---
109// -----------------------------------------------------------------------
110int init
()
111{
112// Init Allegro 5
113 if (!al_init())
114 return log(1,
"Unable to Init ALLEGRO_5 ! \n");
115
116// Init & Install : Modules & Addon
117 if (!al_install_keyboard())
118 return log(1,
"Unable to Install Keyboard ! \n");
119
120 if (!al_install_mouse())
121 return log(1,
"Unable to Install Keyboard ! \n");
122
123 if (!al_init_image_addon())
124 return log(1,
"Unable to Init Image addon ! \n");
125
126 if (!al_init_primitives_addon())
127 return log(1,
"Unable to Init Primitives addon ! \n");
128
129// Settings
130 al_set_new_display_flags(ALLEGRO_WINDOWED
);
131 al_set_new_display_flags(ALLEGRO_OPENGL
);
132 //al_set_new_display_flags(ALLEGRO_PROGRAMMABLE_PIPELINE | ALLEGRO_OPENGL);
133
134 setFramerate
(60);
135
136// Create All
137 windowDisplay
= al_create_display(screenW
*zoom, screenH
*zoom
);
138 if (!windowDisplay
)
139 return log(1,
"Unable to Create display ! \n");
140
141 windowBuffer
= al_create_bitmap(screenW, screenH
);
142 if (!windowDisplay
)
143 return log(1,
"Unable to Create Buffer ! \n");
144
145 al_show_mouse_cursor(windowDisplay
);
146
147 myImage
= al_load_bitmap(myImageFileName
);
148
149
150 myShader
= create_shader
(myShaderVertFileName,myShaderFragFileName
);
151
152 if(!myShader
)
153 return log(1,
" Error in create myShader !\n");
154
155 return log(0,
"--- init OK !\n");
156}
157// -----------------------------------------------------------------------
158// --- DONE ---
159// -----------------------------------------------------------------------
160int done
()
161{
162// Destroy All
163 al_destroy_bitmap(myImage
);
164 al_destroy_event_queue(eventQueue
);
165 al_destroy_timer(framerateTimer
);
166 al_destroy_shader
(myShader
);
167 al_destroy_bitmap(windowBuffer
);
168 al_destroy_display(windowDisplay
);
169
170 return log(0,
"--- done OK !\n");
171}
172// -----------------------------------------------------------------------
173// --- RUN ---
174// -----------------------------------------------------------------------
175int run
()
176{
177
178 bool quit
(false);
179
180 float centerX
(0);
181 float centerY
(0);
182 float radius
(0);
183 float maxRadius
(200);
184 float speed
(0);
185
186 while (!quit
)
187 {
188 // --- Update ---
189
190 ALLEGRO_EVENT event
;
191 al_wait_for_event(eventQueue,
&event
);
192
193 // Keyboard Input !
194 al_get_keyboard_state(&keyState
);
195 if (al_key_down(&keyState, ALLEGRO_KEY_ESCAPE
))
196 quit
= true;
197
198 // Mouse Input !
199 al_get_mouse_state(&mouseState
);
200 al_get_window_position (windowDisplay,
&xWindow,
&yWindow
);
201 al_get_mouse_cursor_position(&mouseXi,
&mouseYi
);
202 mouseXf
= (float(mouseXi-xWindow
)-2)/zoom
;
203 mouseYf
= (float(mouseYi-yWindow
)-24)/zoom
;
204
205 if (mouseState.buttons
& 1)
206 {
207 centerX
= mouseXf
;
208 centerY
= mouseYf
;
209 radius
= 0;
210 speed
= 4;
211 }
212
213 // ShockWave Update !
214 radius
+= speed
;
215 if (radius
> maxRadius
)
216 {
217 radius
= 0;
218 speed
= 0;
219 }
220
221 // --- Render ---
222
223 // clear windowbuffer !
224 al_set_target_bitmap(windowBuffer
);
225 al_clear_to_color(al_map_rgb(0,
25,
40));
226
227 // Begin drawing !
228
229 // Use shader here before blit buffer to display !!
230 al_use_shader
(myShader
);
231 al_set_shader_sampler
("texture", myImage,
0);
232
233 float center
[2] = { centerX, centerY
};
234 float shockParams
[3] = {10.
0,
0.
8,
0.
1};
235
236 al_set_shader_float
("time", radius
);
237 al_set_shader_float_vector
("center",
2,
¢er
[0],
1);
238 al_set_shader_float_vector
("shockParams",
3,
&shockParams
[0],
1);
239
240 al_draw_bitmap(myImage,
0,
0,
0);
241
242 al_use_shader
(NULL
);
243
244 drawGrid
(screenW, screenH,
32,
32,
al_map_rgba(0,
45,
80,
50));
245 al_draw_rectangle(0.
5,
0.
5,
246 screenW-.5, screenH-.5,
247 al_map_rgb(250,
120,
180),
0);
248
249 al_draw_line(0, mouseYf, screenW, mouseYf,
al_map_rgba(10,
100,
155,
50),
0);
250 al_draw_line(mouseXf,
0, mouseXf, screenH,
al_map_rgba(10,
100,
155,
50),
0);
251
252 al_draw_circle(centerX, centerY, radius,
al_map_rgba(250,
200,
210,
50),
0);
253
254
255 /// End drawing !
256
257 // Blit buffer to display !
258 al_set_target_backbuffer(windowDisplay
);
259 al_clear_to_color(al_map_rgb(0,
0,
0));
260
261
262 al_draw_scaled_bitmap(windowBuffer,
263 0,
0, screenW, screenH,
264 0,
0, screenW
*zoom, screenH
*zoom,
265 0),
266
267
268 // Flip display !
269 al_flip_display();
270
271
272 }
273
274 return log(0,
"--- run OK !\n");
275}
276// -----------------------------------------------------------------------
277// --- MAIN ---
278// -----------------------------------------------------------------------
279int main
()
280{
281 if (init
())
282 return log(1,
"Error in init() \n");
283 if (run
())
284 return log(1,
"Error in run() \n");
285 if (done
())
286 return log(1,
"Error in done() \n");
287
288 return log(0,
"--- Terminated normally ! \n");;
289}