STORM-1256 WIP Implemented editing region environment settings via the Region/Estate floater.

meow-7.2.2
Vadim ProductEngine 2011-05-23 19:26:17 +03:00
parent 99fe1004a6
commit b60c63bf07
10 changed files with 391 additions and 37 deletions

View File

@ -367,7 +367,7 @@ void LLEnvManager::commitSettings(LLEnvKey::EScope scope)
metadata["messageID"] = mLastReceivedID; // add last received update ID to outbound message so simulator can handle concurrent updates
saveSettingsFromManagers(scope); // save current settings into settings store before grabbing from settings store and sending
success = LLEnvironmentApplyResponder::initiateRequest(makePacket(LLEnvKey::SCOPE_REGION, metadata));
success = LLEnvironmentApply::initiateRequest(makePacket(LLEnvKey::SCOPE_REGION, metadata));
if(success)
{
// while waiting for the return message, render old settings
@ -484,7 +484,7 @@ void LLEnvManager::saveSettingsFromManagers(LLEnvKey::EScope scope)
{
// ensure only referenced region-scope skies are saved, resolve naming collisions, etc.
std::map<LLWLParamKey, LLWLParamSet> final_references = LLWLParamManager::getInstance()->finalizeFromDayCycle(scope);
LLSD referenced_skies = LLWLParamManager::getInstance()->createSkyMap(final_references);
LLSD referenced_skies = LLWLParamManager::createSkyMap(final_references);
LL_DEBUGS("Windlight Sync") << "Dumping referenced skies (" << final_references.size() << ") to LLSD: " << referenced_skies << LL_ENDL;
@ -764,6 +764,23 @@ void LLEnvManagerNew::dumpUserPrefs()
LL_DEBUGS("Windlight") << "UseDayCycle: " << gSavedSettings.getBOOL("UseDayCycle") << LL_ENDL;
}
// static
LLSD LLEnvManagerNew::getDayCycleByName(const std::string name)
{
return LLWLDayCycle::loadCycleDataFromFile(name + ".xml");
}
bool LLEnvManagerNew::sendRegionSettings(const LLEnvironmentSettings& new_settings)
{
LLSD metadata;
metadata["regionID"] = gAgent.getRegion()->getRegionID();
// add last received update ID to outbound message so simulator can handle concurrent updates
metadata["messageID"] = mLastReceivedID;
return LLEnvironmentApply::initiateRequest(new_settings.makePacket(metadata));
}
void LLEnvManagerNew::onRegionCrossing()
{
LL_DEBUGS("Windlight") << "Crossed region" << LL_ENDL;
@ -795,7 +812,7 @@ void LLEnvManagerNew::updateManagersFromPrefs(bool interpolate)
LLWLParamManager::instance().applyUserPrefs(interpolate);
}
void LLEnvManagerNew::sendRegionSettingsRequest()
void LLEnvManagerNew::requestRegionSettings()
{
LLEnvironmentRequest::initiate();
// *TODO: Indicate that current cached region settings have been invalidated?
@ -816,11 +833,14 @@ void LLEnvManagerNew::onRegionChange(bool interpolate)
LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL;
mCurRegionUUID = region_uuid;
mInterpNextChangeMessage = interpolate;
sendRegionSettingsRequest();
requestRegionSettings();
}
void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
{
// If the message was valid, grab the UUID from it and save it for next outbound update message.
mLastReceivedID = content[0]["messageID"].asUUID();
// 1. Refresh cached region settings.
LL_DEBUGS("Windlight") << "Caching region environment settings: " << content << LL_ENDL;
F32 sun_hour = 0; // *TODO

View File

@ -99,7 +99,7 @@ public:
return mDayTime;
}
LLSD makePacket(const LLSD& metadata)
LLSD makePacket(const LLSD& metadata) const
{
LLSD full_packet = LLSD::emptyArray();
@ -261,19 +261,24 @@ class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
public:
LLEnvManagerNew();
// getters to access user env. preferences
bool getUseRegionSettings() const;
bool getUseDayCycle() const;
bool getUseFixedSky() const;
std::string getWaterPresetName() const;
std::string getSkyPresetName() const;
std::string getDayCycleName() const;
/// @return cached env. settings of the current region.
const LLEnvironmentSettings& getRegionSettings() const;
// setters for user env. preferences
void setUseRegionSettings(bool val);
void setUseWaterPreset(const std::string& name);
void setUseSkyPreset(const std::string& name);
void setUseDayCycle(const std::string& name);
// Preferences manipulation.
void loadUserPrefs();
void saveUserPrefs();
void setUserPrefs(
@ -284,6 +289,13 @@ public:
bool use_region_settings);
void dumpUserPrefs();
// Common interface to the wl/water managers.
static LLSD getDayCycleByName(const std::string name);
// Misc.
bool sendRegionSettings(const LLEnvironmentSettings& new_settings);
// Public callbacks.
void onRegionCrossing();
void onTeleport();
void onRegionSettingsResponse(const LLSD& content);
@ -293,7 +305,7 @@ private:
/*virtual*/ void initSingleton();
void updateManagersFromPrefs(bool interpolate);
void sendRegionSettingsRequest();
void requestRegionSettings();
void onRegionChange(bool interpolate);
@ -301,6 +313,7 @@ private:
LLEnvironmentSettings mCachedRegionPrefs; /// Cached region environment settings.
bool mInterpNextChangeMessage; /// Interpolate env. settings on next region change.
LLUUID mCurRegionUUID; /// To avoid duplicated region env. settings requests.
LLUUID mLastReceivedID; /// Id of last received region env. settings.
};
#endif // LL_LLENVMANAGER_H

View File

@ -40,6 +40,7 @@
#include "llxfermanager.h"
#include "indra_constants.h"
#include "message.h"
#include "llradiogroup.h"
#include "llsd.h"
#include "llsdserialize.h"
@ -83,6 +84,7 @@
#include "llviewertexteditor.h"
#include "llviewerwindow.h"
#include "llvlcomposition.h"
#include "llwaterparammanager.h"
#include "lltrans.h"
#include "llagentui.h"
@ -176,6 +178,7 @@ LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
BOOL LLFloaterRegionInfo::postBuild()
{
mTab = getChild<LLTabContainer>("region_panels");
mTab->setCommitCallback(boost::bind(&LLFloaterRegionInfo::onTabSelected, this, _2));
// contruct the panels
LLPanelRegionInfo* panel;
@ -423,6 +426,12 @@ LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
return panel;
}
void LLFloaterRegionInfo::onTabSelected(const LLSD& param)
{
LLPanel* active_panel = getChild<LLPanel>(param.asString());
active_panel->onOpen(LLSD());
}
void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
{
if (!region)
@ -3160,3 +3169,256 @@ bool LLDispatchSetEstateAccess::operator()(
return true;
}
LLPanelEnvironmentInfo::LLPanelEnvironmentInfo()
: mRegionSettingsRadioGroup(NULL),
mDayCycleSettingsRadioGroup(NULL),
mWaterPresetCombo(NULL),
mSkyPresetCombo(NULL),
mDayCyclePresetCombo(NULL)
{
}
// virtual
BOOL LLPanelEnvironmentInfo::postBuild()
{
mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group");
mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchRegionSettings, this));
mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group");
mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDayCycle, this));
mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo");
mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo");
mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo");
childSetCommitCallback("save_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnSave, this), NULL);
childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL);
return TRUE;
}
// virtual
void LLPanelEnvironmentInfo::onOpen(const LLSD& key)
{
refresh();
}
void LLPanelEnvironmentInfo::refresh()
{
populateWaterPresetsList();
populateSkyPresetsList();
populateDayCyclesList();
// Init radio groups.
const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings();
const LLSD& dc = settings.getWLDayCycle();
LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f;
const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0;
mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1);
mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
LLPanelEnvironmentInfo::onSwitchRegionSettings();
LLPanelEnvironmentInfo::onSwitchDayCycle();
}
void LLPanelEnvironmentInfo::populateWaterPresetsList()
{
mWaterPresetCombo->removeall();
// If the region already has water params, add them to the list.
const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
if (region_settings.getWaterParams().size() != 0)
{
const std::string& region_name = gAgent.getRegion()->getName();
mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD());
mWaterPresetCombo->addSeparator();
}
// Add local water presets.
const std::map<std::string, LLWaterParamSet> &water_params_map = LLWaterParamManager::instance().mParamList;
for (std::map<std::string, LLWaterParamSet>::const_iterator it = water_params_map.begin(); it != water_params_map.end(); it++)
{
mWaterPresetCombo->add(it->first, LLWLParamKey(it->first, LLEnvKey::SCOPE_LOCAL).toLLSD());
}
// There's no way to select current preset because its name is not stored on server.
}
void LLPanelEnvironmentInfo::populateSkyPresetsList()
{
mSkyPresetCombo->removeall();
const std::map<LLWLParamKey, LLWLParamSet> &sky_params_map = LLWLParamManager::getInstance()->mParamList;
for (std::map<LLWLParamKey, LLWLParamSet>::const_iterator it = sky_params_map.begin(); it != sky_params_map.end(); it++)
{
std::string preset_name = it->first.name;
std::string item_title;
if (it->first.scope == LLEnvKey::SCOPE_LOCAL) // local preset
{
item_title = preset_name;
}
else // region preset
{
item_title = preset_name + " (" + gAgent.getRegion()->getName() + ")";
}
// Saving as string instead of LLSD() for selectByValue() to work, as it doesn't support non-scalar values.
mSkyPresetCombo->add(item_title, it->first.toStringVal());
}
// Select current preset.
LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap();
if (sky_map.size() == 1) // if the region is set to fixed sky
{
std::string preset_name = sky_map.beginMap()->first;
mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
}
}
void LLPanelEnvironmentInfo::populateDayCyclesList()
{
mDayCyclePresetCombo->removeall();
// If the region already has env. settings, add its day cycle to the list.
const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
if (cur_region_dc.size() != 0)
{
LLViewerRegion* region = gAgent.getRegion();
llassert(region != NULL);
LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION);
mDayCyclePresetCombo->add(region->getName(), key.toLLSD());
mDayCyclePresetCombo->addSeparator();
}
// Add local day cycles.
// *TODO: multiple local day cycles support
LLWLParamKey key("Default", LLEnvKey::SCOPE_LOCAL);
mDayCyclePresetCombo->add("Default", key.toLLSD());
// Current day cycle is already selected.
}
void LLPanelEnvironmentInfo::onSwitchRegionSettings()
{
getChild<LLView>("user_environment_settings")->setEnabled(mRegionSettingsRadioGroup->getSelectedIndex() != 0);
}
void LLPanelEnvironmentInfo::onSwitchDayCycle()
{
bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
mSkyPresetCombo->setEnabled(is_fixed_sky);
mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
}
void LLPanelEnvironmentInfo::onBtnSave()
{
LL_DEBUGS("Windlight") << "About to save region settings" << LL_ENDL;
const LLEnvironmentSettings& old_region_settings = LLEnvManagerNew::instance().getRegionSettings();
const bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
const bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
LLSD day_cycle;
LLSD sky_map;
LLSD water_params;
if (use_defaults)
{
// settings will be empty
LL_DEBUGS("Windlight") << "Defaults" << LL_ENDL;
}
else // use custom region settings
{
if (use_fixed_sky)
{
LL_DEBUGS("Windlight") << "Use fixed sky" << LL_ENDL;
std::string preset_key(mSkyPresetCombo->getValue().asString());
LLWLParamKey preset(preset_key);
// Get the preset sky params.
LLWLParamSet params;
if (!LLWLParamManager::instance().getParamSet(preset, params))
{
llwarns << "Error getting sky params: " << preset.toLLSD() << llendl;
return;
}
// Create a day cycle consisting of a single sky preset.
LLSD key(LLSD::emptyArray());
key.append(-1.0f); // indicate that user preference is actually fixed sky, not a day cycle
key.append(preset.name);
day_cycle.append(key);
// Create a sky map consisting of only the sky preset.
std::map<LLWLParamKey, LLWLParamSet> refs;
refs[preset] = params;
sky_map = LLWLParamManager::createSkyMap(refs);
}
else // use day cycle
{
LLWLParamKey dc(mDayCyclePresetCombo->getValue());
LL_DEBUGS("Windlight") << "Use day cycle: " << dc.toLLSD() << LL_ENDL;
if (dc.scope == LLEnvKey::SCOPE_REGION) // current region day cycle
{
day_cycle = old_region_settings.getWLDayCycle();
sky_map = old_region_settings.getSkyMap();
}
else // a local day cycle
{
// *TODO: multiple local day cycles support
day_cycle = LLEnvManagerNew::instance().getDayCycleByName("Default");
// Create sky map from the day cycle.
{
std::map<LLWLParamKey, LLWLParamSet> refs;
LLWLDayCycle tmp_day;
tmp_day.loadDayCycle(day_cycle, dc.scope);
tmp_day.getSkyRefs(refs);
sky_map = LLWLParamManager::createSkyMap(refs);
}
LL_DEBUGS("Windlight") << "day_cycle: " << day_cycle << LL_ENDL;
LL_DEBUGS("Windlight") << "sky_map: " << sky_map << LL_ENDL;
}
}
// Get water params.
LLWLParamKey water_key(mWaterPresetCombo->getSelectedValue());
if (water_key.scope == LLEnvKey::SCOPE_REGION)
{
water_params = old_region_settings.getWaterParams();
}
else
{
LLWaterParamSet param_set;
if (!LLWaterParamManager::instance().getParamSet(water_key.name, param_set))
{
llwarns << "Error getting water preset: " << water_key.name << llendl;
return;
}
water_params = param_set.getAll();
}
}
// Send settings apply request.
LLEnvironmentSettings new_region_settings;
new_region_settings.saveParams(day_cycle, sky_map, water_params, 0.0f);
if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
{
llwarns << "Error applying region environment settings" << llendl;
}
}
void LLPanelEnvironmentInfo::onBtnCancel()
{
// Reload current region settings.
refresh();
}

