summaryrefslogtreecommitdiff
path: root/game/vehicles/railloco.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/vehicles/railloco.cpp')
-rw-r--r--game/vehicles/railloco.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/game/vehicles/railloco.cpp b/game/vehicles/railloco.cpp
new file mode 100644
index 0000000..baa9b81
--- /dev/null
+++ b/game/vehicles/railloco.cpp
@@ -0,0 +1,30 @@
+#include "railloco.h"
+#include "game/vehicles/vehicle.h"
+#include "gfx/gl/transform.h"
+#include <glm/glm.hpp>
+#include <maths.h>
+
+void
+RailLoco::tick(TickDuration dur)
+{
+ linkDist += dur.count() * speed;
+ while (linkDist > link->length) {
+ location = link->positionAt(link->length, linkDir);
+ const auto & nexts {link->nexts[1 - linkDir]};
+ const auto next = std::find_if(nexts.begin(), nexts.end(), [ang = location.GetRot().y](const Link::Next & n) {
+ return std::abs(normalize(n.first->ends[n.second].second - ang)) < 0.1F;
+ });
+ if (next != nexts.end()) {
+ linkDist -= link->length;
+ link = next->first;
+ linkDir = next->second;
+ }
+ else {
+ linkDist = link->length;
+ speed = 0;
+ }
+ }
+ location = link->positionAt(linkDist, linkDir);
+}
+
+Brush47::Brush47(LinkPtr l) : RailLoco(l, "brush47.obj", "brush47.png") { }