]> git.localhorst.tv Git - blank.git/blob - src/world/ChunkLoader.hpp
propagate light into blocking blocks
[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 private:
43         Chunk &Generate(const Chunk::Pos &pos);
44         // link given chunk to all loaded neighbors
45         void Insert(Chunk &) noexcept;
46         // remove a loaded chunk
47         // this unlinks it from its neighbors as well as moves it to the free list
48         // given iterator must point to a chunk from the loaded list
49         // returns an iterator to the chunk following the removed one
50         // in the loaded list (end for the last one)
51         std::list<Chunk>::iterator Remove(std::list<Chunk>::iterator) noexcept;
52
53 private:
54         Chunk::Pos base;
55
56         const BlockTypeRegistry &reg;
57         const Generator &gen;
58
59         std::list<Chunk> loaded;
60         std::list<Chunk::Pos> to_generate;
61         std::list<Chunk> to_free;
62
63         IntervalTimer gen_timer;
64
65         int load_dist;
66         int unload_dist;
67
68 };
69
70 }
71
72 #endif