diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2024-01-07 17:13:38 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2024-01-07 17:13:38 +0000 |
commit | 381caebb524a5bb8f091d1aa2ca02d384e010961 (patch) | |
tree | 1f006fe4bdcecabdb402f999a6fc9d0d52c8f34d /game/network/rail.cpp | |
parent | Merge branch 'template-types' (diff) | |
download | ilt-381caebb524a5bb8f091d1aa2ca02d384e010961.tar.bz2 ilt-381caebb524a5bb8f091d1aa2ca02d384e010961.tar.xz ilt-381caebb524a5bb8f091d1aa2ca02d384e010961.zip |
Global positions in network data
Diffstat (limited to 'game/network/rail.cpp')
-rw-r--r-- | game/network/rail.cpp | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/game/network/rail.cpp b/game/network/rail.cpp index 303f1c8..79aaf97 100644 --- a/game/network/rail.cpp +++ b/game/network/rail.cpp @@ -9,9 +9,7 @@ #include <gfx/models/vertex.h> #include <glad/gl.h> #include <glm/gtx/transform.hpp> -#include <initializer_list> #include <maths.h> -#include <stdexcept> #include <utility> #include <vector> @@ -28,7 +26,7 @@ RailLinks::tick(TickDuration) } std::shared_ptr<RailLink> -RailLinks::addLinksBetween(Position3D start, Position3D end) +RailLinks::addLinksBetween(GlobalPosition3D start, GlobalPosition3D end) { auto node1ins = newNodeAt(start), node2ins = newNodeAt(end); if (node1ins.second == NodeIs::NotInNetwork && node2ins.second == NodeIs::NotInNetwork) { @@ -41,31 +39,32 @@ RailLinks::addLinksBetween(Position3D start, Position3D end) std::swap(start, end); } // Find start link/end - opposite entry dir to existing link; so pi +... - const float dir = pi + findNodeDirection(node1ins.first); + const Angle dir = pi + findNodeDirection(node1ins.first); if (dir == vector_yaw(end - start)) { return addLink<RailLinkStraight>(start, end); } - const Position2D flatStart {start.xy()}, flatEnd {end.xy()}; + const auto flatStart {start.xy()}, flatEnd {end.xy()}; if (node2ins.second == NodeIs::InNetwork) { auto midheight = [&](auto mid) { - const auto sm = glm::distance(flatStart, mid), em = glm::distance(flatEnd, mid); - return start.z + ((end.z - start.z) * (sm / (sm + em))); + const auto sm = glm::length(RelativePosition2D(flatStart - mid)), + em = glm::length(RelativePosition2D(flatEnd - mid)); + return start.z + GlobalDistance(RelativeDistance(end.z - start.z) * (sm / (sm + em))); }; const float dir2 = pi + findNodeDirection(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; - const auto c2 = flatEnd + sincosf(dir2 + half_pi) * radius; - const auto mid = (c1 + c2) / 2.F; + const auto c1 = flatStart + GlobalPosition2D(sincosf(dir + half_pi) * radius); + const auto c2 = flatEnd + GlobalPosition2D(sincosf(dir2 + half_pi) * radius); + const auto mid = (c1 + c2) / 2; const auto midh = mid || midheight(mid); addLink<RailLinkCurve>(start, midh, c1); return addLink<RailLinkCurve>(end, midh, c2); } else { const auto radius {radii.second}; - const auto c1 = flatStart + sincosf(dir - half_pi) * radius; - const auto c2 = flatEnd + sincosf(dir2 - half_pi) * radius; - const auto mid = (c1 + c2) / 2.F; + const auto c1 = flatStart + GlobalPosition2D(sincosf(dir - half_pi) * radius); + const auto c2 = flatEnd + GlobalPosition2D(sincosf(dir2 - half_pi) * radius); + const auto mid = (c1 + c2) / 2; const auto midh = mid || midheight(mid); addLink<RailLinkCurve>(midh, start, c1); return addLink<RailLinkCurve>(midh, end, c2); @@ -100,7 +99,7 @@ RailLink::render(const SceneShader &) const mesh->Draw(); } -constexpr const std::array<std::pair<Position3D, float>, RAIL_CROSSSECTION_VERTICES> railCrossSection {{ +constexpr const std::array<std::pair<RelativePosition3D, float>, RAIL_CROSSSECTION_VERTICES> railCrossSection {{ // ___________ // _/ \_ // left to right @@ -122,59 +121,57 @@ RailLinkStraight::RailLinkStraight(const Node::Ptr & a, const Node::Ptr & b) : R { } -RailLinkStraight::RailLinkStraight(Node::Ptr a, Node::Ptr b, const Position3D & diff) : +RailLinkStraight::RailLinkStraight(Node::Ptr a, Node::Ptr b, const RelativePosition3D & diff) : Link({std::move(a), vector_yaw(diff)}, {std::move(b), vector_yaw(-diff)}, glm::length(diff)) { if (glGenVertexArrays) { std::vector<Vertex> vertices; vertices.reserve(2 * railCrossSection.size()); const auto len = round_sleepers(length / 2000.F); - const auto e {flat_orientation(diff)}; + const glm::mat3 trans {flat_orientation(diff)}; for (auto ei : {1U, 0U}) { - const auto trans {glm::translate(ends[ei].node->pos) * e}; for (const auto & rcs : railCrossSection) { - const Position3D m {(trans * (rcs.first || 1.F))}; - vertices.emplace_back(m, Position2D {rcs.second, len * static_cast<float>(ei)}, up); + const auto m {ends[ei].node->pos + GlobalPosition3D(trans * rcs.first)}; + vertices.emplace_back(m, TextureRelCoord {rcs.second, len * static_cast<float>(ei)}, up); } } mesh = defaultMesh(vertices); } } -RailLinkCurve::RailLinkCurve(const Node::Ptr & a, const Node::Ptr & b, Position2D c) : - RailLinkCurve(a, b, c || a->pos.z, {c || 0.F, a->pos, b->pos}) +RailLinkCurve::RailLinkCurve(const Node::Ptr & a, const Node::Ptr & b, GlobalPosition2D c) : + RailLinkCurve(a, b, c || a->pos.z, {c || 0, a->pos, b->pos}) { } -RailLinkCurve::RailLinkCurve(const Node::Ptr & a, const Node::Ptr & b, Position3D c, const Arc arc) : +RailLinkCurve::RailLinkCurve(const Node::Ptr & a, const Node::Ptr & b, GlobalPosition3D c, const Arc arc) : Link({a, normalize(arc.first + half_pi)}, {b, normalize(arc.second - half_pi)}, - (glm::length(a->pos - c)) * arc_length(arc)), - LinkCurve {c, glm::length(ends[0].node->pos - c), arc} + glm::length(RelativePosition3D(a->pos - c)) * arc_length(arc)), + LinkCurve {c, glm::length(RelativePosition3D(ends[0].node->pos - c)), arc} { if (glGenVertexArrays) { const auto & e0p {ends[0].node->pos}; const auto & e1p {ends[1].node->pos}; const auto slength = round_sleepers(length / 2.F); const auto segs = std::round(slength / std::pow(radius, 0.7F)); - const auto step {Position3D {arc_length(arc), e1p.z - e0p.z, slength / 1000.F} / segs}; - const auto trans {glm::translate(centreBase)}; + const auto step {RelativePosition3D {arc_length(arc), e1p.z - e0p.z, slength / 1000.F} / segs}; auto segCount = static_cast<std::size_t>(std::lround(segs)) + 1; std::vector<Vertex> vertices; vertices.reserve(segCount * railCrossSection.size()); - for (Position3D swing = {arc.first, centreBase.z - e0p.z, 0.F}; segCount; swing += step, --segCount) { + for (RelativePosition3D swing = {arc.first, centreBase.z - e0p.z, 0.F}; segCount; swing += step, --segCount) { const auto t { - trans * glm::rotate(half_pi - swing.x, up) * glm::translate(Position3D {radius, 0.F, swing.y})}; + glm::rotate(half_pi - swing.x, up) * glm::translate(RelativePosition3D {radius, 0.F, swing.y})}; for (const auto & rcs : railCrossSection) { - const Position3D m {(t * (rcs.first || 1.F))}; - vertices.emplace_back(m, Position2D {rcs.second, swing.z}, up); + const auto m {centreBase + GlobalPosition3D(t * (rcs.first || 1.F))}; + vertices.emplace_back(m, TextureRelCoord {rcs.second, swing.z}, up); } } mesh = defaultMesh(vertices); } } -Position3D +RelativePosition3D RailLink::vehiclePositionOffset() const { return RAIL_HEIGHT; |