1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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;
}
|