SL-10091 EEP Filter out dupplicate refreshes and callbacks

meow-7.2.2
andreykproductengine 2018-12-05 22:13:49 +02:00
parent 031dabede8
commit 76071d4fe8
6 changed files with 135 additions and 74 deletions

View File

@ -76,6 +76,7 @@ namespace
const std::string KEY_DAYNAME("day_name");
const std::string KEY_DAYNAMES("day_names");
const std::string KEY_DAYOFFSET("day_offset");
const std::string KEY_ENVVERSION("env_version");
const std::string KEY_ISDEFAULT("is_default");
const std::string KEY_PARCELID("parcel_id");
const std::string KEY_REGIONID("region_id");
@ -329,6 +330,8 @@ const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("95882e1b-7741-f082-d9d6-3a34ec644c
const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("d8e50d02-a15b-17a7-3425-523bc20f67b8");
const S32 LLEnvironment::NO_TRACK(-1);
const S32 LLEnvironment::NO_VERSION(-3); // For viewer sided change, like ENV_LOCAL. -3 since -1 and -2 are taken by parcel initial server/viewer version
const S32 LLEnvironment::VERSION_CLEANUP(-4); // for cleanups
const F32 LLEnvironment::SUN_DELTA_YAW(F_PI); // 180deg
@ -360,6 +363,7 @@ void LLEnvironment::initSingleton()
gAgent.addParcelChangedCallback([this]() { onParcelChange(); });
//TODO: This frequently results in one more request than we need. It isn't breaking, but should be nicer.
// We need to know new env version to fix this, without it we can only do full re-request
LLRegionInfoModel::instance().setUpdateCallback([this]() { requestRegion(); });
gAgent.addRegionChangedCallback([this]() { onRegionChange(); });
@ -551,7 +555,7 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::getEnvironmentInstance(LLEnviro
}
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSettingsDay::ptr_t &pday, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset)
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSettingsDay::ptr_t &pday, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 env_version)
{
if ((env < ENV_EDIT) || (env >= ENV_DEFAULT))
{
@ -567,11 +571,11 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSe
environment->animate();
if (!mSignalEnvChanged.empty())
mSignalEnvChanged(env);
mSignalEnvChanged(env, env_version);
}
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironment::fixedEnvironment_t fixed)
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironment::fixedEnvironment_t fixed, S32 env_version)
{
if ((env < ENV_EDIT) || (env >= ENV_DEFAULT))
{
@ -595,12 +599,12 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironm
if (!mSignalEnvChanged.empty())
mSignalEnvChanged(env);
mSignalEnvChanged(env, env_version);
/*TODO: readjust environment*/
}
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSettingsBase::ptr_t &settings)
void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSettingsBase::ptr_t &settings, S32 env_version)
{
DayInstance::ptr_t environment = getEnvironmentInstance(env);
@ -647,22 +651,33 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSe
}
}
void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId)
void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId, S32 env_version)
{
setEnvironment(env, assetId, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
}
void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset)
void LLEnvironment::setEnvironment(EnvSelection_t env,
const LLUUID &assetId,
LLSettingsDay::Seconds daylength,
LLSettingsDay::Seconds dayoffset,
S32 env_version)
{
LLSettingsVOBase::getSettingsAsset(assetId,
[this, env, daylength, dayoffset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat)
[this, env, daylength, dayoffset, env_version](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat)
{
onSetEnvAssetLoaded(env, asset_id, settings, daylength, dayoffset, TRANSITION_DEFAULT, status);
onSetEnvAssetLoaded(env, asset_id, settings, daylength, dayoffset, TRANSITION_DEFAULT, status, env_version);
});
}
void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, LLSettingsBase::Seconds transition, S32 status)
void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env,
LLUUID asset_id,
LLSettingsBase::ptr_t settings,
LLSettingsDay::Seconds daylength,
LLSettingsDay::Seconds dayoffset,
LLSettingsBase::Seconds transition,
S32 status,
S32 env_version)
{
if (!settings || status)
{
@ -687,7 +702,7 @@ void LLEnvironment::clearEnvironment(LLEnvironment::EnvSelection_t env)
mEnvironments[env].reset();
if (!mSignalEnvChanged.empty())
mSignalEnvChanged(env);
mSignalEnvChanged(env, VERSION_CLEANUP);
/*TODO: readjust environment*/
}
@ -1055,7 +1070,7 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
if (!envinfo->mDayCycle)
{
clearEnvironment(ENV_PARCEL);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET, envinfo->mEnvVersion);
updateEnvironment();
}
else if (envinfo->mDayCycle->isTrackEmpty(LLSettingsDay::TRACK_WATER)
@ -1063,13 +1078,13 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
{
LL_WARNS("LAPRAS") << "Invalid day cycle for region" << LL_ENDL;
clearEnvironment(ENV_PARCEL);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET, envinfo->mEnvVersion);
updateEnvironment();
}
else
{
LL_INFOS("LAPRAS") << "Setting Region environment" << LL_ENDL;
setEnvironment(ENV_REGION, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset);
setEnvironment(ENV_REGION, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset, envinfo->mEnvVersion);
mTrackAltitudes = envinfo->mAltitudes;
}
@ -1098,7 +1113,7 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
}
else
{
setEnvironment(ENV_PARCEL, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset);
setEnvironment(ENV_PARCEL, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset, envinfo->mEnvVersion);
}
}
@ -1470,7 +1485,8 @@ LLEnvironment::EnvironmentInfo::EnvironmentInfo():
mIsDefault(false),
mIsLegacy(false),
mDayCycleName(),
mNameList()
mNameList(),
mEnvVersion(INVALID_PARCEL_ENVIRONMENT_VERSION)
{
}
@ -1526,6 +1542,17 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL
}
}
if (environment.has(KEY_ENVVERSION))
{
LLSD version = environment[KEY_ENVVERSION];
pinfo->mEnvVersion = version.asInteger();
}
else
{
// can be used for region, but versions should be same
pinfo->mEnvVersion = pinfo->mIsDefault ? UNSET_PARCEL_ENVIRONMENT_VERSION : INVALID_PARCEL_ENVIRONMENT_VERSION;
}
return pinfo;
}
@ -1746,7 +1773,7 @@ void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_
mPushEnvironmentExpId = experience_id;
onSetEnvAssetLoaded(ENV_PUSH, asset_id, settings,
LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET,
LLSettingsBase::Seconds(transition_time), status);
LLSettingsBase::Seconds(transition_time), status, NO_VERSION);
});

