#ifndef CLIENT_ITEM_BLOCK_HH_ #define CLIENT_ITEM_BLOCK_HH_ #include #include #include "client/item/item.hh" #include "client/render/render.hh" #include "client/world/block.hh" #include "shared/item/block.hh" #include "shared/item/item.hh" namespace client { namespace item { class block : virtual public shared::item::block, public client::item::item { private: struct gl_object { GLuint vbo; GLuint vao; unsigned long elements; gl_object(const GLuint& vbo, const GLuint& vao, const unsigned long& elements) noexcept : vbo(vbo), vao(vao), elements(elements) {} gl_object(const gl_object&) = delete; gl_object(gl_object&&) = delete; ~gl_object() noexcept { glDeleteBuffers(1, &vbo); glDeleteVertexArrays(1, &vao); } }; private: std::optional glo = std::nullopt; void regenerate_glo() noexcept; public: template block(const enum shared::world::block::type& type, Args&&... args) noexcept : shared::item::block(type, args...), client::item::item( std::forward(args)...) { } template block(const shared::item::item::type_t& type, Args&&... args) noexcept : shared::item::item(type, args...), shared::item::block(type, args...), client::item::item(type, std::forward(args)...) {} virtual ~block() noexcept {} public: virtual void draw(const glm::vec2& pos, const glm::vec2& size) noexcept override; }; } // namespace item } // namespace client #endif