You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.2 KiB
55 lines
2.2 KiB
// original wind shader from https://github.com/Maujoe/godot-simple-wind-shader-2d/tree/master/assets/maujoe.simple_wind_shader_2d
|
|
// original script modified by HungryProton so that the assets are moving differently : https://pastebin.com/VL3AfV8D
|
|
//
|
|
// speed - The speed of the wind movement.
|
|
// minStrength - The minimal strength of the wind movement.
|
|
// maxStrength - The maximal strength of the wind movement.
|
|
// strengthScale - Scalefactor for the wind strength.
|
|
// interval - The time between minimal and maximal strength changes.
|
|
// detail - The detail (number of waves) of the wind movement.
|
|
// distortion - The strength of geometry distortion.
|
|
// heightOffset - The height where the wind begins to move. By default 0.0.
|
|
|
|
shader_type canvas_item;
|
|
render_mode blend_mix;
|
|
|
|
// Wind settings.
|
|
uniform float speed = 1.0;
|
|
uniform float minStrength : hint_range(0.0, 1.0) = 0.05;
|
|
uniform float maxStrength : hint_range(0.0, 1.0) = 0.01;
|
|
uniform float strengthScale = 100.0;
|
|
uniform float interval = 3.5;
|
|
uniform float detail = 1.0;
|
|
uniform float distortion : hint_range(0.0, 1.0);
|
|
uniform float heightOffset : hint_range(0.0, 1.0);
|
|
|
|
// With the offset value, you can if you want different moves for each asset. Just put a random value (1, 2, 3) in the editor. Don't forget to mark the material as unique if you use this
|
|
uniform float offset = 0;
|
|
|
|
float getWind(vec2 vertex, vec2 uv, float time){
|
|
float diff = pow(maxStrength - minStrength, 2.0);
|
|
float strength = clamp(minStrength + diff + sin(time / interval) * diff, minStrength, maxStrength) * strengthScale;
|
|
float wind = (sin(time) + cos(time * detail)) * strength * max(0.0, (1.0-uv.y) - heightOffset);
|
|
|
|
return wind;
|
|
}
|
|
|
|
float hash(vec2 p) {
|
|
return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453123);
|
|
}
|
|
|
|
float noise(vec2 x) {
|
|
vec2 p = floor(x);
|
|
vec2 f = fract(x);
|
|
f = f * f * (3.0 - 2.0 * f);
|
|
vec2 a = vec2(1.0, 0.0);
|
|
return mix(mix(hash(p + a.yy), hash(p + a.xy), f.x), mix(hash(p + a.yx), hash(p + a.xx), f.x), f.y);
|
|
}
|
|
|
|
void vertex() {
|
|
vec4 pos = MODEL_MATRIX * vec4(0.0, 0.0, 0.0, 1.0);
|
|
//float time = TIME * speed + sin(VERTEX.x * noise(VERTEX.xy) * offset);
|
|
float time = TIME * speed + sin(pos.x * offset) * cos( pos.x * offset) ;
|
|
VERTEX.x += getWind(VERTEX.xy, UV, time);
|
|
}
|