summaryrefslogtreecommitdiffhomepage
path: root/draw
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-12-07 17:50:50 +0100
committerStanislaw Halik <sthalik@misaki.pl>2022-12-08 08:29:12 +0100
commit9a6a923c68afc4e9b6f47164c7ae9b2ed67bcf77 (patch)
tree9123a47535b14f38fa8a171797fafdf492987920 /draw
parentea90834553ca195049c41892c1356e157ec6d203 (diff)
src, draw: don't overallocate ground & wall vbo's
Diffstat (limited to 'draw')
-rw-r--r--draw/floor.cpp16
-rw-r--r--draw/wall.cpp14
2 files changed, 17 insertions, 13 deletions
diff --git a/draw/floor.cpp b/draw/floor.cpp
index 5e645b0f..5b5a515f 100644
--- a/draw/floor.cpp
+++ b/draw/floor.cpp
@@ -13,30 +13,32 @@ floor_mesh::floor_mesh() = default;
void floor_mesh::draw(tile_shader& shader, chunk& c)
{
- constexpr auto quad_index_count = 6;
- auto [mesh_, ids] = c.ensure_ground_mesh();
+ constexpr int quad_index_count = 6;
+ const auto [mesh_, ids, size] = c.ensure_ground_mesh();
struct { tile_atlas* atlas = nullptr; std::size_t pos = 0; } last;
GL::MeshView mesh{mesh_};
[[maybe_unused]] std::size_t draw_count = 0;
- const auto do_draw = [&](std::size_t i, tile_atlas* atlas) {
+ const auto do_draw = [&](std::size_t i, tile_atlas* atlas, std::uint32_t max_index) {
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);
+ mesh.setIndexRange((int)(last.pos*quad_index_count), 0, max_index);
shader.draw(mesh);
draw_count++;
}
last = { atlas, i };
};
- for (std::size_t k = 0; k < TILE_COUNT; k++)
- do_draw(k, c.ground_atlas_at(ids[k]));
- do_draw(TILE_COUNT, nullptr);
+ const auto max_index = std::uint32_t(size*quad_index_count - 1);
+ std::size_t k;
+ for (k = 0; k < size; k++)
+ do_draw(k, c.ground_atlas_at(ids[k]), max_index);
+ do_draw(size, nullptr, max_index);
#ifdef FM_DEBUG_DRAW_COUNT
if (draw_count)
diff --git a/draw/wall.cpp b/draw/wall.cpp
index dbc9c2ad..85365844 100644
--- a/draw/wall.cpp
+++ b/draw/wall.cpp
@@ -17,28 +17,30 @@ wall_mesh::wall_mesh() = default;
void wall_mesh::draw(tile_shader& shader, chunk& c)
{
- auto [mesh_, ids] = c.ensure_wall_mesh();
+ const auto [mesh_, ids, size] = c.ensure_wall_mesh();
struct { tile_atlas* atlas = nullptr; std::size_t pos = 0; } last;
GL::MeshView mesh{mesh_};
[[maybe_unused]] std::size_t draw_count = 0;
- const auto do_draw = [&](std::size_t i, tile_atlas* atlas) {
+ const auto do_draw = [&](std::size_t i, tile_atlas* atlas, std::uint32_t max_index) {
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*2 - 1);
+ mesh.setIndexRange((int)(last.pos*quad_index_count), 0, max_index);
shader.draw(mesh);
draw_count++;
}
last = { atlas, i };
};
- for (std::size_t k = 0; k < TILE_COUNT*2; k++)
- do_draw(k, c.wall_atlas_at(ids[k]));
- do_draw(TILE_COUNT*2, nullptr);
+ const auto max_index = std::uint32_t(size*quad_index_count - 1);
+ std::size_t k;
+ for (k = 0; k < size; k++)
+ do_draw(k, c.wall_atlas_at(ids[k]), max_index);
+ do_draw(size, nullptr, max_index);
#ifdef FM_DEBUG_DRAW_COUNT
if (draw_count)