From 22f3bad59de14b62c6680d10aff2cea5ac5b11dc Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 9 Apr 2024 03:34:50 +0200 Subject: Traverse all chunk blocks in a unified (and cache-friendly) way --- src/World/Generation/ChunkMeshing.hpp | 41 ++++++++++++++++------------------- 1 file changed, 19 insertions(+), 22 deletions(-) (limited to 'src/World/Generation/ChunkMeshing.hpp') diff --git a/src/World/Generation/ChunkMeshing.hpp b/src/World/Generation/ChunkMeshing.hpp index c745a3b..16ba701 100644 --- a/src/World/Generation/ChunkMeshing.hpp +++ b/src/World/Generation/ChunkMeshing.hpp @@ -47,29 +47,26 @@ template GFX::Mesh create_mesh(Chunk& chunk, const SurroundingContext& context) { GFX::Util::MeshBuilder builder; - for (Int x = 0; x < Chunk::Width; x++) { - for (Int y = 0; y < Chunk::Height; y++) { - for (Int z = 0; z < Chunk::Width; z++) { - auto block = chunk.at(x, y, z); - if (Decisions::should_ignore_block(block)) - continue; - - for (auto side: BlockSide::all()) { - if (!Decisions::is_face_visible(chunk, context, x, y, z, side)) - continue; - - U32 s = builder.vertex_count(); - - builder.positions(Decisions::face_positions(side, x, y, z)); - builder.attributes<0>(Decisions::face_normals(side)); - builder.attributes<1>(Decisions::face_tex_coords(block.type, side)); - builder.attributes<2>(Decisions::face_light(chunk, context, x, y, z, side)); - builder.attributes<3>(Decisions::face_ao_values(chunk, context, x, y, z, side)); - builder.indices(std::array{ s + 0, s + 1, s + 2, s + 2, s + 3, s + 0 }); - } - } + chunk.for_each([&](Position::BlockLocal pos, Chunk::BlockData block) { + auto [x, y, z] = pos.values(); + if (Decisions::should_ignore_block(block)) return Iteration::Continue; + + for (auto side: BlockSide::all()) { + if (!Decisions::is_face_visible(chunk, context, x, y, z, side)) + continue; + + builder.positions(Decisions::face_positions(side, x, y, z)); + builder.attributes<0>(Decisions::face_normals(side)); + builder.attributes<1>(Decisions::face_tex_coords(block.type, side)); + builder.attributes<2>(Decisions::face_light(chunk, context, x, y, z, side)); + builder.attributes<3>(Decisions::face_ao_values(chunk, context, x, y, z, side)); + + U32 s = builder.vertex_count(); + builder.indices(std::array{ s + 0, s + 1, s + 2, s + 2, s + 3, s + 0 }); } - } + + return Iteration::Continue; + }); return builder.mesh(); } -- cgit 1.4.1