diff options
| author | Mel <einebeere@gmail.com> | 2023-06-12 17:09:55 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2023-06-12 17:14:03 +0200 |
| commit | d0de60dc33df75fbcacb53a09568b14d0fd48cb9 (patch) | |
| tree | 7aefdbb81f114552881834bd5b0d842bc2bdb691 /src/World/World.hpp | |
| parent | 23b0bc4d1ddc9fad3c32e8257497ddd13ac6a155 (diff) | |
| download | meowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.tar.zst meowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.zip | |
Multithreaded world generation with Perlin
Diffstat (limited to 'src/World/World.hpp')
| -rw-r--r-- | src/World/World.hpp | 27 |
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; |
