-bool Chunk::Obstructed(int idx) const {
- Chunk::Pos pos(ToPos(idx));
-
- Chunk::Pos left_pos(pos + Chunk::Pos(-1, 0, 0));
- const Block *left_block = nullptr;
- if (InBounds(left_pos)) {
- left_block = &BlockAt(left_pos);
- } else if (HasNeighbor(Block::FACE_LEFT)) {
- left_pos += Chunk::Pos(Width(), 0, 0);
- left_block = &GetNeighbor(Block::FACE_LEFT).BlockAt(left_pos);
- } else {
- return false;
- }
- if (!Type(*left_block).FaceFilled(*left_block, Block::FACE_RIGHT)) {
- return false;
- }
-
- Chunk::Pos right_pos(pos + Chunk::Pos(1, 0, 0));
- const Block *right_block = nullptr;
- if (InBounds(right_pos)) {
- right_block = &BlockAt(right_pos);
- } else if (HasNeighbor(Block::FACE_RIGHT)) {
- right_pos += Chunk::Pos(-Width(), 0, 0);
- right_block = &GetNeighbor(Block::FACE_RIGHT).BlockAt(right_pos);
- } else {
- return false;
- }
- if (!Type(*right_block).FaceFilled(*right_block, Block::FACE_LEFT)) {
- return false;
- }
-
- Chunk::Pos down_pos(pos + Chunk::Pos(0, -1, 0));
- const Block *down_block = nullptr;
- if (InBounds(down_pos)) {
- down_block = &BlockAt(down_pos);
- } else if (HasNeighbor(Block::FACE_DOWN)) {
- down_pos += Chunk::Pos(0, Height(), 0);
- down_block = &GetNeighbor(Block::FACE_DOWN).BlockAt(down_pos);
- } else {
- return false;
- }
- if (!Type(*down_block).FaceFilled(*down_block, Block::FACE_UP)) {
- return false;
- }