diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-03 02:35:54 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-03 02:35:54 +0000 |
commit | 750d483af501a9b89dffb1e60ff97ca9a5fa2e44 (patch) | |
tree | 988f575dfa0b7788c215d7bdb3880720af2828ee /game/geoData.cpp | |
parent | Flip edges if better instead of splitting them when cutting triangle strip edge (diff) | |
download | ilt-750d483af501a9b89dffb1e60ff97ca9a5fa2e44.tar.bz2 ilt-750d483af501a9b89dffb1e60ff97ca9a5fa2e44.tar.xz ilt-750d483af501a9b89dffb1e60ff97ca9a5fa2e44.zip |
Check all adjacent vertex before edges when cutting triangle strip edge
Diffstat (limited to 'game/geoData.cpp')
-rw-r--r-- | game/geoData.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp index 1430cb6..22f8682 100644 --- a/game/geoData.cpp +++ b/game/geoData.cpp @@ -551,13 +551,27 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const // 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, &shouldFlip]( + auto doBoundaryPart = [this, &boundaryTriangles, &opts, &addVertexForNormalUpdate, &shouldFlip]( VertexHandle start, VertexHandle end, const Triangle<3> & triangle) { boundaryTriangles.emplace(start, &triangle); const auto endPoint = point(end); while (!std::ranges::contains(vv_range(start), end)) { const auto startPoint = point(start); - if (std::ranges::none_of(voh_range(start), [&](const auto & outHalf) { + const auto distanceToEndPoint = distance(startPoint.xy(), endPoint.xy()); + if (std::ranges::any_of(vv_range(start), [&](const auto & adjVertex) { + const auto adjPoint = point(adjVertex); + if (distance(adjPoint.xy(), endPoint.xy()) < distanceToEndPoint + && (Triangle<2> {startPoint, endPoint, adjPoint}.area() + / distance(startPoint.xy(), endPoint.xy())) + < opts.nearNodeTolerance) { + start = adjVertex; + return true; + } + return false; + })) { + continue; + } + if (std::ranges::any_of(voh_range(start), [&](const auto & outHalf) { const auto next = next_halfedge_handle(outHalf); const auto nexts = std::array {from_vertex_handle(next), to_vertex_handle(next)}; const auto nextPoints = nexts | std::views::transform([this](const auto v) { @@ -566,15 +580,7 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const if (linesCross(startPoint, endPoint, nextPoints.front().second, nextPoints.back().second)) { if (const auto intersection = linesIntersectAt(startPoint.xy(), endPoint.xy(), nextPoints.front().second.xy(), nextPoints.back().second.xy())) { - if (const auto nextDist - = std::ranges::min(nexts | std::views::transform(vertexDistFrom(*intersection)), {}, - &std::pair<VertexHandle, float>::second); - nextDist.second < opts.nearNodeTolerance) { - point(nextDist.first).z = positionOnTriangle(point(nextDist.first), triangle).z; - start = nextDist.first; - return true; - } - else if (const auto nextEdge = shouldFlip(next, startPoint)) { + if (const auto nextEdge = shouldFlip(next, startPoint)) { flip(*nextEdge); return true; } @@ -587,9 +593,10 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const } return false; })) { - throw std::runtime_error( - std::format("Could not navigate to ({}, {}, {})", endPoint.x, endPoint.y, endPoint.z)); + continue; } + throw std::runtime_error( + std::format("Could not navigate to ({}, {}, {})", endPoint.x, endPoint.y, endPoint.z)); } }; auto doBoundary = [&doBoundaryPart, triangle = strip.begin()](const auto & verts) mutable { |