1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00
Files
bbedward 0511cd19df qs: numerous performance optimizations
- ClippingRectangle usages
- Asynchronous loader usages
- Replace cava visualizers with shaders
2026-07-07 16:11:11 -04:00

88 lines
2.7 KiB
GLSL

#version 450
layout(location = 0) in vec2 qt_TexCoord0;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {
mat4 qt_Matrix;
float qt_Opacity;
float phase;
float spin;
float sizePx;
float baseRadiusPx;
float amplitudePx;
float activation;
float energy;
vec2 bandsB;
vec4 bandsA;
vec4 fillColor;
} ubuf;
const float TAU = 6.28318530718;
const float NOISE_FREQ = 1.25;
const float ORBIT_RADIUS = 1.0;
const float WARP_STRENGTH = 0.75;
const float RING_BIAS = 0.25;
const float MID_FREQ = 2.4;
const float MID_GAIN = 0.34;
const float HIGH_FREQ = 5.0;
const float HIGH_GAIN = 0.16;
const float LOBE_MAX = 1.3;
float hash(vec2 p) {
p = fract(p * vec2(123.34, 456.21));
p += dot(p, p + 45.32);
return fract(p.x * p.y);
}
float vnoise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
vec2 u = f * f * (3.0 - 2.0 * f);
float a = hash(i);
float b = hash(i + vec2(1.0, 0.0));
float c = hash(i + vec2(0.0, 1.0));
float d = hash(i + vec2(1.0, 1.0));
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}
float fbm(vec2 p) {
return 0.55 * vnoise(p) + 0.3 * vnoise(p * 2.0 + vec2(17.1, 9.2)) + 0.15 * vnoise(p * 3.9 + vec2(4.3, 21.7));
}
void main() {
vec2 p = (qt_TexCoord0 - 0.5) * ubuf.sizePx;
float r = length(p);
float aa = max(fwidth(r), 0.75);
float T = ubuf.phase * TAU;
vec2 dir = r > 0.001 ? p / r : vec2(1.0, 0.0);
float cs = cos(ubuf.spin);
float sn = sin(ubuf.spin);
dir = vec2(dir.x * cs - dir.y * sn, dir.x * sn + dir.y * cs);
vec2 q = dir * NOISE_FREQ;
vec2 orbitA = vec2(cos(T), sin(T)) * ORBIT_RADIUS;
vec2 orbitB = vec2(cos(2.0 * T + 2.1), sin(2.0 * T + 2.1)) * (ORBIT_RADIUS * 0.6);
float w1 = fbm(q + orbitA);
float w2 = fbm(q * 1.3 + orbitB + vec2(3.7, 7.3));
float n = fbm(q + orbitA + WARP_STRENGTH * (vec2(w1, w2) - 0.5));
float mid = max(ubuf.bandsA.z, ubuf.bandsA.w);
float high = max(ubuf.bandsB.x, ubuf.bandsB.y);
vec2 orbitM = vec2(cos(3.0 * T + 0.7), sin(3.0 * T + 0.7)) * 0.9;
vec2 orbitH = vec2(cos(5.0 * T + 4.2), sin(5.0 * T + 4.2)) * 1.2;
float midTerm = (vnoise(dir * MID_FREQ + orbitM) - 0.5) * MID_GAIN * mid;
float highTerm = (vnoise(dir * HIGH_FREQ + orbitH) - 0.5) * HIGH_GAIN * high;
float shaped = smoothstep(0.34, 0.7, n);
float body = ubuf.energy * (RING_BIAS + (1.0 - RING_BIAS) * shaped);
float lobe = clamp(body + midTerm + highTerm, 0.0, LOBE_MAX);
float blobR = ubuf.baseRadiusPx + ubuf.activation * ubuf.amplitudePx * lobe;
float mask = 1.0 - smoothstep(-aa, aa, r - blobR);
float a = ubuf.fillColor.a * mask * ubuf.qt_Opacity;
fragColor = vec4(ubuf.fillColor.rgb * a, a);
}