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