diff --git a/config.js b/config.js index 178f3eb..08ff298 100644 --- a/config.js +++ b/config.js @@ -316,8 +316,16 @@ window.CONFIG = { physicalSky: true, // Rayleigh sky scattering instead of pure theme gradient rayleighGain: 8.0, // exposure for the physical sky term distanceFog: false, // legacy aerial perspective is off + haze: { + enabled: true, + heightKm: 60, + scaleHeightKm: 8.5, + density: 0.25, + grayTau: 1.2, + gain: 1.0 + }, model: { - enabled: false // volumetric atmosphere/fog removed + enabled: false // legacy full atmosphere model remains off }, hazeResidual: 0.30, // surface colour surviving at the full fog distance cloudBrightness: 1.0, // cloud albedo (theme hue, brightness from the model) diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 9b50573..39de683 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -364,7 +364,7 @@ var FRAG_SRC = [ 'for (int i = 0; i < 32; i++) {', 'vec3 p = ro + rd * t;', 'float alt = max(0.0, length(p - C) - R);', - 'float dens = exp(-alt / Hs);', + 'float dens = exp(-alt / Hs) / Hs;', 'float dtau = uAtmoDensity * dens * step;', 'float transBefore = exp(-tau);', 'float grayMix = clamp(tau / max(0.01, uAtmoGrayTau), 0.0, 1.0);', @@ -2427,19 +2427,32 @@ var ATMO_HAZE_RESIDUAL = (typeof ATMO.hazeResidual === 'number') ? Math.max(0.02, Math.min(0.95, ATMO.hazeResidual)) : 0.30; var ATMO_DISTANCE_FOG = ATMO.distanceFog !== false; var ATMO_MODEL = ATMO.model || {}; -var ATMO_MODEL_ON = ATMO_MODEL.enabled === true; -var ATMO_MODEL_HEIGHT_KM = (typeof ATMO_MODEL.heightKm === 'number') - ? Math.max(1.0, Math.min(80.0, ATMO_MODEL.heightKm)) : 35.0; +var HAZE_CFG = ATMO.haze || {}; +var ATMO_MODEL_ON = (typeof HAZE_CFG.enabled === 'boolean') + ? HAZE_CFG.enabled + : (ATMO_MODEL.enabled === true); +var ATMO_MODEL_HEIGHT_KM = (typeof HAZE_CFG.heightKm === 'number') + ? Math.max(1.0, Math.min(120.0, HAZE_CFG.heightKm)) + : ((typeof ATMO_MODEL.heightKm === 'number') + ? Math.max(1.0, Math.min(80.0, ATMO_MODEL.heightKm)) : 60.0); var ATMO_MODEL_HEIGHT_UNITS = ATMO_MODEL_HEIGHT_KM / KM_PER_TILE; -var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof ATMO_MODEL.scaleHeightKm === 'number') - ? Math.max(1.0, Math.min(30.0, ATMO_MODEL.scaleHeightKm)) : 8.5; +var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof HAZE_CFG.scaleHeightKm === 'number') + ? Math.max(1.0, Math.min(30.0, HAZE_CFG.scaleHeightKm)) + : ((typeof ATMO_MODEL.scaleHeightKm === 'number') + ? Math.max(1.0, Math.min(30.0, ATMO_MODEL.scaleHeightKm)) : 8.5); var ATMO_MODEL_SCALE_HEIGHT_UNITS = ATMO_MODEL_SCALE_HEIGHT_KM / KM_PER_TILE; -var ATMO_MODEL_DENSITY = (typeof ATMO_MODEL.density === 'number') - ? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.12; -var ATMO_MODEL_GRAY_TAU = (typeof ATMO_MODEL.grayTau === 'number') - ? Math.max(0.1, Math.min(10.0, ATMO_MODEL.grayTau)) : 1.5; -var ATMO_MODEL_GAIN = (typeof ATMO_MODEL.gain === 'number') - ? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 2.0; +var ATMO_MODEL_DENSITY = (typeof HAZE_CFG.density === 'number') + ? Math.max(0.01, Math.min(5.0, HAZE_CFG.density)) + : ((typeof ATMO_MODEL.density === 'number') + ? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.25); +var ATMO_MODEL_GRAY_TAU = (typeof HAZE_CFG.grayTau === 'number') + ? Math.max(0.1, Math.min(10.0, HAZE_CFG.grayTau)) + : ((typeof ATMO_MODEL.grayTau === 'number') + ? Math.max(0.1, Math.min(10.0, ATMO_MODEL.grayTau)) : 1.2); +var ATMO_MODEL_GAIN = (typeof HAZE_CFG.gain === 'number') + ? Math.max(0.1, Math.min(5.0, HAZE_CFG.gain)) + : ((typeof ATMO_MODEL.gain === 'number') + ? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 1.0); var CURV_CFG = (window.CONFIG && window.CONFIG.curvature) || {}; var CURVATURE_ON = CURV_CFG.enabled !== false; var CURV_EXAG = (typeof CURV_CFG.exaggeration === 'number') @@ -6364,6 +6377,14 @@ window.clouds3dRender = function(target) { } if (ATMO_MODEL_ON) { + gl.useProgram(s.prog); + gl.bindBuffer(gl.ARRAY_BUFFER, s.buf); + gl.enableVertexAttribArray(s.aPos); + gl.vertexAttribPointer(s.aPos, 2, gl.FLOAT, false, 0, 0); + gl.disable(gl.DEPTH_TEST); + gl.depthMask(false); + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); gl.uniform1i(s.uMode, 2); gl.drawArrays(gl.TRIANGLES, 0, 3); }