View File

@ -46,6 +46,7 @@ class LLInventoryItem;
class LLCheckBoxCtrl;
class LLComboBox;
class LLNameListCtrl;
class LLRadioGroup;
class LLSliderCtrl;
class LLSpinCtrl;
class LLTextBox;
@ -100,6 +101,7 @@ private:
~LLFloaterRegionInfo();
protected:
void onTabSelected(const LLSD& param);
void refreshFromRegion(LLViewerRegion* region);
// member data
@ -422,6 +424,34 @@ protected:
class LLPanelEnvironmentInfo : public LLPanelRegionInfo
{
LOG_CLASS(LLPanelEnvironmentInfo);
public:
LLPanelEnvironmentInfo();
// LLPanel
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
private:
void refresh();
void populateWaterPresetsList();
void populateSkyPresetsList();
void populateDayCyclesList();
void onSwitchRegionSettings();
void onSwitchDayCycle();
void onBtnSave();
void onBtnCancel();
LLRadioGroup* mRegionSettingsRadioGroup;
LLRadioGroup* mDayCycleSettingsRadioGroup;
LLComboBox* mWaterPresetCombo;
LLComboBox* mSkyPresetCombo;
LLComboBox* mDayCyclePresetCombo;
};
#endif

View File

@ -146,6 +146,25 @@ LLSD LLWLDayCycle::asLLSD()
return day_data;
}
bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs)
{
bool result = true;
LLWLParamManager& wl_mgr = LLWLParamManager::instance();
refs.clear();
for (std::map<F32, LLWLParamKey>::iterator iter = mTimeMap.begin(); iter != mTimeMap.end(); ++iter)
{
LLWLParamKey& key = iter->second;
if (!wl_mgr.getParamSet(key, refs[key]))
{
llwarns << "Cannot find sky [" << key.name << "] referenced by a day cycle" << llendl;
result = false;
}
}
return result;
}
void LLWLDayCycle::clearKeyframes()
{
lldebugs << "Clearing key frames" << llendl;

View File

@ -71,6 +71,9 @@ public:
/// get the LLSD data for this day cycle
LLSD asLLSD();
// get skies referenced by this day cycle
bool getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs);
/// clear keyframes
void clearKeyframes();

