33 lines
1.4 KiB
Plaintext
33 lines
1.4 KiB
Plaintext
// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Wind.gdshaderinc"
|
|
|
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
|
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
|
|
|
|
void applyWind(
|
|
float _TIME,
|
|
mat4 _MODEL_MATRIX,
|
|
inout vec3 _VERTEX,
|
|
float _windStrength,
|
|
vec2 _windSpeed,
|
|
float _windScale,
|
|
sampler2D _windNoise,
|
|
vec2 _windNoiseAngleOffset,
|
|
vec2 _windNoiseStrengthOffset,
|
|
float _windStart,
|
|
float _windEnd,
|
|
float _windWeightCurve,
|
|
float _windHeightCompensation
|
|
)
|
|
{
|
|
float _windAmount = normalizeToRange01( _VERTEX.y, _windStart, _windEnd );
|
|
float rawWindAmount = _windAmount;
|
|
_windAmount = mix( _windAmount, _windAmount * _windAmount, _windWeightCurve );
|
|
vec3 worldVertex = localToWorld( _VERTEX, _MODEL_MATRIX );
|
|
vec2 _windUV = _TIME * _windSpeed + worldVertex.xz * _windScale;
|
|
float angle = texture( _windNoise, _windUV + _windNoiseAngleOffset).r * PI * 2.0;
|
|
float strength = texture( _windNoise, _windUV + _windNoiseStrengthOffset ).r * _windStrength;
|
|
vec2 circle = onCircle( angle ) * strength;
|
|
_VERTEX = worldToLocal( worldVertex + vec3( circle.x, 0, circle.y ) * _windAmount, _MODEL_MATRIX );
|
|
float minY = min( _VERTEX.y, 0 );
|
|
_VERTEX.y = mix( _VERTEX.y, max( minY, _VERTEX.y - strength * _windAmount), _windHeightCompensation * 4.0f );
|
|
} |