Round #1 : EEP in OS.

Basic changes to allow EEP viewer to operate in OpenSim.
These changes restore windlight support by converting to EEP
As OpenSim does not yet have EEP Asset support this can only be
done on-the-fly. Quickprefs and region windlight support should
now work.
windlight setting through the region floater will not work, editing windlight settings will also not work.
Windlight support is not allowed in Second Life.
master
Beq 2020-06-10 20:29:02 +01:00
parent 102b1b5031
commit 0fa2fde0b3
3 changed files with 351 additions and 37 deletions

View File

@ -33,6 +33,7 @@
#include "llagent.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewerregion.h"
#include "llviewernetwork.h" // <FS:Beq/> for LLGridManager
#include "llwlhandlers.h"
#include "lltrans.h"
#include "lltrace.h"
@ -821,6 +822,72 @@ LLEnvironment::LLEnvironment():
mShowMoonBeacon(false)
{
}
// <FS:Beq> OpenSim legacy Windlight setting support
#ifdef OPENSIM
std::string unescape_name(const std::string& name);
void LLEnvironment::loadLegacyPresets()
{
// [EEPMERGE]
//LLDayCycleManager::preset_name_list_t user_presets, sys_presets;
//LLDayCycleManager::instance().getPresetNames(user_presets, sys_presets);
// [/EEPMERGE]
std::string path_name;
path_name = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "skies", "");
bool found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacySkies.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Sky: " << unescape_name(name) << LL_ENDL;
}
}
path_name = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "water", "");
found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacyWater.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Water: " << unescape_name(name) << LL_ENDL;
}
}
path_name = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "days", "");
found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacyDayCycles.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Day Cycle: " << unescape_name(name) << LL_ENDL;
}
}
}
void LLEnvironment::loadUserPrefs()
{
// operate on members directly to avoid side effects
mWaterPresetName = gSavedSettings.getString("WaterPresetName");
mSkyPresetName = gSavedSettings.getString("SkyPresetName");
mDayCycleName = gSavedSettings.getString("DayCycleName");
}
#endif //opensim
//</FS:Beq>
void LLEnvironment::initSingleton()
{
@ -832,6 +899,12 @@ void LLEnvironment::initSingleton()
mCurrentEnvironment->setWater(p_default_water);
mEnvironments[ENV_DEFAULT] = mCurrentEnvironment;
// <FS:Beq> OpenSim legacy Windlight setting support
#ifdef OPENSIM
loadLegacyPresets();
loadUserPrefs();
#endif
// </FS:Beq>
requestRegion();
@ -1221,7 +1294,7 @@ void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env,
if (!settings || status)
{
LLSD args;
args["DESC"] = asset_id.asString();
args["NAME"] = asset_id.asString();// <FS:Beq/> fix the args to match the template.
LLNotificationsUtil::add("FailedToFindSettings", args);
return;
}
@ -1367,12 +1440,12 @@ void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool f
{
if (transition != TRANSITION_INSTANT)
{
DayInstance::ptr_t trans = std::make_shared<DayTransition>(
mCurrentEnvironment->getSky(), mCurrentEnvironment->getWater(), pinstance, transition);
trans->animate();
mCurrentEnvironment = trans;
DayInstance::ptr_t trans = std::make_shared<DayTransition>(
mCurrentEnvironment->getSky(), mCurrentEnvironment->getWater(), pinstance, transition);
trans->animate();
mCurrentEnvironment = trans;
}
else
{
@ -1618,8 +1691,14 @@ 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, envinfo->mEnvVersion);
updateEnvironment();
// <FS:Beq> opensim legacy windlight. Nothing we can do here as the default assets do not exist in OpenSim
LL_WARNS("ENVIRONMENT") << "No DayCycle specified - setting default" << LL_ENDL;
if(LLGridManager::getInstance()->isInSecondLife())
{
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET, envinfo->mEnvVersion);
updateEnvironment();
}
// </FS:Beq>
}
else if (envinfo->mDayCycle->isTrackEmpty(LLSettingsDay::TRACK_WATER)
|| envinfo->mDayCycle->isTrackEmpty(LLSettingsDay::TRACK_GROUND_LEVEL))
@ -2152,10 +2231,14 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extractLeg
pinfo->mDayHash = pinfo->mDayCycle->getHash();
pinfo->mAltitudes[0] = 0;
pinfo->mAltitudes[2] = 10001;
pinfo->mAltitudes[3] = 10002;
pinfo->mAltitudes[4] = 10003;
// <FS:Beq> Fix typos that offset this by 1. Shoudl get fixed in a merge from the lab soon.
// pinfo->mAltitudes[2] = 10001;
// pinfo->mAltitudes[3] = 10002;
// pinfo->mAltitudes[4] = 10003;
pinfo->mAltitudes[1] = 10001;
pinfo->mAltitudes[2] = 10002;
pinfo->mAltitudes[3] = 10003;
// </FS:Beq>
return pinfo;
}
@ -2361,7 +2444,7 @@ void LLEnvironment::onSetExperienceEnvAssetLoaded(LLUUID experience_id, LLSettin
if (!settings || status)
{
LLSD args;
args["DESC"] = experience_id.asString();
args["NAME"] = experience_id.asString();// <FS:Beq/> fix the args to match the template.
LLNotificationsUtil::add("FailedToFindSettings", args);
return;
}

View File

@ -374,6 +374,20 @@ private:
experience_overrides_t mExperienceOverrides;
DayInstance::ptr_t getEnvironmentInstance(EnvSelection_t env, bool create = false);
// <FS:Beq> opensim windlight setting
#ifdef OPENSIM
public:
std::vector<std::string> mLegacySkies;
std::vector<std::string> mLegacyWater;
std::vector<std::string> mLegacyDayCycles;
std::string mWaterPresetName;
std::string mSkyPresetName;
std::string mDayCycleName;
private:
void loadLegacyPresets();
void loadUserPrefs();
#endif
// </FS:Beq>
void updateCloudScroll();

View File

@ -52,6 +52,7 @@
#include "llspinctrl.h"
#include "lltoolbarview.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h" // <FS:Beq/> for LLGridManager
#include "llviewerregion.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@ -288,6 +289,27 @@ void FloaterQuickPrefs::loadDayCyclePresets(const std::multimap<std::string, LLU
mDayCyclePresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy day cycle presets to QP" << LL_ENDL;
// WL still supported
if (!daycycle_map.empty() && !LLEnvironment::getInstance()->mLegacyDayCycles.empty())
{
mDayCyclePresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacyDayCycles)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy day cycle " << preset_name << LL_ENDL;
mDayCyclePresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy day cycle presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadSkyPresets(const std::multimap<std::string, LLUUID>& sky_map)
@ -308,6 +330,27 @@ void FloaterQuickPrefs::loadSkyPresets(const std::multimap<std::string, LLUUID>&
mWLPresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy sky presets to QP" << LL_ENDL;
// WL still supported
if (!sky_map.empty() && !LLEnvironment::getInstance()->mLegacySkies.empty())
{
mWLPresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacySkies)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy sky " << preset_name << LL_ENDL;
mWLPresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy sky presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadWaterPresets(const std::multimap<std::string, LLUUID>& water_map)
@ -328,6 +371,27 @@ void FloaterQuickPrefs::loadWaterPresets(const std::multimap<std::string, LLUUID
mWaterPresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy presets to QP" << LL_ENDL;
// WL still supported
if (!water_map.empty() && !LLEnvironment::getInstance()->mLegacyWater.empty())
{
mWaterPresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacyWater)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy water " << preset_name << LL_ENDL;
mWaterPresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy water presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadPresets()
@ -388,32 +452,108 @@ void FloaterQuickPrefs::setSelectedEnvironment()
// day cycle. If no fixed sky or fixed water is set, they are either
// defined in the day cycle or inherited from a higher environment level.
LLSettingsDay::ptr_t day = LLEnvironment::instance().getEnvironmentDay(LLEnvironment::ENV_LOCAL);
if (day && day->getAssetId().notNull())
if (day)
{
//LL_INFOS() << "EEP: day name = " << day->getName() << " - asset id = " << day->getAssetId() << LL_ENDL;
mDayCyclePresetsCombo->selectByValue(LLSD(day->getAssetId()));
// Water is part of a day cycle
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
if( day->getAssetId().notNull())
{ // EEP processing
mDayCyclePresetsCombo->selectByValue(LLSD(day->getAssetId()));
// Sky and Water are part of a day cycle in EEP
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = day->getName();
LL_DEBUGS("WindlightCaps") << "Current Day cycle is " << preset_name << LL_ENDL;
if (preset_name == "_default_")
{
preset_name = "Default";
}
mDayCyclePresetsCombo->selectByValue(preset_name);
// Sky is part of day so treat that as day cycle
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
// Water is not part of legacy day so we need to hunt around
LLSettingsWater::ptr_t water = LLEnvironment::instance().getEnvironmentFixedWater(LLEnvironment::ENV_LOCAL);
if (water)
{
// This is going to be possible. OS will support both Legacy and EEP
// so having a water EEP asset with a Legacy day cycle could happen.
LLUUID asset_id = water->getAssetId();
if (asset_id.notNull())
{
mWaterPresetsCombo->selectByValue(LLSD(asset_id));
}
else
{
//mWaterPresetsCombo->selectByValue(LLSD(water->getName()));
std::string preset_name = water->getName();
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWaterPresetsCombo->selectByValue(preset_name);
}
}
}
#endif //OPENSIM
}
else
{
mDayCyclePresetsCombo->selectByValue(LLSD(PRESET_NAME_NONE));
}
LLSettingsSky::ptr_t sky = LLEnvironment::instance().getEnvironmentFixedSky(LLEnvironment::ENV_LOCAL);
if (sky && sky->getAssetId().notNull())
if (sky)
{
//LL_INFOS() << "EEP: sky name = " << sky->getName() << " - asset id = " << sky->getAssetId() << LL_ENDL;
mWLPresetsCombo->selectByValue(LLSD(sky->getAssetId()));
if(sky->getAssetId().notNull())
{
mWLPresetsCombo->selectByValue(LLSD(sky->getAssetId()));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = sky->getName();
LL_DEBUGS("WindlightCaps") << "Current Sky is " << preset_name << LL_ENDL;
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWLPresetsCombo->selectByValue(preset_name);
}
#endif
}
// Water is not part of legacy day so we need to hunt around
LLSettingsWater::ptr_t water = LLEnvironment::instance().getEnvironmentFixedWater(LLEnvironment::ENV_LOCAL);
if (water && water->getAssetId().notNull())
if (water)
{
//LL_INFOS() << "EEP: water name = " << water->getName() << " - asset id = " << water->getAssetId() << LL_ENDL;
mWaterPresetsCombo->selectByValue(LLSD(water->getAssetId()));
LLUUID asset_id = water->getAssetId();
if (asset_id.notNull())
{
mWaterPresetsCombo->selectByValue(LLSD(asset_id));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = water->getName();
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWaterPresetsCombo->selectByValue(preset_name);
}
}
#endif //OPENSIM
}
else
{
// LLEnvironment::ENV_REGION:
// LLEnvironment::ENV_PARCEL:
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
mDayCyclePresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
}
}
@ -631,11 +771,21 @@ void FloaterQuickPrefs::loadSavedSettingsFromFile(const std::string& settings_pa
bool FloaterQuickPrefs::isValidPreset(const LLSD& preset)
{
return (!preset.asString().empty() &&
!preset.asUUID().isNull() &&
preset.asString() != PRESET_NAME_REGION_DEFAULT &&
preset.asString() != PRESET_NAME_DAY_CYCLE &&
preset.asString() != PRESET_NAME_NONE);
if (preset.isUUID())
{
if(!preset.asUUID().isNull()){ return true;}
}
else if (preset.isString())
{
if(!preset.asString().empty() &&
preset.asString() != PRESET_NAME_REGION_DEFAULT &&
preset.asString() != PRESET_NAME_DAY_CYCLE &&
preset.asString() != PRESET_NAME_NONE)
{
return true;
}
}
return false;
}
void FloaterQuickPrefs::stepComboBox(LLComboBox* ctrl, bool forward)
@ -663,21 +813,88 @@ void FloaterQuickPrefs::stepComboBox(LLComboBox* ctrl, bool forward)
void FloaterQuickPrefs::selectSkyPreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
// Opensim continued W/L support
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsSky::ptr_t legacy_sky = nullptr;
LLSD messages;
legacy_sky = LLEnvironment::createSkyFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "skies", preset.asString() + ".xml"), messages);
if (legacy_sky)
{
// Need to preserve current sky manually in this case in contrast to asset-based settings
LLSettingsWater::ptr_t current_water = LLEnvironment::instance().getCurrentWater();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, legacy_sky, current_water);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // note the else here bridges the endif
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}
void FloaterQuickPrefs::selectWaterPreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsWater::ptr_t legacy_water = nullptr;
LLSD messages;
legacy_water = LLEnvironment::createWaterFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "water", preset.asString() + ".xml"), messages);
if (legacy_water)
{
// Need to preserve current sky manually in this case in contrast to asset-based settings
LLSettingsSky::ptr_t current_sky = LLEnvironment::instance().getCurrentSky();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, current_sky, legacy_water);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // beware the trailing else here.
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}
void FloaterQuickPrefs::selectDayCyclePreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsDay::ptr_t legacyday = nullptr;
LLSD messages;
legacyday = LLEnvironment::createDayCycleFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "days", preset.asString() + ".xml"), messages);
if (legacyday)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, legacyday);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // beware trailing else that bridges the endif
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}