View File

@ -127,21 +127,20 @@ LLEnvironmentRequestResponder::LLEnvironmentRequestResponder()
LLEnvManagerNew::getInstance()->onRegionSettingsResponse(LLSD());
}
/****
* LLEnvironmentApplyResponder
* LLEnvironmentApply
****/
clock_t LLEnvironmentApplyResponder::UPDATE_WAIT_SECONDS = clock_t(3.f);
clock_t LLEnvironmentApplyResponder::sLastUpdate = clock_t(0.f);
bool LLEnvironmentApplyResponder::initiateRequest(const LLSD& content)
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)
{
clock_t current = clock();
if(current >= sLastUpdate + (UPDATE_WAIT_SECONDS * CLOCKS_PER_SEC))
{
sLastUpdate = current;
}
else
// Make sure we don't update too frequently.
if (current < sLastUpdate + (UPDATE_WAIT_SECONDS * CLOCKS_PER_SEC))
{
LLSD args(LLSD::emptyMap());
args["WAIT"] = (F64)UPDATE_WAIT_SECONDS;
@ -149,20 +148,25 @@ bool LLEnvironmentApplyResponder::initiateRequest(const LLSD& content)
return false;
}
sLastUpdate = current;
// Send update request.
std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
if (!url.empty())
{
LL_INFOS("WindlightCaps") << "Sending windlight settings to " << url << LL_ENDL;
LL_DEBUGS("WindlightCaps") << "content: " << content << LL_ENDL;
LLHTTPClient::post(url, content, new LLEnvironmentApplyResponder());
return true;
}
else
if (url.empty())
{
LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL;
return false;
}
return false;
LL_INFOS("WindlightCaps") << "Sending windlight settings to " << url << LL_ENDL;
LL_DEBUGS("WindlightCaps") << "content: " << content << LL_ENDL;
LLHTTPClient::post(url, content, new LLEnvironmentApplyResponder());
return true;
}
/****
* LLEnvironmentApplyResponder
****/
/*virtual*/ void LLEnvironmentApplyResponder::result(const LLSD& content)
{
if (content["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
@ -183,8 +187,6 @@ bool LLEnvironmentApplyResponder::initiateRequest(const LLSD& content)
args["FAIL_REASON"] = content["fail_reason"].asString();
LLNotificationsUtil::add("WLRegionApplyFail", args);
}
LLEnvManager::getInstance()->commitSettingsFinished(LLEnvKey::SCOPE_REGION);
}
/*virtual*/ void LLEnvironmentApplyResponder::error(U32 status, const std::string& reason)
{
@ -196,6 +198,4 @@ bool LLEnvironmentApplyResponder::initiateRequest(const LLSD& content)
LLSD args(LLSD::emptyMap());
args["FAIL_REASON"] = msg.str();
LLNotificationsUtil::add("WLRegionApplyFail", args);
LLEnvManager::getInstance()->commitSettingsFinished(LLEnvKey::SCOPE_REGION);
}

View File

@ -66,6 +66,18 @@ private:
int mID;
};
class LLEnvironmentApply
{
LOG_CLASS(LLEnvironmentApply);
public:
/// @return true if request was successfully sent
static bool initiateRequest(const LLSD& content);
private:
static clock_t sLastUpdate;
static clock_t UPDATE_WAIT_SECONDS;
};
class LLEnvironmentApplyResponder: public LLHTTPClient::Responder
{
LOG_CLASS(LLEnvironmentApplyResponder);
@ -89,14 +101,8 @@ public:
virtual void error(U32 status, const std::string& reason); // non-200 errors only
private:
friend class LLEnvManager;
friend class LLEnvironmentApply;
static clock_t sLastUpdate;
static clock_t UPDATE_WAIT_SECONDS;
// for format of packet expected, see llwlscrubbers.cpp in llmessage
static bool initiateRequest(const LLSD& packet);
LLEnvironmentApplyResponder() {}
};

View File

@ -234,6 +234,7 @@ std::map<LLWLParamKey, LLWLParamSet> LLWLParamManager::finalizeFromDayCycle(LLWL
return final_references;
}
// static
LLSD LLWLParamManager::createSkyMap(std::map<LLWLParamKey, LLWLParamSet> refs)
{
LLSD skies = LLSD::emptyMap();

View File

@ -289,7 +289,7 @@ public:
std::map<LLWLParamKey, LLWLParamSet> finalizeFromDayCycle(LLWLParamKey::EScope scope);
// returns all skies in map (intended to be called with output from a finalize)
LLSD createSkyMap(std::map<LLWLParamKey, LLWLParamSet> map);
static LLSD createSkyMap(std::map<LLWLParamKey, LLWLParamSet> map);
// helper variables
LLWLAnimator mAnimator;