diff options
Diffstat (limited to 'src/World')
| -rw-r--r-- | src/World/ChunkRegistry.hpp | 6 | ||||
| -rw-r--r-- | src/World/World.cpp | 25 | ||||
| -rw-r--r-- | src/World/World.hpp | 11 |
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 = {}; |
