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());
}
}
|