summaryrefslogtreecommitdiff
path: root/shaders/liquid.glsl
blob: 90782481093519b48603bcc825e5aeffa5795781 (plain)
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;
}