From b3cd4568f3a38496dc84e487e472fd377f28d8f0 Mon Sep 17 00:00:00 2001 From: loner <2788892716@qq.com> Date: Wed, 26 Nov 2025 14:36:03 +0800 Subject: [PATCH] feat(shader): Add progress_border.frag shader source file --- Shaders/frag/progress_border.frag | 67 +++++++++++++++++++++++++++ Shaders/qsb/progress_border.frag.qsb | Bin 4181 -> 3330 bytes 2 files changed, 67 insertions(+) create mode 100644 Shaders/frag/progress_border.frag diff --git a/Shaders/frag/progress_border.frag b/Shaders/frag/progress_border.frag new file mode 100644 index 00000000..331386c4 --- /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 e6e8f3153317d9ce9cd9b349c78219dac9c41438..94e1628ded1367f58f5c367fc2d042f7b5e85a55 100644 GIT binary patch literal 3330 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 Mh>rXEFKzyR7{VLA$N&HU literal 4181 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