summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorMozzarella32 <143010987+Mozzarella32@users.noreply.github.com>2025-10-18 13:34:33 +0200
committerGitHub <noreply@github.com>2025-10-18 13:34:33 +0200
commit6607c6440d4e3e7313e421f6258b52e6b7982170 (patch)
tree3551cc4153d22a354c64335e8e4460b277ce9c62 /src/render
parentf3e13193a610bbcc36960ded8a25793bcff873b6 (diff)
renderer: add 1fv and 2fv uniform support (#12080)
Diffstat (limited to 'src/render')
-rw-r--r--src/render/Shader.cpp25
-rw-r--r--src/render/Shader.hpp11
2 files changed, 29 insertions, 7 deletions
diff --git a/src/render/Shader.cpp b/src/render/Shader.cpp
index 60a27092..5081d4c4 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<float> value) {
+void SShader::setUniformfv(eShaderUniform location, GLsizei count, const std::vector<float>& value, GLsizei vec_size) {
if (uniformLocations.at(location) == -1)
return;
auto& cached = uniformStatus.at(location);
if (cached.index() != 0) {
- auto val = std::get<SUniform4Data>(cached);
+ auto val = std::get<SUniformVData>(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<float>& value) {
+ setUniformfv(location, count, value, 1);
+}
+
+void SShader::setUniform2fv(eShaderUniform location, GLsizei count, const std::vector<float>& value) {
+ setUniformfv(location, count, value, 2);
+}
+
+void SShader::setUniform4fv(eShaderUniform location, GLsizei count, const std::vector<float>& value) {
+ setUniformfv(location, count, value, 4);
}
void SShader::destroy() {
diff --git a/src/render/Shader.hpp b/src/render/Shader.hpp
index 88651302..780b7fa8 100644
--- a/src/render/Shader.hpp
+++ b/src/render/Shader.hpp
@@ -89,14 +89,14 @@ struct SShader {
std::array<GLfloat, 8> value = {};
};
- struct SUniform4Data {
+ struct SUniformVData {
GLsizei count = 0;
std::vector<float> value;
};
//
std::array<std::variant<std::monostate, GLint, GLfloat, std::array<GLfloat, 2>, std::array<GLfloat, 3>, std::array<GLfloat, 4>, 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<GLfloat, 9> value);
void setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array<GLfloat, 8> value);
- void setUniform4fv(eShaderUniform location, GLsizei count, std::vector<float> value);
+ void setUniform1fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
+ void setUniform2fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
+ void setUniform4fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
void destroy();
+
+ private:
+ void setUniformfv(eShaderUniform location, GLsizei count, const std::vector<float>& value, GLsizei vec_size);
};