3030
3131typedef void (* Screen )(int );
3232int ScreenW = 800 , ScreenH = 600 ;
33- #define NUM_SCREENS 12
33+ #define NUM_SCREENS 14
3434#define ROTATE_SPEED 0.0001f
3535Screen Screens [NUM_SCREENS ];
3636const char * ScreenName [NUM_SCREENS ];
@@ -40,6 +40,7 @@ ALLEGRO_BITMAP* Buffer;
4040ALLEGRO_BITMAP * Texture ;
4141ALLEGRO_COLOR solid_white ;
4242
43+ bool UseShader = false;
4344int Soft = 0 ;
4445int Blend = 1 ;
4546float Speed = ROTATE_SPEED ;
@@ -357,6 +358,146 @@ static void HighFilledPrimitives(int mode)
357358 }
358359}
359360
361+ static void HighFilledPrimitivesShader (int mode )
362+ {
363+ static ALLEGRO_SHADER * shader ;
364+ if (mode == INIT ) {
365+ if (!UseShader )
366+ return ;
367+ shader = al_create_shader (ALLEGRO_SHADER_AUTO );
368+
369+ if (!shader ) {
370+ abort_example ("Failed to create shader." );
371+ }
372+
373+ const char * vertex_shader_file ;
374+ const char * pixel_shader_file ;
375+ if (al_get_shader_platform (shader ) == ALLEGRO_SHADER_GLSL ) {
376+ vertex_shader_file = "data/ex_prim_high_vertex.glsl" ;
377+ pixel_shader_file = "data/ex_prim_high_pixel.glsl" ;
378+ }
379+ else {
380+ vertex_shader_file = "data/ex_prim_high_vertex.hlsl" ;
381+ pixel_shader_file = "data/ex_prim_high_pixel.hlsl" ;
382+ }
383+
384+ if (!al_attach_shader_source_file (shader , ALLEGRO_VERTEX_SHADER , vertex_shader_file )) {
385+ abort_example ("al_attach_shader_source_file for vertex shader failed: %s\n" ,
386+ al_get_shader_log (shader ));
387+ }
388+ if (!al_attach_shader_source_file (shader , ALLEGRO_PIXEL_SHADER , pixel_shader_file )) {
389+ abort_example ("al_attach_shader_source_file for pixel shader failed: %s\n" ,
390+ al_get_shader_log (shader ));
391+ }
392+ if (!al_build_shader (shader )) {
393+ abort_example ("al_build_shader for link failed: %s\n" , al_get_shader_log (shader ));
394+ }
395+ } else if (mode == LOGIC ) {
396+ Theta += Speed ;
397+ al_build_transform (& MainTrans , ScreenW / 2 , ScreenH / 2 , 1 , 1 , Theta );
398+ } else if (mode == DRAW ) {
399+ if (Blend )
400+ al_set_blender (ALLEGRO_ADD , ALLEGRO_ONE , ALLEGRO_ONE );
401+ else
402+ al_set_blender (ALLEGRO_ADD , ALLEGRO_ONE , ALLEGRO_ZERO );
403+
404+ al_use_transform (& MainTrans );
405+ if (!UseShader ) {
406+ al_draw_text (Font , al_map_rgb_f (1 , 1 , 1 ), 0 , -40 , 0 , "Enable shaders (by using --shader arg)" );
407+ }
408+ else if (Soft ) {
409+ al_draw_text (Font , al_map_rgb_f (1 , 1 , 1 ), 0 , -40 , 0 , "Shaders don't work with software rendering" );
410+ }
411+ else {
412+ ALLEGRO_SHADER * old_shader = al_get_current_shader ();
413+ al_use_shader (shader );
414+ al_draw_filled_triangle (-100 , -100 , -150 , 200 , 100 , 200 , al_map_rgb_f (0.5 , 0.7 , 0.3 ));
415+ al_draw_filled_rectangle (20 , -50 , 200 , 50 , al_map_rgb_f (0.3 , 0.2 , 0.6 ));
416+ al_draw_filled_ellipse (-250 , 0 , 100 , 150 , al_map_rgb_f (0.3 , 0.3 , 0.3 ));
417+ al_draw_filled_rounded_rectangle (50 , -250 , 350 , -75 , 50 , 70 , al_map_rgb_f (0.4 , 0.2 , 0 ));
418+ al_draw_filled_pieslice (200 , 125 , 50 , ALLEGRO_PI / 4 , 3 * ALLEGRO_PI / 2 , al_map_rgb_f (0.3 , 0.3 , 0.1 ));
419+ al_use_shader (old_shader );
420+ }
421+ al_use_transform (& Identity );
422+ }
423+ }
424+
425+ static void HighPrimitivesShader (int mode )
426+ {
427+ static ALLEGRO_SHADER * shader ;
428+ if (mode == INIT ) {
429+ if (!UseShader )
430+ return ;
431+ shader = al_create_shader (ALLEGRO_SHADER_AUTO );
432+
433+ if (!shader ) {
434+ abort_example ("Failed to create shader." );
435+ }
436+
437+ const char * vertex_shader_file ;
438+ const char * pixel_shader_file ;
439+ if (al_get_shader_platform (shader ) == ALLEGRO_SHADER_GLSL ) {
440+ vertex_shader_file = "data/ex_prim_high_vertex.glsl" ;
441+ pixel_shader_file = "data/ex_prim_high_pixel.glsl" ;
442+ }
443+ else {
444+ vertex_shader_file = "data/ex_prim_high_vertex.hlsl" ;
445+ pixel_shader_file = "data/ex_prim_high_pixel.hlsl" ;
446+ }
447+
448+ if (!al_attach_shader_source_file (shader , ALLEGRO_VERTEX_SHADER , vertex_shader_file )) {
449+ abort_example ("al_attach_shader_source_file for vertex shader failed: %s\n" ,
450+ al_get_shader_log (shader ));
451+ }
452+ if (!al_attach_shader_source_file (shader , ALLEGRO_PIXEL_SHADER , pixel_shader_file )) {
453+ abort_example ("al_attach_shader_source_file for pixel shader failed: %s\n" ,
454+ al_get_shader_log (shader ));
455+ }
456+ if (!al_build_shader (shader )) {
457+ abort_example ("al_build_shader for link failed: %s\n" , al_get_shader_log (shader ));
458+ }
459+ } else if (mode == LOGIC ) {
460+ Theta += Speed ;
461+ al_build_transform (& MainTrans , ScreenW / 2 , ScreenH / 2 , 1 , 1 , Theta );
462+ } else if (mode == DRAW ) {
463+ if (Blend )
464+ al_set_blender (ALLEGRO_ADD , ALLEGRO_ONE , ALLEGRO_ONE );
465+ else
466+ al_set_blender (ALLEGRO_ADD , ALLEGRO_ONE , ALLEGRO_ZERO );
467+
468+ al_use_transform (& MainTrans );
469+ if (!UseShader ) {
470+ al_draw_text (Font , al_map_rgb_f (1 , 1 , 1 ), 0 , -40 , 0 , "Enable shaders (by using --shader arg)" );
471+ }
472+ else if (Soft ) {
473+ al_draw_text (Font , al_map_rgb_f (1 , 1 , 1 ), 0 , -40 , 0 , "Shaders don't work with software rendering" );
474+ }
475+ else {
476+ ALLEGRO_SHADER * old_shader = al_get_current_shader ();
477+ al_use_shader (shader );
478+ // float points[8] = {
479+ // -300, -200,
480+ // 700, 200,
481+ // -700, 200,
482+ // 300, -200
483+ // };
484+
485+ al_draw_line (-300 , -200 , 300 , 200 , al_map_rgba_f (0 , 0.5 , 0.5 , 1 ), Thickness );
486+ al_draw_triangle (-150 , -250 , 0 , 250 , 150 , -250 , al_map_rgba_f (0.5 , 0 , 0.5 , 1 ), Thickness );
487+ al_draw_rectangle (-300 , -200 , 300 , 200 , al_map_rgba_f (0.5 , 0 , 0 , 1 ), Thickness );
488+ al_draw_rounded_rectangle (-200 , -125 , 200 , 125 , 50 , 100 , al_map_rgba_f (0.2 , 0.2 , 0 , 1 ), Thickness );
489+
490+ al_draw_ellipse (0 , 0 , 300 , 150 , al_map_rgba_f (0 , 0.5 , 0.5 , 1 ), Thickness );
491+ al_draw_elliptical_arc (-20 , 0 , 300 , 200 , - ALLEGRO_PI / 2 , - ALLEGRO_PI , al_map_rgba_f (0.25 , 0.25 , 0.5 , 1 ), Thickness );
492+ al_draw_arc (0 , 0 , 200 , - ALLEGRO_PI / 2 , ALLEGRO_PI , al_map_rgba_f (0.5 , 0.25 , 0 , 1 ), Thickness );
493+ // al_draw_spline(points, al_map_rgba_f(0.1, 0.2, 0.5, 1), Thickness);
494+ al_draw_pieslice (0 , 25 , 150 , ALLEGRO_PI * 3 / 4 , - ALLEGRO_PI / 2 , al_map_rgba_f (0.4 , 0.3 , 0.1 , 1 ), Thickness );
495+ al_use_shader (old_shader );
496+ }
497+ al_use_transform (& Identity );
498+ }
499+ }
500+
360501static void TransformationsPrimitives (int mode )
361502{
362503 float t = al_get_time ();
@@ -638,11 +779,10 @@ int main(int argc, char **argv)
638779 ALLEGRO_BITMAP * bkg ;
639780 ALLEGRO_COLOR black ;
640781 ALLEGRO_EVENT_QUEUE * queue ;
641- bool use_shader = false;
642782
643783 if (argc > 1 ) {
644784 if (strcmp (argv [1 ], "--shader" ) == 0 ) {
645- use_shader = true;
785+ UseShader = true;
646786 }
647787 else {
648788 abort_example ("Invalid command line option: %s" , argv [1 ]);
@@ -658,7 +798,7 @@ int main(int argc, char **argv)
658798 al_init_primitives_addon ();
659799 init_platform_specific ();
660800
661- if (use_shader ) {
801+ if (UseShader ) {
662802 al_set_new_display_flags (ALLEGRO_PROGRAMMABLE_PIPELINE );
663803 }
664804
@@ -740,6 +880,8 @@ int main(int argc, char **argv)
740880 Screens [9 ] = CustomVertexFormatPrimitives ;
741881 Screens [10 ] = VertexBuffers ;
742882 Screens [11 ] = IndexedBuffers ;
883+ Screens [12 ] = HighPrimitivesShader ;
884+ Screens [13 ] = HighFilledPrimitivesShader ;
743885
744886 ScreenName [0 ] = "Low Level Primitives" ;
745887 ScreenName [1 ] = "Indexed Primitives" ;
@@ -753,6 +895,8 @@ int main(int argc, char **argv)
753895 ScreenName [9 ] = "Custom Vertex Format" ;
754896 ScreenName [10 ] = "Vertex Buffers" ;
755897 ScreenName [11 ] = "Indexed Buffers" ;
898+ ScreenName [12 ] = "High Level Primitives + Shaders" ;
899+ ScreenName [13 ] = "High Level Filled Primitives + Shaders" ;
756900
757901 for (ii = 0 ; ii < NUM_SCREENS ; ii ++ ) {
758902 Screens [ii ](INIT );
0 commit comments