summaryrefslogtreecommitdiff
path: root/game/geoData.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-02-06 19:38:20 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-02-06 19:38:20 +0000
commit87b2d80aabb6b4e6effc423a350963395f528f3c (patch)
treeb6b6199b92d69ebe613d7987a14610f431e37e3d /game/geoData.cpp
parentUpdate PointFace _face cache as required instead of erroring (diff)
downloadilt-87b2d80aabb6b4e6effc423a350963395f528f3c.tar.bz2
ilt-87b2d80aabb6b4e6effc423a350963395f528f3c.tar.xz
ilt-87b2d80aabb6b4e6effc423a350963395f528f3c.zip
Verify an edge can be flipped
Asserts the resulting triangle pair would be both still face up, not the case if the original triangles do not form a convex polygon
Diffstat (limited to 'game/geoData.cpp')
-rw-r--r--game/geoData.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 5f098e4..74ededa 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -534,9 +534,18 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
}
return nullptr;
};
- const auto shouldFlip
- = [this](const HalfedgeHandle next, const GlobalPosition2D startPoint) -> std::optional<EdgeHandle> {
- if (const auto nextEdge = edge_handle(next); is_flip_ok(nextEdge)) {
+ const auto canFlip = [this](const HalfedgeHandle edge) {
+ const auto opposite = opposite_halfedge_handle(edge);
+ const auto pointA = point(to_vertex_handle(edge));
+ const auto pointB = point(to_vertex_handle(opposite));
+ const auto pointC = point(to_vertex_handle(next_halfedge_handle(edge)));
+ const auto pointD = point(to_vertex_handle(next_halfedge_handle(opposite)));
+
+ return Triangle<2> {pointC, pointB, pointD}.isUp() && Triangle<2> {pointA, pointC, pointD}.isUp();
+ };
+ const auto shouldFlip = [this, &canFlip](const HalfedgeHandle next,
+ const GlobalPosition2D startPoint) -> std::optional<EdgeHandle> {
+ if (const auto nextEdge = edge_handle(next); is_flip_ok(nextEdge) && canFlip(next)) {
const auto opposite_point
= point(to_vertex_handle(next_halfedge_handle(opposite_halfedge_handle(next)))).xy();
if (distance<2>(startPoint, opposite_point) < length<2>(next)) {