diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 3ebd44a..f94b997 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -5440,6 +5440,8 @@ var CT2_FRAG_SRC = [ 'precision mediump float;', 'uniform float uDay;', 'uniform float uNight;', + 'uniform float uTime;', + 'uniform vec3 uCamPos;', 'varying float vU;', 'varying float vV;', 'varying float vS;', @@ -5467,23 +5469,31 @@ var CT2_FRAG_SRC = [ 'return v;', '}', 'void main() {', + 'float cDist = length(vWorld - uCamPos);', + 'float cSoft = smoothstep(8.0, 24.0, cDist);', + 'vec2 q = vec2(', + 'vWorld.x * 0.28 + vWorld.z * 0.19 + uTime * 0.015,', + 'vWorld.y * 0.55 + vWorld.z * 0.11 - uTime * 0.008', + ');', 'float side = abs(vV);', - 'float edgeNoise = fbm2(vec2(vU * 18.0, vV * 5.0));', - 'float clumpNoise = fbm2(vec2(vU * 43.0 + 11.0, vV * 11.0 - 3.0));', - 'float wob = 0.30 + 0.72 * edgeNoise;', - 'float raggedSide = side + (clumpNoise - 0.5) * 0.42;', - 'float edge = 1.0 - smoothstep(wob * 0.10, wob, raggedSide);', - 'edge *= 0.32 + 0.68 * pow(vU, 0.55);', - 'float dens = fbm2(vec2(vU * 31.0 + vV * 2.0, vU * 7.0 - vV * 4.0));', - 'dens = 0.35 + 0.75 * smoothstep(0.12, 0.78, dens);', - 'float streak = 0.65 + 0.35 * noise2(vec2(vU * 90.0, vV * 2.0));', - 'float head = 0.32 + 0.68 * vU;', - 'float a = clamp(vS * (0.25 + edge * head * dens * streak), 0.0, 0.95);', - 'if (a <= 0.002) discard;', - 'vec3 dayCol = mix(vec3(0.82, 0.84, 0.88), vec3(1.0, 1.0, 1.0), dens);', - 'vec3 nightCol = mix(vec3(0.30, 0.38, 0.55), vec3(0.58, 0.68, 0.88), dens);', + 'float edgeBase = fbm2(q * 1.15 + vec2(vU * 2.0, vV * 0.35));', + 'float edgeFine = noise2(q * 7.0 + vec2(vU * 12.0, vV * 2.5));', + 'float wob = 0.22 + 0.86 * edgeBase;', + 'float ragged = side + (edgeFine - 0.5) * 0.65 + (edgeBase - 0.5) * 0.25;', + 'float edge = 1.0 - smoothstep(wob * 0.06, wob, ragged);', + 'edge *= 0.25 + 0.75 * pow(vU, 0.45);', + 'float cloud = fbm2(q * 2.2 + vec2(vU * 3.5, vV * 0.8));', + 'float wisps = noise2(q * 9.0 + vec2(vU * 18.0, vV * 3.0));', + 'float dens = smoothstep(0.14, 0.74, cloud) * (0.45 + 0.85 * wisps);', + 'dens = mix(dens, 0.55, cSoft);', + 'float head = 0.25 + 0.75 * vU;', + 'float a = clamp(vS * edge * head * (0.18 + 1.05 * dens), 0.0, 0.95);', + 'if (a <= 0.003) discard;', + 'float shade = 0.62 + 0.48 * cloud;', + 'vec3 dayCol = vec3(0.88, 0.90, 0.94) * shade;', + 'vec3 nightCol = vec3(0.28, 0.36, 0.52) * shade;', 'vec3 col = mix(nightCol, dayCol, clamp(uDay, 0.0, 1.0));', - 'col *= 0.32 + 0.68 * clamp(uDay + uNight, 0.0, 1.0);', + 'col *= 0.30 + 0.70 * clamp(uDay + uNight, 0.0, 1.0);', 'gl_FragColor = vec4(col, a);', '}' ].join('\n'); @@ -6965,7 +6975,8 @@ window.clouds3dRender = function(target) { earthRadius: gl.getUniformLocation(c2p, 'uEarthRadius'), curvatureOn: gl.getUniformLocation(c2p, 'uCurvatureOn'), day: gl.getUniformLocation(c2p, 'uDay'), - night: gl.getUniformLocation(c2p, 'uNight') + night: gl.getUniformLocation(c2p, 'uNight'), + time: gl.getUniformLocation(c2p, 'uTime') }; } } @@ -6978,6 +6989,7 @@ window.clouds3dRender = function(target) { gl.uniform1f(ct2U.curvatureOn, CURVATURE_ON ? 1.0 : 0.0); gl.uniform1f(ct2U.day, dayf); gl.uniform1f(ct2U.night, carNight); + gl.uniform1f(ct2U.time, now); gl.enableVertexAttribArray(ct2A.pos); gl.vertexAttribPointer(ct2A.pos, 3, gl.FLOAT, false, 24, 0); gl.enableVertexAttribArray(ct2A.u);