#pragma once #include #include #include #include #define GLM_ENABLE_EXPERIMENTAL #include #include "util/ThreadPool.hpp" #include "commons.hpp" template class Mesh; class Chunk; class Level; class Camera; class Shader; class Assets; class Chunks; 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; ChunkMeshData meshData; }; struct RendererJob { std::shared_ptr chunk; std::shared_ptr volume; }; class ChunksRenderer { const Chunks& chunks; 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 threadPool; const Mesh* retrieveChunk( size_t index, const Camera& camera, bool culling ); std::shared_ptr prepareVoxelsVolume(const Chunk& chunk); size_t enqueuedInFrame = 0; public: ChunksRenderer( const Level& level, const Chunks& chunks, const Assets& assets, const Frustum& frustum, const ContentGfxCache& cache, const EngineSettings& settings ); virtual ~ChunksRenderer(); const ChunkMesh* render( const std::shared_ptr& chunk, bool important, bool lowPriority ); void unload(const Chunk* chunk); void clear(); const ChunkMesh* getOrRender( const std::shared_ptr& chunk, bool important, bool lowPriority ); void drawShadowsPass( const Camera& camera, Shader& shader, const Camera& playerCamera ); void drawChunks(const Camera& camera, Shader& shader); void drawSortedMeshes(const Camera& camera, Shader& shader); void update(); static size_t visibleChunks; };