From d0af1ca7cb2174c479139692ed764ccaca92a8d5 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Fri, 16 Dec 2022 13:35:16 -0600
Subject: [PATCH] SL-18780 Feedback cloud coverage into reflection probe
 ambiance to recover legacy behavior of cloud coverage brightening ambient
 lighting without destroying the ability to have good probe driven ambiance.

---
 indra/llinventory/llsettingssky.cpp      | 10 ++++++++++
 indra/llinventory/llsettingssky.h        |  4 ++++
 indra/newview/llreflectionmapmanager.cpp |  2 +-
 indra/newview/llsettingsvo.cpp           |  3 ++-
 4 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index d4e616abc2d..4004793ffdb 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -1437,6 +1437,16 @@ F32 LLSettingsSky::getReflectionProbeAmbiance() const
     return mSettings[SETTING_REFLECTION_PROBE_AMBIANCE].asReal();
 }
 
+F32 LLSettingsSky::getTotalReflectionProbeAmbiance() const
+{
+    // feed cloud shadow back into reflection probe ambiance to mimic pre-reflection-probe behavior 
+    // without brightening dark/interior spaces
+    F32 probe_ambiance = getReflectionProbeAmbiance();
+    probe_ambiance += (1.f - probe_ambiance) * getCloudShadow()*0.5f;
+
+    return probe_ambiance;
+}
+
 F32 LLSettingsSky::getSkyBottomRadius() const
 {
     return mSettings[SETTING_SKY_BOTTOM_RADIUS].asReal();
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index 715d31518b9..b17b32ebb13 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -133,8 +133,12 @@ class LLSettingsSky: public LLSettingsBase
     F32 getSkyDropletRadius() const;
     F32 getSkyIceLevel() const;
 
+    // get the probe ambiance setting as stored in the sky settings asset
     F32 getReflectionProbeAmbiance() const;
 
+    // get the probe ambiance setting to use for rendering (adjusted by cloud shadow, aka cloud coverage)
+    F32 getTotalReflectionProbeAmbiance() const;
+
     // Return first (only) profile layer represented in LLSD
     LLSD getRayleighConfig() const;
     LLSD getMieConfig() const;
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 088b83a8e92..1472abcec2e 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -695,7 +695,7 @@ void LLReflectionMapManager::updateUniforms()
     LLEnvironment& environment = LLEnvironment::instance();
     LLSettingsSky::ptr_t psky = environment.getCurrentSky();
 
-    F32 minimum_ambiance = psky->getReflectionProbeAmbiance();
+    F32 minimum_ambiance = psky->getTotalReflectionProbeAmbiance();
 
     for (auto* refmap : mReflectionMaps)
     {
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 59cfb4f0c46..870ac6bd5a5 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -717,7 +717,8 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
     shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, linearColor3v(getAmbientColor()/3.f)); // note magic number 3.f comes from SLIDER_SCALE_SUN_AMBIENT
     shader->uniform3fv(LLShaderMgr::SUNLIGHT_LINEAR, linearColor3v(getSunlightColor()));
     shader->uniform3fv(LLShaderMgr::MOONLIGHT_LINEAR,linearColor3v(getMoonlightColor()));
-    shader->uniform1f(LLShaderMgr::REFLECTION_PROBE_AMBIANCE, getReflectionProbeAmbiance());
+
+    shader->uniform1f(LLShaderMgr::REFLECTION_PROBE_AMBIANCE, getTotalReflectionProbeAmbiance());
 
     shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, getIsSunUp() ? 1 : 0);
     shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());
-- 
GitLab