diff --git a/Shaders/frag/progress_border.frag b/Shaders/frag/progress_border.frag new file mode 100644 index 000000000..331386c4f --- /dev/null +++ b/Shaders/frag/progress_border.frag @@ -0,0 +1,67 @@ +#version 450 + +layout(location = 0) in vec2 qt_TexCoord0; +layout(location = 0) out vec4 fragColor; + +layout(binding = 1) uniform sampler2D source; + +layout(std140, binding = 0) uniform buf { + mat4 qt_Matrix; + float qt_Opacity; + float progress; + float borderWidth; + vec4 progressColor; + vec4 borderColor; + vec4 backgroundColor; + float borderRadius; +} ubuf; + +void main() { + vec2 coord = qt_TexCoord0; + float p = clamp(ubuf.progress, 0.0, 1.0); + + if (ubuf.borderRadius > 0.0) { + // Circular progress + vec2 center = vec2(0.5, 0.5); + vec2 dir = coord - center; + float dist = length(dir); + + float outerRadius = 0.5; + float innerRadius = outerRadius - ubuf.borderWidth; + + float angle = atan(dir.y, dir.x) + radians(90.0); + if (angle < 0.0) angle += radians(360.0); + float maxAngle = radians(360.0) * p; + + bool inBorder = dist >= innerRadius && dist <= outerRadius; + bool inProgress = inBorder && angle <= maxAngle; + + if (inProgress) { + fragColor = ubuf.progressColor * ubuf.qt_Opacity; + } else if (inBorder) { + fragColor = ubuf.borderColor * ubuf.qt_Opacity; + } else if (dist < innerRadius) { + fragColor = ubuf.backgroundColor * ubuf.qt_Opacity; + } else { + fragColor = vec4(0.0, 0.0, 0.0, 0.0); + } + } else { + // Rectangular progress + bool inBorder = + coord.x < ubuf.borderWidth || + coord.x > (1.0 - ubuf.borderWidth) || + coord.y < ubuf.borderWidth || + coord.y > (1.0 - ubuf.borderWidth); + + float progressPos = p; + bool inProgress = inBorder && coord.x <= progressPos; + + if (inProgress) { + fragColor = ubuf.progressColor * ubuf.qt_Opacity; + } else if (inBorder) { + fragColor = ubuf.borderColor * ubuf.qt_Opacity; + } else { + fragColor = ubuf.backgroundColor * ubuf.qt_Opacity; + } + } +} \ No newline at end of file diff --git a/Shaders/qsb/progress_border.frag.qsb b/Shaders/qsb/progress_border.frag.qsb index e6e8f3153..94e1628de 100644 Binary files a/Shaders/qsb/progress_border.frag.qsb and b/Shaders/qsb/progress_border.frag.qsb differ