#pragma once #include #include #include #include #include #include "voxels/Block.hpp" #include "voxels/ChunksStorage.hpp" #include "util/ThreadPool.hpp" #include "graphics/core/MeshData.hpp" class Mesh; class Chunk; class Level; class Camera; class Shader; class Chunks; class Assets; class Frustum; class BlocksRenderer; class ContentGfxCache; struct EngineSettings; struct ChunksSortEntry { int index; int d; inline bool operator<(const ChunksSortEntry& o) const noexcept { return d > o.d; } }; struct RendererResult { glm::ivec2 key; bool cancelled; MeshData meshData; }; class ChunksRenderer { Level* level; const Assets& assets; const Frustum& frustum; const EngineSettings* settings; std::unique_ptr renderer; std::unordered_map> meshes; std::unordered_map inwork; std::vector indices; util::ThreadPool, RendererResult> threadPool; bool drawChunk( size_t index, const Camera& camera, Shader& shader, bool culling ); public: ChunksRenderer( Level* level, const Assets& assets, const Frustum& frustum, const ContentGfxCache* cache, const EngineSettings* settings ); virtual ~ChunksRenderer(); std::shared_ptr render( const std::shared_ptr& chunk, bool important ); void unload(const Chunk* chunk); void clear(); std::shared_ptr getOrRender( const std::shared_ptr& chunk, bool important ); void drawChunks(const Camera& camera, Shader& shader); void update(); static size_t visibleChunks; };