#include "railVehicleClass.h" #include "gfx/gl/sceneShader.h" #include "gfx/gl/shadowMapper.h" #include "gfx/gl/vertexArrayObject.hpp" #include "gfx/models/mesh.h" #include "gfx/models/texture.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include bool RailVehicleClass::persist(Persistence::PersistenceStore & store) { return STORE_TYPE && STORE_MEMBER(length) && STORE_MEMBER(wheelBase) && STORE_MEMBER(maxSpeed) && STORE_NAME_HELPER("bogie", bogies, Asset::MeshArrayConstruct) && STORE_HELPER(bodyMesh, Asset::MeshConstruct) && Asset::persist(store); } void RailVehicleClass::postLoad() { texture = getTexture(); bodyMesh->configureVAO(instanceVAO).addAttribs(instancesBody.bufferName(), 1); bogies.front() ->configureVAO(instancesBogiesVAO.front()) .addAttribs(instancesBogies.front().bufferName(), 1); bogies.back() ->configureVAO(instancesBogiesVAO.back()) .addAttribs(instancesBogies.back().bufferName(), 1); } void RailVehicleClass::render(const SceneShader & shader) const { if (const auto count = instancesBody.count()) { if (texture) { texture->bind(); } shader.basicInst.use(); glBindVertexArray(instanceVAO); glDrawElementsInstanced( bodyMesh->type(), bodyMesh->count(), GL_UNSIGNED_INT, nullptr, static_cast(count)); glBindVertexArray(instancesBogiesVAO.front()); glDrawElementsInstanced(bogies.front()->type(), bogies.front()->count(), GL_UNSIGNED_INT, nullptr, static_cast(instancesBogies.front().count())); glBindVertexArray(instancesBogiesVAO.back()); glDrawElementsInstanced(bogies.back()->type(), bogies.back()->count(), GL_UNSIGNED_INT, nullptr, static_cast(instancesBogies.back().count())); glBindVertexArray(0); } } void RailVehicleClass::shadows(const ShadowMapper & mapper) const { if (const auto count = instancesBody.count()) { mapper.dynamicPointInst.use(); glBindVertexArray(instanceVAO); glDrawElementsInstanced( bodyMesh->type(), bodyMesh->count(), GL_UNSIGNED_INT, nullptr, static_cast(count)); glBindVertexArray(instancesBogiesVAO.front()); glDrawElementsInstanced(bogies.front()->type(), bogies.front()->count(), GL_UNSIGNED_INT, nullptr, static_cast(instancesBogies.front().count())); glBindVertexArray(instancesBogiesVAO.back()); glDrawElementsInstanced(bogies.back()->type(), bogies.back()->count(), GL_UNSIGNED_INT, nullptr, static_cast(instancesBogies.back().count())); glBindVertexArray(0); } }