12_floating_pixel.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <cstdio>
  2. #include <cerrno>
  3. #include <thread>
  4. #include <random>
  5. #include "simple/graphical/initializer.h"
  6. #include "simple/graphical/software_window.h"
  7. #include "simple/graphical/algorithm/blit.h"
  8. #include "simple/graphical/algorithm/fill.h"
  9. #include "simple/support/misc.hpp"
  10. using namespace simple::graphical;
  11. using namespace color_literals;
  12. using namespace std::chrono_literals;
  13. int main(int argc, char const* argv[]) try
  14. {
  15. initializer init;
  16. software_window win("Floating pixel", int2::one(400), window::flags::borderless);
  17. const int zoom = argc > 1 ? simple::support::ston<int>(argv[1]) : 16;
  18. if(zoom <= 0)
  19. throw std::logic_error("zoom is not positive!");
  20. const unsigned waypoint_count = argc > 2 ? simple::support::ston<unsigned>(argv[2]) : 5;
  21. const float fastity = argc > 3 ? simple::support::ston<float>(argv[3]) : 0.1;
  22. const auto logical_size = win.surface().size() / zoom;
  23. surface canvas (logical_size, pixel_format(pixel_format::type::rgb24));
  24. auto pixels = std::get<pixel_writer<rgb_pixel, surface::byte>>(canvas.pixels());
  25. std::default_random_engine gen(std::random_device{}());
  26. std::uniform_real_distribution<float> dist(0,logical_size.x());
  27. auto random_float2 = [&dist, &gen]()
  28. {
  29. return float2(dist(gen), dist(gen));
  30. };
  31. float2 pos = random_float2();
  32. std::vector<float2> waypoints(waypoint_count);
  33. std::generate(waypoints.begin(), waypoints.end(), random_float2);
  34. // edge cases
  35. waypoints.push_back(float2(logical_size) - float2(0.74f, 5.82f));
  36. waypoints.push_back(float2(logical_size) - float2(5.82f, 0.74f));
  37. waypoints.push_back(float2(logical_size) - float2(0.74f, 0.54f));
  38. for
  39. (
  40. auto target = waypoints.begin();
  41. target != waypoints.end();
  42. std::this_thread::sleep_for(16ms)
  43. )
  44. {
  45. fill(canvas, canvas.format().color(0x000000_rgb));
  46. pixels.set<rgb_vector>(0x00ffff_rgb, *target);
  47. pixels.set<rgb_vector>(0xff00ff_rgb, pos);
  48. blit(canvas, win.surface(), rect{win.surface().size()});
  49. win.update();
  50. float2 diff = pos - *target;
  51. if(diff(diff) < 0.01)
  52. ++target;
  53. else
  54. pos += (*target - pos) * fastity;
  55. }
  56. return 0;
  57. }
  58. catch(...)
  59. {
  60. if(errno)
  61. std::perror("ERROR");
  62. const char* sdl_error = SDL_GetError();
  63. if(*sdl_error)
  64. std::puts(sdl_error);
  65. throw;
  66. }