Advertisement
SilverTES

Allegro5 Shader Test

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