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