Use the EnvironmentInfo structure to pass information back from legacy environment requests.

master
Rider Linden 2018-08-20 14:59:02 -07:00
parent 1e3ee272ae
commit 8fc3956a5e
5 changed files with 88 additions and 61 deletions

View File

@ -431,26 +431,6 @@ void LLEnvironment::onParcelChange()
requestParcel(parcel_id);
}
void LLEnvironment::onLegacyRegionSettings(LLSD data)
{
LLUUID regionId = data[0]["regionID"].asUUID();
LLSettingsDay::ptr_t regionday;
if (!data[1].isUndefined())
regionday = LLSettingsVODay::buildFromLegacyMessage(regionId, data[1], data[2], data[3]);
clearEnvironment(ENV_PARCEL);
if (!regionday)
{
LL_WARNS("ENVIRONMENT") << "Unable to create day from legacy. Using default day cycle." << LL_ENDL;
setEnvironment(LLEnvironment::ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
}
else
setEnvironment(ENV_REGION, regionday, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
updateEnvironment();
}
//-------------------------------------------------------------------------
F32 LLEnvironment::getCamHeight() const
{
@ -1017,23 +997,11 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
//=========================================================================
void LLEnvironment::requestRegion(environment_apply_fn cb)
{
if (!isExtendedEnvironmentEnabled())
{ /*TODO: When EEP is live on the entire grid, this can go away. */
LLEnvironmentRequest::initiate();
return;
}
requestParcel(INVALID_PARCEL_ID, cb);
}
void LLEnvironment::updateRegion(const LLSettingsDay::ptr_t &pday, S32 day_length, S32 day_offset, environment_apply_fn cb)
{
if (!isExtendedEnvironmentEnabled())
{
LLEnvironmentApply::initiateRequest( LLSettingsVODay::convertToLegacy(pday) );
return;
}
updateParcel(INVALID_PARCEL_ID, pday, day_length, day_offset, cb);
}
@ -1067,6 +1035,27 @@ void LLEnvironment::resetRegion(environment_apply_fn cb)
void LLEnvironment::requestParcel(S32 parcel_id, environment_apply_fn cb)
{
if (!isExtendedEnvironmentEnabled())
{ /*TODO: When EEP is live on the entire grid, this can go away. */
if (!cb)
{
cb = [this](S32 pid, EnvironmentInfo::ptr_t envinfo)
{
if (envinfo->mDayCycle) recordEnvironment(pid, envinfo);
else
{
clearEnvironment(ENV_PARCEL);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
updateEnvironment();
}
};
}
if (parcel_id == INVALID_PARCEL_ID)
LLEnvironmentRequest::initiate(cb);
return;
}
if (!cb)
{
cb = [this](S32 pid, EnvironmentInfo::ptr_t envinfo) { recordEnvironment(pid, envinfo); };
@ -1358,7 +1347,7 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, S32 track_no, environmen
//=========================================================================
LLEnvironment::UserPrefs::UserPrefs():
LLEnvironment::UserPrefs::UserPrefs() :
mUseRegionSettings(true),
mUseDayCycle(true),
mPersistEnvironment(false),
@ -1402,7 +1391,8 @@ LLEnvironment::EnvironmentInfo::EnvironmentInfo():
mDayHash(0),
mDayCycle(),
mAltitudes({ { 0.0, 0.0, 0.0, 0.0 } }),
mIsDefault(false)
mIsDefault(false),
mIsLegacy(false)
{
}
@ -1413,6 +1403,7 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL
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;
pinfo->mIsLegacy = false;
if (environment.has(KEY_TRACKALTS))
{
@ -1434,13 +1425,41 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL
if (environment.has(KEY_DAYASSET))
{
pinfo->mAssetId = environment[KEY_DAYASSET].asUUID();
LL_WARNS("LAPRAS") << "Environment asset ID is " << pinfo->mAssetId << LL_ENDL;
LL_WARNS("LAPRAS") << "(day cycle claims " << pinfo->mDayCycle->getAssetId() << ")" << LL_ENDL;
}
return pinfo;
}
LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extractLegacy(LLSD legacy)
{
if (!legacy.isArray() || !legacy[0].has("regionID"))
{
LL_WARNS("ENVIRONMENT") << "Invalid legacy settings for environment: " << legacy << LL_ENDL;
return ptr_t();
}
ptr_t pinfo = std::make_shared<EnvironmentInfo>();
pinfo->mIsDefault = false;
pinfo->mParcelId = INVALID_PARCEL_ID;
pinfo->mRegionId = legacy[0]["regionID"].asUUID();
pinfo->mIsLegacy = true;
pinfo->mDayLength = LLSettingsDay::DEFAULT_DAYLENGTH;
pinfo->mDayOffset = LLSettingsDay::DEFAULT_DAYOFFSET;
pinfo->mDayCycle = LLSettingsVODay::buildFromLegacyMessage(pinfo->mRegionId, legacy[1], legacy[2], legacy[3]);
if (pinfo->mDayCycle)
pinfo->mDayHash = pinfo->mDayCycle->getHash();
pinfo->mAltitudes[0] = 0;
pinfo->mAltitudes[2] = 10001;
pinfo->mAltitudes[3] = 10002;
pinfo->mAltitudes[4] = 10003;
return pinfo;
}
//=========================================================================
LLSettingsWater::ptr_t LLEnvironment::createWaterFromLegacyPreset(const std::string filename)
{

View File

@ -83,8 +83,10 @@ public:
std::array<F32, 4> mAltitudes;
bool mIsDefault;
LLUUID mAssetId;
bool mIsLegacy;
static ptr_t extract(LLSD);
static ptr_t extractLegacy(LLSD);
};
enum EnvSelection_t
@ -229,8 +231,6 @@ public:
//-------------------------------------------
connection_t setEnvironmentChanged(environment_changed_fn cb);
void onLegacyRegionSettings(LLSD data);
void requestRegion(environment_apply_fn cb = environment_apply_fn());
void updateRegion(const LLUUID &asset_id, S32 day_length, S32 day_offset, environment_apply_fn cb = environment_apply_fn());
void updateRegion(const LLSettingsDay::ptr_t &pday, S32 day_length, S32 day_offset, environment_apply_fn cb = environment_apply_fn());

View File

@ -207,13 +207,14 @@ LLFloaterSettingsPicker *LLPanelEnvironmentInfo::getSettingsPicker()
LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater()
{
static const S32 FOURHOURS(4 * 60 * 60);
LLFloaterEditExtDayCycle *editor = static_cast<LLFloaterEditExtDayCycle *>(mEditFloater.get());
// Show the dialog
if (!editor)
{
LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL)
(LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, static_cast<S32>(mCurrentEnvironment->mDayLength.value())));
(LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS));
editor = (LLFloaterEditExtDayCycle *)LLFloaterReg::getInstance(FLOATER_DAY_CYCLE_EDIT, params);
@ -321,10 +322,12 @@ void LLPanelEnvironmentInfo::onBtnReset()
void LLPanelEnvironmentInfo::onBtnEdit()
{
static const S32 FOURHOURS(4 * 60 * 60);
LLFloaterEditExtDayCycle *dayeditor = getEditFloater();
LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::VALUE_CONTEXT_REGION: LLFloaterEditExtDayCycle::VALUE_CONTEXT_PARCEL)
(LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, static_cast<S32>(mCurrentEnvironment->mDayLength.value())));
LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL)
(LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS));
dayeditor->openFloater(params);
if (mCurrentEnvironment->mDayCycle)

View File

@ -33,13 +33,12 @@
#include "llnotificationsutil.h"
#include "llcorehttputil.h"
#include "llenvironment.h"
#include "llparcel.h"
/****
* LLEnvironmentRequest
****/
// static
bool LLEnvironmentRequest::initiate()
bool LLEnvironmentRequest::initiate(LLEnvironment::environment_apply_fn cb)
{
LLViewerRegion* cur_region = gAgent.getRegion();
@ -52,15 +51,15 @@ bool LLEnvironmentRequest::initiate()
if (!cur_region->capabilitiesReceived())
{
LL_INFOS("WindlightCaps") << "Deferring windlight settings request until we've got region caps" << LL_ENDL;
cur_region->setCapabilitiesReceivedCallback([](LLUUID region_id) { LLEnvironmentRequest::onRegionCapsReceived(region_id); });
cur_region->setCapabilitiesReceivedCallback([cb](LLUUID region_id) { LLEnvironmentRequest::onRegionCapsReceived(region_id, cb); });
return false;
}
return doRequest();
return doRequest(cb);
}
// static
void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id, LLEnvironment::environment_apply_fn cb)
{
if (region_id != gAgent.getRegion()->getRegionID())
{
@ -69,11 +68,11 @@ void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
}
LL_DEBUGS("WindlightCaps") << "Received region capabilities" << LL_ENDL;
doRequest();
doRequest(cb);
}
// static
bool LLEnvironmentRequest::doRequest()
bool LLEnvironmentRequest::doRequest(LLEnvironment::environment_apply_fn cb)
{
std::string url = gAgent.getRegionCapability("EnvironmentSettings");
if (url.empty())
@ -88,7 +87,7 @@ bool LLEnvironmentRequest::doRequest()
std::string coroname =
LLCoros::instance().launch("LLEnvironmentRequest::environmentRequestCoro",
[url]() { LLEnvironmentRequest::environmentRequestCoro(url); });
[url, cb]() { LLEnvironmentRequest::environmentRequestCoro(url, cb); });
LL_INFOS("WindlightCaps") << "Requesting region windlight settings via " << url << LL_ENDL;
return true;
@ -97,7 +96,7 @@ bool LLEnvironmentRequest::doRequest()
S32 LLEnvironmentRequest::sLastRequest = 0;
//static
void LLEnvironmentRequest::environmentRequestCoro(std::string url)
void LLEnvironmentRequest::environmentRequestCoro(std::string url, LLEnvironment::environment_apply_fn cb)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
S32 requestId = ++LLEnvironmentRequest::sLastRequest;
@ -141,7 +140,12 @@ void LLEnvironmentRequest::environmentRequestCoro(std::string url)
return;
}
LLEnvironment::instance().onLegacyRegionSettings(result);
if (cb)
{
LLEnvironment::EnvironmentInfo::ptr_t pinfo = LLEnvironment::EnvironmentInfo::extractLegacy(result);
cb(INVALID_PARCEL_ID, pinfo);
}
}
@ -153,7 +157,7 @@ clock_t LLEnvironmentApply::UPDATE_WAIT_SECONDS = clock_t(3.f);
clock_t LLEnvironmentApply::sLastUpdate = clock_t(0.f);
// static
bool LLEnvironmentApply::initiateRequest(const LLSD& content)
bool LLEnvironmentApply::initiateRequest(const LLSD& content, LLEnvironment::environment_apply_fn cb)
{
clock_t current = clock();
@ -181,11 +185,11 @@ bool LLEnvironmentApply::initiateRequest(const LLSD& content)
std::string coroname =
LLCoros::instance().launch("LLEnvironmentApply::environmentApplyCoro",
[url, content]() { LLEnvironmentApply::environmentApplyCoro(url, content); });
[url, content, cb]() { LLEnvironmentApply::environmentApplyCoro(url, content, cb); });
return true;
}
void LLEnvironmentApply::environmentApplyCoro(std::string url, LLSD content)
void LLEnvironmentApply::environmentApplyCoro(std::string url, LLSD content, LLEnvironment::environment_apply_fn cb)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t

