#pragma once #include #include #include #include #include "Generator.hpp" #include "ChunkIndex.hpp" #include "../Compute/Queue.hpp" namespace MC::World { class World { public: World() : m_queue(2), m_chunks(), m_visible_chunks() {} enum class ChunkStatus { Empty, InFlight, Done }; struct ChunkData { ChunkIndex index; ChunkStatus status; std::optional chunk = {}; std::optional mesh = {}; }; std::vector get_visible_chunks(Vector<3> position); private: std::unordered_set get_visible_chunk_indices(Vector<3> position) const; std::unordered_set load_finished_chunks_from_queue(); void process_chunk_visibility_updates(std::unordered_set& new_chunks); void request_generation(ChunkIndex index); ChunkData& get(ChunkIndex index); uint8_t m_view_distance_radius = 12; Compute::Queue m_queue; Generator m_generator; std::unordered_map m_chunks; std::unordered_set m_visible_chunks; }; }