summaryrefslogtreecommitdiff
path: root/game
diff options
context:
space:
mode:
Diffstat (limited to 'game')
-rw-r--r--game/geoData.cpp19
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;