summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--application/main.cpp5
-rw-r--r--game/vehicles/railloco.cpp34
-rw-r--r--game/vehicles/railloco.h21
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);
+};