#pragma once #include #include #include #include "Generation/Generator.hpp" #include "ChunkIndex.hpp" #include "../GFX/Binder.hpp" #include "../Compute/Queue.hpp" namespace MC::World { class World { public: World() : m_queue(8) {} enum class ChunkStatus { Empty, WaitingForGeneration, WaitingForReification, Done }; struct ChunkData { ChunkIndex index; ChunkStatus status; std::optional chunk = {}; std::optional land_mesh_data = {}; std::optional water_mesh_data = {}; std::optional land_mesh = {}; std::optional water_mesh = {}; }; std::vector get_visible_chunks(Vector<3> position); Chunk* get_chunk_for_position(Vector<3> position); Real get_average_chunk_time() const; private: std::vector get_visible_chunk_indices(Vector<3> position) const; void load_finished_chunks_from_queue(); void request_generation(ChunkIndex index, Real priority); void try_to_reify_chunk(ChunkData& data); void log_chunk_time(U64 chunk_time_ms); ChunkData& get(ChunkIndex index); U8 m_view_distance_radius = 10; struct GenerationResult { Chunk chunk; U64 generation_duration; }; Compute::Queue m_queue; Generation::Generator m_generator; std::unordered_map m_chunks; struct Statistics { UInt chunk_time_sample_count; Real average_chunk_time_ms; }; Statistics m_statistics{0, 0.0f}; }; }