summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-05-12 04:00:51 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2025-05-12 04:00:51 +0100
commit61fa037d0a50b62807ca88dc09e4c85dff7d3ddf (patch)
tree1610db2106f802c0f8b9c02e9a39b9dccff1b7c0
parentSplit link generation definitions according to terrain (diff)
downloadilt-61fa037d0a50b62807ca88dc09e4c85dff7d3ddf.tar.bz2
ilt-61fa037d0a50b62807ca88dc09e4c85dff7d3ddf.tar.xz
ilt-61fa037d0a50b62807ca88dc09e4c85dff7d3ddf.zip
Add network helpers for easily adding a chain of links
-rw-r--r--game/network/network.cpp25
-rw-r--r--game/network/network.h3
2 files changed, 28 insertions, 0 deletions
diff --git a/game/network/network.cpp b/game/network/network.cpp
index 1c3a122..a9c9372 100644
--- a/game/network/network.cpp
+++ b/game/network/network.cpp
@@ -99,6 +99,14 @@ Network::routeFromTo(const Link::End & end, const Node::Ptr & dest)
}
void
+Network::add(GeoData * geoData, const std::span<const Link::Ptr> links)
+{
+ for (const auto & link : links) {
+ add(geoData, link);
+ }
+}
+
+void
Network::terrainSplitAt(GenLinkDef & previous, GenLinkDef & next, GlobalPosition3D pos)
{
std::visit(
@@ -249,3 +257,20 @@ Network::create(const GeoData * geoData, const CreationDefinition & def)
});
return links;
}
+
+Link::Collection
+Network::createChain(const GeoData * geoData, const std::span<const GlobalPosition3D> positions)
+{
+ Link::Collection out;
+ std::ranges::for_each(positions | std::views::pairwise,
+ [&out, dir = std::optional<Angle> {}, geoData, this](const auto & current) mutable {
+ const auto & [previous, next] = current;
+ CreationDefinition def = {
+ .fromEnd = {.position = previous, .direction = dir},
+ .toEnd = {.position = next, .direction = {}},
+ };
+ out += create(geoData, def);
+ dir = out.back()->endAt(next)->dir;
+ });
+ return out;
+}
diff --git a/game/network/network.h b/game/network/network.h
index 65db016..adaae5f 100644
--- a/game/network/network.h
+++ b/game/network/network.h
@@ -65,7 +65,9 @@ public:
[[nodiscard]] virtual float findNodeDirection(Node::AnyCPtr) const = 0;
[[nodiscard]] Link::Collection create(const GeoData *, const CreationDefinition &);
+ [[nodiscard]] Link::Collection createChain(const GeoData *, std::span<const GlobalPosition3D>);
virtual void add(GeoData *, const Link::Ptr &) = 0;
+ void add(GeoData *, std::span<const Link::Ptr>);
[[nodiscard]] virtual const Surface * getBaseSurface() const = 0;
[[nodiscard]] virtual RelativeDistance getBaseWidth() const = 0;
@@ -138,6 +140,7 @@ public:
using Network::create;
[[nodiscard]] Link::Ptr create(const GenStraightDef &) override;
[[nodiscard]] Link::Ptr create(const GenCurveDef &) override;
+ using Network::add;
void add(GeoData *, const Link::Ptr &) override;
protected: