]> git.localhorst.tv Git - blank.git/blob - src/world/ChunkLoader.hpp
textures
[blank.git] / src / world / ChunkLoader.hpp
1 #ifndef BLANK_WORLD_CHUNKLOADER_HPP_
2 #define BLANK_WORLD_CHUNKLOADER_HPP_
3
4 #include "Chunk.hpp"
5 #include "../app/IntervalTimer.hpp"
6
7 #include <list>
8
9
10 namespace blank {
11
12 class BlockTypeRegistry;
13 class Generator;
14
15 class ChunkLoader {
16
17 public:
18         struct Config {
19                 int load_dist = 6;
20                 int unload_dist = 8;
21                 int gen_limit = 16;
22         };
23
24         ChunkLoader(const Config &, const BlockTypeRegistry &, const Generator &) noexcept;
25
26         void Generate(const Chunk::Pos &from, const Chunk::Pos &to);
27         void GenerateSurrounding(const Chunk::Pos &);
28
29         std::list<Chunk> &Loaded() noexcept { return loaded; }
30
31         Chunk *Loaded(const Chunk::Pos &) noexcept;
32         bool Queued(const Chunk::Pos &) noexcept;
33         bool Known(const Chunk::Pos &) noexcept;
34         Chunk &ForceLoad(const Chunk::Pos &);
35
36         bool OutOfRange(const Chunk &c) const noexcept { return OutOfRange(c.Position()); }
37         bool OutOfRange(const Chunk::Pos &) const noexcept;
38
39         void Rebase(const Chunk::Pos &);
40         void Update(int dt);
41
42         std::size_t ToLoad() const noexcept { return to_generate.size(); }
43         void LoadOne();
44         void LoadN(std::size_t n);
45
46 private:
47         Chunk &Generate(const Chunk::Pos &pos);
48         // link given chunk to all loaded neighbors
49         void Insert(Chunk &) noexcept;
50         // remove a loaded chunk
51         // this unlinks it from its neighbors as well as moves it to the free list
52         // given iterator must point to a chunk from the loaded list
53         // returns an iterator to the chunk following the removed one
54         // in the loaded list (end for the last one)
55         std::list<Chunk>::iterator Remove(std::list<Chunk>::iterator) noexcept;
56
57 private:
58         Chunk::Pos base;
59
60         const BlockTypeRegistry &reg;
61         const Generator &gen;
62
63         std::list<Chunk> loaded;
64         std::list<Chunk::Pos> to_generate;
65         std::list<Chunk> to_free;
66
67         IntervalTimer gen_timer;
68
69         int load_dist;
70         int unload_dist;
71
72 };
73
74 }
75
76 #endif