From 58402765133fab24d08b64f3752553bd2b8393b9 Mon Sep 17 00:00:00 2001
From: Dan Goodliffe <dan@randomdan.homeip.net>
Date: Sun, 5 Nov 2023 15:52:02 +0000
Subject: Fix todo for handling a terrain walk from outside the mesh

---
 game/geoData.cpp | 22 ++++++++++++++++++++--
 game/geoData.h   |  2 ++
 2 files changed, 22 insertions(+), 2 deletions(-)

(limited to 'game')

diff --git a/game/geoData.cpp b/game/geoData.cpp
index 781b41e..61dedda 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -210,8 +210,10 @@ GeoData::walk(const PointFace & from, const glm::vec2 to, const std::function<vo
 void
 GeoData::walkUntil(const PointFace & from, const glm::vec2 to, const std::function<bool(FaceHandle)> & op) const
 {
-	assert(from.face(this).is_valid()); // TODO replace with a boundary search
 	auto f = from.face(this);
+	if (!f.is_valid()) {
+		f = opposite_face_handle(findEntry(from.point, to));
+	}
 	FaceHandle previousFace;
 	while (f.is_valid() && !op(f)) {
 		for (auto next = cfh_iter(f); next.is_valid(); ++next) {
@@ -241,7 +243,7 @@ GeoData::boundaryWalk(const std::function<void(HalfedgeHandle)> & op, HalfedgeHa
 	assert(is_boundary(start));
 	boundaryWalkUntil(
 			[&op](auto heh) {
-		op(heh);
+				op(heh);
 				return false;
 			},
 			start);
@@ -266,6 +268,22 @@ GeoData::boundaryWalkUntil(const std::function<bool(HalfedgeHandle)> & op, Halfe
 	}
 }
 
+GeoData::HalfedgeHandle
+GeoData::findEntry(const glm::vec2 from, const glm::vec2 to) const
+{
+	HalfedgeHandle entry;
+	boundaryWalkUntil([this, from, to, &entry](auto he) {
+		const auto e1 = point(to_vertex_handle(he));
+		const auto e2 = point(to_vertex_handle(opposite_halfedge_handle(he)));
+		if (linesCrossLtR(from, to, e1, e2)) {
+			entry = he;
+			return true;
+		}
+		return false;
+	});
+	return entry;
+}
+
 bool
 GeoData::triangleContainsPoint(const glm::vec2 p, const Triangle<2> & t)
 {
diff --git a/game/geoData.h b/game/geoData.h
index 15d7e24..474731b 100644
--- a/game/geoData.h
+++ b/game/geoData.h
@@ -83,6 +83,8 @@ public:
 	void boundaryWalkUntil(const std::function<bool(HalfedgeHandle)> &) const;
 	void boundaryWalkUntil(const std::function<bool(HalfedgeHandle)> &, HalfedgeHandle start) const;
 
+	[[nodiscard]] HalfedgeHandle findEntry(const glm::vec2 from, const glm::vec2 to) const;
+
 	[[nodiscard]] auto
 	getExtents() const
 	{
-- 
cgit v1.2.3