summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/geoData.cpp18
-rw-r--r--game/geoDataMesh.cpp8
-rw-r--r--game/geoDataMesh.h2
3 files changed, 15 insertions, 13 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 988b11c..c472240 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -347,22 +347,13 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
= materializeRange(triangleStrip | std::views::transform([this, nearNodeTolerance](auto v) {
return geoData->setPoint(v, nearNodeTolerance);
}));
- std::ranges::for_each(newVerts, [this](auto vertex) {
- addVertexForNormalUpdate(vertex);
- });
+ std::ranges::copy(newVerts, std::inserter(newOrChangedVerts, newOrChangedVerts.end()));
#ifndef NDEBUG
geoData->sanityCheck();
#endif
return newVerts;
}
- void
- addVertexForNormalUpdate(const VertexHandle vertex)
- {
- newOrChangedVerts.emplace(vertex);
- std::ranges::copy(geoData->vv_range(vertex), std::inserter(newOrChangedVerts, newOrChangedVerts.end()));
- }
-
const Triangle<3> *
getTriangle(const GlobalPosition2D point) const
{
@@ -415,7 +406,7 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
}
start = geoData->split_copy(
geoData->edge_handle(next), triangle.positionOnPlane(*intersection));
- addVertexForNormalUpdate(start);
+ newOrChangedVerts.emplace(start);
boundaryTriangles.emplace(start, &triangle);
return true;
}
@@ -498,8 +489,8 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
}
std::ranges::for_each(done, [this](const auto heh) {
const auto ends = geoData->toVertexHandles(heh);
- addVertexForNormalUpdate(ends.first);
- addVertexForNormalUpdate(ends.second);
+ newOrChangedVerts.emplace(ends.first);
+ newOrChangedVerts.emplace(ends.second);
});
#ifndef NDEBUG
geoData->sanityCheck();
@@ -536,6 +527,7 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
setHeights(newVerts, opts.maxSlope);
const auto out = setSurface(opts.surface);
+ geoData->expandVerts(newOrChangedVerts);
geoData->updateAllVertexNormals(newOrChangedVerts);
geoData->afterChange();
diff --git a/game/geoDataMesh.cpp b/game/geoDataMesh.cpp
index 60af061..8107a5e 100644
--- a/game/geoDataMesh.cpp
+++ b/game/geoDataMesh.cpp
@@ -140,3 +140,11 @@ GeoDataMesh::shouldFlip(const HalfedgeHandle next, const GlobalPosition2D startP
}
return std::nullopt;
};
+
+void
+GeoDataMesh::expandVerts(std::set<VertexHandle> & verts) const
+{
+ std::ranges::for_each(std::vector<VertexHandle>(verts.begin(), verts.end()), [&verts, this](auto vertex) {
+ std::ranges::copy(vv_range(vertex), std::inserter(verts, verts.end()));
+ });
+}
diff --git a/game/geoDataMesh.h b/game/geoDataMesh.h
index befe9fe..72b069e 100644
--- a/game/geoDataMesh.h
+++ b/game/geoDataMesh.h
@@ -3,6 +3,7 @@
#include "config/types.h"
#include "triangle.h"
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
+#include <set>
#include <source_location>
#include <thirdparty/openmesh/glmcompat.h>
#include <thirdparty/openmesh/helpers.h>
@@ -90,6 +91,7 @@ protected:
[[nodiscard]] bool canFlip(HalfedgeHandle edge) const;
[[nodiscard]] std::optional<EdgeHandle> shouldFlip(HalfedgeHandle next, GlobalPosition2D startPoint) const;
+ void expandVerts(std::set<VertexHandle> & verts) const;
template<glm::length_t D>
[[nodiscard]] RelativeDistance