forked from AuroraMiddleware/gtk
e9885f9cde
This adds a bunch of snazz to the gltransitions demo. It is perhaps a bit overloaded now, but it demos everything that we can do. Changes: * The fire shader is now not a bin, it just renders an animating background with no textures involved. * The stacks don't all start on the same page. * The shaderbin passes the mouse coordinate to the shader. * The shaderbin allows specifying a "border" so that you can cause effects outside the bin child (something that is new to gtk4). * All the buttons and the stacks are now in shader-bins that runs a wobbly-widget effect based on the mouse position that wobbles outside the child allocation.
44 lines
1.2 KiB
GLSL
44 lines
1.2 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;
|
|
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));
|
|
}
|