summaryrefslogtreecommitdiff
path: root/game/geoData.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-01-05 12:25:16 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-01-05 12:25:16 +0000
commitb5899aae753287805967ec5241bc0063f5c95a4d (patch)
tree80738c35effb9aa2003bdeb37e04dbeb669be90c /game/geoData.cpp
parentReturn surface face list from setHeights (diff)
downloadilt-b5899aae753287805967ec5241bc0063f5c95a4d.tar.bz2
ilt-b5899aae753287805967ec5241bc0063f5c95a4d.tar.xz
ilt-b5899aae753287805967ec5241bc0063f5c95a4d.zip
Include arc angle in curved terrain walk
Diffstat (limited to 'game/geoData.cpp')
-rw-r--r--game/geoData.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 03bf85f..1a4cd3b 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -285,7 +285,7 @@ GeoData::walkUntil(const PointFace & from, const GlobalPosition2D to, Tester<Wal
}
void
-GeoData::walk(const PointFace & from, GlobalPosition2D to, GlobalPosition2D centre, Consumer<WalkStep> op) const
+GeoData::walk(const PointFace & from, GlobalPosition2D to, GlobalPosition2D centre, Consumer<WalkStepCurve> op) const
{
walkUntil(from, to, centre, [&op](const auto & fh) {
op(fh);
@@ -294,11 +294,9 @@ GeoData::walk(const PointFace & from, GlobalPosition2D to, GlobalPosition2D cent
}
void
-GeoData::walkUntil(const PointFace & from, GlobalPosition2D to, GlobalPosition2D centre, Tester<WalkStep> op) const
+GeoData::walkUntil(const PointFace & from, GlobalPosition2D to, GlobalPosition2D centre, Tester<WalkStepCurve> op) const
{
- WalkStep step {
- .current = from.face(this),
- };
+ WalkStepCurve step {WalkStep {.current = from.face(this)}};
if (!step.current.is_valid()) {
const auto entryEdge = findEntry(from.point, to);
if (!entryEdge.is_valid()) {
@@ -307,6 +305,7 @@ GeoData::walkUntil(const PointFace & from, GlobalPosition2D to, GlobalPosition2D
step.current = opposite_face_handle(entryEdge);
}
ArcSegment arc {centre, from.point, to};
+ step.angle = arc.first;
while (step.current.is_valid() && !op(step)) {
step.previous = step.current;
for (const auto next : fh_range(step.current)) {
@@ -317,7 +316,7 @@ GeoData::walkUntil(const PointFace & from, GlobalPosition2D to, GlobalPosition2D
if (const auto intersect = arc.crossesLineAt(e1, e2)) {
step.exitHalfedge = next;
arc.ep0 = step.exitPosition = intersect.value().first;
- arc.first = std::nextafter(intersect.value().second, INFINITY);
+ arc.first = std::nextafter(step.angle = intersect.value().second, INFINITY);
break;
}
}