summary refs log tree commit diff
path: root/src/World
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2024-02-12 13:01:15 +0100
committerMel <einebeere@gmail.com>2024-02-12 13:01:15 +0100
commit6a30c3e4f22de4d0f8f32107f614f597f5f39cc1 (patch)
treea4e45ac6c5c728266eef1b42099494854744d497 /src/World
parentd2b5fc5b3bc648afffa42375706429685ac63794 (diff)
downloadmeowcraft-6a30c3e4f22de4d0f8f32107f614f597f5f39cc1.tar.zst
meowcraft-6a30c3e4f22de4d0f8f32107f614f597f5f39cc1.zip
Rescue player from void if current chunk wasn't generated prior
Diffstat (limited to 'src/World')
-rw-r--r--src/World/ChunkRegistry.hpp6
-rw-r--r--src/World/World.cpp25
-rw-r--r--src/World/World.hpp11
3 files changed, 24 insertions, 18 deletions
diff --git a/src/World/ChunkRegistry.hpp b/src/World/ChunkRegistry.hpp
index 2b87a3a..d583765 100644
--- a/src/World/ChunkRegistry.hpp
+++ b/src/World/ChunkRegistry.hpp
@@ -2,6 +2,7 @@
 
 #include <optional>
 #include <unordered_map>
+#include "../Time.hpp"
 #include "Chunk.hpp"
 #include "ChunkIndex.hpp"
 #include "Position.hpp"
@@ -23,11 +24,16 @@ public:
     struct Data {
         ChunkIndex index;
         Status status;
+        Time::Tick generated_at_tick;
         std::optional<Chunk> chunk = {};
 
         std::optional<GFX::Mesh> land_mesh = {};
         std::optional<GFX::Mesh> water_mesh = {};
 
+        Bool generated() const {
+            return chunk.has_value();
+        }
+
         Status get_status() const {
             if (status == Status::Done && chunk.value().is_damaged()) { return Status::Damaged; }
             return status;
diff --git a/src/World/World.cpp b/src/World/World.cpp
index 2b5848b..b5dae43 100644
--- a/src/World/World.cpp
+++ b/src/World/World.cpp
@@ -5,8 +5,8 @@
 
 namespace MC::World {
 
-std::vector<ChunkRegistry::Data*> World::get_visible_chunks(Position::World position) {
-    process_chunk_updates();
+std::vector<ChunkRegistry::Data*> World::get_visible_chunks(Time const& time, Position::World position) {
+    process_chunk_updates(time);
 
     if (should_reassess_priorities(position)) {
         reassess_priorities(position);
@@ -84,22 +84,24 @@ std::vector<ChunkIndex> World::get_visible_chunk_indices(const Position::World p
     return indices;
 }
 
-void World::process_chunk_updates() {
+void World::process_chunk_updates(Time const& time) {
     auto generation_results = m_generation_queue.done();
     for (auto& [id, res] : generation_results) {
-        m_registry.get(id) = {id, ChunkRegistry::Status::NeedsReification, {res.chunk}};
+        m_registry.get(id) = {
+            id, ChunkRegistry::Status::NeedsReification,
+            time.tick(),
+            {res.chunk}
+        };
 
         log_chunk_time(res.generation_duration);
     }
 
     auto reification_results = m_reification_queue.done();
     for (auto& [id, res] : reification_results) {
-        m_registry.get(id) = {
-            id, ChunkRegistry::Status::Done,
-            {res.chunk},
-            res.chunk_mesh.land_mesh,
-            res.chunk_mesh.water_mesh
-        };
+        auto& data = m_registry.get(id);
+        data.status = ChunkRegistry::Status::Done;
+        data.land_mesh = res.chunk_mesh.land_mesh;
+        data.water_mesh = res.chunk_mesh.water_mesh;
 
         // TODO: Damage surrounding chunks.
     }
@@ -124,8 +126,7 @@ void World::request_reification(ChunkIndex index, Real priority) {
         intitial_lighting.add_chunk(chunk);
         intitial_lighting.illuminate(chunk);
 
-        auto meshes = Generation::ChunkMeshing::mesh_chunk(chunk, meshing_context);
-        return {chunk, meshes};
+        return {Generation::ChunkMeshing::mesh_chunk(chunk, meshing_context)};
     });
 }
 
diff --git a/src/World/World.hpp b/src/World/World.hpp
index 76005da..82741b0 100644
--- a/src/World/World.hpp
+++ b/src/World/World.hpp
@@ -13,7 +13,7 @@ namespace MC::World {
 
 class World {
 public:
-    std::vector<ChunkRegistry::Data*> get_visible_chunks(Position::World position);
+    std::vector<ChunkRegistry::Data*> get_visible_chunks(Time const& time, Position::World position);
 
     Chunk::BlockData block_at(Position::BlockWorld pos);
     void set_block(Position::BlockWorld pos, BlockType type);
@@ -36,7 +36,7 @@ public:
 private:
     std::vector<ChunkIndex> get_visible_chunk_indices(Position::World position) const;
 
-    void process_chunk_updates();
+    void process_chunk_updates(Time const& time);
     void request_generation(ChunkIndex index, Real priority);
     void request_reification(ChunkIndex index, Real priority);
 
@@ -48,7 +48,7 @@ private:
 
     void log_chunk_time(U64 chunk_time_ms);
 
-    U8 m_view_distance_radius = 12;
+    U8 m_view_distance_radius = 10;
 
     Bool is_chunk_in_radius(Position::World position, ChunkIndex chunk) const;
 
@@ -57,14 +57,13 @@ private:
         U64 generation_duration;
     };
     using GenerationQueue = Compute::Queue<GenerationResult, ChunkIndex>;
-    GenerationQueue m_generation_queue{4};
+    GenerationQueue m_generation_queue{1};
 
     struct ReificationResult {
-        Chunk chunk;
         Generation::ChunkMeshing::ChunkMesh chunk_mesh;
     };
     using ReificationQueue = Compute::Queue<ReificationResult, ChunkIndex>;
-    ReificationQueue m_reification_queue{4};
+    ReificationQueue m_reification_queue{1};
 
     Real m_priority_reassession_distance_threshold = 50;
     Position::World m_last_priority_reassession_at = {};