View File

@ -64,6 +64,8 @@ public:
static const LLUUID KNOWN_SKY_MIDNIGHT;
static const S32 NO_TRACK;
static const S32 NO_VERSION;
static const S32 VERSION_CLEANUP;
struct EnvironmentInfo
{
@ -84,6 +86,7 @@ public:
bool mIsLegacy;
std::string mDayCycleName;
namelist_t mNameList;
S32 mEnvVersion;
static ptr_t extract(LLSD);
static ptr_t extractLegacy(LLSD);
@ -106,7 +109,7 @@ public:
typedef std::pair<LLSettingsSky::ptr_t, LLSettingsWater::ptr_t> fixedEnvironment_t;
typedef std::function<void(S32, EnvironmentInfo::ptr_t)> environment_apply_fn;
typedef boost::signals2::signal<void(EnvSelection_t)> env_changed_signal_t;
typedef boost::signals2::signal<void(EnvSelection_t, S32)> env_changed_signal_t;
typedef env_changed_signal_t::slot_type env_changed_fn;
typedef std::array<F32, 4> altitude_list_t;
typedef std::vector<F32> altitudes_vect_t;
@ -135,14 +138,14 @@ public:
EnvSelection_t getSelectedEnvironment() const { return mSelectedEnvironment; }
bool hasEnvironment(EnvSelection_t env);
void setEnvironment(EnvSelection_t env, const LLSettingsDay::ptr_t &pday, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset);
void setEnvironment(EnvSelection_t env, fixedEnvironment_t fixed);
void setEnvironment(EnvSelection_t env, const LLSettingsBase::ptr_t &fixed);
void setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixed) { setEnvironment(env, fixedEnvironment_t(fixed, LLSettingsWater::ptr_t())); }
void setEnvironment(EnvSelection_t env, const LLSettingsWater::ptr_t & fixed) { setEnvironment(env, fixedEnvironment_t(LLSettingsSky::ptr_t(), fixed)); }
void setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixeds, const LLSettingsWater::ptr_t & fixedw) { setEnvironment(env, fixedEnvironment_t(fixeds, fixedw)); }
void setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset);
void setEnvironment(EnvSelection_t env, const LLUUID &assetId);
void setEnvironment(EnvSelection_t env, const LLSettingsDay::ptr_t &pday, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 env_version = NO_VERSION);
void setEnvironment(EnvSelection_t env, fixedEnvironment_t fixed, S32 env_version = NO_VERSION);
void setEnvironment(EnvSelection_t env, const LLSettingsBase::ptr_t &fixed, S32 env_version = NO_VERSION);
void setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixed, S32 env_version = NO_VERSION) { setEnvironment(env, fixedEnvironment_t(fixed, LLSettingsWater::ptr_t()), env_version); }
void setEnvironment(EnvSelection_t env, const LLSettingsWater::ptr_t & fixed, S32 env_version = NO_VERSION) { setEnvironment(env, fixedEnvironment_t(LLSettingsSky::ptr_t(), fixed), env_version); }
void setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixeds, const LLSettingsWater::ptr_t & fixedw, S32 env_version = NO_VERSION) { setEnvironment(env, fixedEnvironment_t(fixeds, fixedw), env_version); }
void setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 env_version = NO_VERSION);
void setEnvironment(EnvSelection_t env, const LLUUID &assetId, S32 env_version = NO_VERSION);
void setSharedEnvironment();
@ -381,7 +384,7 @@ private:
void onAgentPositionHasChanged(const LLVector3 &localpos);
void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, LLSettingsBase::Seconds transition, S32 status);
void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, LLSettingsBase::Seconds transition, S32 status, S32 env_version);
void onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset, altitudes_vect_t altitudes);
void handleEnvironmentPushClear(LLUUID experience_id, LLSD &message, F32 transition);

