summary refs log tree commit diff
path: root/src/World/World.hpp
blob: f113bda30a8aecc7f61f960fe00edc99aa399f26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once

#include <memory>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include "Generator.hpp"
#include "ChunkIndex.hpp"

namespace MC::World {

class World {
public:
    World() : m_generator(), m_chunks(), m_visible_chunks() {}

    struct ChunkData {
        ChunkData(ChunkIndex index, std::shared_ptr<Chunk> chunk)
            : index(index), chunk(std::move(chunk)), mesh() {}

        ChunkIndex index;
        std::shared_ptr<Chunk> chunk;
        std::optional<GFX::BindableMesh> mesh;
    };

    std::vector<ChunkData> get_visible_chunks(Vector<3> position);

private:
    std::unordered_set<ChunkIndex> get_visible_chunk_indices(Vector<3> position) const;
    ChunkData& get_or_generate(ChunkIndex index);

    uint8_t m_view_distance_radius = 6;

    Generator m_generator;

    std::unordered_map<ChunkIndex, ChunkData> m_chunks;
    std::unordered_set<ChunkIndex> m_visible_chunks;
};

}