+
+ // Try moving to the bottom.
+ if (ydir > 0)
+ {
+ switch (nodes[start].child_type)
+ {
+ case QTC_TOP_LEFT:
+ case QTC_TOP_RIGHT:
+ {
+ if (nodes[start].child_type == QTC_TOP_LEFT)
+ {
+ newNode = nodes[nodes[start].parent].bottom_left;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(nodes[start].parent, QTC_BOTTOM_LEFT);
+ }
+ }
+ else
+ {
+ newNode = nodes[nodes[start].parent].bottom_right;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(nodes[start].parent, QTC_BOTTOM_RIGHT);
+ }
+ }
+ return GetNeighbour(newNode, xdir, ydir - 1, addTo);
+ }
+ case QTC_BOTTOM_LEFT:
+ case QTC_BOTTOM_RIGHT:
+ {
+ QuadTreeIndex bottom_parent = GetNeighbour(nodes[start].parent, 0, 1, addTo);
+ if (bottom_parent == -1) return -1;
+ if (nodes[start].child_type == QTC_BOTTOM_LEFT)
+ {
+ newNode = nodes[bottom_parent].top_left;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(bottom_parent, QTC_TOP_LEFT);
+ }
+ }
+ else
+ {
+ newNode = nodes[bottom_parent].top_right;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(bottom_parent, QTC_TOP_RIGHT);
+ }
+ }
+ return GetNeighbour(newNode, xdir, ydir - 1, addTo);
+ }
+ default:
+ return -1;
+ }
+ }
+
+ // Try moving up, towards the sky.
+ if (ydir < 0)
+ {
+ switch (nodes[start].child_type)
+ {
+ case QTC_BOTTOM_LEFT:
+ case QTC_BOTTOM_RIGHT:
+ {
+ if (nodes[start].child_type == QTC_BOTTOM_LEFT)
+ {
+ newNode = nodes[nodes[start].parent].top_left;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(nodes[start].parent, QTC_TOP_LEFT);
+ }
+ }
+ else
+ {
+ newNode = nodes[nodes[start].parent].top_right;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(nodes[start].parent, QTC_TOP_RIGHT);
+ }
+ }
+ return GetNeighbour(newNode, xdir, ydir + 1, addTo);
+ }
+ case QTC_TOP_LEFT:
+ case QTC_TOP_RIGHT:
+ {
+ QuadTreeIndex top_parent = GetNeighbour(nodes[start].parent, 0, -1, addTo);
+ if (top_parent == -1) return -1;
+ if (nodes[start].child_type == QTC_TOP_LEFT)
+ {
+ newNode = nodes[top_parent].bottom_left;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(top_parent, QTC_BOTTOM_LEFT);
+ }
+ }
+ else
+ {
+ newNode = nodes[top_parent].bottom_right;
+ if (addTo && newNode == -1)
+ {
+ newNode = addTo->GenQuadChild(top_parent, QTC_BOTTOM_RIGHT);
+ }
+ }
+ return GetNeighbour(newNode, xdir, ydir + 1, addTo);
+ }
+ default:
+ return -1;
+ }
+ }
+ return -1;