Graphics.cpp 4.4 KB

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