View File

@ -29,19 +29,20 @@
#include "llviewerprecompiledheaders.h"
#include "llcoros.h"
#include "llenvironment.h"
class LLEnvironmentRequest
{
LOG_CLASS(LLEnvironmentRequest);
public:
/// @return true if request was successfully sent
static bool initiate();
static bool initiate(LLEnvironment::environment_apply_fn cb);
private:
static void onRegionCapsReceived(const LLUUID& region_id);
static bool doRequest();
static void onRegionCapsReceived(const LLUUID& region_id, LLEnvironment::environment_apply_fn cb);
static bool doRequest(LLEnvironment::environment_apply_fn cb);
static void environmentRequestCoro(std::string url);
static void environmentRequestCoro(std::string url, LLEnvironment::environment_apply_fn cb);
static S32 sLastRequest;
};
@ -51,13 +52,13 @@ class LLEnvironmentApply
LOG_CLASS(LLEnvironmentApply);
public:
/// @return true if request was successfully sent
static bool initiateRequest(const LLSD& content);
static bool initiateRequest(const LLSD& content, LLEnvironment::environment_apply_fn cb);
private:
static clock_t sLastUpdate;
static clock_t UPDATE_WAIT_SECONDS;
static void environmentApplyCoro(std::string url, LLSD content);
static void environmentApplyCoro(std::string url, LLSD content, LLEnvironment::environment_apply_fn cb);
};