diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-05-10 13:50:08 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-05-10 13:50:08 +0100 |
commit | df9b9bc264e0bf12e99b447be7903050c822692d (patch) | |
tree | e92ddbfb0c61cc94131512ed2d757df798157f72 /game/network/network.impl.h | |
parent | New genCurveDef for 2 directions (diff) | |
download | ilt-df9b9bc264e0bf12e99b447be7903050c822692d.tar.bz2 ilt-df9b9bc264e0bf12e99b447be7903050c822692d.tar.xz ilt-df9b9bc264e0bf12e99b447be7903050c822692d.zip |
Add new network building interface
Imperfect, matches some legacy interface in places, has some TODO notes.
Diffstat (limited to 'game/network/network.impl.h')
-rw-r--r-- | game/network/network.impl.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/game/network/network.impl.h b/game/network/network.impl.h index e339922..54a5f4b 100644 --- a/game/network/network.impl.h +++ b/game/network/network.impl.h @@ -143,3 +143,39 @@ NetworkOf<T, Links...>::addExtend(const GeoData * geoData, GlobalPosition3D star { return addCurve(geoData, genCurveDef(start, end, findNodeDirection(nodeAt(start)))); } + +template<typename T, typename... Links> +Link::Ptr +NetworkOf<T, Links...>::create(const GenStraightDef & def) +{ + return std::make_shared<typename T::StraightLink>( + *this, candidateNodeAt(std::get<0>(def)).first, candidateNodeAt(std::get<1>(def)).first); +} + +template<typename T, typename... Links> +Link::Ptr +NetworkOf<T, Links...>::create(const GenCurveDef & def) +{ + return std::make_shared<typename T::CurveLink>( + *this, candidateNodeAt(std::get<0>(def)).first, candidateNodeAt(std::get<1>(def)).first, std::get<2>(def)); +} + +template<typename T, typename... Links> +void +NetworkOf<T, Links...>::add(const GeoData *, const Link::Ptr & link) +{ + const auto addIf = [this](auto && lptr) { + if (lptr) { + links.emplace(lptr); + return true; + } + return false; + }; + for (auto & end : link->ends) { + end.node = nodeAt(end.node->pos); + } + if (!(addIf(std::dynamic_pointer_cast<Links>(link)) || ...)) { + throw std::logic_error("Unsupported link type for network"); + } + joinLinks(link); +} |