summaryrefslogtreecommitdiff
path: root/game/vehicles
diff options
context:
space:
mode:
Diffstat (limited to 'game/vehicles')
-rw-r--r--game/vehicles/railVehicle.cpp12
-rw-r--r--game/vehicles/railVehicleClass.cpp50
-rw-r--r--game/vehicles/railVehicleClass.h10
3 files changed, 39 insertions, 33 deletions
diff --git a/game/vehicles/railVehicle.cpp b/game/vehicles/railVehicle.cpp
index 4a0a22d..61f6c93 100644
--- a/game/vehicles/railVehicle.cpp
+++ b/game/vehicles/railVehicle.cpp
@@ -14,18 +14,18 @@
RailVehicle::RailVehicle(RailVehicleClassPtr rvc) :
RailVehicleClass::Instance {rvc->instances.acquire()}, rvClass {std::move(rvc)},
location {[this](const BufferedLocation * l) {
- this->get()->body = l->getRotationTransform();
- this->get()->bodyPos = l->position();
+ this->get()->body.rotation = l->getRotationTransform();
+ this->get()->body.position = l->position();
}},
bogies {{
{[this](const BufferedLocation * l) {
- this->get()->front = l->getRotationTransform();
- this->get()->frontPos = l->position();
+ this->get()->front.rotation = l->getRotationTransform();
+ this->get()->front.position = l->position();
},
GlobalPosition3D {0, rvClass->wheelBase / 2.F, 0}},
{[this](const BufferedLocation * l) {
- this->get()->back = l->getRotationTransform();
- this->get()->backPos = l->position();
+ this->get()->back.rotation = l->getRotationTransform();
+ this->get()->back.position = l->position();
},
GlobalPosition3D {0, -rvClass->wheelBase / 2.F, 0}},
}}
diff --git a/game/vehicles/railVehicleClass.cpp b/game/vehicles/railVehicleClass.cpp
index d94d4ca..176fe82 100644
--- a/game/vehicles/railVehicleClass.cpp
+++ b/game/vehicles/railVehicleClass.cpp
@@ -7,6 +7,7 @@
#include <location.h>
#include <maths.h>
#include <memory>
+#include <ranges>
bool
RailVehicleClass::persist(Persistence::PersistenceStore & store)
@@ -20,12 +21,11 @@ std::any
RailVehicleClass::createAt(const Location & position) const
{
return std::make_shared<InstanceVertices<LocationVertex>::InstanceProxy>(instances.acquire(LocationVertex {
- .body = position.getRotationTransform(),
- .front = position.getRotationTransform(),
- .back = position.getRotationTransform(),
- .bodyPos = position.pos,
- .frontPos = {sincos(position.rot.x) * wheelBase * 0.5F, position.pos.z},
- .backPos = {sincos(position.rot.x) * wheelBase * -0.5F, position.pos.z},
+ .body = {.rotation = position.getRotationTransform(), .position = position.pos},
+ .front = {.rotation = position.getRotationTransform(),
+ .position = {sincos(position.rot.x) * wheelBase * 0.5F, position.pos.z}},
+ .back = {.rotation = position.getRotationTransform(),
+ .position = {sincos(position.rot.x) * wheelBase * -0.5F, position.pos.z}},
}));
}
@@ -35,42 +35,44 @@ RailVehicleClass::postLoad()
texture = getTexture();
glDebugScope _ {0};
bodyMesh->configureVAO(instanceVAO, 0)
- .addAttribs<LocationVertex, &LocationVertex::body, &LocationVertex::bodyPos>(1);
- bogies.front()
- ->configureVAO(instancesBogiesVAO.front(), 0)
- .addAttribs<LocationVertex, &LocationVertex::front, &LocationVertex::frontPos>(1);
- bogies.back()
- ->configureVAO(instancesBogiesVAO.back(), 0)
- .addAttribs<LocationVertex, &LocationVertex::back, &LocationVertex::backPos>(1);
+ .addAttribs<LocationVertex, &LocationVertex::Part::rotation, &LocationVertex::Part::position>(1);
static_assert(sizeof(LocationVertex) == 144UL);
}
void
+RailVehicleClass::renderAllParts(const size_t count) const
+{
+ using PartPair = std::pair<Mesh::Ptr, LocationVertex::Part LocationVertex::*>;
+ const auto bufferName = instances.bufferName();
+ for (const auto & [mesh, part] : {
+ PartPair {bodyMesh, &LocationVertex::body},
+ PartPair {bogies.front(), &LocationVertex::front},
+ PartPair {bogies.back(), &LocationVertex::back},
+ }) {
+ instanceVAO.useBuffer<LocationVertex>(1, bufferName, part);
+ mesh->drawInstanced(instanceVAO, static_cast<GLsizei>(count));
+ }
+}
+
+void
RailVehicleClass::render(const SceneShader & shader, const Frustum &) const
{
- if (const auto count = static_cast<GLsizei>(instances.size())) {
+ if (const auto count = (instances.size())) {
glDebugScope _ {instanceVAO};
if (texture) {
texture->bind(0);
}
shader.basicInst.use();
- instanceVAO.useBuffer(1, instances);
- instancesBogiesVAO.front().useBuffer(1, instances);
- instancesBogiesVAO.back().useBuffer(1, instances);
- bodyMesh->drawInstanced(instanceVAO, count);
- bogies.front()->drawInstanced(instancesBogiesVAO.front(), count);
- bogies.back()->drawInstanced(instancesBogiesVAO.back(), count);
+ renderAllParts(count);
}
}
void
RailVehicleClass::shadows(const ShadowMapper & mapper, const Frustum &) const
{
- if (const auto count = static_cast<GLsizei>(instances.size())) {
+ if (const auto count = instances.size()) {
glDebugScope _ {instanceVAO};
mapper.dynamicPointInst.use();
- bodyMesh->drawInstanced(instanceVAO, count);
- bogies.front()->drawInstanced(instancesBogiesVAO.front(), count);
- bogies.back()->drawInstanced(instancesBogiesVAO.back(), count);
+ renderAllParts(count);
}
}
diff --git a/game/vehicles/railVehicleClass.h b/game/vehicles/railVehicleClass.h
index ccff3e2..fe27230 100644
--- a/game/vehicles/railVehicleClass.h
+++ b/game/vehicles/railVehicleClass.h
@@ -20,8 +20,12 @@ public:
[[nodiscard]] std::any createAt(const Location &) const override;
struct LocationVertex {
- glm::mat3 body, front, back;
- GlobalPosition3D bodyPos, frontPos, backPos;
+ struct Part {
+ glm::mat3 rotation;
+ GlobalPosition3D position;
+ };
+
+ Part body, front, back;
};
std::array<Mesh::Ptr, 2> bogies;
@@ -38,10 +42,10 @@ protected:
friend Persistence::SelectionPtrBase<std::shared_ptr<RailVehicleClass>>;
bool persist(Persistence::PersistenceStore & store) override;
void postLoad() override;
+ void renderAllParts(size_t count) const;
private:
glVertexArray instanceVAO;
- std::array<glVertexArray, 2> instancesBogiesVAO;
};
using RailVehicleClassPtr = std::shared_ptr<RailVehicleClass>;