View File

@ -3281,16 +3281,18 @@ void LLPanelLandEnvironment::refresh()
setCrossRegion(true);
mCurrentEnvironment.reset();
mLastParcelId = INVALID_PARCEL_ID;
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
setControlsEnabled(false);
return;
}
if (mLastParcelId != getParcelId())
{
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
mCurrentEnvironment.reset();
}
if (!mCurrentEnvironment)
if (!mCurrentEnvironment && mCurEnvVersion <= INVALID_PARCEL_ENVIRONMENT_VERSION)
{
refreshFromSource();
return;
@ -3307,6 +3309,7 @@ void LLPanelLandEnvironment::refreshFromSource()
{
setNoEnvironmentSupport(true);
setControlsEnabled(false);
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
return;
}
setNoEnvironmentSupport(false);
@ -3315,17 +3318,25 @@ void LLPanelLandEnvironment::refreshFromSource()
{
setNoSelection(true);
setControlsEnabled(false);
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
return;
}
setNoSelection(false);
if (isSameRegion())
{
LL_DEBUGS("ENVIRONMENT") << "Requesting environment for parcel " << parcel->getLocalID() << ", known version " << mCurEnvVersion << LL_ENDL;
setCrossRegion(false);
LLHandle<LLPanel> that_h = getHandle();
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
if (mCurEnvVersion < UNSET_PARCEL_ENVIRONMENT_VERSION)
{
// to mark as requesting
mCurEnvVersion = parcel->getParcelEnvironmentVersion();
}
mLastParcelId = parcel->getLocalID();
LLEnvironment::instance().requestParcel(parcel->getLocalID(),
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo)
{
@ -3340,6 +3351,7 @@ void LLPanelLandEnvironment::refreshFromSource()
setCrossRegion(true);
mCurrentEnvironment.reset();
mLastParcelId = INVALID_PARCEL_ID;
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
}
setControlsEnabled(false);
}

View File

@ -300,8 +300,7 @@ void LLFloaterRegionInfo::onOpen(const LLSD& key)
disableTabCtrls();
return;
}
refreshFromRegion(gAgent.getRegion());
requestRegionInfo();
requestRegionInfo(); // will cause refreshFromRegion()
requestMeshRezInfo();
}
@ -484,6 +483,8 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel->setCtrlsEnabled(allow_modify);
// Note: region info also causes LLRegionInfoModel::instance().update(msg); -> requestRegion(); -> changed message
// we need to know env version here and in update(msg) to know when to request and when not to, when to filter 'changed'
floater->refreshFromRegion( gAgent.getRegion() );
}
@ -3410,7 +3411,10 @@ void LLPanelRegionEnvironment::refresh()
{
if (!mCurrentEnvironment)
{
refreshFromSource();
if (mCurEnvVersion <= INVALID_PARCEL_ENVIRONMENT_VERSION)
{
refreshFromSource(); // will immediately set mCurEnvVersion
} // else - already requesting
return;
}
@ -3426,15 +3430,17 @@ bool LLPanelRegionEnvironment::refreshFromRegion(LLViewerRegion* region)
{
setNoSelection(true);
setControlsEnabled(false);
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
}
setNoSelection(false);
if (gAgent.getRegion()->getRegionID() != region->getRegionID())
{
setCrossRegion(true);
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
}
setCrossRegion(false);
refreshFromSource();
return true;
}
@ -3448,9 +3454,15 @@ void LLPanelRegionEnvironment::refreshFromEstate()
void LLPanelRegionEnvironment::refreshFromSource()
{
LL_DEBUGS("ENVIRONMENT") << "Requesting environment for region, known version " << mCurEnvVersion << LL_ENDL;
LLHandle<LLPanel> that_h = getHandle();
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
if (mCurEnvVersion < UNSET_PARCEL_ENVIRONMENT_VERSION)
{
// to mark as requesting
mCurEnvVersion = UNSET_PARCEL_ENVIRONMENT_VERSION;
}
LLEnvironment::instance().requestRegion(
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });

