Graphics.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. float scale = min(winsize.x / 320.f, winsize.y / 240.f);
  36. window.setView(view = sf::View(sf::FloatRect(0, 0, winsize.x, winsize.y)));
  37. buffer.display();
  38. window.clear();
  39. sprite.setScale(scale, scale);
  40. sprite.setPosition((winsize.x - 320.f * scale) / 2, (winsize.y - 240.f * scale) / 2);
  41. window.draw(sprite);
  42. window.display();
  43. }
  44. void Graphics::put_sprite(const Texture &sheet, int x, int y, const Rect &window)
  45. {
  46. sf::Sprite sprite;
  47. sprite.setTexture(sheet.data);
  48. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  49. sprite.setPosition(x, y);
  50. buffer.draw(sprite);
  51. }
  52. void Graphics::put_sprite_tint(const Texture &sheet, int x, int y, const Rect &window,
  53. const Pixel &color)
  54. {
  55. sf::Sprite sprite;
  56. sprite.setTexture(sheet.data);
  57. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  58. sprite.setPosition(x, y);
  59. sprite.setColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  60. buffer.draw(sprite);
  61. }
  62. void Graphics::put_sprite_clipping(const Texture &sheet, int x, int y,
  63. const Rect &sprite_window, const Rect &clipping_window)
  64. {
  65. const signed &ss_x = sprite_window.x, ss_y = sprite_window.y;
  66. const signed &ss_w = sprite_window.width, &ss_h = sprite_window.height;
  67. const signed &cx = clipping_window.x, &cy = clipping_window.y;
  68. const signed &cw = clipping_window.width, &ch = clipping_window.height;
  69. const signed lx = x - cx, ly = y - cy;
  70. if (lx < -ss_w || lx > cw)
  71. return;
  72. if (ly < -ss_h || ly > ch)
  73. return;
  74. signed fx = x, fy = y;
  75. signed fssx = ss_x, fssy = ss_y, fssw = ss_w, fssh = ss_h;
  76. if (lx < 0)
  77. {
  78. fssw = ss_w + lx;
  79. fssx = -lx;
  80. fx = cx;
  81. }
  82. if (lx > cw - ss_w)
  83. {
  84. fssw -= lx - (cw - ss_w);
  85. }
  86. if (ly > ch - ss_h)
  87. {
  88. fssh -= ly - (ch - ss_h);
  89. }
  90. if (ly < 0)
  91. {
  92. fssh = ss_h + ly;
  93. fssy = -ly;
  94. fy = cy;
  95. }
  96. sf::Sprite sprite;
  97. sprite.setTexture(sheet.data);
  98. sprite.setTextureRect(sf::IntRect(fssx, fssy, fssw, fssh));
  99. sprite.setPosition(fx, fy);
  100. buffer.draw(sprite);
  101. }
  102. void Graphics::fill(const Pixel &color)
  103. {
  104. buffer.clear(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  105. }
  106. void Graphics::put_pixel(uint16_t x, uint16_t y, const Pixel &color)
  107. {
  108. sf::RectangleShape pixel;
  109. pixel.setSize(sf::Vector2f(1, 1));
  110. pixel.setFillColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  111. pixel.setPosition(x, y);
  112. buffer.draw(pixel);
  113. }
  114. void Graphics::put_horizontal_line(uint16_t x, uint16_t x2, uint16_t y,
  115. const Pixel &color)
  116. {
  117. put_rectangle({x, y, x2 - x + 1u, 1}, color);
  118. }
  119. void Graphics::put_vertical_line(uint16_t x, uint16_t y, uint16_t y2, const Pixel &color)
  120. {
  121. put_rectangle({x, y, 1, y2 - y + 1u}, color);
  122. }
  123. void Graphics::put_line(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2,
  124. const Pixel &color)
  125. {
  126. sf::Color lineColor(color.r << 3, color.g << 2, color.b << 3, 255);
  127. sf::Vertex line[] = {sf::Vertex(sf::Vector2f(x, y), lineColor),
  128. sf::Vertex(sf::Vector2f(x2 + 1, y2 + 1), lineColor)};
  129. buffer.draw(line, 2, sf::Lines);
  130. }
  131. void Graphics::put_rectangle(const Rect &rect, const Pixel &color)
  132. {
  133. sf::RectangleShape rectangle;
  134. rectangle.setSize(sf::Vector2f(rect.width, rect.height));
  135. rectangle.setFillColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  136. rectangle.setPosition(rect.x, rect.y);
  137. buffer.draw(rectangle);
  138. }