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