View File

@ -151,7 +151,7 @@ BOOL LLPanelEnvironmentInfo::postBuild()
getChild<LLMultiSliderCtrl>(SLD_ALTITUDES)->setCommitCallback([this](LLUICtrl *cntrl, const LLSD &value) { onAltSliderCallback(cntrl, value); });
mChangeMonitor = LLEnvironment::instance().setEnvironmentChanged([this](LLEnvironment::EnvSelection_t env) { onEnvironmentChanged(env); });
mChangeMonitor = LLEnvironment::instance().setEnvironmentChanged([this](LLEnvironment::EnvSelection_t env, S32 version) { onEnvironmentChanged(env, version); });
getChild<LLSettingsDropTarget>(SDT_DROP_TARGET)->setPanel(this);
@ -389,7 +389,7 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)
S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex();
bool can_enable = enabled && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION;
bool can_enable = enabled && mCurrentEnvironment && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION;
getChild<LLUICtrl>(RDG_ENVIRONMENT_SELECT)->setEnabled(can_enable);
getChild<LLUICtrl>(RDO_USEDEFAULT)->setEnabled(can_enable && !is_legacy);
getChild<LLUICtrl>(RDO_USEINV)->setEnabled(false); // these two are selected automatically based on
@ -431,16 +431,16 @@ void LLPanelEnvironmentInfo::setDirtyFlag(U32 flag)
{
bool can_edit = canEdit();
mDirtyFlag |= flag;
getChildView(BTN_APPLY)->setEnabled((mDirtyFlag != 0) && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION && can_edit);
getChildView(BTN_CANCEL)->setEnabled((mDirtyFlag != 0) && can_edit);
getChildView(BTN_APPLY)->setEnabled((mDirtyFlag != 0) && mCurrentEnvironment && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION && can_edit);
getChildView(BTN_CANCEL)->setEnabled((mDirtyFlag != 0) && mCurrentEnvironment && can_edit);
}
void LLPanelEnvironmentInfo::clearDirtyFlag(U32 flag)
{
bool can_edit = canEdit();
mDirtyFlag &= ~flag;
getChildView(BTN_APPLY)->setEnabled((mDirtyFlag != 0) && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION && can_edit);
getChildView(BTN_CANCEL)->setEnabled((mDirtyFlag != 0) && can_edit);
getChildView(BTN_APPLY)->setEnabled((mDirtyFlag != 0) && mCurrentEnvironment && mCurEnvVersion != INVALID_PARCEL_ENVIRONMENT_VERSION && can_edit);
getChildView(BTN_CANCEL)->setEnabled((mDirtyFlag != 0) && mCurrentEnvironment && can_edit);
}
void LLPanelEnvironmentInfo::updateAltLabel(const std::string &alt_name, U32 sky_index, F32 alt_value)
@ -663,7 +663,6 @@ void LLPanelEnvironmentInfo::doApply()
if (rdo_selection == 0)
{
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
LLEnvironment::instance().resetParcel(parcel_id,
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
}
@ -675,7 +674,6 @@ void LLPanelEnvironmentInfo::doApply()
LL_WARNS("ENVPANEL") << "Failed to apply changes from editor! Dirty state: " << mDirtyFlag << " update state: " << mCurEnvVersion << LL_ENDL;
return;
}
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
LLEnvironment::instance().updateParcel(parcel_id,
mCurrentEnvironment->mDayCycle->getAssetId(), std::string(), mCurrentEnvironment->mDayLength.value(),
mCurrentEnvironment->mDayOffset.value(), alts,
@ -689,7 +687,6 @@ void LLPanelEnvironmentInfo::doApply()
LL_WARNS("ENVPANEL") << "Failed to apply changes from editor! Dirty state: " << mDirtyFlag << " update state: " << mCurEnvVersion << LL_ENDL;
return;
}
mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
LLEnvironment::instance().updateParcel(parcel_id,
mCurrentEnvironment->mDayCycle, mCurrentEnvironment->mDayLength.value(), mCurrentEnvironment->mDayOffset.value(), alts,
[that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); });
@ -780,36 +777,55 @@ void LLPanelEnvironmentInfo::onEditCommitted(LLSettingsDay::ptr_t newday)
}
}
void LLPanelEnvironmentInfo::onEnvironmentChanged(LLEnvironment::EnvSelection_t env)
void LLPanelEnvironmentInfo::onEnvironmentChanged(LLEnvironment::EnvSelection_t env, S32 new_version)
{
if (new_version < INVALID_PARCEL_ENVIRONMENT_VERSION)
{
// cleanups and local changes, we are only interested in changes sent by server
return;
}
LL_DEBUGS("ENVPANEL") << "Received environment update " << mCurEnvVersion << " " << new_version << LL_ENDL;
// Environment comes from different sources, from environment update callbacks,
// from hovers (causes callbacks on version change) and from personal requests
// filter out duplicates and out of order packets by checking parcel environment version.
if (isRegion())
{
// Note: at the moment mCurEnvVersion is only applyable to parcels, we might need separate version control for regions
// but mCurEnvVersion still acts like indicator that update is pending
if (env == LLEnvironment::ENV_REGION)
// Note: region uses same init versions as parcel
if (env == LLEnvironment::ENV_REGION
// version should be always growing, UNSET_PARCEL_ENVIRONMENT_VERSION is backup case
&& (mCurEnvVersion < new_version || mCurEnvVersion <= UNSET_PARCEL_ENVIRONMENT_VERSION))
{
if (new_version >= UNSET_PARCEL_ENVIRONMENT_VERSION)
{
// 'pending state' to prevent re-request on following onEnvironmentChanged if there will be any
mCurEnvVersion = new_version;
}
mCurrentEnvironment.reset();
refreshFromSource();
}
}
else if ((env == LLEnvironment::ENV_PARCEL) && (getParcelId() == LLViewerParcelMgr::instance().getAgentParcelId()))
else if ((env == LLEnvironment::ENV_PARCEL)
&& (getParcelId() == LLViewerParcelMgr::instance().getAgentParcelId()))
{
// Panel receives environment from different sources, from environment update callbacks,
// from hovers (causes callbacks on version change) and from personal requests
// filter out dupplicates and out of order packets by checking parcel environment version.
LLParcel *parcel = getParcel();
if (parcel)
{
S32 new_version = parcel->getParcelEnvironmentVersion();
LL_DEBUGS("ENVPANEL") << "Received environment update " << mCurEnvVersion << " " << new_version << LL_ENDL;
// first for parcel own settings, second is for case when parcel uses region settings
if (mCurEnvVersion < new_version
|| (mCurEnvVersion != new_version && new_version == UNSET_PARCEL_ENVIRONMENT_VERSION))
{
// 'pending state' to prevent re-request on following onEnvironmentChanged if there will be any
mCurEnvVersion = new_version;
mCurrentEnvironment.reset();
refreshFromSource();
}
else
else if (mCurrentEnvironment)
{
// update controls
refresh();
}
}
@ -839,30 +855,21 @@ void LLPanelEnvironmentInfo::onEnvironmentReceived(S32 parcel_id, LLEnvironment:
}
mCurrentEnvironment = envifo;
clearDirtyFlag(DIRTY_FLAG_MASK);
if (parcel_id == INVALID_PARCEL_ID)
if (mCurrentEnvironment->mEnvVersion > INVALID_PARCEL_ENVIRONMENT_VERSION)
{
// region, no version
// -2 for invalid version viewer -1 for invalid version from server
mCurEnvVersion = UNSET_PARCEL_ENVIRONMENT_VERSION;
// Server provided version, use it
mCurEnvVersion = mCurrentEnvironment->mEnvVersion;
LL_DEBUGS("ENVPANEL") << " Setting environment version: " << mCurEnvVersion << " for parcel id: " << parcel_id << LL_ENDL;
}
// Backup: Version was not provided for some reason
else
{
LLParcel* parcel = getParcel();
if (parcel
&& mCurrentEnvironment->mDayCycle
&& mCurrentEnvironment->mDayCycle->getAssetId() != LLSettingsDay::GetDefaultAssetId())
{
// not always up to date, we will get onEnvironmentChanged() update in such case.
mCurEnvVersion = parcel->getParcelEnvironmentVersion();
}
else
{
// When using 'region' as parcel environment
mCurEnvVersion = UNSET_PARCEL_ENVIRONMENT_VERSION;
}
LL_DEBUGS("ENVPANEL") << " Setting environment version: " << mCurEnvVersion << LL_ENDL;
LL_WARNS("ENVPANEL") << " Environment version was not provided for " << parcel_id << ", old env version: " << mCurEnvVersion << LL_ENDL;
}
refresh();
// todo: we have envifo and parcel env version, should we just setEnvironment() and parcel's property to prevent dupplicate requests?
}
void LLPanelEnvironmentInfo::_onEnvironmentReceived(LLHandle<LLPanel> that_h, S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo)

View File

@ -142,7 +142,7 @@ protected:
LLEnvironment::EnvironmentInfo::ptr_t mCurrentEnvironment;
void onEnvironmentChanged(LLEnvironment::EnvSelection_t env);
void onEnvironmentChanged(LLEnvironment::EnvSelection_t env, S32 version);
class AltitudeData
{
@ -160,7 +160,7 @@ protected:
};
typedef std::map<std::string, AltitudeData> altitudes_data_t;
altitudes_data_t mAltitudes;
S32 mCurEnvVersion;
S32 mCurEnvVersion; // used to filter duplicate callbacks/refreshes
private: