#include "network.h" #include "routeWalker.h" #include #include #include #include #include #include #include Network::Network(const std::string & tn) : texture {Texture::cachedTexture.get(tn)} { } NodePtr Network::nodeAt(glm::vec3 pos) { return *nodes.insert(std::make_shared(pos)).first; } std::pair Network::newNodeAt(glm::vec3 pos) { const auto i = nodes.insert(std::make_shared(pos)); return {*i.first, i.second}; } NodePtr Network::findNodeAt(glm::vec3 pos) const { if (const auto n = nodes.find(std::make_shared(pos)); n != nodes.end()) { return *n; } return {}; } void Network::joinLinks(const LinkPtr & l, const LinkPtr & ol) { if (l != ol) { for (const auto oe : {0, 1}) { for (const auto te : {0, 1}) { if (l->ends[te].node == ol->ends[oe].node) { l->ends[te].nexts.emplace_back(ol, oe); ol->ends[oe].nexts.emplace_back(l, te); } } } } } Link::Nexts Network::routeFromTo(const Link::End & start, glm::vec3 dest) const { auto destNode {findNodeAt(dest)}; if (!destNode) { throw std::out_of_range("Node does not exist in network"); } return routeFromTo(start, destNode); } Link::Nexts Network::routeFromTo(const Link::End & end, const NodePtr & dest) const { return RouteWalker().findRouteTo(end, dest); }