From 1abb464b492e5d8b1e041574d01756faa98fe057 Mon Sep 17 00:00:00 2001 From: lukeph Date: Mon, 3 Dec 2007 08:03:21 +0000 Subject: [PATCH] -fixed a bug in setting shader constants. passing arrays were not working, can an openGL programmer check this is now right? -let the user add a shader without a pixel or vertex shader, as docs state. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1080 dfc29bdd-3216-0410-991c-e03cc46cb475 --- source/Irrlicht/COpenGLSLMaterialRenderer.cpp | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/source/Irrlicht/COpenGLSLMaterialRenderer.cpp b/source/Irrlicht/COpenGLSLMaterialRenderer.cpp index a0687f43..71212d09 100644 --- a/source/Irrlicht/COpenGLSLMaterialRenderer.cpp +++ b/source/Irrlicht/COpenGLSLMaterialRenderer.cpp @@ -102,11 +102,14 @@ void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr, return; #if defined(GL_ARB_vertex_shader) && defined (GL_ARB_fragment_shader) - if (!createShader(GL_VERTEX_SHADER_ARB, vertexShaderProgram)) - return; + if (vertexShaderProgram) + if (!createShader(GL_VERTEX_SHADER_ARB, vertexShaderProgram)) + return; - if (!createShader(GL_FRAGMENT_SHADER_ARB, pixelShaderProgram)) - return; + + if (pixelShaderProgram) + if (!createShader(GL_FRAGMENT_SHADER_ARB, pixelShaderProgram)) + return; #endif if (!linkProgram()) @@ -317,31 +320,33 @@ bool COpenGLSLMaterialRenderer::setPixelShaderConstant(const c8* name, const f32 return false; #ifdef GL_ARB_shader_objects + GLint Location=Driver->extGlGetUniformLocation(Program,name); + switch (UniformInfo[i].type) { case GL_FLOAT: - Driver->extGlUniform1fv(i, count, floats); + Driver->extGlUniform1fv(Location, count, floats); break; case GL_FLOAT_VEC2_ARB: - Driver->extGlUniform2fv(i, count/2, floats); + Driver->extGlUniform2fv(Location, count/2, floats); break; case GL_FLOAT_VEC3_ARB: - Driver->extGlUniform3fv(i, count/3, floats); + Driver->extGlUniform3fv(Location, count/3, floats); break; case GL_FLOAT_VEC4_ARB: - Driver->extGlUniform4fv(i, count/4, floats); + Driver->extGlUniform4fv(Location, count/4, floats); break; case GL_FLOAT_MAT2_ARB: - Driver->extGlUniformMatrix2fv(i, count/4, false, floats); + Driver->extGlUniformMatrix2fv(Location, count/4, false, floats); break; case GL_FLOAT_MAT3_ARB: - Driver->extGlUniformMatrix3fv(i, count/9, false, floats); + Driver->extGlUniformMatrix3fv(Location, count/9, false, floats); break; case GL_FLOAT_MAT4_ARB: - Driver->extGlUniformMatrix4fv(i, count/16, false, floats); + Driver->extGlUniformMatrix4fv(Location, count/16, false, floats); break; default: - Driver->extGlUniform1iv(i, count, reinterpret_cast(floats)); + Driver->extGlUniform1iv(Location, count, reinterpret_cast(floats)); break; } #endif