diff --git a/src/render/Shader.cpp b/src/render/Shader.cpp index 60a270929..5081d4c42 100644 --- a/src/render/Shader.cpp +++ b/src/render/Shader.cpp @@ -166,20 +166,37 @@ void SShader::setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLbo glUniformMatrix4x2fv(uniformLocations[location], count, transpose, value.data()); } -void SShader::setUniform4fv(eShaderUniform location, GLsizei count, std::vector value) { +void SShader::setUniformfv(eShaderUniform location, GLsizei count, const std::vector& value, GLsizei vec_size) { if (uniformLocations.at(location) == -1) return; auto& cached = uniformStatus.at(location); if (cached.index() != 0) { - auto val = std::get(cached); + auto val = std::get(cached); if (val.count == count && compareFloat(val.value, value)) return; } - cached = SUniform4Data{.count = count, .value = value}; - glUniform4fv(uniformLocations[location], count, value.data()); + cached = SUniformVData{.count = count, .value = value}; + switch (vec_size) { + case 1: glUniform1fv(uniformLocations[location], count, value.data()); break; + case 2: glUniform2fv(uniformLocations[location], count, value.data()); break; + case 4: glUniform4fv(uniformLocations[location], count, value.data()); break; + default: UNREACHABLE(); + } +} + +void SShader::setUniform1fv(eShaderUniform location, GLsizei count, const std::vector& value) { + setUniformfv(location, count, value, 1); +} + +void SShader::setUniform2fv(eShaderUniform location, GLsizei count, const std::vector& value) { + setUniformfv(location, count, value, 2); +} + +void SShader::setUniform4fv(eShaderUniform location, GLsizei count, const std::vector& value) { + setUniformfv(location, count, value, 4); } void SShader::destroy() { diff --git a/src/render/Shader.hpp b/src/render/Shader.hpp index 886513025..780b7fa8b 100644 --- a/src/render/Shader.hpp +++ b/src/render/Shader.hpp @@ -89,14 +89,14 @@ struct SShader { std::array value = {}; }; - struct SUniform4Data { + struct SUniformVData { GLsizei count = 0; std::vector value; }; // std::array, std::array, std::array, SUniformMatrix3Data, SUniformMatrix4Data, - SUniform4Data>, + SUniformVData>, SHADER_LAST> uniformStatus; // @@ -109,6 +109,11 @@ struct SShader { void setUniformFloat4(eShaderUniform location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); void setUniformMatrix3fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array value); void setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array value); - void setUniform4fv(eShaderUniform location, GLsizei count, std::vector value); + void setUniform1fv(eShaderUniform location, GLsizei count, const std::vector& value); + void setUniform2fv(eShaderUniform location, GLsizei count, const std::vector& value); + void setUniform4fv(eShaderUniform location, GLsizei count, const std::vector& value); void destroy(); + + private: + void setUniformfv(eShaderUniform location, GLsizei count, const std::vector& value, GLsizei vec_size); };