summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-02-14 23:53:46 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-02-15 00:06:27 +0000
commitf26559dcd25b649d37a1a30e087b70b95f530954 (patch)
tree4874868c9bbee81618343cee6a03f0e135d34f3d
parentUse new helpers to simplify close entity search in GeoData::setPoint (diff)
downloadilt-f26559dcd25b649d37a1a30e087b70b95f530954.tar.bz2
ilt-f26559dcd25b649d37a1a30e087b70b95f530954.tar.xz
ilt-f26559dcd25b649d37a1a30e087b70b95f530954.zip
Range adaptor to make triangle strip triples
-rw-r--r--game/geoData.cpp10
-rw-r--r--lib/collections.h26
2 files changed, 30 insertions, 6 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 552d2ba..cfaf44b 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -344,12 +344,10 @@ GeoData::setHeights(const std::span<const GlobalPosition3D> triangleStrip, const
std::ranges::for_each(newVerts, addVertexForNormalUpdate);
// Create temporary triangles from triangleStrip
- std::vector<Triangle<3>> strip;
- std::transform(
- strip_begin(triangleStrip), strip_end(triangleStrip), std::back_inserter(strip), [](const auto & newVert) {
- const auto [a, b, c] = newVert;
- return Triangle<3> {a, b, c};
- });
+ const auto strip
+ = materializeRange(triangleStrip | TriangleTriples | std::views::transform([](const auto & newVert) {
+ return std::make_from_tuple<Triangle<3>>(*newVert);
+ }));
auto getTriangle = [&strip](const auto point) -> const Triangle<3> * {
if (const auto t = std::ranges::find_if(strip,
[point](const auto & triangle) {
diff --git a/lib/collections.h b/lib/collections.h
index fcd65d3..c81bede 100644
--- a/lib/collections.h
+++ b/lib/collections.h
@@ -197,6 +197,14 @@ template<typename iter> struct stripiter {
return *this;
}
+ constexpr stripiter
+ operator++(int)
+ {
+ auto out {*this};
+ ++*this;
+ return out;
+ }
+
constexpr stripiter &
operator--()
{
@@ -205,6 +213,14 @@ template<typename iter> struct stripiter {
return *this;
}
+ constexpr stripiter
+ operator--(int)
+ {
+ auto out {*this};
+ --*this;
+ return out;
+ }
+
constexpr auto
operator-(const stripiter & other) const
{
@@ -235,6 +251,16 @@ strip_end(IterableCollection auto & cont)
return stripiter {cont.end()};
}
+struct TriangleTriplesImpl : public std::ranges::range_adaptor_closure<TriangleTriplesImpl> {
+ decltype(auto)
+ operator()(const auto & triangleStrip) const
+ {
+ return std::views::iota(strip_begin(triangleStrip), strip_end(triangleStrip));
+ }
+};
+
+constexpr TriangleTriplesImpl TriangleTriples;
+
template<typename T, typename Dist, typename Merger>
void
mergeClose(std::vector<T> & range, const Dist & dist, const Merger & merger,