summaryrefslogtreecommitdiff
path: root/game/network/network.impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/network/network.impl.h')
-rw-r--r--game/network/network.impl.h36
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);
+}