summaryrefslogtreecommitdiff
path: root/game/vehicles
diff options
context:
space:
mode:
Diffstat (limited to 'game/vehicles')
-rw-r--r--game/vehicles/railVehicle.cpp11
-rw-r--r--game/vehicles/railVehicle.h12
-rw-r--r--game/vehicles/railVehicleClass.cpp25
-rw-r--r--game/vehicles/railVehicleClass.h8
4 files changed, 29 insertions, 27 deletions
diff --git a/game/vehicles/railVehicle.cpp b/game/vehicles/railVehicle.cpp
index c4a9e96..2d820b6 100644
--- a/game/vehicles/railVehicle.cpp
+++ b/game/vehicles/railVehicle.cpp
@@ -12,13 +12,12 @@
#include <ray.h>
RailVehicle::RailVehicle(RailVehicleClassPtr rvc) :
- rvClass {std::move(rvc)}, location {rvClass->instancesBody}, bogies {
- rvClass->instancesBogies.front(),
- rvClass->instancesBogies.back(),
- }
+ RailVehicleClass::Instance {rvc->instances.acquire()}, rvClass {std::move(rvc)}, location {&LV::body, *this},
+ bogies {{
+ {&LV::front, *this, glm::vec3 {0, rvClass->wheelBase / 2.F, 0}},
+ {&LV::back, *this, glm::vec3 {0, -rvClass->wheelBase / 2.F, 0}},
+ }}
{
- bogies.front().setPosition({0, rvClass->wheelBase / 2.F, 0});
- bogies.back().setPosition({0, -bogies.front().position().y, 0});
}
void
diff --git a/game/vehicles/railVehicle.h b/game/vehicles/railVehicle.h
index 247bf66..f34643e 100644
--- a/game/vehicles/railVehicle.h
+++ b/game/vehicles/railVehicle.h
@@ -8,12 +8,10 @@
#include <memory>
#include <utility>
-class SceneShader;
-class ShadowMapper;
class Ray;
-
class Train;
-class RailVehicle : Selectable {
+
+class RailVehicle : Selectable, RailVehicleClass::Instance {
public:
explicit RailVehicle(RailVehicleClassPtr rvc);
@@ -22,7 +20,9 @@ public:
[[nodiscard]] bool intersectRay(const Ray &, glm::vec2 *, float *) const override;
RailVehicleClassPtr rvClass;
- BufferedLocation location;
- std::array<BufferedLocation, 2> bogies;
+ using LV = RailVehicleClass::LocationVertex;
+ using BLocation = BufferedLocationT<glm::mat4 LV::*, RailVehicleClass::Instance &>;
+ BLocation location;
+ std::array<BLocation, 2> bogies;
};
using RailVehiclePtr = std::unique_ptr<RailVehicle>;
diff --git a/game/vehicles/railVehicleClass.cpp b/game/vehicles/railVehicleClass.cpp
index 64a21be..324148c 100644
--- a/game/vehicles/railVehicleClass.cpp
+++ b/game/vehicles/railVehicleClass.cpp
@@ -4,6 +4,7 @@
#include "gfx/gl/vertexArrayObject.h"
#include "gfx/models/mesh.h"
#include "gfx/models/texture.h"
+#include "stream_support.h"
#include <algorithm>
#include <array>
#include <cache.h>
@@ -34,38 +35,36 @@ void
RailVehicleClass::postLoad()
{
texture = getTexture();
- bodyMesh->configureVAO(instanceVAO).addAttribs<glm::mat4>(instancesBody.bufferName(), 1);
+ bodyMesh->configureVAO(instanceVAO).addAttribs<LocationVertex, &LocationVertex::body>(instances.bufferName(), 1);
bogies.front()
->configureVAO(instancesBogiesVAO.front())
- .addAttribs<glm::mat4>(instancesBogies.front().bufferName(), 1);
+ .addAttribs<LocationVertex, &LocationVertex::front>(instances.bufferName(), 1);
bogies.back()
->configureVAO(instancesBogiesVAO.back())
- .addAttribs<glm::mat4>(instancesBogies.back().bufferName(), 1);
+ .addAttribs<LocationVertex, &LocationVertex::back>(instances.bufferName(), 1);
}
void
RailVehicleClass::render(const SceneShader & shader) const
{
- if (const auto count = instancesBody.count()) {
+ if (const auto count = static_cast<GLsizei>(instances.size())) {
if (texture) {
texture->bind();
}
shader.basicInst.use();
- bodyMesh->DrawInstanced(instanceVAO, static_cast<GLsizei>(count));
- bogies.front()->DrawInstanced(
- instancesBogiesVAO.front(), static_cast<GLsizei>(instancesBogies.front().count()));
- bogies.back()->DrawInstanced(instancesBogiesVAO.back(), static_cast<GLsizei>(instancesBogies.back().count()));
+ bodyMesh->DrawInstanced(instanceVAO, count);
+ bogies.front()->DrawInstanced(instancesBogiesVAO.front(), count);
+ bogies.back()->DrawInstanced(instancesBogiesVAO.back(), count);
}
}
void
RailVehicleClass::shadows(const ShadowMapper & mapper) const
{
- if (const auto count = instancesBody.count()) {
+ if (const auto count = static_cast<GLsizei>(instances.size())) {
mapper.dynamicPointInst.use();
- bodyMesh->DrawInstanced(instanceVAO, static_cast<GLsizei>(count));
- bogies.front()->DrawInstanced(
- instancesBogiesVAO.front(), static_cast<GLsizei>(instancesBogies.front().count()));
- bogies.back()->DrawInstanced(instancesBogiesVAO.back(), static_cast<GLsizei>(instancesBogies.back().count()));
+ bodyMesh->DrawInstanced(instanceVAO, count);
+ bogies.front()->DrawInstanced(instanceVAO, count);
+ bogies.back()->DrawInstanced(instanceVAO, count);
}
}
diff --git a/game/vehicles/railVehicleClass.h b/game/vehicles/railVehicleClass.h
index 2fda8f7..80b3fda 100644
--- a/game/vehicles/railVehicleClass.h
+++ b/game/vehicles/railVehicleClass.h
@@ -18,6 +18,10 @@ public:
void render(const SceneShader & shader) const override;
void shadows(const ShadowMapper & shadowMapper) const override;
+ struct LocationVertex {
+ glm::mat4 body, front, back;
+ };
+
std::array<Mesh::Ptr, 2> bogies;
Mesh::Ptr bodyMesh;
std::shared_ptr<Texture> texture;
@@ -25,8 +29,8 @@ public:
float length;
float maxSpeed;
- mutable InstanceVertices<glm::mat4> instancesBody;
- mutable std::array<InstanceVertices<glm::mat4>, 2> instancesBogies;
+ mutable InstanceVertices<LocationVertex> instances;
+ using Instance = decltype(instances)::InstanceProxy;
protected:
friend Persistence::SelectionPtrBase<std::shared_ptr<RailVehicleClass>>;