// // renderer.hpp // graphics // // Created by Sam Jaffe on 5/19/19. // Copyright © 2019 Sam Jaffe. All rights reserved. // #pragma once #include #include "game/graphics/graphics_fwd.h" #include "game/math/math_fwd.hpp" #include "game/util/hash.hpp" #include "vector/vector.hpp" namespace graphics { struct renderer { virtual ~renderer() {} virtual std::shared_ptr manager() const = 0; virtual void draw(object const & obj) = 0; virtual void draw(identity, math::matr4 const &, std::vector const &) = 0; virtual void clear() = 0; virtual void flush() = 0; }; enum class driver { openGL }; class direct_renderer : public renderer { public: direct_renderer(driver d); direct_renderer(class renderer_impl * pi); std::shared_ptr manager() const override; void draw(object const & obj) override; void draw(identity, math::matr4 const &, std::vector const &) override; void clear() override; void flush() override; private: struct renderer_impl * pimpl; }; class batch_renderer : public renderer { public: batch_renderer(renderer * impl, std::size_t batch_size = 0); ~batch_renderer(); std::shared_ptr manager() const override { return impl_->manager(); } void draw(object const & obj) override; void draw(identity, math::matr4 const &, std::vector const &) override; void clear() override { impl_->clear(); } void flush() override; private: void check(); void write(); private: renderer * impl_; std::unordered_map, std::vector> batches_; std::size_t batch_size_; std::size_t elements_; }; }