diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-15 01:36:51 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-15 01:36:51 +0000 |
commit | 2812584e271a62d8edd4d8ec683ea4c644730df2 (patch) | |
tree | ebf24b19e6e5cd7b0bc3f7f1e2aad6f2479f2692 | |
parent | Correctly follow rails according to wheelbase (diff) | |
download | ilt-2812584e271a62d8edd4d8ec683ea4c644730df2.tar.bz2 ilt-2812584e271a62d8edd4d8ec683ea4c644730df2.tar.xz ilt-2812584e271a62d8edd4d8ec683ea4c644730df2.zip |
Basic support for rail wagons
-rw-r--r-- | application/main.cpp | 5 | ||||
-rw-r--r-- | game/vehicles/railloco.cpp | 34 | ||||
-rw-r--r-- | game/vehicles/railloco.h | 21 |
3 files changed, 59 insertions, 1 deletions
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<RailLinkCurve>(l, k, glm::vec2 {l.x, k.z}); auto l3 = rl->addLink<RailLinkStraight>(l, m); rl->addLink<RailLinkCurve>(m, j, glm::vec2 {m.x, j.z}); - world.create<Brush47>(l3); + auto loco = world.create<Brush47>(l3); + for (int n = 0; n < 6; n++) { + loco->wagons.push_back(world.create<Brush47Wagon>(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 <memory> #include <string> +#include <vector> 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<RailWagon>; + class RailLoco : public RailVehicle { public: using RailVehicle::RailVehicle; void tick(TickDuration elapsed) override; + + std::vector<RailWagonPtr> 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); +}; |