mirror of
https://github.com/zoriya/noctalia-shell.git
synced 2025-12-06 06:36:15 +00:00
Merge pull request #876 from lonerOrz/feat/shader-progress-border
feat(shader): Add progress_border.frag shader source file
This commit is contained in:
67
Shaders/frag/progress_border.frag
Normal file
67
Shaders/frag/progress_border.frag
Normal 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.
Reference in New Issue
Block a user