Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/lib/vertex/waving.glsl
2025-08-23 05:20:14 +02:00

96 lines
4.2 KiB
GLSL

float wavingTime = frametime * WAVING_SPEED;
const float PI = 3.1415927;
float pi2wt = 6.2831854 * (wavingTime * 24.0);
vec3 calcWave(vec3 pos, float fm, float mm, float ma, float f0, float f1, float f2, float f3, float f4, float f5) {
vec3 ret;
float magnitude, d0, d1, d2, d3;
magnitude = sin(pi2wt * fm + pos.x*0.5 + pos.z*0.5 + pos.y*0.5) * mm + ma;
d0 = sin(pi2wt * f0);
d1 = sin(pi2wt * f1);
d2 = sin(pi2wt * f2);
ret.x = sin(pi2wt*f3 + d0 + d1 - pos.x + pos.z + pos.y) * magnitude;
ret.z = sin(pi2wt*f4 + d1 + d2 + pos.x - pos.z + pos.y) * magnitude;
ret.y = sin(pi2wt*f5 + d2 + d0 + pos.z + pos.y - pos.y) * magnitude;
return ret;
}
vec3 calcMove(in vec3 pos, float f0, float f1, float f2, float f3, float f4, float f5, vec3 amp1, vec3 amp2) {
vec3 move1 = calcWave(pos , 0.0027, 0.0400, 0.0400, 0.0127, 0.0089, 0.0114, 0.0063, 0.0224, 0.0015) * amp1;
vec3 move2 = calcWave(pos+move1, 0.0348, 0.0400, 0.0400, f0, f1, f2, f3, f4, f5) * amp2;
vec3 returner = move1 + move2;
return returner;
}
float calcLilypadMove(vec3 worldPos) {
float wave = sin(2 * PI * (wavingTime*0.7 + worldPos.x * 0.14 + worldPos.z * 0.07))
+ sin(2 * PI * (wavingTime*0.5 + worldPos.x * 0.10 + worldPos.z * 0.20));
return wave * 0.0125;
}
vec3 WavingBlocks(vec3 position, float istopv, float lmCoordY) {
vec3 wave = vec3(0.0);
vec3 worldpos = position + cameraPosition;
#ifdef WAVING_CROPS
if (mc_Entity.x == 59 && (istopv > 0.9 || fract(worldpos.y + 0.0675) > 0.01)) { // Crops
if (length(position) < 2.0) wave.xz += position.xz*max(5.0/pow(max(length(position*vec3(8.0,2.0,8.0)-vec3(0.0,2.0,0.0)),2.0),1.0)-0.625,0.0);
wave += calcMove(worldpos, 0.0041, 0.0070, 0.0044, 0.0038, 0.0240, 0.0000, vec3(0.4,0.0,0.4), vec3(0.2,0.0,0.2));
}
if (mc_Entity.x == 104 && (istopv > 0.9 || fract(worldpos.y + 0.0675) > 0.01)) { // Stems
wave += calcMove(worldpos, 0.0041, 0.0070, 0.0044, 0.0038, 0.0240, 0.0000, vec3(0.1,0.4,0.1), vec3(0.05,0.2,0.05));
}
#endif
#ifdef WAVING_FOLIAGE
if (mc_Entity.x == 31 && istopv > 0.9) { // Foliage
if (length(position) < 2.0) wave.xz += position.xz*max(5.0/pow(max(length(position*vec3(8.0,2.0,8.0)-vec3(0.0,2.0,0.0)),2.0),1.0)-0.625,0.0);
wave += calcMove(worldpos, 0.0041, 0.0070, 0.0044, 0.0038, 0.0063, 0.0000, vec3(0.8,0.0,0.8), vec3(0.4,0.0,0.4));
}
if (mc_Entity.x == 175 || (mc_Entity.x == 176.0 && (istopv > 0.9 || fract(worldpos.y+0.005)>0.01))) { // Double Plants
wave += calcMove(worldpos, 0.0041, 0.005, 0.0044, 0.0038, 0.0240, 0.0000, vec3(0.8,0.1,0.8), vec3(0.4,0.0,0.4));
}
if (mc_Entity.x == 6 && (istopv > 0.9 || fract(worldpos.y + 0.005) > 0.01)) { // Plants
wave += calcMove(worldpos, 0.0041, 0.005, 0.0044, 0.0038, 0.0240, 0.0000, vec3(0.6,0.0,0.6), vec3(0.3,0.0,0.3));
}
#endif
#ifdef WAVING_LEAVES
if (mc_Entity.x == 18) // Leaves
wave += calcMove(worldpos, 0.0040, 0.0064, 0.0043, 0.0035, 0.0037, 0.0041, vec3(0.5,0.5,0.5), vec3(0.25,0.25,0.25));
#endif
#ifdef WAVING_VINES
if (mc_Entity.x == 9600) // Vines
wave += calcMove(worldpos, 0.0040, 0.0064, 0.0043, 0.0035, 0.0037, 0.0041, vec3(0.25,0.5,0.25), vec3(0.125,0.25,0.125));
#endif
#ifdef WAVING_LILY_PADS
if (mc_Entity.x == 9100) // Lily Pads
wave.y += calcLilypadMove(worldpos);
#endif
#ifdef WAVING_EVERYTHING
wave += calcWave(worldpos, 0.0027, 0.0400, 0.0400, 0.0127, 0.0089, 0.0114, 0.0063, 0.0224, 0.0015);
#endif
wave *= WAVING_INTENSITY * mix(1.0, RAIN_WAVING_INTENSITY, rainStrengthS);
#ifndef DO_WAVING_UNDERGROUND
wave *= float(lmCoordY > 0.9);
#endif
return wave;
}
float WavingWater(vec3 worldPos, float lmCoordY) {
float fractY = fract(worldPos.y + cameraPosition.y + 0.005);
worldPos += cameraPosition.xyz;
float waterWaveTime = frametime * WATER_SPEED * 0.8;
float wave = sin(6.28 * (waterWaveTime * 0.7 + worldPos.x * 0.14 + worldPos.z * 0.07)) +
sin(6.28 * (waterWaveTime * 0.5 + worldPos.x * 0.10 + worldPos.z * 0.20));
#if !defined DO_WAVING_UNDERGROUND && MC_VERSION >= 11800
wave *= float(lmCoordY > 0.9);
#endif
if (fractY > 0.01) return wave * 0.0125;
else return 0.0;
}