diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-02 03:18:43 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-02 03:18:43 +0000 |
commit | dddc07f0189d722fc07f70ae0c1308dcc4fd0978 (patch) | |
tree | 70cc91414f23a7ccb6e4c50b5bf863e01810948c /game | |
parent | Add distance helper (diff) | |
download | ilt-dddc07f0189d722fc07f70ae0c1308dcc4fd0978.tar.bz2 ilt-dddc07f0189d722fc07f70ae0c1308dcc4fd0978.tar.xz ilt-dddc07f0189d722fc07f70ae0c1308dcc4fd0978.zip |
Flip edges if better instead of splitting them when cutting triangle strip edge
Diffstat (limited to 'game')
-rw-r--r-- | game/geoData.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp index 448ff67..1430cb6 100644 --- a/game/geoData.cpp +++ b/game/geoData.cpp @@ -537,10 +537,21 @@ 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 opposite_point + = point(to_vertex_handle(next_halfedge_handle(opposite_halfedge_handle(next)))).xy(); + if (distance<2>(startPoint, opposite_point) < length<2>(next)) { + return nextEdge; + } + } + return std::nullopt; + }; // Cut along each edge of triangleStrip AB, AC, BC, BD, CD, CE etc std::map<VertexHandle, const Triangle<3> *> boundaryTriangles; - auto doBoundaryPart = [this, &boundaryTriangles, &vertexDistFrom, &opts, &addVertexForNormalUpdate]( + auto doBoundaryPart = [this, &boundaryTriangles, &vertexDistFrom, &opts, &addVertexForNormalUpdate, &shouldFlip]( VertexHandle start, VertexHandle end, const Triangle<3> & triangle) { boundaryTriangles.emplace(start, &triangle); const auto endPoint = point(end); @@ -563,9 +574,11 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const start = nextDist.first; return true; } - else { - start = split_copy(edge_handle(next), positionOnTriangle(*intersection, triangle)); + else if (const auto nextEdge = shouldFlip(next, startPoint)) { + flip(*nextEdge); + return true; } + start = split_copy(edge_handle(next), positionOnTriangle(*intersection, triangle)); addVertexForNormalUpdate(start); boundaryTriangles.emplace(start, &triangle); return true; |