summaryrefslogtreecommitdiff
path: root/game/vehicles/railloco.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-02-19 01:16:38 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2021-02-19 01:16:38 +0000
commitf8e7c47bbd33fb67afa3ba5478fceb13ddb09243 (patch)
tree5c370029f658e62f8bb4866e6d45af46c05c4045 /game/vehicles/railloco.cpp
parentAdd support for directional light color and an ambient color (diff)
downloadilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.tar.bz2
ilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.tar.xz
ilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.zip
Mesh split, bogeys follow rails.
Wow. This commit is too big. It: * splits obj loaded meshes into individual named objects. * moves obj to mesh(es) code into new file obj.impl.cpp, removing the clutter from mesh * removes Physical for providing the wrong level of abstraction * bit of a hack to adjust loaded models to offset rail vehicle bogeys to 0 centre, and then applies their calculated position to the mesh All in all, quite a lot of mess... But the result is the rail vehicle bogeys now follow the rails quite authentically.
Diffstat (limited to 'game/vehicles/railloco.cpp')
-rw-r--r--game/vehicles/railloco.cpp62
1 files changed, 56 insertions, 6 deletions
diff --git a/game/vehicles/railloco.cpp b/game/vehicles/railloco.cpp
index 230fd4e..b47722e 100644
--- a/game/vehicles/railloco.cpp
+++ b/game/vehicles/railloco.cpp
@@ -1,14 +1,32 @@
#include "railloco.h"
+#include "gfx/gl/shader.h"
#include "gfx/gl/transform.h"
+#include "gfx/models/obj.h"
+#include "gfx/models/texture.h"
#include <algorithm>
#include <array>
+#include <cache.h>
#include <glm/glm.hpp>
+#include <lib/resource.h>
#include <maths.h>
#include <memory>
+#include <set>
#include <utility>
#include <vector>
void
+RailVehicle::render(const Shader & shader) const
+{
+ shader.setModel(location.GetModel());
+ texture->Bind();
+ bodyMesh->Draw();
+ for (const auto & bogey : bogeys) {
+ shader.setModel(bogey.location.GetModel());
+ bogey.mesh->Draw();
+ }
+}
+
+void
RailLoco::move(TickDuration dur)
{
linkDist += dur.count() * speed;
@@ -42,8 +60,8 @@ void
RailLoco::updateRailVehiclePosition(RailVehicle * w, float trailBy) const
{
const auto overhang {(w->length - w->wheelBase) / 2};
- const auto b1Pos = getBogeyPosition(linkDist, trailBy += overhang);
- const auto b2Pos = getBogeyPosition(linkDist, trailBy += wheelBase);
+ const auto & b1Pos = w->bogeys[0].location = getBogeyPosition(linkDist, trailBy += overhang);
+ const auto & b2Pos = w->bogeys[1].location = getBogeyPosition(linkDist, trailBy += wheelBase);
const auto diff = glm::normalize(b2Pos.GetPos() - b1Pos.GetPos());
w->location.GetPos() = (b1Pos.GetPos() + b2Pos.GetPos()) / 2.F;
w->location.GetRot() = {-vector_pitch(diff), vector_yaw(diff), 0};
@@ -71,16 +89,48 @@ RailLoco::updateWagons() const
void RailWagon::tick(TickDuration) { }
-Brush47::Brush47(const LinkPtr & l) : RailLoco(l, "brush47.obj", "brush47.png")
+void
+bogeyOffset(ObjParser & o)
+{
+ // offset bogey positions so they can be set directly
+ for (int b = 1; b < 3; b++) { // bogey object index
+ std::set<std::pair<float, int>> vertexIds;
+ for (const auto & face : o.objects[b].second) {
+ for (const auto & faceElement : face) {
+ vertexIds.emplace(o.vertices[faceElement.x - 1].z, faceElement.x - 1);
+ }
+ }
+ auto offset = (vertexIds.begin()->first + vertexIds.rbegin()->first) / 2;
+ for (const auto & v : vertexIds) {
+ o.vertices[v.second].z -= offset;
+ }
+ }
+}
+
+Brush47::Brush47(const LinkPtr & l) : RailLoco(l, 0)
{
- wheelBase = 15.7F;
+ ObjParser o {Resource::mapPath("brush47.obj")};
+ bogeyOffset(o);
+ const auto m = o.createMeshes();
+ bodyMesh = m[0].second;
+ bogeys[0].mesh = m[1].second;
+ bogeys[1].mesh = m[2].second;
+ texture = Texture::cachedTexture.get(Resource::mapPath("brush47.png"));
+ wheelBase = 12.F;
length = 20.F;
linkDist = wheelBase;
}
-Brush47Wagon::Brush47Wagon(const LinkPtr & l) : RailWagon(l, "brush47.obj", "brush47.png")
+Brush47Wagon::Brush47Wagon(const LinkPtr & l) : RailWagon(l, 0)
{
- wheelBase = 15.7F;
+ ObjParser o {Resource::mapPath("brush47.obj")};
+ bogeyOffset(o);
+ const auto m = o.createMeshes();
+ bodyMesh = m[0].second;
+ bogeys[0].mesh = m[1].second;
+ bogeys[1].mesh = m[2].second;
+ texture = Texture::cachedTexture.get(Resource::mapPath("brush47.png"));
+ wheelBase = 12.F;
length = 20.F;
linkDist = wheelBase;
}