summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2022-10-25 18:49:19 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2022-10-28 02:10:47 +0100
commit37b135e59ba22cf9ace1141b9dd21d0819fe3d1d (patch)
tree1b24085262116f04c8869365e50f971af56f7d3d
parentMove findDir into member function findNodeDirection (diff)
downloadilt-37b135e59ba22cf9ace1141b9dd21d0819fe3d1d.tar.bz2
ilt-37b135e59ba22cf9ace1141b9dd21d0819fe3d1d.tar.xz
ilt-37b135e59ba22cf9ace1141b9dd21d0819fe3d1d.zip
Implement extending a network into open space
-rw-r--r--game/network/network.cpp16
-rw-r--r--game/network/network.h4
-rw-r--r--game/network/network.impl.h10
-rw-r--r--game/network/rail.h2
-rw-r--r--test/test-network.cpp4
5 files changed, 31 insertions, 5 deletions
diff --git a/game/network/network.cpp b/game/network/network.cpp
index ad501b5..7724c20 100644
--- a/game/network/network.cpp
+++ b/game/network/network.cpp
@@ -93,3 +93,19 @@ Network::routeFromTo(const Link::End & end, const Node::Ptr & dest) const
{
return RouteWalker().findRouteTo(end, dest);
}
+
+GenCurveDef
+Network::genCurveDef(const glm::vec3 & start, const glm::vec3 & end, float startDir)
+{
+ const auto diff {end - start};
+ const auto vy {vector_yaw(diff)};
+ const auto dir = pi + startDir;
+ const auto flatStart {!start}, flatEnd {!end};
+ const auto n2ed {(vy * 2) - dir - pi};
+ const auto centre {find_arc_centre(flatStart, dir, flatEnd, n2ed)};
+
+ if (centre.second) { // right hand arc
+ return {end, start, centre.first};
+ }
+ return {start, end, centre.first};
+}
diff --git a/game/network/network.h b/game/network/network.h
index f1ac23f..f37f335 100644
--- a/game/network/network.h
+++ b/game/network/network.h
@@ -15,6 +15,9 @@ class Texture;
class Shader;
class Ray;
+template<size_t... n> using GenDef = std::tuple<glm::vec<n, float>...>;
+using GenCurveDef = GenDef<3, 3, 2>;
+
class Network {
public:
using LinkEnd = std::pair<Link::Ptr, unsigned char>;
@@ -44,6 +47,7 @@ public:
protected:
static void joinLinks(const Link::Ptr & l, const Link::Ptr & ol);
+ static GenCurveDef genCurveDef(const glm::vec3 & start, const glm::vec3 & end, float startDir);
using Nodes = std::set<Node::Ptr, PtrMemberSorter<Node::Ptr, &Node::pos>>;
Nodes nodes;
diff --git a/game/network/network.impl.h b/game/network/network.impl.h
index cee8155..859d1ac 100644
--- a/game/network/network.impl.h
+++ b/game/network/network.impl.h
@@ -68,9 +68,10 @@ NetworkOf<T>::candidateJoins(glm::vec3 n1, glm::vec3 n2)
template<typename T>
Link::CCollection
-NetworkOf<T>::candidateExtend(glm::vec3 n1, glm::vec3 n2)
+NetworkOf<T>::candidateExtend(glm::vec3 start, glm::vec3 end)
{
- return {candidateLink<typename T::StraightLink>(n1, n2)};
+ const auto [cstart, cend, centre] = genCurveDef(start, end, findNodeDirection(candidateNodeAt(start).first));
+ return {candidateLink<typename T::CurveLink>(cstart, cend, centre)};
}
template<typename T>
@@ -89,7 +90,8 @@ NetworkOf<T>::addJoins(glm::vec3 n1, glm::vec3 n2)
template<typename T>
Link::CCollection
-NetworkOf<T>::addExtend(glm::vec3 n1, glm::vec3 n2)
+NetworkOf<T>::addExtend(glm::vec3 start, glm::vec3 end)
{
- return {addLink<typename T::StraightLink>(n1, n2)};
+ const auto [cstart, cend, centre] = genCurveDef(start, end, findNodeDirection(nodeAt(start)));
+ return {addLink<typename T::CurveLink>(cstart, cend, centre)};
}
diff --git a/game/network/rail.h b/game/network/rail.h
index b1a036e..6850463 100644
--- a/game/network/rail.h
+++ b/game/network/rail.h
@@ -17,12 +17,14 @@ struct Arc;
// A piece of rail track
class RailLinkStraight;
+class RailLinkCurve;
class RailLink : public virtual Link, public Renderable {
public:
RailLink() = default;
inline ~RailLink() override = 0;
using StraightLink = RailLinkStraight;
+ using CurveLink = RailLinkCurve;
void render(const Shader &) const override;
NO_COPY(RailLink);
diff --git a/test/test-network.cpp b/test/test-network.cpp
index fb4c87c..dc2b52f 100644
--- a/test/test-network.cpp
+++ b/test/test-network.cpp
@@ -19,9 +19,11 @@
#include <vector>
struct TestLink : public LinkStraight {
- TestLink(Node::Ptr a, Node::Ptr b) : TestLink {a, b, glm::distance(a->pos, b->pos)} { }
+ TestLink(Node::Ptr a, Node::Ptr b) : TestLink {a, b, (a->pos - b->pos)} { }
+ TestLink(Node::Ptr a, Node::Ptr b, glm::vec2 l) : Link {{std::move(a), 0}, {std::move(b), pi}, glm::length(l)} { }
TestLink(Node::Ptr a, Node::Ptr b, float l) : Link {{std::move(a), 0}, {std::move(b), pi}, l} { }
using StraightLink = TestLink;
+ using CurveLink = TestLink;
};
constexpr glm::vec3 p000 {0, 0, 0}, p100 {1, 0, 0}, p200 {2, 0, 0}, p300 {3, 0, 0};