summary refs log tree commit diff
path: root/src/World/World.hpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-06-12 17:09:55 +0200
committerMel <einebeere@gmail.com>2023-06-12 17:14:03 +0200
commitd0de60dc33df75fbcacb53a09568b14d0fd48cb9 (patch)
tree7aefdbb81f114552881834bd5b0d842bc2bdb691 /src/World/World.hpp
parent23b0bc4d1ddc9fad3c32e8257497ddd13ac6a155 (diff)
downloadmeowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.tar.zst
meowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.zip
Multithreaded world generation with Perlin
Diffstat (limited to 'src/World/World.hpp')
-rw-r--r--src/World/World.hpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/World/World.hpp b/src/World/World.hpp
index f113bda..dc8f8a7 100644
--- a/src/World/World.hpp
+++ b/src/World/World.hpp
@@ -6,30 +6,39 @@
 #include <utility>
 #include "Generator.hpp"
 #include "ChunkIndex.hpp"
+#include "../Compute/Queue.hpp"
 
 namespace MC::World {
 
 class World {
 public:
-    World() : m_generator(), m_chunks(), m_visible_chunks() {}
+    World() : m_queue(2), m_chunks(), m_visible_chunks() {}
 
-    struct ChunkData {
-        ChunkData(ChunkIndex index, std::shared_ptr<Chunk> chunk)
-            : index(index), chunk(std::move(chunk)), mesh() {}
+    enum class ChunkStatus {
+        Empty,
+        InFlight,
+        Done
+    };
 
+    struct ChunkData {
         ChunkIndex index;
-        std::shared_ptr<Chunk> chunk;
-        std::optional<GFX::BindableMesh> mesh;
+        ChunkStatus status;
+        std::optional<Chunk> chunk = {};
+        std::optional<GFX::BindableMesh> mesh = {};
     };
 
     std::vector<ChunkData> get_visible_chunks(Vector<3> position);
-
 private:
     std::unordered_set<ChunkIndex> get_visible_chunk_indices(Vector<3> position) const;
-    ChunkData& get_or_generate(ChunkIndex index);
+    std::unordered_set<ChunkIndex> load_finished_chunks_from_queue();
+    void process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks);
+    void request_generation(ChunkIndex index);
+
+    ChunkData& get(ChunkIndex index);
 
-    uint8_t m_view_distance_radius = 6;
+    uint8_t m_view_distance_radius = 12;
 
+    Compute::Queue<Chunk, ChunkIndex> m_queue;
     Generator m_generator;
 
     std::unordered_map<ChunkIndex, ChunkData> m_chunks;