From 0152ed8f2704ae4e77df98ea908835f436535335 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 21 Mar 2024 14:21:54 +0100 Subject: point small fixes --- src/global-coords.cpp | 2 +- src/point.hpp | 15 ++------------- src/point.inl | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/global-coords.cpp b/src/global-coords.cpp index 8775f9ba..4f3797f2 100644 --- a/src/global-coords.cpp +++ b/src/global-coords.cpp @@ -1,5 +1,5 @@ #include "global-coords.hpp" -#include "point.hpp" +#include "point.inl" #include #include diff --git a/src/point.hpp b/src/point.hpp index 3b164ac3..6d3caf72 100644 --- a/src/point.hpp +++ b/src/point.hpp @@ -2,7 +2,7 @@ #include "global-coords.hpp" #include #include -#include +#include namespace floormat { struct point; } @@ -23,6 +23,7 @@ struct point constexpr bool operator==(const point&) const noexcept; friend constexpr std::strong_ordering operator<=>(const point& a, const point& b); + friend constexpr Vector2i operator-(const point& p1, const point& p2); constexpr global_coords coord() const; constexpr chunk_coords chunk() const; @@ -51,18 +52,6 @@ constexpr point::point(chunk_coords_ coord, 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; - if (auto val = p1.cy <=> p2.cy; val != std::strong_ordering::equal) return val; - 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; - return std::strong_ordering::equal; -} - 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}; } diff --git a/src/point.inl b/src/point.inl index 62abbde1..be5b3180 100644 --- a/src/point.inl +++ b/src/point.inl @@ -21,4 +21,26 @@ constexpr uint32_t point::distance_l2(point a, point b) return (uint32_t)Math::abs(dist).sum(); } +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; + if (auto val = p1.cy <=> p2.cy; val != std::strong_ordering::equal) return val; + 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; + return std::strong_ordering::equal; +} + +constexpr Vector2i operator-(const point& p1, const point& p2) +{ + fm_debug_assert(p1.cz == p2.cz); + Vector2i sum; + sum += iTILE_SIZE2 * TILE_MAX_DIM * (Vector2i(p1.cx, p1.cy) - Vector2i(p2.cx, p2.cy)); + sum += iTILE_SIZE2 * (Vector2i(p1.tile.x, p1.tile.y) - Vector2i(p2.tile.x, p2.tile.y)); + sum += Vector2i(p1._offset) - Vector2i(p2._offset); + return sum; +} + } // namespace floormat -- cgit v1.2.3