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; }