50 lines
1.3 KiB
Text
50 lines
1.3 KiB
Text
|
|
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.
|
||
|
|
//}
|