From c2f7c14fdb757fb27842b82d8f235dc4c49af12d Mon Sep 17 00:00:00 2001 From: vlj Date: Thu, 10 Jul 2014 18:49:17 +0200 Subject: [PATCH] Try to factorize using tuple --- src/graphics/render.cpp | 22 +++++++++++++++------- src/graphics/stkanimatedmesh.cpp | 18 +++--------------- src/graphics/stkmesh.cpp | 3 +++ src/graphics/stkmesh.hpp | 19 +++++++++++++++++++ src/graphics/stkmeshscenenode.cpp | 18 +++--------------- 5 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 9993087d8..ae4195b66 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -585,14 +585,20 @@ void IrrDriver::renderSolidFirstPass() } } +template +void apply(std::tuple arg) +{ + draw(*std::get<0>(arg), std::get<1>(arg), std::get<2>(arg)); +} + template -void renderMeshes2ndPass(std::vector &meshes, const std::vector &MVPMatrixes) +void renderMeshes2ndPass(std::vector > &meshes) { glUseProgram(Shader::Program); glBindVertexArray(getVAO(VertexType)); for (unsigned i = 0; i < meshes.size(); i++) { - GLMesh &mesh = *meshes[i]; + GLMesh &mesh = *(std::get<0>(meshes[i])); if (!mesh.textures[0]) mesh.textures[0] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); if (mesh.VAOType != VertexType) @@ -614,7 +620,7 @@ void renderMeshes2ndPass(std::vector &meshes, const std::vector(mesh, MVPMatrixes[i], mesh.TextureMatrix); + apply(meshes[i]); } } @@ -640,7 +646,9 @@ void IrrDriver::renderSolidSecondPass() glEnable(GL_DEPTH_TEST); glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); - GroupedSM::reset(); + ListDefaultStandardSM::Arguments.clear(); + ListDefaultTangentSM::Arguments.clear(); + ListAlphaRefSM::Arguments.clear(); GroupedSM::reset(); GroupedSM::reset(); GroupedSM::reset(); @@ -656,9 +664,9 @@ void IrrDriver::renderSolidSecondPass() m_scene_manager->drawAll(scene::ESNRP_SOLID); - renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); - renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); - renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); + renderMeshes2ndPass(ListDefaultStandardSM::Arguments); + renderMeshes2ndPass(ListDefaultTangentSM::Arguments); + renderMeshes2ndPass(ListAlphaRefSM::Arguments); glUseProgram(MeshShader::SphereMapShader::Program); glBindVertexArray(getVAO(EVT_STANDARD)); diff --git a/src/graphics/stkanimatedmesh.cpp b/src/graphics/stkanimatedmesh.cpp index 727144398..bc9f248cc 100644 --- a/src/graphics/stkanimatedmesh.cpp +++ b/src/graphics/stkanimatedmesh.cpp @@ -175,25 +175,13 @@ void STKAnimatedMesh::render() GLMesh* mesh; for_in(mesh, ShadedMesh[SM_DEFAULT_STANDARD]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListDefaultStandardSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in(mesh, ShadedMesh[SM_DEFAULT_TANGENT]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListDefaultTangentSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in(mesh, ShadedMesh[SM_ALPHA_REF_TEXTURE]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListAlphaRefSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in (mesh, ShadedMesh[SM_UNLIT]) { diff --git a/src/graphics/stkmesh.cpp b/src/graphics/stkmesh.cpp index d24517e43..45b92753d 100644 --- a/src/graphics/stkmesh.cpp +++ b/src/graphics/stkmesh.cpp @@ -519,3 +519,6 @@ void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat) mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride)); } +std::vector > ListDefaultStandardSM::Arguments; +std::vector > ListDefaultTangentSM::Arguments; +std::vector > ListAlphaRefSM::Arguments; \ No newline at end of file diff --git a/src/graphics/stkmesh.hpp b/src/graphics/stkmesh.hpp index 70e2299fd..ec2734505 100644 --- a/src/graphics/stkmesh.hpp +++ b/src/graphics/stkmesh.hpp @@ -8,6 +8,7 @@ #include #include "../lib/irrlicht/source/Irrlicht/CMeshSceneNode.h" +#include #include enum GeometricMaterial @@ -108,6 +109,24 @@ void draw(const GLMesh &mesh, uniforms... Args) void drawGrassPass1(const GLMesh &mesh, const core::matrix4 & ModelViewProjectionMatrix, const core::matrix4 &TransposeInverseModelView, core::vector3df windDir); // Pass 2 shader (ie shaders that outputs final color) +class ListDefaultStandardSM +{ +public: + static std::vector > Arguments; +}; + +class ListDefaultTangentSM +{ +public: + static std::vector > Arguments; +}; + +class ListAlphaRefSM +{ +public: + static std::vector > Arguments; +}; + template class GroupedSM { diff --git a/src/graphics/stkmeshscenenode.cpp b/src/graphics/stkmeshscenenode.cpp index 77b5fe308..3bab24e22 100644 --- a/src/graphics/stkmeshscenenode.cpp +++ b/src/graphics/stkmeshscenenode.cpp @@ -348,25 +348,13 @@ void STKMeshSceneNode::render() GLMesh* mesh; for_in(mesh, ShadedMesh[SM_DEFAULT_STANDARD]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListDefaultStandardSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in(mesh, ShadedMesh[SM_DEFAULT_TANGENT]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListDefaultTangentSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in(mesh, ShadedMesh[SM_ALPHA_REF_TEXTURE]) - { - GroupedSM::MeshSet.push_back(mesh); - GroupedSM::MVPSet.push_back(AbsoluteTransformation); - GroupedSM::TIMVSet.push_back(invmodel); - } + ListAlphaRefSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix)); for_in(mesh, ShadedMesh[SM_SPHEREMAP]) {