summaryrefslogtreecommitdiff
path: root/game/vehicles
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
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')
-rw-r--r--game/vehicles/railloco.cpp62
-rw-r--r--game/vehicles/railloco.h13
-rw-r--r--game/vehicles/vehicle.cpp3
-rw-r--r--game/vehicles/vehicle.h10
4 files changed, 76 insertions, 12 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;
}
diff --git a/game/vehicles/railloco.h b/game/vehicles/railloco.h
index ce4012a..0d0425a 100644
--- a/game/vehicles/railloco.h
+++ b/game/vehicles/railloco.h
@@ -1,15 +1,28 @@
#include "game/network/link.h"
#include "game/vehicles/vehicle.h"
#include "game/worldobject.h"
+#include "gfx/models/mesh.h"
#include <memory>
#include <string>
#include <vector>
+class Texture;
class RailVehicle : public Vehicle {
public:
+ struct Bogey {
+ Transform location;
+ MeshPtr mesh;
+ };
+
using Vehicle::Vehicle;
+ void render(const Shader & shader) const override;
+
+ std::array<Bogey, 2> bogeys;
+ MeshPtr bodyMesh;
+ std::shared_ptr<Texture> texture;
float wheelBase;
float length;
+
friend class RailLoco;
};
diff --git a/game/vehicles/vehicle.cpp b/game/vehicles/vehicle.cpp
index fceb37c..b9d10bc 100644
--- a/game/vehicles/vehicle.cpp
+++ b/game/vehicles/vehicle.cpp
@@ -4,8 +4,7 @@
#include <memory>
#include <utility>
-Vehicle::Vehicle(const LinkPtr & l, const std::string & obj, const std::string & tex) :
- Physical(l->ends.front().first->pos, obj, tex)
+Vehicle::Vehicle(const LinkPtr & l, float ld) : linkDist {ld}
{
linkHist.add(l, 0);
}
diff --git a/game/vehicles/vehicle.h b/game/vehicles/vehicle.h
index 25ed5bb..945d43b 100644
--- a/game/vehicles/vehicle.h
+++ b/game/vehicles/vehicle.h
@@ -1,9 +1,9 @@
#ifndef VEHICLE_H
#define VEHICLE_H
-#include "game/physical.h"
#include <game/network/link.h>
#include <game/worldobject.h>
+#include <gfx/renderable.h>
#include <memory>
#include <string>
#include <utility>
@@ -22,12 +22,14 @@ private:
float totalLen {0.F};
};
-class Vehicle : public WorldObject, public Physical {
+class Vehicle : public WorldObject, public Renderable {
public:
- Vehicle(const LinkPtr & link, const std::string & obj, const std::string & tex);
- float linkDist {0}; // distance long current link
+ Vehicle(const LinkPtr & link, float linkDist = 0);
+ float linkDist; // distance long current link
float speed {50}; // speed in m/s (~75 km/h)
+ Transform location;
+
protected:
LinkHistory linkHist;
};