summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRider Linden <rider@lindenlab.com>2018-08-03 16:13:22 -0700
committerRider Linden <rider@lindenlab.com>2018-08-03 16:13:22 -0700
commitb50d546d5ffb520228926ff1f4e6b03c69b3f857 (patch)
tree346b5802686c223d50e6c4e8ba2fb7a8bab4cefc /indra
parentdbbb89a13c99dce50b5c2a124bd3a5ccc23ef7f6 (diff)
MAINT-7699: More robust cap protocol, better support for delete and support for individual tracks, support for setting environment by asset id in the cap
MAINT-7703: Initial flags sent in message protocol for parcels
Diffstat (limited to 'indra')
-rw-r--r--indra/llinventory/llparcel.cpp3
-rw-r--r--indra/llinventory/llparcel.h9
-rw-r--r--indra/llinventory/llsettingsbase.cpp1
-rw-r--r--indra/llmessage/message_prehash.cpp4
-rw-r--r--indra/llmessage/message_prehash.h3
-rw-r--r--indra/newview/llenvironment.cpp183
-rw-r--r--indra/newview/llenvironment.h44
-rw-r--r--indra/newview/llsettingsvo.cpp2
-rw-r--r--indra/newview/llviewerparcelmgr.cpp58
9 files changed, 180 insertions, 127 deletions
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 0908613c10..aff7f86fd4 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -231,6 +231,9 @@ void LLParcel::init(const LLUUID &owner_id,
setAllowGroupAVSounds(TRUE);
setAllowAnyAVSounds(TRUE);
setHaveNewParcelLimitData(FALSE);
+
+ setRegionAllowEnvironmentOverride(FALSE);
+ setParcelEnvironmentVersion(-1);
}
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 6ef389d246..2497a069d7 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -511,6 +511,10 @@ public:
{ return mRegionDenyAgeUnverifiedOverride; }
BOOL getRegionAllowAccessOverride() const
{ return mRegionAllowAccessoverride; }
+ BOOL getRegionAllowEnvironmentOverride() const
+ { return mRegionAllowEnvironmentOverride; }
+ S32 getParcelEnvironmentVersion() const
+ { return mCurrentEnvironmentVersion; }
BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
@@ -581,6 +585,9 @@ public:
void setRegionDenyAnonymousOverride(BOOL override) { mRegionDenyAnonymousOverride = override; }
void setRegionDenyAgeUnverifiedOverride(BOOL override) { mRegionDenyAgeUnverifiedOverride = override; }
void setRegionAllowAccessOverride(BOOL override) { mRegionAllowAccessoverride = override; }
+ void setRegionAllowEnvironmentOverride(BOOL override) { mRegionAllowEnvironmentOverride = override; }
+
+ void setParcelEnvironmentVersion(S32 version) { mCurrentEnvironmentVersion = version; }
// Accessors for parcel sellWithObjects
void setPreviousOwnerID(LLUUID prev_owner) { mPreviousOwnerID = prev_owner; }
@@ -662,8 +669,10 @@ protected:
BOOL mRegionDenyAnonymousOverride;
BOOL mRegionDenyAgeUnverifiedOverride;
BOOL mRegionAllowAccessoverride;
+ BOOL mRegionAllowEnvironmentOverride;
BOOL mAllowGroupAVSounds;
BOOL mAllowAnyAVSounds;
+ S32 mCurrentEnvironmentVersion;
bool mIsDefaultDayCycle;
diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 8bcf8a4973..e00dd2199c 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -300,7 +300,6 @@ bool LLSettingsBase::validate()
{
LL_WARNS("SETTINGS") << "Validation warnings: " << result["warnings"] << LL_ENDL;
}
- LL_WARNS("SETTINGS") << "Validation success is " << result["success"] << LL_ENDL;
return result["success"].asBoolean();
}
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 1ae8a6ac15..6e5923862b 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1375,7 +1375,9 @@ char const* const _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getIn
char const* const _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock");
char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getInstance()->getString("RegionAllowAccessBlock");
char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride");
-
+char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock");
+char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion");
+char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");
char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 7910fde305..30763d426e 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1375,6 +1375,9 @@ extern char const* const _PREHASH_RegionDenyAgeUnverified;
extern char const* const _PREHASH_AgeVerificationBlock;
extern char const* const _PREHASH_RegionAllowAccessBlock;
extern char const* const _PREHASH_RegionAllowAccessOverride;
+extern char const* const _PREHASH_ParcelEnvironmentBlock;
+extern char const* const _PREHASH_ParcelEnvironmentVersion;
+extern char const* const _PREHASH_RegionAllowEnvironmentOverride;
extern char const* const _PREHASH_UCoord;
extern char const* const _PREHASH_VCoord;
extern char const* const _PREHASH_FaceIndex;
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index f4dedbc848..3bcdf345f1 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -61,6 +61,18 @@
//=========================================================================
namespace
{
+ const std::string KEY_ENVIRONMENT("environment");
+ const std::string KEY_DAYASSET("day_asset");
+ const std::string KEY_DAYCYCLE("day_cycle");
+ const std::string KEY_DAYHASH("day_hash");
+ const std::string KEY_DAYLENGTH("day_length");
+ const std::string KEY_DAYOFFSET("day_offset");
+ const std::string KEY_ISDEFAULT("is_default");
+ const std::string KEY_PARCELID("parcel_id");
+ const std::string KEY_REGIONID("region_id");
+ const std::string KEY_TRACKALTS("track_altitudes");
+
+ //---------------------------------------------------------------------
LLTrace::BlockTimerStatHandle FTM_ENVIRONMENT_UPDATE("Update Environment Tick");
LLTrace::BlockTimerStatHandle FTM_SHADER_PARAM_UPDATE("Update Shader Parameters");
@@ -254,6 +266,8 @@ const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("07589e0e-8e2e-4864-8e58-07b516efd9
const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("8113ba47-3223-46ba-bae6-12c875091b32");
const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("90187088-d7f3-4656-8c27-8ba0e19e21e9");
+const S32 LLEnvironment::NO_TRACK(-1);
+
const F32 LLEnvironment::SUN_DELTA_YAW(F_PI); // 180deg
//-------------------------------------------------------------------------
@@ -269,6 +283,7 @@ LLEnvironment::LLEnvironment():
{
}
+#pragma optimize ("", off)
void LLEnvironment::initSingleton()
{
LLSettingsSky::ptr_t p_default_sky = LLSettingsVOSky::buildDefaultSky();
@@ -280,16 +295,17 @@ void LLEnvironment::initSingleton()
mEnvironments[ENV_DEFAULT] = mCurrentEnvironment;
- requestRegionEnvironment();
+ requestRegion();
- LLRegionInfoModel::instance().setUpdateCallback([this]() { onParcelChange(); });
gAgent.addParcelChangedCallback([this]() { onParcelChange(); });
//TODO: This frequently results in one more request than we need. It isn't breaking, but should be nicer.
- gAgent.addRegionChangedCallback([this]() { requestRegionEnvironment(); });
+ LLRegionInfoModel::instance().setUpdateCallback([this]() { requestRegion(); });
+ gAgent.addRegionChangedCallback([this]() { requestRegion(); });
gAgent.whenPositionChanged([this](const LLVector3 &localpos, const LLVector3d &) { onAgentPositionHasChanged(localpos); });
}
+#pragma optimize ("", on)
LLEnvironment::~LLEnvironment()
{
@@ -391,6 +407,7 @@ bool LLEnvironment::isInventoryEnabled() const
!gAgent.getRegionCapability("UpdateSettingsTaskInventory").empty());
}
+#pragma optimize ("", off)
void LLEnvironment::onParcelChange()
{
S32 parcel_id(INVALID_PARCEL_ID);
@@ -403,11 +420,7 @@ void LLEnvironment::onParcelChange()
requestParcel(parcel_id);
}
-
-void LLEnvironment::requestRegionEnvironment()
-{
- requestRegion();
-}
+#pragma optimize ("", on)
void LLEnvironment::onLegacyRegionSettings(LLSD data)
{
@@ -950,22 +963,10 @@ void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader)
void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo)
{
- LL_WARNS("ENVIRONMENT") << "Have environment" << LL_ENDL;
-
- LLSettingsDay::ptr_t pday = LLSettingsVODay::buildFromEnvironmentMessage(envinfo->mDaycycleData);
-
- LL_WARNS("ENVIRONMENT") << "serverhash=" << envinfo->mDayHash << " viewerhash=" << pday->getHash() << LL_ENDL;
-
if (envinfo->mParcelId == INVALID_PARCEL_ID)
{ // the returned info applies to an entire region.
LL_WARNS("LAPRAS") << "Setting Region environment" << LL_ENDL;
- setEnvironment(ENV_REGION, pday, envinfo->mDayLength, envinfo->mDayOffset);
- if (parcel_id != INVALID_PARCEL_ID)
- {
- LL_WARNS("LAPRAS") << "Had requested parcel environment #" << parcel_id << " but got region." << LL_ENDL;
- clearEnvironment(ENV_PARCEL);
- }
-
+ setEnvironment(ENV_REGION, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset);
mTrackAltitudes = envinfo->mAltitudes;
LL_WARNS("LAPRAS") << "Altitudes set to {" << mTrackAltitudes[0] << ", "<< mTrackAltitudes[1] << ", " << mTrackAltitudes[2] << ", " << mTrackAltitudes[3] << LL_ENDL;
@@ -973,7 +974,6 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
else
{
LLParcel *parcel = LLViewerParcelMgr::instance().getAgentParcel();
-
LL_WARNS("LAPRAS") << "Have parcel environment #" << envinfo->mParcelId << LL_ENDL;
if (parcel && (parcel->getLocalID() != parcel_id))
{
@@ -981,23 +981,33 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
return;
}
- setEnvironment(ENV_PARCEL, pday, envinfo->mDayLength, envinfo->mDayOffset);
+ if (!envinfo->mDayCycle)
+ {
+ LL_WARNS("LAPRAS") << "Clearing environment on parcel #" << parcel_id << LL_ENDL;
+ clearEnvironment(ENV_PARCEL);
+ }
+ else
+ {
+ setEnvironment(ENV_PARCEL, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset);
+ }
}
updateEnvironment();
}
//=========================================================================
+#pragma optimize ("", off)
void LLEnvironment::requestRegion()
{
if (!isExtendedEnvironmentEnabled())
- {
+ { /*TODO: When EEP is live on the entire grid, this can go away. */
LLEnvironmentRequest::initiate();
return;
}
requestParcel(INVALID_PARCEL_ID);
}
+#pragma optimize ("", on)
void LLEnvironment::updateRegion(const LLSettingsDay::ptr_t &pday, S32 day_length, S32 day_offset)
{
@@ -1048,8 +1058,14 @@ void LLEnvironment::requestParcel(S32 parcel_id)
void LLEnvironment::updateParcel(S32 parcel_id, const LLUUID &asset_id, S32 day_length, S32 day_offset)
{
- LLSettingsVOBase::getSettingsAsset(asset_id,
- [this, parcel_id, day_length, day_offset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onUpdateParcelAssetLoaded(asset_id, settings, status, parcel_id, day_length, day_offset); });
+ std::string coroname =
+ LLCoros::instance().launch("LLEnvironment::coroUpdateEnvironment",
+ [this, parcel_id, asset_id, day_length, day_offset]() { coroUpdateEnvironment(parcel_id, NO_TRACK,
+ LLSettingsDay::ptr_t(), asset_id, day_length, day_offset, environment_apply_fn()); });
+// [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); }); });
+
+// LLSettingsVOBase::getSettingsAsset(asset_id,
+// [this, parcel_id, day_length, day_offset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onUpdateParcelAssetLoaded(asset_id, settings, status, parcel_id, day_length, day_offset); });
}
void LLEnvironment::onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset)
@@ -1096,17 +1112,19 @@ void LLEnvironment::updateParcel(S32 parcel_id, const LLSettingsDay::ptr_t &pday
{
std::string coroname =
LLCoros::instance().launch("LLEnvironment::coroUpdateEnvironment",
- boost::bind(&LLEnvironment::coroUpdateEnvironment, this, parcel_id,
- pday, day_length, day_offset,
- [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); }));
+ [this, parcel_id, pday, day_length, day_offset]() { coroUpdateEnvironment(parcel_id, NO_TRACK,
+ pday, LLUUID::null, day_length, day_offset, environment_apply_fn()); });
+// [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); }); });
}
+
+
void LLEnvironment::resetParcel(S32 parcel_id)
{
std::string coroname =
LLCoros::instance().launch("LLEnvironment::coroResetEnvironment",
- boost::bind(&LLEnvironment::coroResetEnvironment, this, parcel_id,
- [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); }));
+ [this, parcel_id]() { coroResetEnvironment(parcel_id, NO_TRACK, environment_apply_fn()); });
+// [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); }); });
}
void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environment_apply_fn apply)
@@ -1151,7 +1169,7 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ
}
else
{
- LLSD environment = result["environment"];
+ LLSD environment = result[KEY_ENVIRONMENT];
if (environment.isDefined() && apply)
{
EnvironmentInfo::ptr_t envinfo = LLEnvironment::EnvironmentInfo::extract(environment);
@@ -1166,7 +1184,7 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ
}
}
-void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, LLSettingsDay::ptr_t pday, S32 day_length, S32 day_offset, LLEnvironment::environment_apply_fn apply)
+void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, S32 track_no, LLSettingsDay::ptr_t pday, LLUUID settings_asset, S32 day_length, S32 day_offset, LLEnvironment::environment_apply_fn apply)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -1192,22 +1210,39 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, LLSettingsDay::ptr_t pd
}
LLSD body(LLSD::emptyMap());
- body["environment"] = LLSD::emptyMap();
+ body[KEY_ENVIRONMENT] = LLSD::emptyMap();
- if (day_length >= 0)
- body["environment"]["day_length"] = day_length;
- if (day_offset >= 0)
- body["environment"]["day_offset"] = day_offset;
+ if (track_no == NO_TRACK)
+ { // day length and offset are only applicable if we are addressing the entire day cycle.
+ if (day_length >= 0)
+ body[KEY_ENVIRONMENT][KEY_DAYLENGTH] = day_length;
+ if (day_offset >= 0)
+ body[KEY_ENVIRONMENT][KEY_DAYOFFSET] = day_offset;
+ }
if (pday)
- body["environment"]["day_cycle"] = pday->getSettings();
+ body[KEY_ENVIRONMENT][KEY_DAYCYCLE] = pday->getSettings();
+ else if (!settings_asset.isNull())
+ body[KEY_ENVIRONMENT][KEY_DAYASSET] = settings_asset;
+
LL_WARNS("LAPRAS") << "Body = " << body << LL_ENDL;
- if (parcel_id != INVALID_PARCEL_ID)
+ if ((parcel_id != INVALID_PARCEL_ID) || (track_no != NO_TRACK))
{
std::stringstream query;
+ query << "?";
- query << "?parcelid=" << parcel_id;
+ if (parcel_id != INVALID_PARCEL_ID)
+ {
+ query << "parcelid=" << parcel_id;
+
+ if (track_no != NO_TRACK)
+ query << "&";
+ }
+ if (track_no != NO_TRACK)
+ {
+ query << "trackno=" << track_no;
+ }
url += query.str();
}
@@ -1228,7 +1263,7 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, LLSettingsDay::ptr_t pd
}
else
{
- LLSD environment = result["environment"];
+ LLSD environment = result[KEY_ENVIRONMENT];
if (environment.isDefined() && apply)
{
EnvironmentInfo::ptr_t envinfo = LLEnvironment::EnvironmentInfo::extract(environment);
@@ -1243,7 +1278,7 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, LLSettingsDay::ptr_t pd
}
}
-void LLEnvironment::coroResetEnvironment(S32 parcel_id, environment_apply_fn apply)
+void LLEnvironment::coroResetEnvironment(S32 parcel_id, S32 track_no, environment_apply_fn apply)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -1254,11 +1289,22 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, environment_apply_fn app
if (url.empty())
return;
- if (parcel_id != INVALID_PARCEL_ID)
+ if ((parcel_id != INVALID_PARCEL_ID) || (track_no != NO_TRACK))
{
std::stringstream query;
+ query << "?";
- query << "?parcelid=" << parcel_id;
+ if (parcel_id != INVALID_PARCEL_ID)
+ {
+ query << "parcelid=" << parcel_id;
+
+ if (track_no != NO_TRACK)
+ query << "&";
+ }
+ if (track_no != NO_TRACK)
+ {
+ query << "trackno=" << track_no;
+ }
url += query.str();
}
@@ -1279,7 +1325,7 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, environment_apply_fn app
}
else
{
- LLSD environment = result["environment"];
+ LLSD environment = result[KEY_ENVIRONMENT];
if (environment.isDefined() && apply)
{
EnvironmentInfo::ptr_t envinfo = LLEnvironment::EnvironmentInfo::extract(environment);
@@ -1339,10 +1385,9 @@ LLEnvironment::EnvironmentInfo::EnvironmentInfo():
mDayLength(0),
mDayOffset(0),
mDayHash(0),
- mDaycycleData(),
+ mDayCycle(),
mAltitudes({ { 0.0, 0.0, 0.0, 0.0 } }),
- mIsDefault(false),
- mIsRegion(false)
+ mIsDefault(false)
{
}
@@ -1350,32 +1395,28 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL
{
ptr_t pinfo = std::make_shared<EnvironmentInfo>();
- if (environment.has("parcel_id"))
- pinfo->mParcelId = environment["parcel_id"].asInteger();
- if (environment.has("region_id"))
- pinfo->mRegionId = environment["region_id"].asUUID();
- if (environment.has("day_length"))
- pinfo->mDayLength = LLSettingsDay::Seconds(environment["day_length"].asInteger());
- if (environment.has("day_offset"))
- pinfo->mDayOffset = LLSettingsDay::Seconds(environment["day_offset"].asInteger());
- if (environment.has("day_hash"))
- pinfo->mDayHash = environment["day_hash"].asInteger();
- if (environment.has("day_cycle"))
- pinfo->mDaycycleData = environment["day_cycle"];
- if (environment.has("is_default"))
- pinfo->mIsDefault = environment["is_default"].asBoolean();
- if (environment.has("track_altitudes"))
- {
- LL_WARNS("LAPRAS") << "track_altitudes=" << environment["track_altitudes"] << LL_ENDL;
-
- /*LAPRAS: TODO: Fix the simulator message. Shouldn't be 5, just 4*/
- int idx = 1;
- for (F32 &altitude : pinfo->mAltitudes)
+ pinfo->mIsDefault = environment.has(KEY_ISDEFAULT) ? environment[KEY_ISDEFAULT].asBoolean() : true;
+ pinfo->mParcelId = environment.has(KEY_PARCELID) ? environment[KEY_PARCELID].asInteger() : INVALID_PARCEL_ID;
+ pinfo->mRegionId = environment.has(KEY_REGIONID) ? environment[KEY_REGIONID].asUUID() : LLUUID::null;
+
+ if (environment.has(KEY_TRACKALTS))
+ {
+ for (int idx = 0; idx < 3; idx++)
{
- altitude = environment["track_altitudes"][idx++].asReal();
+ pinfo->mAltitudes[idx+1] = environment[KEY_TRACKALTS][idx].asReal();
}
+ pinfo->mAltitudes[0] = 0;
+ }
+
+ if (environment.has(KEY_DAYCYCLE))
+ {
+ pinfo->mDayCycle = LLSettingsVODay::buildFromEnvironmentMessage(environment[KEY_DAYCYCLE]);
+ pinfo->mDayLength = LLSettingsDay::Seconds(environment.has(KEY_DAYLENGTH) ? environment[KEY_DAYLENGTH].asInteger() : -1);
+ pinfo->mDayOffset = LLSettingsDay::Seconds(environment.has(KEY_DAYOFFSET) ? environment[KEY_DAYOFFSET].asInteger() : -1);
+ pinfo->mDayHash = environment.has(KEY_DAYHASH) ? environment[KEY_DAYHASH].asInteger() : 0;
}
+
return pinfo;
}
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 6f8d4b5203..80d186c9e6 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -65,25 +65,24 @@ public:
static const LLUUID KNOWN_SKY_SUNSET;
static const LLUUID KNOWN_SKY_MIDNIGHT;
+ static const S32 NO_TRACK;
+
struct EnvironmentInfo
{
EnvironmentInfo();
typedef std::shared_ptr<EnvironmentInfo> ptr_t;
- S32 mParcelId;
- LLUUID mRegionId;
- S64Seconds mDayLength;
- S64Seconds mDayOffset;
- size_t mDayHash;
- LLSD mDaycycleData;
- std::array<F32, 4> mAltitudes;
- bool mIsDefault;
- bool mIsRegion;
-
-
- static ptr_t extract(LLSD);
+ S32 mParcelId;
+ LLUUID mRegionId;
+ S64Seconds mDayLength;
+ S64Seconds mDayOffset;
+ size_t mDayHash;
+ LLSettingsDay::ptr_t mDayCycle;
+ std::array<F32, 4> mAltitudes;
+ bool mIsDefault;
+ static ptr_t extract(LLSD);
};
enum EnvSelection_t
@@ -226,8 +225,6 @@ public:
//-------------------------------------------
connection_t setEnvironmentChanged(environment_changed_fn cb);
- void requestRegionEnvironment();
-
void onLegacyRegionSettings(LLSD data);
void requestRegion();
@@ -359,21 +356,20 @@ private:
DayInstance::ptr_t getSelectedEnvironmentInstance();
- void updateCloudScroll();
-
- void onParcelChange();
+ void updateCloudScroll();
- void coroRequestEnvironment(S32 parcel_id, environment_apply_fn apply);
- void coroUpdateEnvironment(S32 parcel_id, LLSettingsDay::ptr_t pday, S32 day_length, S32 day_offset, environment_apply_fn apply);
- void coroResetEnvironment(S32 parcel_id, environment_apply_fn apply);
+ void onParcelChange();
- void recordEnvironment(S32 parcel_id, EnvironmentInfo::ptr_t environment);
+ void coroRequestEnvironment(S32 parcel_id, environment_apply_fn apply);
+ void coroUpdateEnvironment(S32 parcel_id, S32 track_no, LLSettingsDay::ptr_t pday, LLUUID settings_asset, S32 day_length, S32 day_offset, environment_apply_fn apply);
+ void coroResetEnvironment(S32 parcel_id, S32 track_no, environment_apply_fn apply);
- void onAgentPositionHasChanged(const LLVector3 &localpos);
+ void recordEnvironment(S32 parcel_id, EnvironmentInfo::ptr_t environment);
- void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status);
- void onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset);
+ void onAgentPositionHasChanged(const LLVector3 &localpos);
+ void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status);
+ void onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset);
};
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 010b5dec36..e464f3f8ef 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -269,7 +269,7 @@ void LLSettingsVOBase::onAssetDownloadComplete(LLVFS *vfs, const LLUUID &asset_i
if (!settings)
{
status = 1;
- LL_WARNS("SETTINGS") << "Unable to creat settings object." << LL_ENDL;
+ LL_WARNS("SETTINGS") << "Unable to create settings object." << LL_ENDL;
}
else
{
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index ed529975d2..d263e15a10 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1483,6 +1483,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
BOOL region_deny_transacted_override = false; // Deprecated
BOOL region_deny_age_unverified_override = false;
BOOL region_allow_access_override = true;
+ BOOL region_allow_environment_override = true;
+ S32 parcel_environment_version = 0;
BOOL agent_parcel_update = false; // updating previous(existing) agent parcel
S32 other_clean_time = 0;
@@ -1573,6 +1575,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
msg->getBOOLFast(_PREHASH_RegionAllowAccessBlock, _PREHASH_RegionAllowAccessOverride, region_allow_access_override);
}
+ if (msg->getNumberOfBlocks(_PREHASH_ParcelEnvironmentBlock))
+ {
+ msg->getS32Fast(_PREHASH_ParcelEnvironmentBlock, _PREHASH_ParcelEnvironmentVersion, parcel_environment_version);
+ msg->getBOOLFast(_PREHASH_ParcelEnvironmentBlock, _PREHASH_RegionAllowEnvironmentOverride, region_allow_environment_override);
+ }
+
msg->getS32("ParcelData", "OtherCleanTime", other_clean_time );
// Actually extract the data.
@@ -1590,6 +1598,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
}
}
+ bool environment_changed = (parcel->getParcelEnvironmentVersion() != parcel_environment_version);
+
parcel->init(owner_id,
FALSE, FALSE, FALSE,
claim_date, claim_price_per_meter, rent_price_per_meter,
@@ -1615,6 +1625,10 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
parcel->setRegionDenyAnonymousOverride(region_deny_anonymous_override);
parcel->setRegionDenyAgeUnverifiedOverride(region_deny_age_unverified_override);
parcel->setRegionAllowAccessOverride(region_allow_access_override);
+
+ parcel->setParcelEnvironmentVersion(parcel_environment_version);
+ parcel->setRegionAllowEnvironmentOverride(region_allow_environment_override);
+
parcel->unpackMessage(msg);
if (parcel == parcel_mgr.mAgentParcel)
@@ -1632,9 +1646,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
// Let interesting parties know about agent parcel change.
LLViewerParcelMgr* instance = LLViewerParcelMgr::getInstance();
- // Notify anything that wants to know when the agent changes parcels
- gAgent.changeParcels();
-
if (instance->mTeleportInProgress)
{
instance->mTeleportInProgress = FALSE;
@@ -1648,12 +1659,21 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false);
}
}
- }
- else if (agent_parcel_update)
- {
- // updated agent parcel
- parcel_mgr.mAgentParcel->unpackMessage(msg);
- }
+
+ LL_WARNS("LAPRAS") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL;
+ // Notify anything that wants to know when the agent changes parcels
+ gAgent.changeParcels();
+ }
+ else if (agent_parcel_update)
+ {
+ // updated agent parcel
+ parcel_mgr.mAgentParcel->unpackMessage(msg);
+ if ((LLEnvironment::instance().isExtendedEnvironmentEnabled() && environment_changed))
+ {
+ LL_WARNS("LAPRAS") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL;
+ LLEnvironment::instance().requestParcel(local_id);
+ }
+ }
}
// Handle updating selections, if necessary.
@@ -1835,26 +1855,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
}//if gAudiop
};
- if (LLEnvironment::instance().isExtendedEnvironmentEnabled())
- {
- LL_WARNS("LAPRAS") << "TODO: Hey Rider! Fix this. 1) don't rerequest parcel information. 2) if sequent_id == -1 we are selecting a parcel. Deal with that correctly." << LL_ENDL;
-
- if (sequence_id == SELECTED_PARCEL_SEQ_ID)
- {
- LL_WARNS("LAPRAS") << "TODO: Hay Rider! Fix this. Get environment for selected parcel." << LL_ENDL;
- }
- else if ((sequence_id == HOVERED_PARCEL_SEQ_ID) ||
- (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID) ||
- (sequence_id == COLLISION_NOT_ON_LIST_PARCEL_SEQ_ID) ||
- (sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID))
- {
- /*NoOp*/
- }
- else
- {
- LLEnvironment::instance().requestParcel(local_id);
- }
- }
}
void LLViewerParcelMgr::optionally_start_music(const std::string& music_url)