summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/network/network.cpp14
-rw-r--r--game/network/network.h3
-rw-r--r--game/network/rail.cpp7
-rw-r--r--game/network/rail.h4
4 files changed, 21 insertions, 7 deletions
diff --git a/game/network/network.cpp b/game/network/network.cpp
index adda8fc..52d88ec 100644
--- a/game/network/network.cpp
+++ b/game/network/network.cpp
@@ -2,10 +2,24 @@
#include <cache.h>
#include <game/network/link.h>
#include <gfx/models/texture.h>
+#include <utility>
Network::Network(const std::string & tn) : texture {Texture::cachedTexture.get(tn)} { }
NodePtr
+Network::nodeAt(glm::vec3 pos)
+{
+ return *nodes.insert(std::make_shared<Node>(pos)).first;
+}
+
+std::pair<NodePtr, bool>
+Network::newNodeAt(glm::vec3 pos)
+{
+ const auto i = nodes.insert(std::make_shared<Node>(pos));
+ return {*i.first, i.second};
+}
+
+NodePtr
Network::findNodeAt(glm::vec3 pos) const
{
if (const auto n = nodes.find(std::make_shared<Node>(pos)); n != nodes.end()) {
diff --git a/game/network/network.h b/game/network/network.h
index 2c24916..c42f056 100644
--- a/game/network/network.h
+++ b/game/network/network.h
@@ -9,6 +9,7 @@
#include <set>
#include <sorting.hpp>
#include <string>
+#include <utility>
class Texture;
class Shader;
@@ -18,6 +19,8 @@ public:
explicit Network(const std::string & textureName);
[[nodiscard]] NodePtr findNodeAt(glm::vec3) const;
+ [[nodiscard]] NodePtr nodeAt(glm::vec3);
+ [[nodiscard]] std::pair<NodePtr, bool> newNodeAt(glm::vec3);
protected:
using Nodes = std::set<NodePtr, PtrSorter<NodePtr>>;
diff --git a/game/network/rail.cpp b/game/network/rail.cpp
index c84f97f..7cc6284 100644
--- a/game/network/rail.cpp
+++ b/game/network/rail.cpp
@@ -42,8 +42,7 @@ RailLinks::joinLinks(const LinkPtr & l) const
std::shared_ptr<RailLink>
RailLinks::addLinksBetween(glm::vec3 start, glm::vec3 end)
{
- auto node1ins = nodes.insert(std::make_shared<Node>(start));
- auto node2ins = nodes.insert(std::make_shared<Node>(end));
+ auto node1ins = newNodeAt(start), node2ins = newNodeAt(end);
if (node1ins.second && node2ins.second) {
// Both nodes are new, direct link, easy
return addLink<RailLinkStraight>(start, end);
@@ -65,14 +64,14 @@ RailLinks::addLinksBetween(glm::vec3 start, glm::vec3 end)
}
throw std::runtime_error("Node exists but couldn't find it");
};
- float dir = pi + findDir(*node1ins.first);
+ float dir = pi + findDir(node1ins.first);
const glm::vec2 flatStart {!start}, flatEnd {!end};
if (!node2ins.second) {
auto midheight = [&](auto mid) {
const auto sm = glm::distance(flatStart, mid), em = glm::distance(flatEnd, mid);
return start.y + ((end.y - start.y) * (sm / (sm + em)));
};
- float dir2 = pi + findDir(*node2ins.first);
+ float dir2 = pi + findDir(node2ins.first);
if (const auto radii = find_arcs_radius(flatStart, dir, flatEnd, dir2); radii.first < radii.second) {
const auto radius {radii.first};
const auto c1 = flatStart + sincosf(dir + half_pi) * radius;
diff --git a/game/network/rail.h b/game/network/rail.h
index c67dc67..3b3da42 100644
--- a/game/network/rail.h
+++ b/game/network/rail.h
@@ -10,7 +10,6 @@
#include <location.hpp>
#include <maths.h>
#include <memory>
-#include <set>
#include <span>
#include <utility>
@@ -60,8 +59,7 @@ public:
std::shared_ptr<T>
addLink(glm::vec3 a, glm::vec3 b, Params &&... params)
{
- const auto node1 = *nodes.insert(std::make_shared<Node>(a)).first;
- const auto node2 = *nodes.insert(std::make_shared<Node>(b)).first;
+ const auto node1 = nodeAt(a), node2 = nodeAt(b);
auto l {links.create<T>(node1, node2, std::forward<Params>(params)...)};
joinLinks(l);
return l;