screentinker/shared/Transitions/VanEck.glsl
screentinker 96b71a0d56
feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) (#204)
Client-side GL Transitions v1 across all three players with never-blank degradation: shader lib + generated manifest + real-WebGL CI, transition-as-widget normalization, persistent WebGL/GLES2 compositors (web/Tizen/native Android), image↔video wipes, SSRF-hardened media proxy, decode-gated image preload, dashboard picker. Fixes the playlist change-fingerprint that dropped transition edits. Alpha + on-device soak validated.
2026-07-20 16:45:32 -05:00

47 lines
1.6 KiB
GLSL

// Van Eck
// blurb: The next frame reconstructs from raster noise, scanline by scanline, behind an acquisition beam.
// Author: Dan (ByteTinker)
// License: MIT
// GL Transitions v1 — GLSL ES 1.0, runs unmodified in WebGL1 and Android GLES2.
uniform float lineCount; // = 300.0 [60.0..720.0]
uniform float smear; // = 0.07 [0.0..0.3]
uniform float jitter; // = 0.35 [0.0..1.0]
uniform float phosphor; // = 1.0 [0.0..1.0]
float bt_hash(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); }
vec4 transition(vec2 uv){
float gate = smoothstep(0.0, 0.04, progress);
float line = floor(uv.y * lineCount);
float ly = line / lineCount;
float j = bt_hash(vec2(line, 7.0)) * jitter;
float thresh = clamp(ly * (1.0 - jitter) + j, 0.0, 0.8);
float acq = smoothstep(thresh, thresh + 0.18, progress);
vec3 b = vec3(0.0);
float sm = smear * (1.0 - acq);
for(int i = 0; i < 6; i++){
float f = float(i) / 5.0;
b += getToColor(vec2(fract(uv.x + f * sm), uv.y)).rgb;
}
b /= 6.0;
float lum = dot(b, vec3(0.299, 0.587, 0.114));
vec3 phos = vec3(lum) * mix(vec3(1.0), vec3(1.0, 0.72, 0.25), phosphor);
b = mix(phos, b, acq);
float n = bt_hash(uv * vec2(900.0, 500.0) + floor(progress * 90.0));
b = mix(b, vec3(n) * mix(vec3(1.0), vec3(1.0, 0.72, 0.25), phosphor), (1.0 - acq) * 0.55);
vec3 a = getFromColor(uv).rgb;
float wipe = smoothstep(thresh - 0.25, thresh, progress) * gate;
vec3 res = mix(a, b, wipe);
float beam = exp(-abs(progress - thresh) * 55.0) * gate;
res += beam * vec3(1.0, 0.78, 0.34) * 0.55;
res = mix(res, getToColor(uv).rgb, smoothstep(0.96, 1.0, progress));
return vec4(res, 1.0);
}