diff options
Diffstat (limited to 'src/render/Shader.hpp')
| -rw-r--r-- | src/render/Shader.hpp | 168 |
1 files changed, 98 insertions, 70 deletions
diff --git a/src/render/Shader.hpp b/src/render/Shader.hpp index 7bed9041..76d1235f 100644 --- a/src/render/Shader.hpp +++ b/src/render/Shader.hpp @@ -1,85 +1,113 @@ #pragma once #include "../defines.hpp" -#include <unordered_map> +#include <array> +#include <variant> -struct SShader { - ~SShader(); - - GLuint program = 0; - GLint proj = -1; - GLint color = -1; - GLint alphaMatte = -1; - GLint texType = -1; - GLint skipCM = -1; - GLint sourceTF = -1; - GLint targetTF = -1; - GLint srcTFRange = -1; - GLint dstTFRange = -1; - GLint targetPrimaries = -1; - GLint maxLuminance = -1; - GLint dstMaxLuminance = -1; - GLint dstRefLuminance = -1; - GLint sdrSaturation = -1; // sdr -> hdr saturation - GLint sdrBrightness = -1; // sdr -> hdr brightness multiplier - GLint convertMatrix = -1; - GLint tex = -1; - GLint alpha = -1; - GLint posAttrib = -1; - GLint texAttrib = -1; - GLint matteTexAttrib = -1; - GLint discardOpaque = -1; - GLint discardAlpha = -1; - GLfloat discardAlphaValue = -1; - - GLuint shaderVao = 0; - GLuint shaderVboPos = 0; - GLuint shaderVboUv = 0; +enum eShaderUniform : uint8_t { + SHADER_PROJ = 0, + SHADER_COLOR, + SHADER_ALPHA_MATTE, + SHADER_TEX_TYPE, + SHADER_SKIP_CM, + SHADER_SOURCE_TF, + SHADER_TARGET_TF, + SHADER_SRC_TF_RANGE, + SHADER_DST_TF_RANGE, + SHADER_TARGET_PRIMARIES, + SHADER_MAX_LUMINANCE, + SHADER_DST_MAX_LUMINANCE, + SHADER_DST_REF_LUMINANCE, + SHADER_SDR_SATURATION, + SHADER_SDR_BRIGHTNESS, + SHADER_CONVERT_MATRIX, + SHADER_TEX, + SHADER_ALPHA, + SHADER_POS_ATTRIB, + SHADER_TEX_ATTRIB, + SHADER_MATTE_TEX_ATTRIB, + SHADER_DISCARD_OPAQUE, + SHADER_DISCARD_ALPHA, + SHADER_DISCARD_ALPHA_VALUE, + SHADER_SHADER_VAO, + SHADER_SHADER_VBO_POS, + SHADER_SHADER_VBO_UV, + SHADER_TOP_LEFT, + SHADER_BOTTOM_RIGHT, + SHADER_FULL_SIZE, + SHADER_FULL_SIZE_UNTRANSFORMED, + SHADER_RADIUS, + SHADER_RADIUS_OUTER, + SHADER_ROUNDING_POWER, + SHADER_THICK, + SHADER_HALFPIXEL, + SHADER_RANGE, + SHADER_SHADOW_POWER, + SHADER_USE_ALPHA_MATTE, + SHADER_APPLY_TINT, + SHADER_TINT, + SHADER_GRADIENT, + SHADER_GRADIENT_LENGTH, + SHADER_ANGLE, + SHADER_GRADIENT2, + SHADER_GRADIENT2_LENGTH, + SHADER_ANGLE2, + SHADER_GRADIENT_LERP, + SHADER_TIME, + SHADER_DISTORT, + SHADER_WL_OUTPUT, + SHADER_CONTRAST, + SHADER_PASSES, + SHADER_VIBRANCY, + SHADER_VIBRANCY_DARKNESS, + SHADER_BRIGHTNESS, + SHADER_NOISE, - GLint topLeft = -1; - GLint bottomRight = -1; - GLint fullSize = -1; - GLint fullSizeUntransformed = -1; - GLint radius = -1; - GLint radiusOuter = -1; - GLfloat roundingPower = -1; - - GLint thick = -1; + SHADER_LAST, +}; - GLint halfpixel = -1; +struct SShader { + SShader(); + ~SShader(); - GLint range = -1; - GLint shadowPower = -1; - GLint useAlphaMatte = -1; // always inverted + GLuint program = 0; - GLint applyTint = -1; - GLint tint = -1; + std::array<GLint, SHADER_LAST> uniformLocations; - GLint gradient = -1; - GLint gradientLength = -1; - GLint angle = -1; - GLint gradient2 = -1; - GLint gradient2Length = -1; - GLint angle2 = -1; - GLint gradientLerp = -1; + float initialTime = 0; - float initialTime = 0; - GLint time = -1; - GLint distort = -1; - GLint wl_output = -1; + struct SUniformMatrix3Data { + GLsizei count = 0; + GLboolean transpose = false; + std::array<GLfloat, 9> value = {}; + }; - // Blur prepare - GLint contrast = -1; + struct SUniformMatrix4Data { + GLsizei count = 0; + GLboolean transpose = false; + std::array<GLfloat, 8> value = {}; + }; - // Blur - GLint passes = -1; // Used by `vibrancy` - GLint vibrancy = -1; - GLint vibrancy_darkness = -1; + struct SUniform4Data { + GLsizei count = 0; + std::vector<float> value; + }; - // Blur finish - GLint brightness = -1; - GLint noise = -1; + // + std::array<std::variant<std::monostate, GLint, GLfloat, std::array<GLfloat, 2>, std::array<GLfloat, 3>, std::array<GLfloat, 4>, SUniformMatrix3Data, SUniformMatrix4Data, + SUniform4Data>, + SHADER_LAST> + uniformStatus; + // - void createVao(); - void destroy(); + void createVao(); + void setUniformInt(eShaderUniform location, GLint v0); + void setUniformFloat(eShaderUniform location, GLfloat v0); + void setUniformFloat2(eShaderUniform location, GLfloat v0, GLfloat v1); + void setUniformFloat3(eShaderUniform location, GLfloat v0, GLfloat v1, GLfloat v2); + 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 destroy(); }; |
