extern Image scene; extern number time; extern vec2 resolution; extern vec2 splashCenter; extern number splashTime; float getOffsetStrength(float t, vec2 dir) { float maxRadius = 0.3; float d = length(dir) - maxRadius * t; d *= 1.0 - smoothstep(0.0, 0.05, abs(d)); d *= smoothstep(0.0, 0.05, t); d *= 1.0 - smoothstep(0.5, 1.0, t); return d; } vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { vec2 uv = screen_coords / resolution; // waves float x = sin(uv.y * 2.56) * 0.05 * sin(time * 0.4); float y = sin(uv.x * 2.56) * 0.05 * cos(time * 0.4); vec2 offset = vec2(x, y); // shockwave vec2 dir = splashCenter - uv; float dist = length(dir); float t = splashTime * (1.0 - smoothstep(0.0, 0.3, dist)); t = pow(max(0.0, t), 1.0 / 1.5); float rD = getOffsetStrength(t + 0.02, dir); float gD = getOffsetStrength(t, dir); float bD = getOffsetStrength(t - 0.02, dir); dir = normalize(dir + vec2(0.0001)); vec2 uvR = clamp(uv + offset + dir * rD, vec2(0.0, 0.0), vec2(1.0, 1.0)); vec2 uvG = clamp(uv + offset + dir * gD, vec2(0.0, 0.0), vec2(1.0, 1.0)); vec2 uvB = clamp(uv + offset + dir * bD, vec2(0.0, 0.0), vec2(1.0, 1.0)); float red = Texel(scene, uvR).r; float green = Texel(scene, uvG).g; float blue = Texel(scene, uvB).b; vec4 col = vec4(red, green, blue, color.a); float shading = gD * 8.0; col.rgb += shading; return col; }