09_texture.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <cstdio>
  2. #include <cerrno>
  3. #include "simple/graphical/initializer.h"
  4. #include "simple/graphical/renderer_window.h"
  5. #include "simple/graphical/renderer.h"
  6. #include "simple/graphical/texture.h"
  7. #include "simple/graphical/surface.h"
  8. #include "simple/graphical/algorithm/fill.h"
  9. using namespace simple::graphical;
  10. using namespace color_literals;
  11. int main(int argc, char const* argv[]) try
  12. {
  13. initializer init;
  14. renderer_window win("textures galore", {600,600}, renderer_window::flags::borderless,
  15. renderer::flags::accelerated | renderer::flags::v_sync | renderer::flags::texture_target);
  16. auto& renderer = win.renderer();
  17. if(argc >= 2)
  18. {
  19. surface image(argv[1]);
  20. auto static_default_scaling = renderer.get_texture(image);
  21. renderer.render(static_default_scaling);
  22. renderer.update();
  23. SDL_Delay(1313);
  24. auto static_best_scaling = renderer.get_texture(image, quality_hint::best);
  25. renderer.render(static_best_scaling);
  26. renderer.update();
  27. SDL_Delay(1313);
  28. }
  29. auto size = int2::one() * 300;
  30. auto streaming = renderer.get_texture(size, quality_hint::best, pixel_format::type::abgr8888);
  31. renderer.texture_blend(streaming, blend_mode::alpha);
  32. float blue = 0;
  33. auto gradientor_blue = [&blue](auto&& pixels_variant) {
  34. auto pixels = std::get<pixel_writer<rgba_pixel, pixel_byte>>(pixels_variant);
  35. for(int2 p{}; p < pixels.size(); ++p.y(), p.x() = 0)
  36. for(; p < pixels.size(); p += int2::i())
  37. pixels.set( rgb_pixel(rgb_vector(
  38. ( (float2)p /(float2)pixels.size() ).xyz(blue) )), p );
  39. };
  40. for(int angle = 0; blue <= 1.0; blue += 0.01, angle += 5)
  41. {
  42. renderer.update(streaming, gradientor_blue);
  43. fill(renderer, 0x0_rgb);
  44. renderer.render({streaming, size/2}, win.size()/2 - size/2, angle);
  45. renderer.update();
  46. }
  47. SDL_Delay(1313);
  48. auto render_tex = renderer.get_render_texture(size, quality_hint::best, pixel_format::type::rgba8888);
  49. renderer.texture_blend(render_tex, blend_mode::alpha);
  50. renderer.target(render_tex);
  51. renderer.render(streaming);
  52. renderer.update();
  53. renderer.target_default();
  54. for(int angle = 0; angle <= 2*360 + 45; angle += 5)
  55. {
  56. fill(renderer, 0x0_rgb);
  57. renderer.render({render_tex, size/2}, win.size()/2 - size/2, angle);
  58. renderer.update();
  59. }
  60. SDL_Delay(1313);
  61. return 0;
  62. }
  63. catch(...)
  64. {
  65. if(errno)
  66. std::perror("ERROR");
  67. const char* sdl_error = SDL_GetError();
  68. if(*sdl_error)
  69. std::puts(sdl_error);
  70. throw;
  71. }