Graphics.cpp 4.6 KB

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