+void Chunk::SetNeighbor(Chunk &other) {
+ if (other.position == position - Pos(-1, 0, 0)) {
+ neighbor[Block::FACE_LEFT] = &other;
+ other.neighbor[Block::FACE_RIGHT] = this;
+ } else if (other.position == position - Pos(1, 0, 0)) {
+ neighbor[Block::FACE_RIGHT] = &other;
+ other.neighbor[Block::FACE_LEFT] = this;
+ } else if (other.position == position - Pos(0, -1, 0)) {
+ neighbor[Block::FACE_DOWN] = &other;
+ other.neighbor[Block::FACE_UP] = this;
+ } else if (other.position == position - Pos(0, 1, 0)) {
+ neighbor[Block::FACE_UP] = &other;
+ other.neighbor[Block::FACE_DOWN] = this;
+ } else if (other.position == position - Pos(0, 0, -1)) {
+ neighbor[Block::FACE_BACK] = &other;
+ other.neighbor[Block::FACE_FRONT] = this;
+ } else if (other.position == position - Pos(0, 0, 1)) {
+ neighbor[Block::FACE_FRONT] = &other;
+ other.neighbor[Block::FACE_BACK] = this;
+ }
+}
+
+void Chunk::ClearNeighbors() {
+ for (int i = 0; i < Block::FACE_COUNT; ++i) {
+ neighbor[i] = nullptr;
+ }
+}
+
+void Chunk::Unlink() {
+ if (neighbor[Block::FACE_UP]) {
+ neighbor[Block::FACE_UP]->neighbor[Block::FACE_DOWN] = nullptr;
+ }
+ if (neighbor[Block::FACE_DOWN]) {
+ neighbor[Block::FACE_DOWN]->neighbor[Block::FACE_UP] = nullptr;
+ }
+ if (neighbor[Block::FACE_LEFT]) {
+ neighbor[Block::FACE_LEFT]->neighbor[Block::FACE_RIGHT] = nullptr;
+ }
+ if (neighbor[Block::FACE_RIGHT]) {
+ neighbor[Block::FACE_RIGHT]->neighbor[Block::FACE_LEFT] = nullptr;
+ }
+ if (neighbor[Block::FACE_FRONT]) {
+ neighbor[Block::FACE_FRONT]->neighbor[Block::FACE_BACK] = nullptr;
+ }
+ if (neighbor[Block::FACE_BACK]) {
+ neighbor[Block::FACE_BACK]->neighbor[Block::FACE_FRONT] = nullptr;
+ }
+}
+
+void Chunk::Relink() {
+ if (neighbor[Block::FACE_UP]) {
+ neighbor[Block::FACE_UP]->neighbor[Block::FACE_DOWN] = this;
+ }
+ if (neighbor[Block::FACE_DOWN]) {
+ neighbor[Block::FACE_DOWN]->neighbor[Block::FACE_UP] = this;
+ }
+ if (neighbor[Block::FACE_LEFT]) {
+ neighbor[Block::FACE_LEFT]->neighbor[Block::FACE_RIGHT] = this;
+ }
+ if (neighbor[Block::FACE_RIGHT]) {
+ neighbor[Block::FACE_RIGHT]->neighbor[Block::FACE_LEFT] = this;
+ }
+ if (neighbor[Block::FACE_FRONT]) {
+ neighbor[Block::FACE_FRONT]->neighbor[Block::FACE_BACK] = this;
+ }
+ if (neighbor[Block::FACE_BACK]) {
+ neighbor[Block::FACE_BACK]->neighbor[Block::FACE_FRONT] = this;
+ }
+}
+
+