#pragma once #include "tile.hpp" #include #include #include #include #include #include namespace Magnum::Examples { struct tile_shader; struct chunk; struct wall_mesh final { wall_mesh(); void draw(tile_shader& shader, chunk& c); private: static constexpr auto COUNT = TILE_MAX_DIM*2 * TILE_MAX_DIM*2; static constexpr auto quad_index_count = 6; using texcoords_array = std::array; using position_array = std::array; struct vertex final { typename texcoords_array::value_type texcoords; typename position_array::value_type position; }; using quad = std::array; using vertex_array = std::array; using texture_array = std::array; static void maybe_add_tile(vertex_array& data, texture_array& textures, std::size_t& pos, tile& x, local_coords pt); static void add_wall(vertex_array& data, texture_array& textures, std::size_t& pos, tile_image& img, const position_array& positions); GL::Mesh _mesh; GL::Buffer _vertex_buffer{vertex_array{}, Magnum::GL::BufferUsage::StaticDraw}, _index_buffer{_index_data, Magnum::GL::BufferUsage::StaticDraw}; static const std::array, COUNT> _index_data; static decltype(_index_data) make_index_array(); }; } // namespace Magnum::Examples