#ifndef BLANK_WORLD_CHUNKLOADER_HPP_
#define BLANK_WORLD_CHUNKLOADER_HPP_
-#include "Chunk.hpp"
-
-#include <list>
+#include <cstddef>
namespace blank {
-class BlockTypeRegistry;
+class ChunkStore;
class Generator;
+class WorldSave;
class ChunkLoader {
public:
- struct Config {
- int load_dist = 6;
- int unload_dist = 8;
- };
-
- ChunkLoader(const Config &, const BlockTypeRegistry &, const Generator &) noexcept;
+ ChunkLoader(
+ ChunkStore &,
+ const Generator &,
+ const WorldSave &
+ ) noexcept;
- void Generate(const Chunk::Pos &from, const Chunk::Pos &to);
- void GenerateSurrounding(const Chunk::Pos &);
+ const WorldSave &SaveFile() const noexcept { return save; }
- std::list<Chunk> &Loaded() noexcept { return loaded; }
+ void Update(int dt);
- Chunk *Loaded(const Chunk::Pos &) noexcept;
- bool Queued(const Chunk::Pos &) noexcept;
- bool Known(const Chunk::Pos &) noexcept;
- Chunk &ForceLoad(const Chunk::Pos &);
+ int ToLoad() const noexcept;
- void Rebase(const Chunk::Pos &);
- void Update();
-
-private:
- Chunk &Generate(const Chunk::Pos &pos);
- void Insert(Chunk &) noexcept;
- void Remove(Chunk &) noexcept;
+ // returns true if the chunk was generated
+ // (as opposed to loaded from file)
+ bool LoadOne();
+ void LoadN(std::size_t n);
private:
- Chunk::Pos base;
-
- const BlockTypeRegistry ®
+ ChunkStore &store;
const Generator &gen;
-
- std::list<Chunk> loaded;
- std::list<Chunk::Pos> to_generate;
- std::list<Chunk> to_free;
-
- int load_dist;
- int unload_dist;
+ const WorldSave &save;
};