From 23cbc121d676687c19c41c1fd83a99205c83fcc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 28 Sep 2012 21:39:01 +0200 Subject: [PATCH] Using only RectangularMatrix in setUniform(), added remaining setters. Shader implementations now have to include Vector, Matrix and Color classes on their own. --- src/AbstractShaderProgram.h | 79 ++++++++++++++++++++++++++++++------- src/Shaders/PhongShader.h | 10 +++-- 2 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/AbstractShaderProgram.h b/src/AbstractShaderProgram.h index 355330a44..d2f23c358 100644 --- a/src/AbstractShaderProgram.h +++ b/src/AbstractShaderProgram.h @@ -21,9 +21,7 @@ #include -#include "Math/Matrix3.h" -#include "Math/Matrix4.h" -#include "Math/Vector4.h" +#include "Math/RectangularMatrix.h" #include "Magnum.h" #include "magnumVisibility.h" @@ -379,17 +377,17 @@ class MAGNUM_EXPORT AbstractShaderProgram { } /** @copydoc setUniform(GLint, GLfloat) */ - inline void setUniform(GLint location, const Vector2& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 2, GLfloat>& value) { glUniform2fv(location, 1, value.data()); } /** @copydoc setUniform(GLint, GLfloat) */ - inline void setUniform(GLint location, const Vector3& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 3, GLfloat>& value) { glUniform3fv(location, 1, value.data()); } /** @copydoc setUniform(GLint, GLfloat) */ - inline void setUniform(GLint location, const Vector4& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 4, GLfloat>& value) { glUniform4fv(location, 1, value.data()); } @@ -399,17 +397,17 @@ class MAGNUM_EXPORT AbstractShaderProgram { } /** @copydoc setUniform(GLint, GLint) */ - inline void setUniform(GLint location, const Math::Vector2& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 2, GLint>& value) { glUniform2iv(location, 1, value.data()); } /** @copydoc setUniform(GLint, GLint) */ - inline void setUniform(GLint location, const Math::Vector3& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 3, GLint>& value) { glUniform3iv(location, 1, value.data()); } /** @copydoc setUniform(GLint, GLint) */ - inline void setUniform(GLint location, const Math::Vector4& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 4, GLint>& value) { glUniform4iv(location, 1, value.data()); } @@ -427,7 +425,7 @@ class MAGNUM_EXPORT AbstractShaderProgram { * @requires_gl30 Extension @extension{EXT,gpu_shader4} * @requires_gles30 (no extension providing this functionality) */ - inline void setUniform(GLint location, const Math::Vector2& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 2, GLuint>& value) { glUniform2uiv(location, 1, value.data()); } @@ -436,7 +434,7 @@ class MAGNUM_EXPORT AbstractShaderProgram { * @requires_gl30 Extension @extension{EXT,gpu_shader4} * @requires_gles30 (no extension providing this functionality) */ - inline void setUniform(GLint location, const Math::Vector3& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 3, GLuint>& value) { glUniform3uiv(location, 1, value.data()); } @@ -445,20 +443,73 @@ class MAGNUM_EXPORT AbstractShaderProgram { * @requires_gl30 Extension @extension{EXT,gpu_shader4} * @requires_gles30 (no extension providing this functionality) */ - inline void setUniform(GLint location, const Math::Vector4& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<1, 4, GLuint>& value) { glUniform4uiv(location, 1, value.data()); } /** @copydoc setUniform(GLint, GLint) */ - inline void setUniform(GLint location, const Matrix3& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<2, 2, GLfloat>& value) { + glUniformMatrix2fv(location, 1, GL_FALSE, value.data()); + } + + /** @copydoc setUniform(GLint, GLint) */ + inline void setUniform(GLint location, const Math::RectangularMatrix<3, 3, GLfloat>& value) { glUniformMatrix3fv(location, 1, GL_FALSE, value.data()); } /** @copydoc setUniform(GLint, GLint) */ - inline void setUniform(GLint location, const Matrix4& value) { + inline void setUniform(GLint location, const Math::RectangularMatrix<4, 4, GLfloat>& value) { glUniformMatrix4fv(location, 1, GL_FALSE, value.data()); } + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<2, 3, GLfloat>& value) { + glUniformMatrix2x3fv(location, 1, GL_FALSE, value.data()); + } + + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<3, 2, GLfloat>& value) { + glUniformMatrix3x2fv(location, 1, GL_FALSE, value.data()); + } + + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<2, 4, GLfloat>& value) { + glUniformMatrix2x4fv(location, 1, GL_FALSE, value.data()); + } + + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<4, 2, GLfloat>& value) { + glUniformMatrix4x2fv(location, 1, GL_FALSE, value.data()); + } + + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<3, 4, GLfloat>& value) { + glUniformMatrix3x4fv(location, 1, GL_FALSE, value.data()); + } + + /** + * @copydoc setUniform(GLint, GLint) + * @requires_gles30 (no extension providing this functionality) + */ + inline void setUniform(GLint location, const Math::RectangularMatrix<4, 3, GLfloat>& value) { + glUniformMatrix4x3fv(location, 1, GL_FALSE, value.data()); + } + private: enum State { Initialized, diff --git a/src/Shaders/PhongShader.h b/src/Shaders/PhongShader.h index a6dd5c6dc..547f1d016 100644 --- a/src/Shaders/PhongShader.h +++ b/src/Shaders/PhongShader.h @@ -19,7 +19,9 @@ * @brief Class Magnum::Shaders::PhongShader */ +#include "Math/Matrix4.h" #include "AbstractShaderProgram.h" +#include "Color.h" #include "magnumShadersVisibility.h" @@ -44,12 +46,12 @@ class SHADERS_EXPORT PhongShader: public AbstractShaderProgram { * * If not set, default value is `(0.0f, 0.0f, 0.0f)`. */ - inline void setAmbientColorUniform(const Vector3& color) { + inline void setAmbientColorUniform(const Color3& color) { setUniform(ambientColorUniform, color); } /** @brief Diffuse color */ - inline void setDiffuseColorUniform(const Vector3& color) { + inline void setDiffuseColorUniform(const Color3& color) { setUniform(diffuseColorUniform, color); } @@ -58,7 +60,7 @@ class SHADERS_EXPORT PhongShader: public AbstractShaderProgram { * * If not set, default value is `(1.0f, 1.0f, 1.0f)`. */ - inline void setSpecularColorUniform(const Vector3& color) { + inline void setSpecularColorUniform(const Color3& color) { setUniform(specularColorUniform, color); } @@ -92,7 +94,7 @@ class SHADERS_EXPORT PhongShader: public AbstractShaderProgram { * * If not set, default value is `(1.0f, 1.0f, 1.0f)`. */ - inline void setLightColorUniform(const Vector3& color) { + inline void setLightColorUniform(const Color3& color) { setUniform(lightColorUniform, color); }