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