A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Renderer.h 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include <memory>
  3. #include <vector>
  4. #include <stdint.h>
  5. #include <swan-common/constants.h>
  6. #include <swan-common/Vector2.h>
  7. #include "util.h"
  8. namespace Cygnet {
  9. struct RendererState;
  10. struct RenderSprite {
  11. GLuint tex;
  12. };
  13. struct RenderChunk {
  14. GLuint tex;
  15. };
  16. struct RenderCamera {
  17. SwanCommon::Vec2 pos;
  18. SwanCommon::Vec2i size;
  19. float zoom;
  20. };
  21. class Renderer {
  22. public:
  23. using TileID = uint16_t;
  24. Renderer();
  25. ~Renderer();
  26. void drawChunk(RenderChunk chunk, SwanCommon::Vec2 pos);
  27. void drawSprite(RenderSprite sprite, Mat3gf mat);
  28. void drawSprite(RenderSprite sprite, SwanCommon::Vec2 pos);
  29. void drawSpriteFlipped(RenderSprite chunk, SwanCommon::Vec2 pos);
  30. void draw(const RenderCamera &cam);
  31. void registerTileTexture(TileID tileId, const void *data, size_t len);
  32. void uploadTileTexture();
  33. RenderChunk createChunk(
  34. TileID tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT]);
  35. void modifyChunk(RenderChunk chunk, SwanCommon::Vec2i pos, TileID id);
  36. void destroyChunk(RenderChunk chunk);
  37. RenderSprite createSprite(uint8_t *rgb, int width, int height);
  38. void destroySprite(RenderSprite sprite);
  39. private:
  40. std::unique_ptr<RendererState> state_;
  41. std::vector<std::pair<SwanCommon::Vec2, RenderChunk>> draw_chunks_;
  42. std::vector<std::pair<Mat3gf, RenderSprite>> draw_sprites_;
  43. };
  44. inline void Renderer::drawChunk(RenderChunk chunk, SwanCommon::Vec2 pos) {
  45. draw_chunks_.emplace_back(pos, chunk);
  46. }
  47. inline void Renderer::drawSprite(RenderSprite sprite, Mat3gf mat) {
  48. draw_sprites_.emplace_back(mat, sprite);
  49. }
  50. inline void Renderer::drawSprite(RenderSprite sprite, SwanCommon::Vec2 pos) {
  51. draw_sprites_.emplace_back(Mat3gf{}.translate(pos), sprite);
  52. }
  53. inline void Renderer::drawSpriteFlipped(RenderSprite sprite, SwanCommon::Vec2 pos) {
  54. draw_sprites_.emplace_back(Mat3gf{}.translate(pos).scale({ -1, 1 }), sprite);
  55. }
  56. }