Bounds get(Dir dir, bool force2d = false) const { if (force2d) dir = toDir(toIntegral(dir, true)); switch (dir) { case Dir::swd: return getSwd(force2d); break; case Dir::sed: return getSed(force2d); break; case Dir::nwd: return getNwd(force2d); break; case Dir::ned: return getNed(force2d); break; case Dir::swu: return getSwu(); break; case Dir::seu: return getSeu(); break; case Dir::nwu: return getNwu(); break; case Dir::neu: return getNeu(); break; } throw std::runtime_error( "Invalid Dir to Bounds::get: " + std::to_string(toIntegral(dir))); }
// Call this if allDirections() == true. QueryChunkState getClimb(Dir dir) const { QueryChunkState result(*this); ++result.m_depth; result.m_bounds.go(dir, m_structure.tubular()); assert(result.m_depth <= m_structure.sparseDepthBegin()); result.m_chunkId <<= m_structure.dimensions(); ++result.m_chunkId.data().front(); result.m_chunkId += toIntegral(dir) * m_pointsPerChunk; return result; }
void go(Dir dir, bool force2d = false) { if (force2d) dir = toDir(toIntegral(dir, true)); switch (dir) { case Dir::swd: goSwd(force2d); break; case Dir::sed: goSed(force2d); break; case Dir::nwd: goNwd(force2d); break; case Dir::ned: goNed(force2d); break; case Dir::swu: goSwu(); break; case Dir::seu: goSeu(); break; case Dir::nwu: goNwu(); break; case Dir::neu: goNeu(); break; } }
inline bool isDown(Dir dir) { return toIntegral(dir) < 4; } // 0, 1, 2, 3
inline bool isWest(Dir dir) { return toIntegral(dir) % 2 == 0; } // 0, 2, 4, 6
inline bool isSouth(Dir dir) { return toIntegral(dir) % 4 < 2; } // 0, 1, 4, 5