SL-20124 Wipe reflection probes when applying parcel EEP settings and pause updates on probes until transition completes.

master
RunitaiLinden 2023-10-02 14:19:04 -05:00
parent 3da26ee8df
commit bc4e90ea5e
3 changed files with 39 additions and 2 deletions

View File

@ -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))
{

View File

@ -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)

View File

@ -84,6 +84,12 @@ public:
// 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 @@ private:
// 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;
};