summary refs log tree commit diff
path: root/src/World/World.cpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-07-22 17:35:00 +0200
committerMel <einebeere@gmail.com>2023-07-22 17:35:00 +0200
commit2eef7cf49b7a15559ee7bb6719411bcf67386213 (patch)
tree11eb7a4f437da7bfdde620c10a043960fd423cfb /src/World/World.cpp
parent23d88e5f1c8f0c8652a07050fcfa8ff126e85d4a (diff)
downloadmeowcraft-2eef7cf49b7a15559ee7bb6719411bcf67386213.tar.zst
meowcraft-2eef7cf49b7a15559ee7bb6719411bcf67386213.zip
Propagation in lighting system
Diffstat (limited to 'src/World/World.cpp')
-rw-r--r--src/World/World.cpp50
1 files changed, 15 insertions, 35 deletions
diff --git a/src/World/World.cpp b/src/World/World.cpp
index 912a5cf..5548866 100644
--- a/src/World/World.cpp
+++ b/src/World/World.cpp
@@ -5,25 +5,25 @@
 
 namespace MC::World {
 
-std::vector<World::ChunkData*> World::get_visible_chunks(Vector<3> position) {
+std::vector<ChunkRegistry::Data*> World::get_visible_chunks(Vector<3> position) {
     load_finished_chunks_from_queue();
 
     auto visible_chunks = get_visible_chunk_indices(position);
 
-    std::vector<ChunkData*> chunks{};
+    std::vector<ChunkRegistry::Data*> chunks{};
     chunks.reserve(visible_chunks.size());
     for (auto index : visible_chunks) {
-        auto& data = get(index);
-        if (data.status == ChunkStatus::Empty) {
+        auto& data = m_registry.get(index);
+        if (data.status == ChunkRegistry::Status::Empty) {
             request_generation(index, position.distance(index.middle()));
-            data.status = ChunkStatus::WaitingForGeneration;
+            data.status = ChunkRegistry::Status::WaitingForGeneration;
             continue;
         }
 
-        if (data.status == ChunkStatus::WaitingForReification) {
+        if (data.status == ChunkRegistry::Status::WaitingForReification) {
             try_to_reify_chunk(data);
         }
-        if (data.status == ChunkStatus::Done) {
+        if (data.status == ChunkRegistry::Status::Done) {
             chunks.push_back(&data);
         }
     }
@@ -31,16 +31,6 @@ std::vector<World::ChunkData*> World::get_visible_chunks(Vector<3> position) {
     return chunks;
 }
 
-Chunk* World::get_chunk_for_position(Vector<3> position) {
-    I32 x = std::round(position.x() / Chunk::Width);
-    I32 y = std::round(position.z() / Chunk::Width);
-    auto& data = get({x, y});
-    if (data.chunk.has_value()) {
-        return &data.chunk.value();
-    }
-    return nullptr;
-}
-
 std::vector<ChunkIndex> World::get_visible_chunk_indices(const Vector<3> position) const {
     I32 center_x = std::round(position.x() / Chunk::Width);
     I32 center_y = std::round(position.z() / Chunk::Width);
@@ -66,7 +56,7 @@ std::vector<ChunkIndex> World::get_visible_chunk_indices(const Vector<3> positio
 void World::load_finished_chunks_from_queue() {
     auto results = m_queue.done();
     for (auto& [id, res] : results) {
-        get(id) = {id, ChunkStatus::WaitingForReification, {res.chunk}};
+        m_registry.get(id) = {id, ChunkRegistry::Status::WaitingForReification, {res.chunk}};
         log_chunk_time(res.generation_duration);
     }
 }
@@ -79,20 +69,9 @@ void World::request_generation(ChunkIndex index, Real priority) {
     });
 }
 
-World::ChunkData& World::get(ChunkIndex index) {
-    auto entry = m_chunks.find(index);
-    if (entry == m_chunks.end()) {
-        ChunkData data{index, ChunkStatus::Empty};
-
-        m_chunks.insert({index, std::move(data)});
-        return m_chunks.at(index);
-    }
-
-    return entry->second;
-}
-
-void World::try_to_reify_chunk(ChunkData& data) {
+void World::try_to_reify_chunk(ChunkRegistry::Data& data) {
     auto index = data.index;
+    auto& chunk = data.chunk.value();
 
     UInt neighbor_index = 0;
     std::array<Chunk*, 8> neighbors;
@@ -100,7 +79,7 @@ void World::try_to_reify_chunk(ChunkData& data) {
         for (I32 y = -1; y <= 1; y++) {
             if (x == 0 && y == 0) continue;
 
-            auto& neighbor_data = get({index.x + x, index.y + y});
+            auto& neighbor_data = m_registry.get({index.x + x, index.y + y});
             if (!neighbor_data.chunk.has_value()) return; // All neighbors need to be generated first.
 
             neighbors[neighbor_index++] = &neighbor_data.chunk.value();
@@ -116,10 +95,11 @@ void World::try_to_reify_chunk(ChunkData& data) {
     };
 
     // Lighting
-    Generation::Lighting::light_chunk(data.chunk.value(), chunk_neighbors);
+    m_lighting.add_chunk(chunk);
+    m_lighting.illuminate(m_registry);
 
     // Meshing
-    auto meshes = Generation::ChunkMeshing::mesh_chunk(data.chunk.value(), chunk_neighbors);
+    auto meshes = Generation::ChunkMeshing::mesh_chunk(chunk, chunk_neighbors);
 
     data.land_mesh_data = meshes.land_mesh;
     data.land_mesh = GFX::Binder::load(data.land_mesh_data.value());
@@ -127,7 +107,7 @@ void World::try_to_reify_chunk(ChunkData& data) {
     data.water_mesh_data = meshes.water_mesh;
     data.water_mesh = GFX::Binder::load(data.water_mesh_data.value());
 
-    data.status = ChunkStatus::Done;
+    data.status = ChunkRegistry::Status::Done;
 }
 
 void World::log_chunk_time(U64 chunk_time_ms) {