From f240fc21961996392905c8728758b193ff0350bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Sat, 4 Dec 2010 12:25:49 +0100 Subject: [PATCH] Support QMatrix4x4 as Uniform value --- lib/kwinglutils.cpp | 18 ++++++++++++++++++ lib/kwinglutils.h | 2 ++ lib/kwinglutils_funcs.cpp | 2 ++ lib/kwinglutils_funcs.h | 2 ++ 4 files changed, 24 insertions(+) diff --git a/lib/kwinglutils.cpp b/lib/kwinglutils.cpp index 0a5d5f9c75..f8c3f7c469 100644 --- a/lib/kwinglutils.cpp +++ b/lib/kwinglutils.cpp @@ -34,6 +34,7 @@ along with this program. If not, see . #include #include #include +#include #define DEBUG_GLRENDERTARGET 0 @@ -999,6 +1000,23 @@ bool GLShader::setUniform(const char* name, const QVector4D& value) return (location >= 0); } +bool GLShader::setUniform(const char* name, const QMatrix4x4& value) +{ + const int location = uniformLocation(name); + if (location >= 0) { + GLfloat m[16]; + const qreal *data = value.constData(); + // i is column, j is row for m + for (int i = 0; i < 4; ++i) { + for (int j=0; j < 4; ++j) { + m[i*4+j] = data[j*4+i]; + } + } + glUniformMatrix4fv(location, 1, GL_FALSE, m); + } + return (location >= 0); +} + int GLShader::attributeLocation(const char* name) { int location = glGetAttribLocation(mProgram, name); diff --git a/lib/kwinglutils.h b/lib/kwinglutils.h index 2b11ac1433..1141bd938e 100644 --- a/lib/kwinglutils.h +++ b/lib/kwinglutils.h @@ -38,6 +38,7 @@ along with this program. If not, see . class QVector2D; class QVector3D; class QVector4D; +class QMatrix4x4; template< class K, class V > class QHash; @@ -252,6 +253,7 @@ class KWIN_EXPORT GLShader bool setUniform(const char* name, const QVector2D& value); bool setUniform(const char* name, const QVector3D& value); bool setUniform(const char* name, const QVector4D& value); + bool setUniform(const char* name, const QMatrix4x4& value); int attributeLocation(const char* name); bool setAttribute(const char* name, float value); /** diff --git a/lib/kwinglutils_funcs.cpp b/lib/kwinglutils_funcs.cpp index 5f007d0a30..ffe44c1e34 100644 --- a/lib/kwinglutils_funcs.cpp +++ b/lib/kwinglutils_funcs.cpp @@ -103,6 +103,7 @@ glUniform1fv_func glUniform1fv; glUniform2fv_func glUniform2fv; glUniform3fv_func glUniform3fv; glUniform4fv_func glUniform4fv; +glUniformMatrix4fv_func glUniformMatrix4fv; glValidateProgram_func glValidateProgram; glGetUniformLocation_func glGetUniformLocation; glVertexAttrib1f_func glVertexAttrib1f; @@ -260,6 +261,7 @@ void glResolveFunctions() GL_RESOLVE_WITH_EXT( glUniform2fv, glUniform2fvARB ); GL_RESOLVE_WITH_EXT( glUniform3fv, glUniform3fvARB ); GL_RESOLVE_WITH_EXT( glUniform4fv, glUniform4fvARB ); + GL_RESOLVE_WITH_EXT( glUniformMatrix4fv, glUniformMatrix4fvARB ); GL_RESOLVE_WITH_EXT( glValidateProgram, glValidateProgramARB ); GL_RESOLVE_WITH_EXT( glGetUniformLocation, glGetUniformLocationARB ); GL_RESOLVE_WITH_EXT( glVertexAttrib1f, glVertexAttrib1fARB ); diff --git a/lib/kwinglutils_funcs.h b/lib/kwinglutils_funcs.h index 6b4d9f255a..39ca572665 100644 --- a/lib/kwinglutils_funcs.h +++ b/lib/kwinglutils_funcs.h @@ -285,6 +285,7 @@ typedef GLvoid (*glUniform1fv_func)(GLint, GLsizei, const GLfloat*); typedef GLvoid (*glUniform2fv_func)(GLint, GLsizei, const GLfloat*); typedef GLvoid (*glUniform3fv_func)(GLint, GLsizei, const GLfloat*); typedef GLvoid (*glUniform4fv_func)(GLint, GLsizei, const GLfloat*); +typedef GLvoid (*glUniformMatrix4fv_func)(GLint, GLsizei, GLboolean, const GLfloat*); typedef GLvoid (*glValidateProgram_func)(GLuint); typedef GLint (*glGetUniformLocation_func)(GLuint, const GLchar*); typedef GLvoid (*glVertexAttrib1f_func)(GLuint, GLfloat); @@ -318,6 +319,7 @@ extern KWIN_EXPORT glUniform1fv_func glUniform1fv; extern KWIN_EXPORT glUniform2fv_func glUniform2fv; extern KWIN_EXPORT glUniform3fv_func glUniform3fv; extern KWIN_EXPORT glUniform4fv_func glUniform4fv; +extern KWIN_EXPORT glUniformMatrix4fv_func glUniformMatrix4fv; extern KWIN_EXPORT glValidateProgram_func glValidateProgram; extern KWIN_EXPORT glGetUniformLocation_func glGetUniformLocation; extern KWIN_EXPORT glVertexAttrib1f_func glVertexAttrib1f;