renderer.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //
  2. // renderer.hpp
  3. // graphics
  4. //
  5. // Created by Sam Jaffe on 5/19/19.
  6. // Copyright © 2019 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <unordered_map>
  10. #include "game/graphics/graphics_fwd.h"
  11. #include "game/math/math_fwd.hpp"
  12. #include "game/util/hash.hpp"
  13. #include "matrix/matrix.hpp"
  14. #include "vector/vector.hpp"
  15. namespace graphics {
  16. struct renderer {
  17. virtual ~renderer() {}
  18. virtual std::shared_ptr<manager const> manager() const = 0;
  19. virtual void draw(object const & obj) = 0;
  20. virtual void draw(identity<material>, math::matr4 const &,
  21. std::vector<vertex> const &) = 0;
  22. virtual void clear() = 0;
  23. virtual void flush() = 0;
  24. };
  25. enum class driver { openGL };
  26. class direct_renderer : public renderer {
  27. public:
  28. direct_renderer(driver d);
  29. std::shared_ptr<class manager const> manager() const override;
  30. void draw(object const & obj) override;
  31. void draw(identity<material>, math::matr4 const &,
  32. std::vector<vertex> const &) override;
  33. void clear() override;
  34. void flush() override;
  35. private:
  36. struct renderer_impl * pimpl;
  37. };
  38. class batch_renderer : public renderer {
  39. public:
  40. batch_renderer(renderer * impl, std::size_t batch_size = 0);
  41. batch_renderer(renderer * impl, math::matr4 const &,
  42. std::size_t batch_size = 0);
  43. ~batch_renderer();
  44. std::shared_ptr<class manager const> manager() const override {
  45. return impl_->manager();
  46. }
  47. void draw(object const & obj) override;
  48. void draw(identity<material>, math::matr4 const &,
  49. std::vector<vertex> const &) override;
  50. void clear() override { impl_->clear(); }
  51. void flush() override;
  52. private:
  53. void check();
  54. void write();
  55. private:
  56. renderer * impl_;
  57. std::unordered_map<identity<material>, std::vector<vertex>> batches_;
  58. math::matr4 object_to_world_;
  59. std::size_t batch_size_;
  60. std::size_t elements_;
  61. };
  62. }