From feda837de830dec4b5fe6d18d79d656e6fcd23c0 Mon Sep 17 00:00:00 2001 From: vlj Date: Thu, 10 Jul 2014 18:11:35 +0200 Subject: [PATCH] Factorize some rendering loops. --- src/graphics/render.cpp | 113 +++++++++++++--------------------------- 1 file changed, 36 insertions(+), 77 deletions(-) diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 1b6e0b8c1..9993087d8 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -585,6 +585,39 @@ void IrrDriver::renderSolidFirstPass() } } +template +void renderMeshes2ndPass(std::vector &meshes, const std::vector &MVPMatrixes) +{ + glUseProgram(Shader::Program); + glBindVertexArray(getVAO(VertexType)); + for (unsigned i = 0; i < meshes.size(); i++) + { + GLMesh &mesh = *meshes[i]; + if (!mesh.textures[0]) + mesh.textures[0] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); + if (mesh.VAOType != VertexType) + { +#ifdef DEBUG + Log::error("Materials", "Wrong vertex Type associed to pass 2 (hint texture : %s)", mesh.textures[0]->getName().getPath().c_str()); +#endif + continue; + } + compressTexture(mesh.textures[0], true); + setTexture(MeshShader::ObjectPass2Shader::TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); + if (irr_driver->getLightViz()) + { + GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else + { + GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + draw(mesh, MVPMatrixes[i], mesh.TextureMatrix); + } +} + void IrrDriver::renderSolidSecondPass() { SColor clearColor(0, 150, 150, 150); @@ -619,87 +652,13 @@ void IrrDriver::renderSolidSecondPass() setTexture(2, m_rtts->getRenderTarget(RTT_HALF1_R), GL_LINEAR, GL_LINEAR); { - ScopedGPUTimer Timer(getGPUTimer(Q_SOLID_PASS2)); m_scene_manager->drawAll(scene::ESNRP_SOLID); - glUseProgram(MeshShader::ObjectPass2Shader::Program); - glBindVertexArray(getVAO(video::EVT_STANDARD)); - for (unsigned i = 0; i < GroupedSM::MeshSet.size(); i++) - { - GLMesh &mesh = *GroupedSM::MeshSet[i]; - if (mesh.VAOType != video::EVT_STANDARD) - { -#ifdef DEBUG - Log::error("Materials", "Wrong vertex Type associed to pass 2 (hint texture : %s)", mesh.textures[0]->getName().getPath().c_str()); -#endif - continue; - } - if (!mesh.textures[0]) - mesh.textures[0] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh.textures[0], true); - setTexture(MeshShader::ObjectPass2Shader::TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); - if (irr_driver->getLightViz()) - { - GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - else - { - GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - draw(mesh, GroupedSM::MVPSet[i], GroupedSM::MeshSet[i]->TextureMatrix); - } - - glBindVertexArray(getVAO(video::EVT_TANGENTS)); - for (unsigned i = 0; i < GroupedSM::MeshSet.size(); i++) - { - const GLMesh &mesh = *GroupedSM::MeshSet[i]; - assert(mesh.VAOType == video::EVT_TANGENTS); - compressTexture(mesh.textures[0], true); - setTexture(MeshShader::ObjectPass2Shader::TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); - if (irr_driver->getLightViz()) - { - GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - else - { - GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - draw(mesh, GroupedSM::MVPSet[i], GroupedSM::MeshSet[i]->TextureMatrix); - } - - glUseProgram(MeshShader::ObjectRefPass2Shader::Program); - glBindVertexArray(getVAO(EVT_STANDARD)); - for (unsigned i = 0; i < GroupedSM::MeshSet.size(); i++) - { - const GLMesh &mesh = *GroupedSM::MeshSet[i]; - if (mesh.VAOType != video::EVT_STANDARD) - { -#ifdef DEBUG - Log::error("Materials", "Wrong vertex Type associed to alpha ref pass 2 (hint texture : %s)", mesh.textures[0]->getName().getPath().c_str()); -#endif - continue; - } - compressTexture(mesh.textures[0], true); - setTexture(MeshShader::ObjectRefPass2Shader::TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); - if (irr_driver->getLightViz()) - { - GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - else - { - GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); - } - - draw(mesh, GroupedSM::MVPSet[i], GroupedSM::MeshSet[i]->TextureMatrix); - } + renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); + renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); + renderMeshes2ndPass(GroupedSM::MeshSet, GroupedSM::MVPSet); glUseProgram(MeshShader::SphereMapShader::Program); glBindVertexArray(getVAO(EVT_STANDARD));