#pragma once #include #include #define GLM_ENABLE_EXPERIMENTAL #include #include #include "voxel.hpp" class Chunk; class Level; class ContentIndices; class GlobalChunks { Level* level; const ContentIndices* indices; std::unordered_map> chunksMap; std::unordered_map> pinnedChunks; std::unordered_map refCounters; public: GlobalChunks(Level* level); ~GlobalChunks() = default; std::shared_ptr fetch(int x, int z); std::shared_ptr create(int x, int z); void pinChunk(std::shared_ptr chunk); void unpinChunk(int x, int z); size_t size() const; void incref(Chunk* chunk); void decref(Chunk* chunk); void erase(int x, int z); void save(Chunk* chunk); void saveAll(); void putChunk(std::shared_ptr chunk); Chunk* getChunk(int cx, int cz) const; const ContentIndices& getContentIndices() const { return *indices; } };