The_Dark_Side_of_Earth/water/water.gdshader

50 lines
1.3 KiB
Text
Raw Permalink Normal View History

2025-09-18 14:49:30 +02:00
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.
//}