diff options
Diffstat (limited to 'src/World/World.cpp')
| -rw-r--r-- | src/World/World.cpp | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/src/World/World.cpp b/src/World/World.cpp index 912a5cf..5548866 100644 --- a/src/World/World.cpp +++ b/src/World/World.cpp @@ -5,25 +5,25 @@ namespace MC::World { -std::vector<World::ChunkData*> World::get_visible_chunks(Vector<3> position) { +std::vector<ChunkRegistry::Data*> World::get_visible_chunks(Vector<3> position) { load_finished_chunks_from_queue(); auto visible_chunks = get_visible_chunk_indices(position); - std::vector<ChunkData*> chunks{}; + std::vector<ChunkRegistry::Data*> chunks{}; chunks.reserve(visible_chunks.size()); for (auto index : visible_chunks) { - auto& data = get(index); - if (data.status == ChunkStatus::Empty) { + auto& data = m_registry.get(index); + if (data.status == ChunkRegistry::Status::Empty) { request_generation(index, position.distance(index.middle())); - data.status = ChunkStatus::WaitingForGeneration; + data.status = ChunkRegistry::Status::WaitingForGeneration; continue; } - if (data.status == ChunkStatus::WaitingForReification) { + if (data.status == ChunkRegistry::Status::WaitingForReification) { try_to_reify_chunk(data); } - if (data.status == ChunkStatus::Done) { + if (data.status == ChunkRegistry::Status::Done) { chunks.push_back(&data); } } @@ -31,16 +31,6 @@ std::vector<World::ChunkData*> World::get_visible_chunks(Vector<3> position) { return chunks; } -Chunk* World::get_chunk_for_position(Vector<3> position) { - I32 x = std::round(position.x() / Chunk::Width); - I32 y = std::round(position.z() / Chunk::Width); - auto& data = get({x, y}); - if (data.chunk.has_value()) { - return &data.chunk.value(); - } - return nullptr; -} - 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); @@ -66,7 +56,7 @@ std::vector<ChunkIndex> World::get_visible_chunk_indices(const Vector<3> positio void World::load_finished_chunks_from_queue() { auto results = m_queue.done(); for (auto& [id, res] : results) { - get(id) = {id, ChunkStatus::WaitingForReification, {res.chunk}}; + m_registry.get(id) = {id, ChunkRegistry::Status::WaitingForReification, {res.chunk}}; log_chunk_time(res.generation_duration); } } @@ -79,20 +69,9 @@ void World::request_generation(ChunkIndex index, Real priority) { }); } -World::ChunkData& World::get(ChunkIndex index) { - auto entry = m_chunks.find(index); - if (entry == m_chunks.end()) { - ChunkData data{index, ChunkStatus::Empty}; - - m_chunks.insert({index, std::move(data)}); - return m_chunks.at(index); - } - - return entry->second; -} - -void World::try_to_reify_chunk(ChunkData& data) { +void World::try_to_reify_chunk(ChunkRegistry::Data& data) { auto index = data.index; + auto& chunk = data.chunk.value(); UInt neighbor_index = 0; std::array<Chunk*, 8> neighbors; @@ -100,7 +79,7 @@ void World::try_to_reify_chunk(ChunkData& data) { for (I32 y = -1; y <= 1; y++) { if (x == 0 && y == 0) continue; - auto& neighbor_data = get({index.x + x, index.y + y}); + auto& neighbor_data = m_registry.get({index.x + x, index.y + y}); if (!neighbor_data.chunk.has_value()) return; // All neighbors need to be generated first. neighbors[neighbor_index++] = &neighbor_data.chunk.value(); @@ -116,10 +95,11 @@ void World::try_to_reify_chunk(ChunkData& data) { }; // Lighting - Generation::Lighting::light_chunk(data.chunk.value(), chunk_neighbors); + m_lighting.add_chunk(chunk); + m_lighting.illuminate(m_registry); // Meshing - auto meshes = Generation::ChunkMeshing::mesh_chunk(data.chunk.value(), chunk_neighbors); + auto meshes = Generation::ChunkMeshing::mesh_chunk(chunk, chunk_neighbors); data.land_mesh_data = meshes.land_mesh; data.land_mesh = GFX::Binder::load(data.land_mesh_data.value()); @@ -127,7 +107,7 @@ void World::try_to_reify_chunk(ChunkData& data) { data.water_mesh_data = meshes.water_mesh; data.water_mesh = GFX::Binder::load(data.water_mesh_data.value()); - data.status = ChunkStatus::Done; + data.status = ChunkRegistry::Status::Done; } void World::log_chunk_time(U64 chunk_time_ms) { |
