summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/geoData.cpp7
-rw-r--r--game/geoData.h2
-rw-r--r--game/network/network.cpp4
-rw-r--r--game/network/network.impl.h4
-rw-r--r--game/network/rail.cpp6
-rw-r--r--lib/maths.h9
-rw-r--r--lib/ray.h3
-rw-r--r--lib/triangle.h2
-rw-r--r--test/test-network.cpp6
9 files changed, 25 insertions, 18 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 1a4cd3b..448ff67 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -405,10 +405,11 @@ GeoData::difference(const HalfedgeHandle heh) const
return ::difference(point(to_vertex_handle(heh)), point(from_vertex_handle(heh)));
}
+template<glm::length_t D>
[[nodiscard]] RelativeDistance
GeoData::length(const HalfedgeHandle heh) const
{
- return glm::length(difference(heh));
+ return ::distance<D, GlobalDistance, glm::defaultp>(point(to_vertex_handle(heh)), point(from_vertex_handle(heh)));
}
[[nodiscard]] GlobalPosition3D
@@ -468,7 +469,7 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
const auto vertexDistFrom = [this](GlobalPosition2D p) {
return [p, this](const VertexHandle v) {
- return std::make_pair(v, glm::length(::difference(p, this->point(v).xy())));
+ return std::make_pair(v, ::distance(p, this->point(v).xy()));
};
};
const auto vertexDistFromE = [this](GlobalPosition2D p) {
@@ -614,7 +615,7 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
todoOutHalfEdges(toVertex);
}
else if (!toTriangle) { // point without the new strip, adjust vertically by limit
- const auto maxOffset = static_cast<GlobalDistance>(opts.maxSlope * glm::length(difference(heh).xy()));
+ const auto maxOffset = static_cast<GlobalDistance>(opts.maxSlope * length<2>(heh));
const auto newHeight = std::clamp(toPoint.z, fromPoint.z - maxOffset, fromPoint.z + maxOffset);
if (newHeight != toPoint.z) {
toPoint.z = newHeight;
diff --git a/game/geoData.h b/game/geoData.h
index 7e4c28f..390a443 100644
--- a/game/geoData.h
+++ b/game/geoData.h
@@ -136,7 +136,7 @@ protected:
[[nodiscard]] HalfedgeHandle findBoundaryStart() const;
[[nodiscard]] RelativePosition3D difference(const HalfedgeHandle) const;
- [[nodiscard]] RelativeDistance length(const HalfedgeHandle) const;
+ template<glm::length_t D> [[nodiscard]] RelativeDistance length(const HalfedgeHandle) const;
[[nodiscard]] GlobalPosition3D centre(const HalfedgeHandle) const;
void updateAllVertexNormals();
diff --git a/game/network/network.cpp b/game/network/network.cpp
index 1666c4d..e67942f 100644
--- a/game/network/network.cpp
+++ b/game/network/network.cpp
@@ -121,8 +121,8 @@ Network::genCurveDef(const GlobalPosition3D & start, const GlobalPosition3D & en
endDir += pi;
const auto flatStart {start.xy()}, flatEnd {end.xy()};
auto midheight = [&](auto mid) {
- const auto sm = glm::length(RelativePosition2D(flatStart - mid)),
- em = glm::length(RelativePosition2D(flatEnd - mid));
+ const auto sm = ::distance<2>(flatStart, mid);
+ const auto em = ::distance<2>(flatEnd, mid);
return start.z + GlobalDistance(RelativeDistance(end.z - start.z) * (sm / (sm + em)));
};
if (const auto radii = find_arcs_radius(flatStart, startDir, flatEnd, endDir); radii.first < radii.second) {
diff --git a/game/network/network.impl.h b/game/network/network.impl.h
index ff29088..33b0a86 100644
--- a/game/network/network.impl.h
+++ b/game/network/network.impl.h
@@ -52,7 +52,7 @@ template<typename T, typename... Links>
Link::CCollection
NetworkOf<T, Links...>::candidateJoins(GlobalPosition3D start, GlobalPosition3D end)
{
- if (glm::length(RelativePosition3D(start - end)) < 2000.F) {
+ if (::distance(start, end) < 2000.F) {
return {};
}
const auto defs = genCurveDef(
@@ -81,7 +81,7 @@ template<typename T, typename... Links>
Link::CCollection
NetworkOf<T, Links...>::addJoins(GlobalPosition3D start, GlobalPosition3D end)
{
- if (glm::length(RelativePosition3D(start - end)) < 2000.F) {
+ if (::distance(start, end) < 2000.F) {
return {};
}
const auto defs = genCurveDef(start, end, findNodeDirection(nodeAt(start)), findNodeDirection(nodeAt(end)));
diff --git a/game/network/rail.cpp b/game/network/rail.cpp
index 2820cca..d7de231 100644
--- a/game/network/rail.cpp
+++ b/game/network/rail.cpp
@@ -40,8 +40,8 @@ RailLinks::addLinksBetween(GlobalPosition3D start, GlobalPosition3D end)
const auto flatStart {start.xy()}, flatEnd {end.xy()};
if (node2ins.second == NodeIs::InNetwork) {
auto midheight = [&](auto mid) {
- const auto sm = glm::length(RelativePosition2D(flatStart - mid)),
- em = glm::length(RelativePosition2D(flatEnd - mid));
+ const auto sm = ::distance<2>(flatStart, mid);
+ const auto em = ::distance<2>(flatEnd, mid);
return start.z + GlobalDistance(RelativeDistance(end.z - start.z) * (sm / (sm + em)));
};
const float dir2 = pi + findNodeDirection(node2ins.first);
@@ -117,7 +117,7 @@ RailLinkStraight::RailLinkStraight(
RailLinkCurve::RailLinkCurve(
NetworkLinkHolder<RailLinkCurve> & instances, const Node::Ptr & a, const Node::Ptr & b, GlobalPosition2D c) :
- RailLinkCurve(instances, a, b, c || a->pos.z, glm::length(difference(a->pos.xy(), c)), {c, a->pos, b->pos})
+ RailLinkCurve(instances, a, b, c || a->pos.z, ::distance<2>(a->pos.xy(), c), {c, a->pos, b->pos})
{
}
diff --git a/lib/maths.h b/lib/maths.h
index 17ca795..3d4f440 100644
--- a/lib/maths.h
+++ b/lib/maths.h
@@ -111,6 +111,13 @@ difference(const glm::vec<D, T, Q> & globalA, const glm::vec<D, T, Q> & globalB)
return globalA - globalB;
}
+template<glm::length_t D, Arithmetic T, glm::qualifier Q = glm::defaultp>
+constexpr auto
+distance(const glm::vec<D, T, Q> & pointA, const glm::vec<D, T, Q> & pointB)
+{
+ return glm::length(difference(pointA, pointB));
+}
+
glm::mat4 flat_orientation(const Rotation3D & diff);
namespace {
@@ -498,7 +505,7 @@ operator"" _degrees(long double degrees)
// Late implementations due to dependencies
template<typename T, glm::qualifier Q>
constexpr ArcSegment<T, Q>::ArcSegment(PointType centre, PointType ep0, PointType ep1) :
- Arc {centre, ep0, ep1}, centre {centre}, ep0 {ep0}, ep1 {ep1}, radius {glm::length(difference(centre, ep0))}
+ Arc {centre, ep0, ep1}, centre {centre}, ep0 {ep0}, ep1 {ep1}, radius {::distance(centre, ep0)}
{
}
diff --git a/lib/ray.h b/lib/ray.h
index a831270..793e21e 100644
--- a/lib/ray.h
+++ b/lib/ray.h
@@ -27,8 +27,7 @@ public:
const auto n2 = crossProduct(direction, n);
const auto c1 = p1 + PositionType((glm::dot(RelativePosition3D(start - p1), n2) / glm::dot(d1, n2)) * d1);
const auto difflength = glm::length(diff);
- if (glm::length(RelativePosition3D(c1 - p1)) > difflength
- || glm::length(RelativePosition3D(c1 - e1)) > difflength) {
+ if (::distance(c1, p1) > difflength || ::distance(c1, e1) > difflength) {
return std::numeric_limits<typename PositionType::value_type>::infinity();
}
return static_cast<PositionType::value_type>(glm::abs(glm::dot(n, RelativePosition3D(p1 - start))));
diff --git a/lib/triangle.h b/lib/triangle.h
index d5547ab..e430653 100644
--- a/lib/triangle.h
+++ b/lib/triangle.h
@@ -48,7 +48,7 @@ struct Triangle : public glm::vec<3, glm::vec<Dim, T, Q>> {
[[nodiscard]] constexpr auto
height()
{
- return (area() * 2) / glm::length(difference(p(0), p(1)));
+ return (area() * 2) / ::distance(p(0), p(1));
}
[[nodiscard]] constexpr Normal3D
diff --git a/test/test-network.cpp b/test/test-network.cpp
index 5373dd5..e7419b5 100644
--- a/test/test-network.cpp
+++ b/test/test-network.cpp
@@ -241,7 +241,7 @@ BOOST_FIXTURE_TEST_CASE(test_rail_network, RailLinks)
// --------
auto l0 = addLinksBetween(p000, p100);
BOOST_CHECK(dynamic_cast<RailLinkStraight *>(l0.get()));
- BOOST_CHECK_EQUAL(l0->length, glm::length(difference(p000, p100)));
+ BOOST_CHECK_EQUAL(l0->length, ::distance(p000, p100));
BOOST_CHECK_CLOSE(l0->ends[0].dir, half_pi, 0.1F);
BOOST_CHECK_CLOSE(l0->ends[1].dir, -half_pi, 0.1F);
BOOST_CHECK(l0->ends[0].nexts.empty());
@@ -249,7 +249,7 @@ BOOST_FIXTURE_TEST_CASE(test_rail_network, RailLinks)
auto l1 = addLinksBetween(p200, p100);
BOOST_CHECK(dynamic_cast<RailLinkStraight *>(l1.get()));
- BOOST_CHECK_EQUAL(l1->length, glm::length(difference(p200, p100)));
+ BOOST_CHECK_EQUAL(l1->length, ::distance(p200, p100));
BOOST_CHECK_CLOSE(l1->ends[0].dir, half_pi, 0.1F);
BOOST_CHECK_CLOSE(l1->ends[1].dir, -half_pi, 0.1F);
BOOST_CHECK(l0->ends[0].nexts.empty());
@@ -261,7 +261,7 @@ BOOST_FIXTURE_TEST_CASE(test_rail_network, RailLinks)
auto l2 = addLinksBetween(p200, p300);
BOOST_CHECK(dynamic_cast<RailLinkStraight *>(l2.get()));
- BOOST_CHECK_EQUAL(l2->length, glm::length(difference(p200, p300)));
+ BOOST_CHECK_EQUAL(l2->length, ::distance(p200, p300));
BOOST_CHECK_CLOSE(l2->ends[0].dir, half_pi, 0.1F);
BOOST_CHECK_CLOSE(l2->ends[1].dir, -half_pi, 0.1F);
BOOST_CHECK(l0->ends[0].nexts.empty());