Merge pull request #876 from lonerOrz/feat/shader-progress-border

feat(shader): Add progress_border.frag shader source file
This commit is contained in:
Lysec
2025-11-26 07:40:14 +01:00
committed by GitHub
2 changed files with 67 additions and 0 deletions

View File

@@ -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;
}
}
}

Binary file not shown.