summaryrefslogtreecommitdiffhomepage
path: root/src/point.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/point.hpp')
-rw-r--r--src/point.hpp32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/point.hpp b/src/point.hpp
index fd23f72d..1ae511dd 100644
--- a/src/point.hpp
+++ b/src/point.hpp
@@ -18,26 +18,32 @@ namespace floormat {
struct point
{
- int16_t cx = 0, cy = 0;
- int8_t cz = 0;
- local_coords tile;
- Vector2b offset;
-
constexpr point();
constexpr point(global_coords coord, Vector2b offset);
constexpr point(chunk_coords_ coord, local_coords tile, Vector2b offset);
fm_DECLARE_DEFAULT_COPY_ASSIGNMENT(point);
- constexpr bool operator==(const point&) const noexcept = default;
+ constexpr bool operator==(const point&) const noexcept;
friend constexpr std::strong_ordering operator<=>(const point& a, const point& b);
constexpr global_coords coord() const;
constexpr chunk_coords chunk() const;
constexpr chunk_coords_ chunk3() const;
constexpr local_coords local() const;
+ constexpr Vector2b offset() const;
+ template<size_t N> std::tuple_element_t<N, point> constexpr get() const;
+
friend Debug& operator<<(Debug& dbg, const point& pt);
+
+private:
+ int16_t cx = 0, cy = 0;
+ int8_t cz = 0;
+ local_coords tile;
+ Vector2b _offset;
};
+constexpr bool point::operator==(const point&) const noexcept = default;
+
constexpr std::strong_ordering operator<=>(const point& p1, const point& p2)
{
if (auto val = p1.cz <=> p2.cz; val != std::strong_ordering::equal) return val;
@@ -45,8 +51,8 @@ constexpr std::strong_ordering operator<=>(const point& p1, const point& p2)
if (auto val = p1.cx <=> p2.cx; val != std::strong_ordering::equal) return val;
if (auto val = p1.tile.y <=> p2.tile.y; val != std::strong_ordering::equal) return val;
if (auto val = p1.tile.x <=> p2.tile.x; val != std::strong_ordering::equal) return val;
- if (auto val = p1.offset.y() <=> p2.offset.y(); val != std::strong_ordering::equal) return val;
- if (auto val = p1.offset.x() <=> p2.offset.x(); val != std::strong_ordering::equal) return val;
+ if (auto val = p1._offset.y() <=> p2._offset.y(); val != std::strong_ordering::equal) return val;
+ if (auto val = p1._offset.x() <=> p2._offset.x(); val != std::strong_ordering::equal) return val;
return std::strong_ordering::equal;
}
@@ -54,20 +60,22 @@ constexpr point::point() = default;
constexpr point::point(global_coords coord, Vector2b offset) : point{coord.chunk3(), coord.local(), offset} { }
constexpr point::point(chunk_coords_ coord, local_coords tile, Vector2b offset) :
- cx{coord.x}, cy{coord.y}, cz{coord.z}, tile{tile}, offset{offset}
+ cx{coord.x}, cy{coord.y}, cz{coord.z}, tile{tile}, _offset{offset}
{}
constexpr global_coords point::coord() const { return {{cx, cy}, tile, cz}; }
constexpr chunk_coords_ point::chunk3() const { return {cx, cy, cz}; }
constexpr chunk_coords point::chunk() const { return {cx, cy}; }
constexpr local_coords point::local() const { return tile; }
+constexpr Vector2b point::offset() const { return _offset; }
-template<size_t N> std::tuple_element_t<N, point> constexpr get(point pt) {
+template<size_t N> std::tuple_element_t<N, point> constexpr point::get() const
+{
static_assert(N < 2);
if constexpr(N == 0)
- return global_coords{{pt.cx, pt.cy}, pt.tile, pt.cz};
+ return global_coords{{cx, cy}, tile, cz};
if constexpr(N == 1)
- return pt.offset;
+ return _offset;
return {};
}