Files
dotfiles/.config/niri/custom/animations/smoke.kdl
T

149 lines
5.3 KiB
KDL

animations {
window-open {
duration-ms 1000
curve "ease-out-cubic"
custom-shader r"
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
}
float noise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
f = 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, f.x), mix(c, d, f.x), f.y);
}
float fbm(vec2 p) {
float v = 0.0;
float amp = 0.5;
for (int i = 0; i < 6; i++) {
v += amp * noise(p);
p *= 2.0;
amp *= 0.5;
}
return v;
}
float warpedFbm(vec2 p, float t) {
vec2 q = vec2(fbm(p + vec2(0.0, 0.0)),
fbm(p + vec2(5.2, 1.3)));
vec2 r = vec2(fbm(p + 6.0 * q + vec2(1.7, 9.2) + 0.25 * t),
fbm(p + 6.0 * q + vec2(8.3, 2.8) + 0.22 * t));
vec2 s = vec2(fbm(p + 5.0 * r + vec2(3.1, 7.4) + 0.18 * t),
fbm(p + 5.0 * r + vec2(6.7, 0.9) + 0.2 * t));
return fbm(p + 6.0 * s);
}
vec4 open_color(vec3 coords_geo, vec3 size_geo) {
float p = niri_clamped_progress;
vec2 uv = coords_geo.xy;
float seed = niri_random_seed * 100.0;
float t = p * 12.0 + seed;
float fluid = warpedFbm(uv * 2.0 + seed, t);
vec2 center = uv - 0.5;
float dist = length(center * vec2(1.0, 0.7));
float appear = (1.0 - dist * 1.2) + (1.0 - fluid) * 0.7;
float reveal = smoothstep(appear + 0.5, appear - 0.5, (1.0 - p) * 1.8);
float distort_strength = (1.0 - p) * (1.0 - p) * 0.35;
vec2 wq = vec2(fbm(uv * 2.0 + vec2(0.0, t * 0.2)),
fbm(uv * 2.0 + vec2(5.2, t * 0.2)));
vec2 wr = vec2(fbm(uv * 2.0 + 4.0 * wq + vec2(1.7, 9.2)),
fbm(uv * 2.0 + 4.0 * wq + vec2(8.3, 2.8)));
vec2 warped_uv = uv + (wr - 0.5) * distort_strength;
vec3 tex_coords = niri_geo_to_tex * vec3(warped_uv, 1.0);
vec4 color = texture2D(niri_tex, tex_coords.st);
return color * reveal;
}
"
}
window-close{
duration-ms 1000
curve "ease-out-cubic"
custom-shader r"
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
}
float noise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
f = 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, f.x), mix(c, d, f.x), f.y);
}
float fbm(vec2 p) {
float v = 0.0;
float amp = 0.5;
for (int i = 0; i < 6; i++) {
v += amp * noise(p);
p *= 2.0;
amp *= 0.5;
}
return v;
}
float warpedFbm(vec2 p, float t) {
vec2 q = vec2(fbm(p + vec2(0.0, 0.0)),
fbm(p + vec2(5.2, 1.3)));
vec2 r = vec2(fbm(p + 6.0 * q + vec2(1.7, 9.2) + 0.25 * t),
fbm(p + 6.0 * q + vec2(8.3, 2.8) + 0.22 * t));
vec2 s = vec2(fbm(p + 5.0 * r + vec2(3.1, 7.4) + 0.18 * t),
fbm(p + 5.0 * r + vec2(6.7, 0.9) + 0.2 * t));
return fbm(p + 6.0 * s);
}
vec4 close_color(vec3 coords_geo, vec3 size_geo) {
float p = niri_clamped_progress;
vec2 uv = coords_geo.xy;
float seed = niri_random_seed * 100.0;
float t = p * 12.0 + seed;
float fluid = warpedFbm(uv * 2.0 + seed, t);
vec2 center = uv - 0.5;
float dist = length(center * vec2(1.0, 0.7));
float dissolve = (1.0 - dist) * 1.2 + fluid * 0.7;
float remain = smoothstep(dissolve + 0.5, dissolve - 0.5, p * 1.8);
float distort_strength = p * p * 0.4;
vec2 wq = vec2(fbm(uv * 2.0 + vec2(0.0, t * 0.2)),
fbm(uv * 2.0 + vec2(5.2, t * 0.2)));
vec2 wr = vec2(fbm(uv * 2.0 + 4.0 * wq + vec2(1.7, 9.2)),
fbm(uv * 2.0 + 4.0 * wq + vec2(8.3, 2.8)));
vec2 warped_uv = uv + (wr - 0.5) * distort_strength;
vec3 tex_coords = niri_geo_to_tex * vec3(warped_uv, 1.0);
vec4 color = texture2D(niri_tex, tex_coords.st);
float tail = smoothstep(1.0, 0.8, p);
return color * remain * tail;
}
"
}
}