1 #define ALLEGRO_UNSTABLE
2 #include <allegro5/allegro.h>
3 #include <allegro5/allegro_image.h>
4 #include <allegro5/allegro_font.h>
5 #include <allegro5/allegro_color.h>
6 #include <allegro5/allegro_primitives.h>
7 #include <stdlib.h>
8 #include <math.h>
9
10 #include "common.c"
11
12 #define FPS 60
13
14 struct Example {
15 ALLEGRO_BITMAP *target_depth;
16 ALLEGRO_BITMAP *target_no_depth;
17 ALLEGRO_BITMAP *target_no_multisample;
18 ALLEGRO_FONT *font;
19 double t;
20 double direct_speed_measure;
21 } example;
22
draw_on_target(ALLEGRO_BITMAP * target)23 static void draw_on_target(ALLEGRO_BITMAP *target)
24 {
25 ALLEGRO_STATE state;
26 ALLEGRO_TRANSFORM transform;
27
28 al_store_state(&state, ALLEGRO_STATE_TARGET_BITMAP |
29 ALLEGRO_STATE_TRANSFORM |
30 ALLEGRO_STATE_PROJECTION_TRANSFORM);
31
32 al_set_target_bitmap(target);
33 al_clear_to_color(al_map_rgba_f(0, 0, 0, 0));
34 al_clear_depth_buffer(1);
35
36 al_identity_transform(&transform);
37 al_translate_transform_3d(&transform, 0, 0, 0);
38 al_orthographic_transform(&transform,
39 -1, 1, -1, 1, -1, 1);
40 al_use_projection_transform(&transform);
41
42 al_draw_filled_rectangle(-0.75, -0.5, 0.75, 0.5, al_color_name("blue"));
43
44 al_set_render_state(ALLEGRO_DEPTH_TEST, true);
45
46 int i, j;
47 for (i = 0; i < 24; i++) {
48 for (j = 0; j < 2; j++) {
49 al_identity_transform(&transform);
50 al_translate_transform_3d(&transform, 0, 0, j * 0.01);
51 al_rotate_transform_3d(&transform, 0, 1, 0,
52 ALLEGRO_PI * (i / 12.0 + example.t / 2));
53 al_rotate_transform_3d(&transform, 1, 0, 0, ALLEGRO_PI * 0.25);
54 al_use_transform(&transform);
55 if (j == 0)
56 al_draw_filled_rectangle(0, -.5, .5, .5, i % 2 == 0 ?
57 al_color_name("yellow") : al_color_name("red"));
58 else
59 al_draw_filled_rectangle(0, -.5, .5, .5, i % 2 == 0 ?
60 al_color_name("goldenrod") : al_color_name("maroon"));
61 }
62 }
63
64 al_set_render_state(ALLEGRO_DEPTH_TEST, false);
65
66 al_identity_transform(&transform);
67 al_use_transform(&transform);
68
69 al_draw_line(0.9, 0, 1, 0, al_color_name("black"), 0.05);
70 al_draw_line(-0.9, 0, -1, 0, al_color_name("black"), 0.05);
71 al_draw_line(0, 0.9, 0, 1, al_color_name("black"), 0.05);
72 al_draw_line(0, -0.9, 0, -1, al_color_name("black"), 0.05);
73
74 al_restore_state(&state);
75 }
76
redraw(void)77 static void redraw(void)
78 {
79 double w = 512, h = 512;
80 ALLEGRO_COLOR black = al_color_name("black");
81 draw_on_target(example.target_depth);
82 draw_on_target(example.target_no_depth);
83 draw_on_target(example.target_no_multisample);
84
85 al_clear_to_color(al_color_name("green"));
86
87 ALLEGRO_TRANSFORM transform;
88
89 al_identity_transform(&transform);
90 al_use_transform(&transform);
91 al_translate_transform(&transform, -128, -128);
92 al_rotate_transform(&transform, example.t * ALLEGRO_PI / 3);
93 al_translate_transform(&transform, 512 + 128, 128);
94 al_use_transform(&transform);
95 al_draw_bitmap(example.target_no_depth, 0, 0, 0);
96 al_draw_text(example.font, black, 0, 0, 0, "no depth");
97
98 al_identity_transform(&transform);
99 al_use_transform(&transform);
100 al_translate_transform(&transform, -128, -128);
101 al_rotate_transform(&transform, example.t * ALLEGRO_PI / 3);
102 al_translate_transform(&transform, 512 + 128, 256 + 128);
103 al_use_transform(&transform);
104 al_draw_bitmap(example.target_no_multisample, 0, 0, 0);
105 al_draw_textf(example.font, black, 0, 0, 0, "no multisample");
106
107 al_identity_transform(&transform);
108 al_use_transform(&transform);
109 al_translate_transform(&transform, -256, -256);
110 al_rotate_transform(&transform, example.t * ALLEGRO_PI / 3);
111 al_translate_transform(&transform, 256, 256);
112 al_use_transform(&transform);
113 al_draw_bitmap(example.target_depth, 0, 0, 0);
114
115 al_draw_line(30, h / 2, 60, h / 2, black, 12);
116 al_draw_line(w - 30, h / 2, w - 60, h / 2, black, 12);
117 al_draw_line(w / 2, 30, w / 2, 60, black, 12);
118 al_draw_line(w / 2, h - 30, w / 2, h - 60, black, 12);
119 al_draw_text(example.font, black, 30, h / 2 - 16, 0, "back buffer");
120 al_draw_text(example.font, black, 0, h / 2 + 10, 0, "bitmap");
121
122 al_identity_transform(&transform);
123 al_use_transform(&transform);
124 al_draw_textf(example.font, black, w, 0,
125 ALLEGRO_ALIGN_RIGHT, "%.1f FPS", 1.0 / example.direct_speed_measure);
126 }
127
update(void)128 static void update(void)
129 {
130 example.t += 1.0 / FPS;
131 }
132
init(void)133 static void init(void)
134 {
135 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR);
136 al_set_new_bitmap_depth(16);
137 al_set_new_bitmap_samples(4);
138 example.target_depth = al_create_bitmap(512, 512);
139 al_set_new_bitmap_depth(0);
140 example.target_no_depth = al_create_bitmap(256, 256);
141 al_set_new_bitmap_samples(0);
142 example.target_no_multisample = al_create_bitmap(256, 256);
143 }
144
main(int argc,char ** argv)145 int main(int argc, char **argv)
146 {
147 ALLEGRO_TIMER *timer;
148 ALLEGRO_EVENT_QUEUE *queue;
149 ALLEGRO_DISPLAY *display;
150 int w = 512 + 256, h = 512;
151 bool done = false;
152 bool need_redraw = true;
153
154 (void)argc;
155 (void)argv;
156
157 if (!al_init()) {
158 abort_example("Failed to init Allegro.\n");
159 }
160
161 if (!al_init_image_addon()) {
162 abort_example("Failed to init IIO addon.\n");
163 }
164
165 al_init_font_addon();
166 example.font = al_create_builtin_font();
167
168 al_init_primitives_addon();
169
170 init_platform_specific();
171
172 al_set_new_display_option(ALLEGRO_DEPTH_SIZE, 16, ALLEGRO_SUGGEST);
173 al_set_new_display_flags(ALLEGRO_PROGRAMMABLE_PIPELINE);
174
175 display = al_create_display(w, h);
176 if (!display) {
177 abort_example("Error creating display.\n");
178 }
179
180 if (!al_install_keyboard()) {
181 abort_example("Error installing keyboard.\n");
182 }
183
184 init();
185
186 timer = al_create_timer(1.0 / FPS);
187
188 queue = al_create_event_queue();
189 al_register_event_source(queue, al_get_keyboard_event_source());
190
191 al_register_event_source(queue, al_get_timer_event_source(timer));
192
193 al_register_event_source(queue, al_get_display_event_source(display));
194
195 al_start_timer(timer);
196
197 double t = -al_get_time();
198
199 while (!done) {
200 ALLEGRO_EVENT event;
201
202 if (need_redraw) {
203 t += al_get_time();
204 example.direct_speed_measure = t;
205 t = -al_get_time();
206 redraw();
207 al_flip_display();
208 need_redraw = false;
209 }
210
211 while (true) {
212 al_wait_for_event(queue, &event);
213 switch (event.type) {
214 case ALLEGRO_EVENT_KEY_CHAR:
215 if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
216 done = true;
217 break;
218
219 case ALLEGRO_EVENT_DISPLAY_CLOSE:
220 done = true;
221 break;
222
223 case ALLEGRO_EVENT_TIMER:
224 update();
225 need_redraw = true;
226 break;
227 }
228 if (al_is_event_queue_empty(queue))
229 break;
230 }
231 }
232
233 return 0;
234 }
235
236 /* vim: set sts=3 sw=3 et: */
237