summary refs log tree commit diff
path: root/src/World/Generation/ChunkMeshing.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/World/Generation/ChunkMeshing.hpp')
-rw-r--r--src/World/Generation/ChunkMeshing.hpp41
1 files changed, 19 insertions, 22 deletions
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 <typename Decisions>
 GFX::Mesh create_mesh(Chunk& chunk, const SurroundingContext& context) {
     GFX::Util::MeshBuilder<Normal, TexCoord, Light, AO> 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();
 }