31 lines
1.1 KiB
Plaintext
31 lines
1.1 KiB
Plaintext
shader_type spatial;
|
|
render_mode unshaded;
|
|
|
|
global uniform float global_wind_speed = 1.0; //0.0 = calm, 1.0 = normal, 2.0+ = strong
|
|
global uniform vec2 global_wind_direction = vec2(1.0, 0.0);
|
|
|
|
uniform float wave_frequency = 1.0;
|
|
uniform float base_amplitude = 0.5;
|
|
uniform float secondary_ratio = 0.6;
|
|
uniform float time_scale_base = 3.0;
|
|
|
|
void vertex() {
|
|
float random_seed_offset = INSTANCE_CUSTOM.x * 100.0;
|
|
float scaled_time = (TIME + random_seed_offset) * (time_scale_base * global_wind_speed);
|
|
float amplitude = base_amplitude * global_wind_speed;
|
|
|
|
vec2 wind_dir = normalize(global_wind_direction);
|
|
vec2 wind_perp = vec2(-wind_dir.y, wind_dir.x); //90° perpendicular
|
|
|
|
float primary_sway = sin(VERTEX.y * wave_frequency + scaled_time) * amplitude;
|
|
float secondary_sway = sin(VERTEX.y * wave_frequency * 1.3 + scaled_time * 0.7 + 1.57)
|
|
* (amplitude * secondary_ratio);
|
|
|
|
VERTEX.x += primary_sway * wind_dir.x + secondary_sway * wind_perp.x;
|
|
VERTEX.z += primary_sway * wind_dir.y + secondary_sway * wind_perp.y;
|
|
}
|
|
|
|
void fragment() {
|
|
ALBEDO = COLOR.rgb;
|
|
ALPHA = COLOR.a;
|
|
} |