Graphics.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "Graphics.h"
  2. #include "Logger.h"
  3. #include "sfwindow.h"
  4. #include <SFML/Graphics.hpp>
  5. #include "utility/misc.h"
  6. #include "utility/minmax.h"
  7. using namespace WalrusRPG; /*::Graphics*/
  8. using WalrusRPG::Utils::Rect;
  9. sf::RenderWindow window;
  10. sf::View view;
  11. sf::RenderTexture buffer;
  12. void Graphics::init()
  13. {
  14. Logger::log("Graphics init");
  15. // window.create(sf::VideoMode::getDesktopMode(), "WalrusRPG",
  16. // sf::Style::Fullscreen);
  17. window.create(sf::VideoMode(640, 480), "WalrusRPG");
  18. window.setFramerateLimit(60);
  19. view = sf::View(window.getDefaultView());
  20. buffer.create(320, 240);
  21. }
  22. void Graphics::deinit()
  23. {
  24. Logger::log("Graphics deinit");
  25. window.close();
  26. }
  27. void Graphics::frame_begin()
  28. {
  29. window.clear(sf::Color::Black);
  30. }
  31. void Graphics::frame_end()
  32. {
  33. sf::Sprite sprite(buffer.getTexture());
  34. sf::Vector2u winsize = window.getSize();
  35. sf::Event event;
  36. float scale = min(winsize.x / 320.f, winsize.y / 240.f);
  37. while (window.pollEvent(event))
  38. {
  39. }
  40. window.setView(view = sf::View(sf::FloatRect(0, 0, winsize.x, winsize.y)));
  41. buffer.display();
  42. window.clear();
  43. sprite.setScale(scale, scale);
  44. sprite.setPosition((winsize.x - 320.f * scale) / 2, (winsize.y - 240.f * scale) / 2);
  45. window.draw(sprite);
  46. window.display();
  47. }
  48. void Graphics::put_sprite(const Texture &sheet, int x, int y, const Rect &window)
  49. {
  50. sf::Sprite sprite;
  51. sprite.setTexture(sheet.data);
  52. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  53. sprite.setPosition(x, y);
  54. buffer.draw(sprite);
  55. }
  56. void Graphics::put_sprite_tint(const Texture &sheet, int x, int y, const Rect &window,
  57. const Pixel &color)
  58. {
  59. sf::Sprite sprite;
  60. sprite.setTexture(sheet.data);
  61. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  62. sprite.setPosition(x, y);
  63. sprite.setColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  64. buffer.draw(sprite);
  65. }
  66. void Graphics::put_sprite_clipping(const Texture &sheet, int x, int y,
  67. const Rect &sprite_window, const Rect &clipping_window)
  68. {
  69. const signed &ss_x = sprite_window.x, ss_y = sprite_window.y;
  70. const signed &ss_w = sprite_window.width, &ss_h = sprite_window.height;
  71. const signed &cx = clipping_window.x, &cy = clipping_window.y;
  72. const signed &cw = clipping_window.width, &ch = clipping_window.height;
  73. const signed lx = x - cx, ly = y - cy;
  74. if (lx < -ss_w || lx > cw)
  75. return;
  76. if (ly < -ss_h || ly > ch)
  77. return;
  78. signed fx = x, fy = y;
  79. signed fssx = ss_x, fssy = ss_y, fssw = ss_w, fssh = ss_h;
  80. if (lx < 0)
  81. {
  82. fssw = ss_w + lx;
  83. fssx = -lx;
  84. fx = cx;
  85. }
  86. if (lx > cw - ss_w)
  87. {
  88. fssw -= lx - (cw - ss_w);
  89. }
  90. if (ly > ch - ss_h)
  91. {
  92. fssh -= ly - (ch - ss_h);
  93. }
  94. if (ly < 0)
  95. {
  96. fssh = ss_h + ly;
  97. fssy = -ly;
  98. fy = cy;
  99. }
  100. sf::Sprite sprite;
  101. sprite.setTexture(sheet.data);
  102. sprite.setTextureRect(sf::IntRect(fssx, fssy, fssw, fssh));
  103. sprite.setPosition(fx, fy);
  104. buffer.draw(sprite);
  105. }
  106. void Graphics::fill(const Pixel &color)
  107. {
  108. buffer.clear(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  109. }
  110. void Graphics::put_pixel(uint16_t x, uint16_t y, const Pixel &color)
  111. {
  112. sf::RectangleShape pixel;
  113. pixel.setSize(sf::Vector2f(1, 1));
  114. pixel.setFillColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  115. pixel.setPosition(x, y);
  116. buffer.draw(pixel);
  117. }
  118. void Graphics::put_horizontal_line(uint16_t x, uint16_t x2, uint16_t y,
  119. const Pixel &color)
  120. {
  121. put_rectangle({x, y, x2 - x + 1u, 1}, color);
  122. }
  123. void Graphics::put_vertical_line(uint16_t x, uint16_t y, uint16_t y2, const Pixel &color)
  124. {
  125. put_rectangle({x, y, 1, y2 - y + 1u}, color);
  126. }
  127. void Graphics::put_line(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2,
  128. const Pixel &color)
  129. {
  130. sf::Color lineColor(color.r << 3, color.g << 2, color.b << 3, 255);
  131. sf::Vertex line[] = {sf::Vertex(sf::Vector2f(x, y), lineColor),
  132. sf::Vertex(sf::Vector2f(x2 + 1, y2 + 1), lineColor)};
  133. buffer.draw(line, 2, sf::Lines);
  134. }
  135. void Graphics::put_rectangle(const Rect &rect, const Pixel &color)
  136. {
  137. sf::RectangleShape rectangle;
  138. rectangle.setSize(sf::Vector2f(rect.width, rect.height));
  139. rectangle.setFillColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  140. rectangle.setPosition(rect.x, rect.y);
  141. buffer.draw(rectangle);
  142. }