#include "floor.hpp" #include "shaders/tile.hpp" #include "tile.hpp" #include "chunk.hpp" #include "tile-atlas.hpp" #include namespace floormat { constexpr auto quad_index_count = 6; floor_mesh::floor_mesh() { } void floor_mesh::draw(tile_shader& shader, chunk& c) { auto [mesh_, ids] = c.ensure_ground_mesh(); tile_atlas* last_atlas = nullptr; std::size_t last_pos = 0; GL::MeshView mesh{mesh_}; const auto do_draw = [&](std::size_t i, tile_atlas* atlas) { if (atlas == last_atlas) return; if (auto len = i - last_pos; last_atlas && len > 0) { last_atlas->texture().bind(0); mesh.setCount((int)(quad_index_count * len)); mesh.setIndexRange((int)(last_pos*quad_index_count), 0, quad_index_count*TILE_COUNT - 1); shader.draw(mesh); } last_atlas = atlas; last_pos = i; }; for (std::size_t k = 0; k < TILE_COUNT; k++) if (auto* atlas = c.ground_atlas_at(ids[k])) do_draw(k, atlas); do_draw(TILE_COUNT, nullptr); } } // namespace floormat