From 6d9d393ae60bfc6b2625a5540cd60ffed478aa13 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 12 Mar 2026 01:15:26 +0000 Subject: Shared VAO for all 3 parts of RailVehicleClass Rearranges its LocationVertex to be 3 repeated Parts. Adds helpers to glvglVertexArray for useBuffer with various offsets. Render is then an iteration of the meshes and the location data at the nth offset. --- game/vehicles/railVehicleClass.cpp | 50 ++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 24 deletions(-) (limited to 'game/vehicles/railVehicleClass.cpp') 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 #include #include +#include bool RailVehicleClass::persist(Persistence::PersistenceStore & store) @@ -20,12 +21,11 @@ std::any RailVehicleClass::createAt(const Location & position) const { return std::make_shared::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(1); - bogies.front() - ->configureVAO(instancesBogiesVAO.front(), 0) - .addAttribs(1); - bogies.back() - ->configureVAO(instancesBogiesVAO.back(), 0) - .addAttribs(1); + .addAttribs(1); static_assert(sizeof(LocationVertex) == 144UL); } +void +RailVehicleClass::renderAllParts(const size_t count) const +{ + using PartPair = std::pair; + 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(1, bufferName, part); + mesh->drawInstanced(instanceVAO, static_cast(count)); + } +} + void RailVehicleClass::render(const SceneShader & shader, const Frustum &) const { - if (const auto count = static_cast(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(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); } } -- cgit v1.3