Solara-Shaders/shaders/lib/vertex/waving.glsl
2024-06-22 15:15:55 -04:00

133 lines
3.9 KiB
GLSL

const float pi = 3.1415927;
float pi2wt = 6.2831854 * (frametime * 24.0);
float GetNoise(vec2 pos) {
return fract(sin(dot(pos, vec2(12.9898, 4.1414))) * 43758.5453);
}
float Noise2D(vec2 pos) {
vec2 flr = floor(pos);
vec2 frc = fract(pos);
frc = frc * frc * (3.0 - 2.0 * frc);
float n00 = GetNoise(flr);
float n01 = GetNoise(flr + vec2(0.0, 1.0));
float n10 = GetNoise(flr + vec2(1.0, 0.0));
float n11 = GetNoise(flr + vec2(1.0, 1.0));
float n0 = mix(n00, n01, frc.y);
float n1 = mix(n10, n11, frc.y);
return mix(n0, n1, frc.x) - 0.5;
}
vec3 CalcMove(vec3 pos, float density, float speed, vec2 mult) {
pos = pos * density + frametime * speed;
vec3 wave = vec3(Noise2D(pos.yz), Noise2D(pos.xz + 0.333), Noise2D(pos.xy + 0.667));
return wave * vec3(mult, mult.x);
}
float CalcLilypadMove(vec3 worldpos) {
float wave = sin(2 * pi * (frametime * 0.7 + worldpos.x * 0.14 + worldpos.z * 0.07)) +
sin(2 * pi * (frametime * 0.5 + worldpos.x * 0.10 + worldpos.z * 0.20));
return wave * 0.0125;
}
float CalcLavaMove(vec3 worldpos) {
float fy = fract(worldpos.y + 0.005);
if (fy > 0.01) {
float wave = sin(pi * (frametime * 0.7 + worldpos.x * 0.14 + worldpos.z * 0.07)) +
sin(pi * (frametime * 0.5 + worldpos.x * 0.10 + worldpos.z * 0.20));
return wave * 0.0125;
} else return 0.0;
}
vec3 CalcLanternMove(vec3 position) {
vec3 frc = fract(position);
frc = vec3(frc.x - 0.5, fract(frc.y - 0.001) - 1.0, frc.z - 0.5);
vec3 flr = position - frc;
float offset = flr.x * 2.4 + flr.y * 2.7 + flr.z * 2.2;
float rmult = pi * 0.016;
float rx = sin(frametime + offset) * rmult;
float ry = sin(frametime * 1.7 + offset) * rmult;
float rz = sin(frametime * 1.4 + offset) * rmult;
mat3 rotx = mat3(
1, 0, 0,
0, cos(rx), -sin(rx),
0, sin(rx), cos(rx)
);
mat3 roty = mat3(
cos(ry), 0, sin(ry),
0, 1, 0,
-sin(ry), 0, cos(ry)
);
mat3 rotz = mat3(
cos(rz), -sin(rz), 0,
sin(rz), cos(rz), 0,
0, 0, 1
);
frc = rotx * roty * rotz * frc;
return flr + frc - position;
}
vec3 WavingBlocks(vec3 position, int blockID, float istopv) {
vec3 wave = vec3(0.0);
vec3 worldpos = position + cameraPosition;
#ifdef WAVING_GRASS
if (blockID == 100 && istopv > 0.9)
wave += CalcMove(worldpos, 0.35, 1.0, vec2(0.25, 0.06));
#endif
#ifdef WAVING_CROP
if (blockID == 104 && (istopv > 0.9 || fract(worldpos.y + 0.0675) > 0.01))
wave += CalcMove(worldpos, 0.35, 1.0, vec2(0.15, 0.06));
#endif
#ifdef WAVING_PLANT
if (blockID == 101 && (istopv > 0.9 || fract(worldpos.y + 0.005) > 0.01))
wave += CalcMove(worldpos, 0.7, 1.35, vec2(0.12, 0.00));
if (blockID == 107 || blockID == 207)
wave += CalcMove(worldpos, 0.5, 1.25, vec2(0.06, 0.00));
if (blockID == 108)
wave.y += CalcLilypadMove(worldpos);
#endif
#ifdef WAVING_TALL_PLANT
if (blockID == 102 && (istopv > 0.9 || fract(worldpos.y + 0.005) > 0.01) ||
blockID == 103)
wave += CalcMove(worldpos, 0.35, 1.15, vec2(0.15, 0.06));
#endif
#ifdef WAVING_LEAF
if (blockID == 105)
wave += CalcMove(worldpos, 0.25, 1.0, vec2(0.08, 0.08));
#endif
#ifdef WAVING_VINE
if (blockID == 106)
wave += CalcMove(worldpos, 0.35, 1.25, vec2(0.06, 0.06));
#endif
#ifdef WAVING_LAVA
if (blockID == 203)
wave.y += CalcLavaMove(worldpos);
#endif
#ifdef WAVING_FIRE
if (blockID == 204 && istopv > 0.9)
wave += CalcMove(worldpos, 1.0, 1.5, vec2(0.0, 0.37));
#endif
#ifdef WAVING_LANTERN
if (blockID == 206)
wave += CalcLanternMove(worldpos);
#endif
position += wave;
return position;
}