#ifndef SRC_GRAPHICS_CHUNKSRENDERER_H_ #define SRC_GRAPHICS_CHUNKSRENDERER_H_ #include #include #include #include #include #include #include #include #include "../../voxels/Block.h" #include "../../voxels/ChunksStorage.h" #include "../../settings.h" class Mesh; class Chunk; class Level; class BlocksRenderer; class ContentGfxCache; struct mesh_entry { BlocksRenderer& renderer; std::condition_variable& variable; int workerIndex; bool& locked; glm::ivec2 key; }; class ChunksRenderer { std::unique_ptr renderer; Level* level; std::unordered_map> meshes; std::unordered_map inwork; std::vector threads; std::queue results; std::mutex resultsMutex; std::queue> jobs; std::condition_variable jobsMutexCondition; std::mutex jobsMutex; bool working = true; const ContentGfxCache* cache; const EngineSettings& settings; std::vector> workersBlocked; void threadLoop(int index); void process(std::shared_ptr chunk, BlocksRenderer& renderer); public: ChunksRenderer(Level* level, const ContentGfxCache* cache, const EngineSettings& settings); virtual ~ChunksRenderer(); std::shared_ptr render(std::shared_ptr chunk, bool important); void unload(Chunk* chunk); std::shared_ptr getOrRender(std::shared_ptr chunk, bool important); std::shared_ptr get(Chunk* chunk); void update(); }; #endif // SRC_GRAPHICS_CHUNKSRENDERER_H_