#ifndef WORLD_H #define WORLD_H #include #include #include #include #include #include #include constexpr std::uint8_t RENDER_DISTANCE = 15; constexpr std::uint8_t CHUNKS_UPLOAD_PER_FRAME = 3; enum class GenerationState: std::uint8_t { Ready, Working, Quitting, Finished, }; struct PostProcessData { Scop::Vec2f inv_res; std::int32_t underwater; }; 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]] inline std::shared_ptr GetWaterPipeline() const { return p_water_pipeline; } [[nodiscard]] Scop::NonOwningPtr GetChunk(Scop::Vec2i position); [[nodiscard]] NoiseCollection& GetNoiseGenerator() noexcept { return m_noisecollection; } ~World(); private: void UnloadChunks(); void GenerateWorld(); void Upload(); private: NoiseCollection m_noisecollection; FpsCounter m_fps_counter; std::unordered_map m_chunks; ThreadSafeQueue> m_chunks_to_upload; std::shared_ptr p_block_material; std::shared_ptr p_water_pipeline; std::shared_ptr p_water_vertex_shader; std::shared_ptr p_water_fragment_shader; Scop::Scene& m_scene; Scop::Vec2i m_previous_chunk_position; Scop::Vec2i m_current_chunk_position; std::atomic m_generation_status = GenerationState::Ready; Scop::NonOwningPtr p_fps_text; std::uint32_t m_last_fps_count = 0; bool m_show_loading_screen = true; }; #endif