From 2812584e271a62d8edd4d8ec683ea4c644730df2 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 15 Feb 2021 01:36:51 +0000 Subject: Basic support for rail wagons --- application/main.cpp | 5 ++++- game/vehicles/railloco.cpp | 34 ++++++++++++++++++++++++++++++++++ game/vehicles/railloco.h | 21 +++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/application/main.cpp b/application/main.cpp index ee6bade..04ff9c0 100644 --- a/application/main.cpp +++ b/application/main.cpp @@ -73,7 +73,10 @@ public: rl->addLink(l, k, glm::vec2 {l.x, k.z}); auto l3 = rl->addLink(l, m); rl->addLink(m, j, glm::vec2 {m.x, j.z}); - world.create(l3); + auto loco = world.create(l3); + for (int n = 0; n < 6; n++) { + loco->wagons.push_back(world.create(l3)); + } } Shader shader; diff --git a/game/vehicles/railloco.cpp b/game/vehicles/railloco.cpp index a1add29..d61b882 100644 --- a/game/vehicles/railloco.cpp +++ b/game/vehicles/railloco.cpp @@ -39,10 +39,44 @@ RailLoco::tick(TickDuration dur) const auto diff = glm::normalize(b2pos.GetPos() - b1pos.GetPos()); location.GetRot().x = -vector_pitch(diff); location.GetRot().y = vector_yaw(diff); + updateWagons(); } +void +RailLoco::updateWagons() const +{ + // Drag wagons + float trailBy {wheelBase + ((length - wheelBase)) / 2}; + for (const auto & wagon : wagons) { + const auto w {wagon.lock()}; + auto wTrailBy {trailBy + ((w->length - w->wheelBase) / 2)}; + float b1linkDist {}; + const auto b1Link = linkHist.getAt(wTrailBy - linkDist, &b1linkDist); + const auto b1Pos = b1Link.first->positionAt(b1linkDist, b1Link.second); + wTrailBy += w->wheelBase; + float b2linkDist {}; + const auto b2Link = linkHist.getAt(wTrailBy - linkDist, &b2linkDist); + const auto b2Pos = b2Link.first->positionAt(b2linkDist, b2Link.second); + w->location.GetPos() = (b1Pos.GetPos() + b2Pos.GetPos()) / 2.F; + const auto diff = glm::normalize(b2Pos.GetPos() - b1Pos.GetPos()); + w->location.GetRot().x = -vector_pitch(diff); + w->location.GetRot().y = vector_yaw(diff); + trailBy += w->length; + } +} + +void RailWagon::tick(TickDuration) { } + Brush47::Brush47(const LinkPtr & l) : RailLoco(l, "brush47.obj", "brush47.png") { wheelBase = 15.7F; + length = 19.38F; + linkDist = wheelBase; +} + +Brush47Wagon::Brush47Wagon(const LinkPtr & l) : RailWagon(l, "brush47.obj", "brush47.png") +{ + wheelBase = 15.7F; + length = 19.38F; linkDist = wheelBase; } diff --git a/game/vehicles/railloco.h b/game/vehicles/railloco.h index ff8871b..537d448 100644 --- a/game/vehicles/railloco.h +++ b/game/vehicles/railloco.h @@ -1,21 +1,42 @@ #include "game/network/link.h" #include "game/vehicles/vehicle.h" #include "game/worldobject.h" +#include #include +#include class RailVehicle : public Vehicle { public: using Vehicle::Vehicle; float wheelBase; + float length; }; +class RailWagon : public RailVehicle { +public: + using RailVehicle::RailVehicle; + void tick(TickDuration elapsed) override; + friend class RailLoco; +}; +using RailWagonPtr = std::weak_ptr; + class RailLoco : public RailVehicle { public: using RailVehicle::RailVehicle; void tick(TickDuration elapsed) override; + + std::vector wagons; + +private: + void updateWagons() const; }; class Brush47 : public RailLoco { public: explicit Brush47(const LinkPtr & p); }; + +class Brush47Wagon : public RailWagon { +public: + explicit Brush47Wagon(const LinkPtr & p); +}; -- cgit v1.2.3