#ifndef WORLD_H #define WORLD_H #include #include #include #include #include constexpr std::uint8_t RENDER_DISTANCE = 10; constexpr std::uint8_t CHUNKS_UPLOAD_PER_FRAME = 1; enum class GenerationState: std::uint8_t { Ready, Working, Finished, }; class World { public: World(Scop::Scene& scene); [[nodiscard]] inline Scop::Scene& GetScene() noexcept { return m_scene; } [[nodiscard]] inline std::shared_ptr GetBlockMaterial() const { return p_block_material; } [[nodiscard]] Scop::NonOwningPtr GetChunk(Scop::Vec2i position); ~World() = default; private: void UnloadChunks(Scop::Vec2i current_chunk_position); void GenerateWorld(Scop::Vec2i current_chunk_position); void Upload(); private: std::unordered_map m_chunks; ThreadSafeQueue> m_chunks_to_upload; std::shared_ptr p_block_material; Scop::Scene& m_scene; Scop::Vec2i m_previous_chunk_position; std::atomic m_generation_status = GenerationState::Ready; }; #endif