From bc4e90ea5e462662f90c860d69aaa53b88f189c5 Mon Sep 17 00:00:00 2001
From: RunitaiLinden <davep@lindenlab.com>
Date: Mon, 2 Oct 2023 14:19:04 -0500
Subject: [PATCH] SL-20124 Wipe reflection probes when applying parcel EEP
 settings and pause updates on probes until transition completes.

---
 indra/newview/llenvironment.cpp          | 15 +++++++++++++++
 indra/newview/llreflectionmapmanager.cpp | 17 +++++++++++++++--
 indra/newview/llreflectionmapmanager.h   |  9 +++++++++
 3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index f672d2a6f13..edc7bdef5f2 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -2954,12 +2954,20 @@ void LLEnvironment::DayTransition::animate()
                 setWater(mNextInstance->getWater());
     });
 
+
+    // pause probe updates and reset reflection maps on sky change
+    gPipeline.mReflectionMapManager.pause();
+    gPipeline.mReflectionMapManager.reset();
+
     mSky = mStartSky->buildClone();
     mBlenderSky = std::make_shared<LLSettingsBlenderTimeDelta>(mSky, mStartSky, mNextInstance->getSky(), mTransitionTime);
     mBlenderSky->setOnFinished(
         [this](LLSettingsBlender::ptr_t blender) {
         mBlenderSky.reset();
 
+        // resume reflection probe updates
+        gPipeline.mReflectionMapManager.resume();
+
         if (!mBlenderSky && !mBlenderWater)
             LLEnvironment::instance().mCurrentEnvironment = mNextInstance;
         else
@@ -3550,12 +3558,19 @@ namespace
             LLSettingsSky::ptr_t target_sky(start_sky->buildClone());
             mInjectedSky->setSource(target_sky);
 
+            // clear reflection probes and pause updates during sky change
+            gPipeline.mReflectionMapManager.pause();
+            gPipeline.mReflectionMapManager.reset();
+
             mBlenderSky = std::make_shared<LLSettingsBlenderTimeDelta>(target_sky, start_sky, psky, transition);
             mBlenderSky->setOnFinished(
                 [this, psky](LLSettingsBlender::ptr_t blender) 
                 {
                     mBlenderSky.reset();
                     mInjectedSky->setSource(psky);
+
+                    // resume updating reflection probes when done animating sky
+                    gPipeline.mReflectionMapManager.resume();
                     setSky(mInjectedSky);
                     if (!mBlenderWater && (countExperiencesActive() == 0))
                     {
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index bb0bb047971..915c8893a4e 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -244,11 +244,14 @@ void LLReflectionMapManager::update()
             continue;
         }
         
-        if (probe != mDefaultProbe && !probe->isRelevant())
-        {
+        if (probe != mDefaultProbe && 
+            (!probe->isRelevant() || mPaused))
+        { // skip irrelevant probes (or all non-default probes if paused)
             continue;
         }
 
+        
+
         LLVector4a d;
 
         if (probe != mDefaultProbe)
@@ -807,6 +810,16 @@ void LLReflectionMapManager::reset()
     mReset = true;
 }
 
+void LLReflectionMapManager::pause()
+{
+    mPaused = true;
+}
+
+void LLReflectionMapManager::resume()
+{
+    mPaused = false;
+}
+
 void LLReflectionMapManager::shift(const LLVector4a& offset)
 {
     for (auto& probe : mProbes)
diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h
index 5a3901cae9f..b77a33da898 100644
--- a/indra/newview/llreflectionmapmanager.h
+++ b/indra/newview/llreflectionmapmanager.h
@@ -84,6 +84,12 @@ class alignas(16) LLReflectionMapManager
     // reset all state on the next update
     void reset();
 
+    // pause all updates other than the default probe
+    void pause();
+
+    // unpause (see pause)
+    void resume();
+
     // called on region crossing to "shift" probes into new coordinate frame
     void shift(const LLVector4a& offset);
 
@@ -191,5 +197,8 @@ class alignas(16) LLReflectionMapManager
 
     // if true, reset all probe render state on the next update (for teleports and sky changes)
     bool mReset = false;
+
+    // if true, only update the default probe
+    bool mPaused = false;
 };
 
-- 
GitLab