SL-10091 EEP Filter out dupplicate refreshes and callbacks
parent
031dabede8
commit
76071d4fe8
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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); });
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue