Code:
template<typename T, Type S,int C1,int C2=0> Program::setUniform( /*No idea, other than writing out all the overloads*/);
//where T is float, int (or double for OpenGL >= 4.0)
//S is an enum which can denote ordinary, vector and matrix.
The whole list of functions the single template would have to cover is:
Code:
void glUniform1f(GLint location, GLfloat v0);
void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
void glUniform1i(GLint location, GLint v0);
void glUniform2i(GLint location, GLint v0, GLint v1);
void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
void glUniform1fv(GLint location, GLsizei count, const GLfloat * value);
void glUniform2fv(GLint location, GLsizei count, const GLfloat * value);
void glUniform3fv(GLint location, GLsizei count, const GLfloat * value);
void glUniform4fv(GLint location, GLsizei count, const GLfloat * value);
void glUniform1iv(GLint location, GLsizei count, const GLint * value);
void glUniform2iv(GLint location, GLsizei count, const GLint * value);
void glUniform3iv(GLint location, GLsizei count, const GLint * value);
void glUniform4iv(GLint location, GLsizei count, const GLint * value);
void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);