#pragma once #include #include #include "../Time.hpp" #include "Chunk.hpp" #include "ChunkIndex.hpp" #include "Position.hpp" namespace MC::World { class ChunkRegistry { public: enum class Status { Empty, WaitingForGeneration, NeedsReification, WaitingForReification, Damaged, Done }; // I think a Chunk entity should just store all this by itself... struct Data { ChunkIndex index; Status status; Time::Tick generated_at_tick; std::optional chunk = {}; std::optional land_mesh = {}; std::optional 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; } void damage() { // if (status == Status::Done) chunk.value().damage(); // TODO: Properly damage the chunk, notifying the nearby chunks, too. status = Status::NeedsReification; } }; Data& get(ChunkIndex index); Data* find(Position::BlockWorld pos); Data* find(Position::World pos); private: std::unordered_map m_chunks; }; }