shader_type canvas_item; varying vec2 world_position; uniform vec4 color : source_color; uniform float radius = 3000; uniform float amplitude = 20; uniform float tsunami_size = 0; uniform float tsunami_angle = 0; void vertex() { world_position = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy; } float wave_at(float angle) { float wave1 = amplitude/1. * sin(150. * angle + TIME); float wave2 = amplitude/2. * sin(90. * angle + 1.6 * TIME); float wave3 = amplitude/3. * sin(55. * angle + 2.3 * TIME); float wave4 = amplitude/4. * sin(35. * angle + 3.9 * TIME); return wave1 + wave2 + wave3 + wave4; } float tsunami_at(float angle) { float angle_diff = angle - tsunami_angle; angle_diff = mod(angle_diff + PI + TAU, TAU) - PI; float sinc = (sin(20. * angle_diff) / angle_diff/ 20.); float wave = pow(abs(sinc), 1.5) * tsunami_size * sign(sinc); return wave; } void fragment() { float angle = atan(world_position.y, world_position.x); float wave = wave_at(angle); float tsunami = tsunami_at(angle); if(length(world_position) < radius + wave + tsunami) { COLOR = color; } else { discard; } } //void light() { // // Called for every pixel for every light affecting the CanvasItem. // // Uncomment to replace the default light processing function with this one. //}