mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-29 15:01:23 +00:00
dd1110ca5c
Same issue as the previous commit, int+float is error, and pow() only works on floats.
44 lines
1.3 KiB
GLSL
44 lines
1.3 KiB
GLSL
uniform float u_time;
|
|
uniform vec2 u_mouse;
|
|
uniform sampler2D u_texture1;
|
|
|
|
#define PI 3.141592654
|
|
|
|
float decay(float v, float t)
|
|
{
|
|
return v * (1.0 / (1.0 + t*t));
|
|
}
|
|
|
|
void mainImage(out vec4 fragColor, in vec2 fragCoord, in vec2 resolution, in vec2 uv)
|
|
{
|
|
// Temporary to loop time every 1 sec
|
|
float time = u_time;
|
|
// we normalize all the effects according to the min height/width
|
|
float size = min(resolution.x, resolution.y);
|
|
|
|
// Animate one wave over size in 0.3 sec
|
|
float wave_speed = size / 0.3;
|
|
float wave_length = size / 1.0;
|
|
float wave_height = size * 0.1;
|
|
|
|
vec2 center = u_mouse;
|
|
vec2 direction_from_center = fragCoord - center;
|
|
float distance_from_center = length(direction_from_center);
|
|
|
|
/* Normalize direction */
|
|
direction_from_center = direction_from_center / distance_from_center;
|
|
|
|
float propagation_length = time * wave_speed;
|
|
|
|
float t = (propagation_length - distance_from_center) / wave_length;
|
|
float offset_magnitude = 0.0;
|
|
if (t > 0.0)
|
|
offset_magnitude = decay(wave_height * sin(t * 2.0 * PI), t);
|
|
|
|
vec2 offset = direction_from_center * min(offset_magnitude, distance_from_center);
|
|
vec2 source = fragCoord - offset;
|
|
|
|
vec2 uv2 = source / resolution;
|
|
fragColor = GskTexture(u_texture1, vec2(uv2.x, 1.0-uv2.y));
|
|
}
|