diff --git a/config.js b/config.js index 773096c..12aa538 100644 --- a/config.js +++ b/config.js @@ -136,9 +136,17 @@ window.CONFIG = { intensity: 1.0, maxAlpha: 0.45, speed: 0.35 // slow drifting flakes + }, + lightning: { + enabled: true, + gain: 1.2, // brightness of one flash + minDelayS: 8, // minimum delay between storm flashes + maxDelayS: 45, // maximum delay between storm flashes + doubleFlash: true // some flashes flicker twice } // weatherEffects: { enabled: false } // weatherEffects: { rain: { maxAlpha: 0.55, speed: 1.4 }, snow: { enabled: false } } + // weatherEffects: { lightning: { gain: 2.0, minDelayS: 3, maxDelayS: 12 } } }, // ------------------------------------------------------------------ diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 5df65e0..cf6a709 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -6034,6 +6034,46 @@ var WEATHER_RAIN_ALPHA = (typeof WEATHER_RAIN_CFG.maxAlpha === 'number') ? Math. var WEATHER_SNOW_ALPHA = (typeof WEATHER_SNOW_CFG.maxAlpha === 'number') ? Math.max(0, Math.min(1, WEATHER_SNOW_CFG.maxAlpha)) : 0.45; var WEATHER_RAIN_SPEED = (typeof WEATHER_RAIN_CFG.speed === 'number') ? Math.max(0.1, WEATHER_RAIN_CFG.speed) : 1.0; var WEATHER_SNOW_SPEED = (typeof WEATHER_SNOW_CFG.speed === 'number') ? Math.max(0.05, WEATHER_SNOW_CFG.speed) : 0.35; +var WEATHER_LIGHTNING_CFG = WEATHER_FX_CFG.lightning || {}; +var WEATHER_LIGHTNING_ON = WEATHER_LIGHTNING_CFG.enabled !== false; +var WEATHER_LIGHTNING_GAIN = (typeof WEATHER_LIGHTNING_CFG.gain === 'number') ? Math.max(0, WEATHER_LIGHTNING_CFG.gain) : 1.2; +var WEATHER_LIGHTNING_MIN_DELAY = (typeof WEATHER_LIGHTNING_CFG.minDelayS === 'number') ? Math.max(0.5, WEATHER_LIGHTNING_CFG.minDelayS) : 8; +var WEATHER_LIGHTNING_MAX_DELAY = (typeof WEATHER_LIGHTNING_CFG.maxDelayS === 'number') ? Math.max(WEATHER_LIGHTNING_MIN_DELAY, WEATHER_LIGHTNING_CFG.maxDelayS) : 45; +var WEATHER_LIGHTNING_DOUBLE = WEATHER_LIGHTNING_CFG.doubleFlash !== false; +var lightningNextT = 0, lightningSeq = 0, lightningSeqT = 0, lightningFlash = 0; + +function updateLightning(now) { + if (!WEATHER_LIGHTNING_ON) { + lightningFlash = 0; + lightningSeq = 0; + return 0; + } + var wx = window.__currentWeather || {}; + var code = Number(wx.code || 0); + var storm = code >= 95 || window.__currentWeatherName === 'stormy'; + if (!storm) { + lightningFlash = 0; + lightningSeq = 0; + return 0; + } + if (now > lightningNextT) { + lightningSeq = 1 + (WEATHER_LIGHTNING_DOUBLE && Math.random() < 0.45 ? 1 : 0); + lightningSeqT = now; + lightningNextT = now + WEATHER_LIGHTNING_MIN_DELAY + + Math.random() * (WEATHER_LIGHTNING_MAX_DELAY - WEATHER_LIGHTNING_MIN_DELAY); + } + var flash = 0; + if (lightningSeq > 0) { + var dt = now - lightningSeqT; + var f1 = Math.exp(-dt * 12.0); + var f2 = lightningSeq > 1 ? Math.exp(-Math.max(0.0, dt - 0.12) * 10.0) : 0.0; + flash = Math.max(f1, f2 * 0.75); + if (dt > 1.2) lightningSeq = 0; + } + lightningFlash = flash; + return flash; +} + var weatherProg = null, weatherU = null; var WEATHER_VERT_SRC = [ @@ -6310,6 +6350,13 @@ window.clouds3dRender = function(target) { _moonI *= _exp; _amb *= _exp; } + var _lightning = updateLightning(now); + if (_lightning > 0.001) { + var _lightningGain = WEATHER_LIGHTNING_GAIN * _lightning; + _amb += _lightningGain * 0.85; + _beamL += _lightningGain * 0.35; + _beam = mixRgb(_beam, [0.82, 0.88, 1.0], Math.min(0.75, _lightning)); + } var _terrainHazeColor = hazeColorDynamic(TERRAIN_HAZE_COLOR, _air, _amb, _star, _moonI); var _frontHazeColor = hazeColorDynamic(FRONT_HAZE_COLOR, _air, _amb, _star, _moonI); var _airHazeColor = hazeColorDynamic(AIR_HAZE_COLOR, _air, _amb, _star, _moonI); @@ -7267,6 +7314,12 @@ window.clouds3dRender = function(target) { // ---- Weather overlay: rain/snow ------------------------------------ if (WEATHER_FX_ON) { var _weather = weatherOverlayIntensities(); + window.__weatherFxDbg = { + rain: +_weather[0].toFixed(2), + snow: +_weather[1].toFixed(2), + lightning: +lightningFlash.toFixed(2), + code: Number((window.__currentWeather || {}).code || 0) + }; var _rainI = _weather[0]; var _snowI = _weather[1]; if (_rainI > 0.001 || _snowI > 0.001) {