#pragma once #include inline static constexpr auto ROUNDED_SHADER_FUNC = [](const std::string colorVarName) -> std::string { return R"#( // branchless baby! highp vec2 pixCoord = vec2(gl_FragCoord); pixCoord -= topLeft + fullSize * 0.5; pixCoord *= vec2(lessThan(pixCoord, vec2(0.0))) * -2.0 + 1.0; pixCoord -= fullSize * 0.5 - radius; pixCoord += vec2(1.0, 1.0) / fullSize; // center the pix dont make it top-left if (pixCoord.x + pixCoord.y > radius) { float dist = length(pixCoord); if (dist > radius + 1.0) discard; if (dist > radius - 1.0) { float dist = length(pixCoord); float normalized = 1.0 - smoothstep(0.0, 1.0, dist - radius + 0.5); )#" + colorVarName + R"#( = )#" + colorVarName + R"#( * normalized; } } )#"; }; inline const std::string QUADVERTSRC = R"#( uniform mat3 proj; uniform vec4 color; attribute vec2 pos; attribute vec2 texcoord; attribute vec2 texcoordMatte; varying vec4 v_color; varying vec2 v_texcoord; varying vec2 v_texcoordMatte; void main() { gl_Position = vec4(proj * vec3(pos, 1.0), 1.0); v_color = color; v_texcoord = texcoord; v_texcoordMatte = texcoordMatte; })#"; inline const std::string QUADFRAGSRC = R"#( precision highp float; varying vec4 v_color; uniform vec2 topLeft; uniform vec2 fullSize; uniform float radius; void main() { vec4 pixColor = v_color; if (radius > 0.0) { )#" + ROUNDED_SHADER_FUNC("pixColor") + R"#( } gl_FragColor = pixColor; })#"; inline const std::string TEXVERTSRC = R"#( uniform mat3 proj; attribute vec2 pos; attribute vec2 texcoord; varying vec2 v_texcoord; void main() { gl_Position = vec4(proj * vec3(pos, 1.0), 1.0); v_texcoord = texcoord; })#"; inline const std::string TEXFRAGSRCRGBA = R"#( precision highp float; varying vec2 v_texcoord; // is in 0-1 uniform sampler2D tex; uniform float alpha; uniform vec2 topLeft; uniform vec2 fullSize; uniform float radius; uniform int discardOpaque; uniform int discardAlpha; uniform float discardAlphaValue; uniform int applyTint; uniform vec3 tint; void main() { vec4 pixColor = texture2D(tex, v_texcoord); if (discardOpaque == 1 && pixColor[3] * alpha == 1.0) discard; if (discardAlpha == 1 && pixColor[3] <= discardAlphaValue) discard; if (applyTint == 1) { pixColor[0] = pixColor[0] * tint[0]; pixColor[1] = pixColor[1] * tint[1]; pixColor[2] = pixColor[2] * tint[2]; } if (radius > 0.0) { )#" + ROUNDED_SHADER_FUNC("pixColor") + R"#( } gl_FragColor = pixColor * alpha; })#";