summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/global-coords.cpp2
-rw-r--r--src/point.hpp15
-rw-r--r--src/point.inl22
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 <array>
#include <algorithm>
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 <compare>
#include <type_traits>
-#include <Corrade/Utility/StlForwardTuple.h>
+#include <Corrade/Utility/StlForwardTupleSizeElement.h>
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