summary refs log tree commit diff
path: root/src/World/Generation/ChunkNeighbors.cpp
blob: f34466e30cd83558ad8d40c3b2ff3ca67367f8fd (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
#include "ChunkNeighbors.hpp"

namespace MC::World::Generation {

Chunk::BlockData get_block_wrapping(const Chunk& chunk, const ChunkNeighbors& neighbors, Vector<3, I32> pos) {
    const Chunk* chunk_to_ask;

    auto overflow = [](I32& c, I32 max) -> I8 {
        if (c < 0) { c += max; return -1; }
        if (c >= max) { c -= max; return 1; }
        return 0;
    };

    auto xo = overflow(pos.x(), Chunk::Width);
    auto yo = overflow(pos.y(), Chunk::Height);
    auto zo = overflow(pos.z(), Chunk::Width);

    // Blocks above and below a chunk are always Air.
    if (yo != 0) return {};

    if (xo == 1 && zo == 1) { chunk_to_ask = neighbors.south_east; }
    else if (xo == 1 && zo == -1) { chunk_to_ask = neighbors.north_east; }
    else if (xo == -1 && zo == 1) { chunk_to_ask = neighbors.south_west; }
    else if (xo == -1 && zo == -1) { chunk_to_ask = neighbors.north_west; }
    else if (xo == 1) { chunk_to_ask = neighbors.east; }
    else if (xo == -1) { chunk_to_ask = neighbors.west; }
    else if (zo == 1) { chunk_to_ask = neighbors.south; }
    else if (zo == -1) { chunk_to_ask = neighbors.north; }
    else { chunk_to_ask = &chunk; }

    return chunk_to_ask->at(pos.x(), pos.y(), pos.z());
}

}