From 2e47c58bbb6ddba330ddcdadbe55fa3b51b94ae7 Mon Sep 17 00:00:00 2001 From: cutealien Date: Tue, 7 Jan 2014 22:57:00 +0000 Subject: [PATCH] Merge r4558 from trunk: Optimized OpenGL shaders renderer. git-svn-id: http://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@4640 dfc29bdd-3216-0410-991c-e03cc46cb475 --- source/Irrlicht/COpenGLMaterialRenderer.h | 103 +----------------- source/Irrlicht/COpenGLSLMaterialRenderer.cpp | 11 +- .../COpenGLShaderMaterialRenderer.cpp | 11 +- 3 files changed, 11 insertions(+), 114 deletions(-) diff --git a/source/Irrlicht/COpenGLMaterialRenderer.h b/source/Irrlicht/COpenGLMaterialRenderer.h index 73d49e4f..47a9ddd6 100644 --- a/source/Irrlicht/COpenGLMaterialRenderer.h +++ b/source/Irrlicht/COpenGLMaterialRenderer.h @@ -164,56 +164,6 @@ public: Driver->getBridgeCalls()->setAlphaTest(true); Driver->getBridgeCalls()->setAlphaFunc(GL_GREATER, 0.f); Driver->getBridgeCalls()->setBlend(true); - -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, (f32) modulate ); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, (f32) modulate ); -#endif - - if (textureBlendFunc_hasAlpha(srcFact) || textureBlendFunc_hasAlpha(dstFact) ) - { - if (alphaSource==EAS_VERTEX_COLOR) - { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT); -#endif - } - else if (alphaSource==EAS_TEXTURE) - { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE); -#endif - } - else - { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_TEXTURE); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, GL_TEXTURE); -#endif - } - } } virtual void OnUnsetMaterial() _IRR_OVERRIDE_ @@ -235,15 +185,6 @@ public: virtual void OnUnsetBaseMaterial() _IRR_OVERRIDE_ { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f ); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f ); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT); -#endif Driver->getBridgeCalls()->setBlend(false); Driver->getBridgeCalls()->setAlphaTest(false); } @@ -400,21 +341,6 @@ public: virtual void OnSetBaseMaterial(const SMaterial& material) _IRR_OVERRIDE_ { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PRIMARY_COLOR_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PRIMARY_COLOR_EXT ); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT); -#endif Driver->getBridgeCalls()->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Driver->getBridgeCalls()->setBlend(true); } @@ -435,13 +361,7 @@ public: virtual void OnUnsetBaseMaterial() _IRR_OVERRIDE_ { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE ); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE ); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE ); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE ); -#endif + Driver->getBridgeCalls()->setBlend(false); } //! Returns if the material is transparent. @@ -494,22 +414,6 @@ public: virtual void OnSetBaseMaterial(const SMaterial& material) _IRR_OVERRIDE_ { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT); - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE); -#endif - Driver->getBridgeCalls()->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Driver->getBridgeCalls()->setBlend(true); Driver->getBridgeCalls()->setAlphaTest(true); @@ -530,11 +434,6 @@ public: virtual void OnUnsetBaseMaterial() _IRR_OVERRIDE_ { -#ifdef GL_ARB_texture_env_combine - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE ); -#else - glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_MODULATE ); -#endif Driver->getBridgeCalls()->setBlend(false); Driver->getBridgeCalls()->setAlphaTest(false); } diff --git a/source/Irrlicht/COpenGLSLMaterialRenderer.cpp b/source/Irrlicht/COpenGLSLMaterialRenderer.cpp index e70b6316..46700bab 100644 --- a/source/Irrlicht/COpenGLSLMaterialRenderer.cpp +++ b/source/Irrlicht/COpenGLSLMaterialRenderer.cpp @@ -216,6 +216,8 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material, bool resetAllRenderstates, video::IMaterialRendererServices* services) { + Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates, false); + if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) { if (Program2) @@ -225,13 +227,10 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material, if (BaseMaterial) BaseMaterial->OnSetBaseMaterial(material); + + if (CallBack) + CallBack->OnSetMaterial(material); } - - //let callback know used material - if (CallBack) - CallBack->OnSetMaterial(material); - - Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates, false); } diff --git a/source/Irrlicht/COpenGLShaderMaterialRenderer.cpp b/source/Irrlicht/COpenGLShaderMaterialRenderer.cpp index ec45d8be..99b80621 100644 --- a/source/Irrlicht/COpenGLShaderMaterialRenderer.cpp +++ b/source/Irrlicht/COpenGLShaderMaterialRenderer.cpp @@ -133,6 +133,8 @@ bool COpenGLShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial, bool resetAllRenderstates, video::IMaterialRendererServices* services) { + Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates, false); + if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) { if (VertexShader) @@ -175,13 +177,10 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi if (BaseMaterial) BaseMaterial->OnSetBaseMaterial(material); + + if (CallBack) + CallBack->OnSetMaterial(material); } - - //let callback know used material - if (CallBack) - CallBack->OnSetMaterial(material); - - Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); }