#include "network.h" #include #include template void NetworkOf::render(const SceneShader & shader) const { if constexpr (std::is_base_of_v) { shader.absolute.use(); texture->bind(); links.apply(&Renderable::render, shader); } } template void NetworkOf::joinLinks(const Link::Ptr & l) const { for (const auto & ol : links.objects) { Network::joinLinks(l, ol); } } template Link::Ptr NetworkOf::intersectRayLinks(const Ray & ray) const { // Click link if (const auto link = std::find_if(links.objects.begin(), links.objects.end(), [&ray](const std::shared_ptr & link) { return link->intersectRay(ray); }); link != links.objects.end()) { return *link; } return {}; } template float NetworkOf::findNodeDirection(Node::AnyCPtr n) const { for (const auto & l : links.objects) { for (const auto & e : l->ends) { // cppcheck-suppress useStlAlgorithm if (e.node.get() == n.get()) { return e.dir; } } } throw std::runtime_error("Node exists but couldn't find it"); } template Link::CCollection NetworkOf::candidateStraight(Position3D n1, Position3D n2) { return {candidateLink(n1, n2)}; } template Link::CCollection NetworkOf::candidateJoins(Position3D start, Position3D end) { if (glm::distance(start, end) < 2.F) { return {}; } const auto defs = genCurveDef( start, end, findNodeDirection(candidateNodeAt(start).first), findNodeDirection(candidateNodeAt(end).first)); const auto & [c1s, c1e, c1c] = defs.first; const auto & [c2s, c2e, c2c] = defs.second; return {candidateLink(c1s, c1e, c1c), candidateLink(c2s, c2e, c2c)}; } template Link::CCollection NetworkOf::candidateExtend(Position3D start, Position3D end) { const auto [cstart, cend, centre] = genCurveDef(start, end, findNodeDirection(candidateNodeAt(start).first)); return {candidateLink(cstart, cend, centre)}; } template Link::CCollection NetworkOf::addStraight(Position3D n1, Position3D n2) { return {addLink(n1, n2)}; } template Link::CCollection NetworkOf::addJoins(Position3D start, Position3D end) { if (glm::distance(start, end) < 2.F) { return {}; } const auto defs = genCurveDef(start, end, findNodeDirection(nodeAt(start)), findNodeDirection(nodeAt(end))); const auto & [c1s, c1e, c1c] = defs.first; const auto & [c2s, c2e, c2c] = defs.second; return {addLink(c1s, c1e, c1c), addLink(c2s, c2e, c2c)}; } template Link::CCollection NetworkOf::addExtend(Position3D start, Position3D end) { const auto [cstart, cend, centre] = genCurveDef(start, end, findNodeDirection(nodeAt(start))); return {addLink(cstart, cend, centre)}; }