summary refs log tree commit diff
path: root/src/World
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-07-10 17:37:41 +0200
committerMel <einebeere@gmail.com>2023-07-10 17:37:41 +0200
commitd83f8fdb062ed3c2bdb41117e7304c22cc481003 (patch)
treed17746e3fff9376a14fec879645781e4283b147e /src/World
parent354a49d852d8f9ed9b66d7780ba43ce3a9ec59d7 (diff)
downloadmeowcraft-d83f8fdb062ed3c2bdb41117e7304c22cc481003.tar.zst
meowcraft-d83f8fdb062ed3c2bdb41117e7304c22cc481003.zip
Sort chunks for correct alpha blending (only works for the simple plane water mesh)
Diffstat (limited to 'src/World')
-rw-r--r--src/World/World.cpp50
-rw-r--r--src/World/World.hpp6
2 files changed, 19 insertions, 37 deletions
diff --git a/src/World/World.cpp b/src/World/World.cpp
index 53f92da..de80afe 100644
--- a/src/World/World.cpp
+++ b/src/World/World.cpp
@@ -4,26 +4,20 @@
 namespace MC::World {
 
 std::vector<World::ChunkData*> World::get_visible_chunks(Vector<3> position) {
-    auto finished_chunks = load_finished_chunks_from_queue();
-    auto visible_chunks = get_visible_chunk_indices(position);
-
-    auto updates = visible_chunks;
-    for (auto index : m_visible_chunks) {
-        updates.erase(index);
-    }
-    for (auto index : finished_chunks) {
-        updates.insert(index);
-    }
+    load_finished_chunks_from_queue();
 
-    if (!updates.empty()) {
-        process_chunk_visibility_updates(updates, position);
-        m_visible_chunks = visible_chunks;
-    }
+    auto visible_chunks = get_visible_chunk_indices(position);
 
     std::vector<ChunkData*> chunks{};
     chunks.reserve(visible_chunks.size());
     for (auto index : visible_chunks) {
         auto& data = get(index);
+        if (data.status == ChunkStatus::Empty) {
+            request_generation(index, position.distance(index.middle()));
+            data.status = ChunkStatus::WaitingForGeneration;
+            continue;
+        }
+
         if (data.status == ChunkStatus::NeedsMesh) {
             try_to_create_mesh_for_chunk(data);
         }
@@ -45,44 +39,34 @@ Chunk* World::get_chunk_for_position(Vector<3> position) {
     return nullptr;
 }
 
-void World::process_chunk_visibility_updates(const std::unordered_set<ChunkIndex>& new_chunks, const Vector<3> player) {
-    for (auto new_index: new_chunks) {
-        auto& data = get(new_index);
-        if (data.status == ChunkStatus::Empty) {
-            request_generation(new_index, player.distance(new_index.middle()));
-            data.status = ChunkStatus::WaitingForGeneration;
-        }
-    }
-}
-
-std::unordered_set<ChunkIndex> World::get_visible_chunk_indices(const Vector<3> position) const {
+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);
 
-    std::unordered_set<ChunkIndex> indices{};
+    std::vector<ChunkIndex> indices{};
     indices.reserve(m_view_distance_radius * m_view_distance_radius * 4);
     auto radius = m_view_distance_radius;
     for (I32 x = -radius; x <= radius; x++) {
         I32 height = std::round(std::sqrt(radius * radius - x * x) + 0.5);
         for (I32 y = -height; y <= height; y++) {
-            indices.emplace(x + center_x, y + center_y);
+            indices.emplace_back(x + center_x, y + center_y);
         }
     }
 
+    auto cmp = [=](const ChunkIndex& a, const ChunkIndex& b) -> bool {
+        return position.distance(a.middle()) > position.distance(b.middle());
+    };
+    std::sort(indices.begin(), indices.end(), cmp);
+
     return indices;
 }
 
-std::unordered_set<ChunkIndex> World::load_finished_chunks_from_queue() {
-    std::unordered_set<ChunkIndex> indices;
+void World::load_finished_chunks_from_queue() {
     auto results = m_queue.done();
     for (auto& [id, res] : results) {
         get(id) = {id, ChunkStatus::NeedsMesh, {res.chunk}};
-        indices.insert(id);
-
         log_chunk_time(res.generation_duration);
     }
-
-    return indices;
 }
 
 void World::request_generation(ChunkIndex index, Real priority) {
diff --git a/src/World/World.hpp b/src/World/World.hpp
index c931ee4..71156f4 100644
--- a/src/World/World.hpp
+++ b/src/World/World.hpp
@@ -37,9 +37,8 @@ public:
 
     Real get_average_chunk_time() const;
 private:
-    std::unordered_set<ChunkIndex> get_visible_chunk_indices(Vector<3> position) const;
-    std::unordered_set<ChunkIndex> load_finished_chunks_from_queue();
-    void process_chunk_visibility_updates(const std::unordered_set<ChunkIndex>& new_chunks, Vector<3> player);
+    std::vector<ChunkIndex> get_visible_chunk_indices(Vector<3> position) const;
+    void load_finished_chunks_from_queue();
     void request_generation(ChunkIndex index, Real priority);
     void try_to_create_mesh_for_chunk(ChunkData& data);
 
@@ -59,7 +58,6 @@ private:
     Generation::Generator m_generator;
 
     std::unordered_map<ChunkIndex, ChunkData> m_chunks;
-    std::unordered_set<ChunkIndex> m_visible_chunks;
 
     struct Statistics {
         UInt chunk_time_sample_count;