/* Copyright (c) 2010 * * Modular Systems All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. Neither the name Modular Systems nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS “AS IS” * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "llviewerprecompiledheaders.h" #include "wlfPanel_AdvSettings.h" #include "llbutton.h" #include "lluictrlfactory.h" #include "llviewercontrol.h" #include "lliconctrl.h" #include "lloverlaybar.h" #include "lltextbox.h" #include "llcombobox.h" #include "llsliderctrl.h" #include "llcheckboxctrl.h" #include "llstartup.h" #include "llfloaterwindlight.h" #include "llfloaterwater.h" #include "llagent.h" #include "llagentcamera.h" #include "lldaycyclemanager.h" #include "llenvmanager.h" #include "llviewerregion.h" #include "llvoavatarself.h" #include "llwaterparammanager.h" #include "llwlparamset.h" #include "llwlparammanager.h" // Hover funcs void syncFromPreferenceSetting(LLSliderCtrl* sldrCtrl); void onHoverSliderMoved(const LLSD& val); void onHoverSliderFinalCommit(const LLSD& val); wlfPanel_AdvSettings::wlfPanel_AdvSettings() : mExpanded(false) { setVisible(false); setIsChrome(TRUE); setFocusRoot(TRUE); mCommitCallbackRegistrar.add("Wlf.ChangeCameraPreset", boost::bind(&wlfPanel_AdvSettings::onChangeCameraPreset, this, _1, _2)); if(rlv_handler_t::isEnabled()) gRlvHandler.setBehaviourToggleCallback(boost::bind(&wlfPanel_AdvSettings::onRlvBehaviorChange, this, _1, _2)); } //static void wlfPanel_AdvSettings::updateClass() { if (!instanceExists()) return; instance().build(); } void wlfPanel_AdvSettings::build() { mConnections.clear(); deleteAllChildren(); mExpanded = gSavedSettings.getBOOL("wlfAdvSettingsPopup"); if (mRegionChangedSlot.connected()) mRegionChangedSlot.disconnect(); LLUICtrlFactory::instance().buildPanel(this, mExpanded ? "wlfPanel_AdvSettings_expanded.xml" : "wlfPanel_AdvSettings.xml", &getFactoryMap()); } // [RLVa:KB] - Checked: 2013-06-20 void wlfPanel_AdvSettings::updateRlvVisibility() { if (!mExpanded || !rlv_handler_t::isEnabled()) return; bool enable = !gRlvHandler.hasBehaviour(RLV_BHVR_SETENV); childSetEnabled("use_estate_wl", enable); childSetEnabled("EnvAdvancedWaterButton", enable); mWaterPresetCombo->setEnabled(enable); childSetEnabled("WWprev", enable); childSetEnabled("WWnext", enable); childSetEnabled("EnvAdvancedSkyButton", enable); mSkyPresetCombo->setEnabled(enable); childSetEnabled("WLprev", enable); childSetEnabled("WLnext", enable); mTimeSlider->setEnabled(enable); } void wlfPanel_AdvSettings::onRlvBehaviorChange(ERlvBehaviour eBhvr, ERlvParamType eType) { if (eBhvr == RLV_BHVR_SETENV) updateRlvVisibility(); } // [/RLVa:KB] void wlfPanel_AdvSettings::refreshLists() { LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); // Populate the combo boxes with appropriate lists of available presets. //actually, dont do this, its laggy and not needed to just refresh the selections // populateWaterPresetsList(); // populateSkyPresetsList(); // populateDayCyclePresetsList(); //populate the combos with "Default" if using region settings if (gSavedSettings.getBOOL("UseEnvironmentFromRegion")) { mWaterPresetCombo->selectByValue("Default"); mSkyPresetCombo->selectByValue("Default"); //mDayCyclePresetCombo->selectByValue("Default"); } else { // Select the current presets in combo boxes. mWaterPresetCombo->selectByValue(env_mgr.getWaterPresetName()); mSkyPresetCombo->selectByValue(env_mgr.getSkyPresetName()); //mDayCyclePresetCombo->selectByValue(env_mgr.getDayCycleName()); } updateTimeSlider(); } BOOL wlfPanel_AdvSettings::postBuild() { setVisible(true); if (LLUICtrl* ctrl = findChild("expand")) ctrl->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onClickExpandBtn, this)); if (mExpanded) { // Windlight getChild("use_estate_wl")->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onUseRegionSettings, this, _2)); mWaterPresetCombo = getChild("WLWaterPresetsCombo"); mWaterPresetCombo->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onChangeWWPresetName, this, _2)); mSkyPresetCombo = getChild("WLSkyPresetsCombo"); mSkyPresetCombo->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onChangeWLPresetName, this, _2)); // mDayCyclePresetCombo = getChild("DCPresetsCombo"); // mDayCyclePresetCombo->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onChangeDCPresetName, this, _2)); mConnections.push_front(new boost::signals2::scoped_connection(LLEnvManagerNew::instance().setPreferencesChangeCallback(boost::bind(&wlfPanel_AdvSettings::refreshLists, this)))); mConnections.push_front(new boost::signals2::scoped_connection(LLWaterParamManager::getInstance()->setPresetListChangeCallback(boost::bind(&wlfPanel_AdvSettings::populateWaterPresetsList, this)))); mConnections.push_front(new boost::signals2::scoped_connection(LLWLParamManager::getInstance()->setPresetListChangeCallback(boost::bind(&wlfPanel_AdvSettings::populateSkyPresetsList, this)))); // LLDayCycleManager::instance().setModifyCallback(boost::bind(&wlfPanel_AdvSettings::populateDayCyclePresetsList, this)); populateWaterPresetsList(); populateSkyPresetsList(); //populateDayCyclePresetsList(); // next/prev buttons getChild("WWnext")->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onClickWWNext, this)); getChild("WWprev")->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onClickWWPrev, this)); getChild("WLnext")->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onClickWLNext, this)); getChild("WLprev")->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onClickWLPrev, this)); getChild("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(LLFloaterWindLight::show)); getChild("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(LLFloaterWater::show)); mTimeSlider = getChild("EnvTimeSlider"); mTimeSlider->setCommitCallback(boost::bind(&wlfPanel_AdvSettings::onChangeDayTime, this, _2)); updateTimeSlider(); updateRlvVisibility(); // Camera Presets const U32 preset(gSavedSettings.getU32("CameraPreset")); if (preset == CAMERA_PRESET_REAR_VIEW) getChildView("Rear")->setValue(true); else if (preset == CAMERA_PRESET_FRONT_VIEW) getChildView("Front")->setValue(true); else if (preset == CAMERA_PRESET_GROUP_VIEW) getChildView("Group")->setValue(true); // Hover height mHoverHeight = getChild("HoverHeightSlider"); mHoverHeight->setMinValue(MIN_HOVER_Z); mHoverHeight->setMaxValue(MAX_HOVER_Z); mHoverHeight->setSliderMouseUpCallback(boost::bind(onHoverSliderFinalCommit, _2)); mHoverHeight->setSliderEditorCommitCallback(boost::bind(onHoverSliderFinalCommit, _2)); mHoverHeight->setCommitCallback(boost::bind(onHoverSliderMoved, _2)); // Initialize slider from pref setting. syncFromPreferenceSetting(mHoverHeight); // Update slider on future pref changes. if (LLControlVariable* control = gSavedPerAccountSettings.getControl("AvatarHoverOffsetZ")) { control->getCommitSignal()->connect(boost::bind(&syncFromPreferenceSetting, mHoverHeight)); } else { LL_WARNS() << "Control not found for AvatarHoverOffsetZ" << LL_ENDL; } updateEditHoverEnabled(); if (!mRegionChangedSlot.connected()) { mRegionChangedSlot = gAgent.addRegionChangedCallback(boost::bind(&wlfPanel_AdvSettings::onRegionChanged, this)); } // Set up based on initial region. onRegionChanged(); } else { mHoverHeight = NULL; } return TRUE; } void wlfPanel_AdvSettings::draw() { refresh(); LLPanel::draw(); } wlfPanel_AdvSettings::~wlfPanel_AdvSettings () { } void wlfPanel_AdvSettings::onClickExpandBtn() { LLControlVariable* ctrl = gSavedSettings.getControl("wlfAdvSettingsPopup"); ctrl->set(!ctrl->get()); } void wlfPanel_AdvSettings::onChangeCameraPreset(LLUICtrl* ctrl, const LLSD& param) { if (!ctrl->getValue()) // One of these must be set at all times { ctrl->setValue(true); return; } // 0 is rear, 1 is front, 2 is group const ECameraPreset preset((param.asInteger() == 0) ? CAMERA_PRESET_REAR_VIEW : (param.asInteger() == 1) ? CAMERA_PRESET_FRONT_VIEW : CAMERA_PRESET_GROUP_VIEW); // Turn off the other preset indicators if (preset != CAMERA_PRESET_REAR_VIEW) getChildView("Rear")->setValue(false); if (preset != CAMERA_PRESET_FRONT_VIEW) getChildView("Front")->setValue(false); if (preset != CAMERA_PRESET_GROUP_VIEW) getChildView("Group")->setValue(false); // Actually switch the camera gAgentCamera.switchCameraPreset(preset); } void wlfPanel_AdvSettings::onUseRegionSettings(const LLSD& value) { LLEnvManagerNew::instance().setUseRegionSettings(value.asBoolean(), gSavedSettings.getBOOL("PhoenixInterpolateSky")); } void wlfPanel_AdvSettings::onChangeWWPresetName(const LLSD& value) { const std::string& wwset = value.asString(); if (wwset.empty()) return; if (LLWaterParamManager::getInstance()->hasParamSet(wwset)) { LLEnvManagerNew::instance().setUseWaterPreset(wwset, gSavedSettings.getBOOL("PhoenixInterpolateWater")); } else { //if that failed, use region's // LLEnvManagerNew::instance().useRegionWater(); LLEnvManagerNew::instance().setUseWaterPreset("Default", gSavedSettings.getBOOL("PhoenixInterpolateWater")); } } void wlfPanel_AdvSettings::onChangeWLPresetName(const LLSD& value) { const std::string& wlset = value.asString(); if (wlset.empty()) return; const LLWLParamKey key(wlset, LLEnvKey::SCOPE_LOCAL); if (LLWLParamManager::getInstance()->hasParamSet(key)) { LLEnvManagerNew::instance().setUseSkyPreset(wlset, gSavedSettings.getBOOL("PhoenixInterpolateSky")); } else { //if that failed, use region's // LLEnvManagerNew::instance().useRegionSky(); LLEnvManagerNew::instance().setUseSkyPreset("Default", gSavedSettings.getBOOL("PhoenixInterpolateSky")); } } void wlfPanel_AdvSettings::onClickWWNext() { S32 index = mWaterPresetCombo->getCurrentIndex(); ++index; if (index == mWaterPresetCombo->getItemCount()) index = 0; mWaterPresetCombo->setCurrentByIndex(index); onChangeWWPresetName(mWaterPresetCombo->getSelectedValue()); } void wlfPanel_AdvSettings::onClickWWPrev() { S32 index = mWaterPresetCombo->getCurrentIndex(); if (index == 0) index = mWaterPresetCombo->getItemCount(); --index; mWaterPresetCombo->setCurrentByIndex(index); onChangeWWPresetName(mWaterPresetCombo->getSelectedValue()); } void wlfPanel_AdvSettings::onClickWLNext() { S32 index = mSkyPresetCombo->getCurrentIndex(); ++index; if (index == mSkyPresetCombo->getItemCount()) index = 0; mSkyPresetCombo->setCurrentByIndex(index); onChangeWLPresetName(mSkyPresetCombo->getSelectedValue()); } void wlfPanel_AdvSettings::onClickWLPrev() { S32 index = mSkyPresetCombo->getCurrentIndex(); if (index == 0) index = mSkyPresetCombo->getItemCount(); --index; mSkyPresetCombo->setCurrentByIndex(index); onChangeWLPresetName(mSkyPresetCombo->getSelectedValue()); } void wlfPanel_AdvSettings::onChangeDayTime(const LLSD& value) { // deactivate animator LLWLParamManager& inst(LLWLParamManager::instance()); inst.mAnimator.deactivate(); F32 val = value.asFloat() + 0.25f; if(val > 1.0) { val--; } inst.mAnimator.setDayTime((F64)val); inst.mAnimator.update(inst.mCurParams); } void wlfPanel_AdvSettings::populateWaterPresetsList() { mWaterPresetCombo->removeall(); std::list presets; LLWaterParamManager::getInstance()->getPresetNames(presets); for (std::list::const_iterator it = presets.begin(); it != presets.end(); ++it) { mWaterPresetCombo->add(*it); } //populate the combos with "Default" if using region settings if (gSavedSettings.getBOOL("UseEnvironmentFromRegion")) { mWaterPresetCombo->selectByValue("Default"); } else { // Select the current presets in combo boxes. mWaterPresetCombo->selectByValue(LLEnvManagerNew::instance().getWaterPresetName()); } } void wlfPanel_AdvSettings::populateSkyPresetsList() { mSkyPresetCombo->removeall(); LLWLParamManager::preset_name_list_t local_presets; LLWLParamManager::getInstance()->getLocalPresetNames(local_presets); for (LLWLParamManager::preset_name_list_t::const_iterator it = local_presets.begin(); it != local_presets.end(); ++it) { mSkyPresetCombo->add(*it); } //populate the combos with "Default" if using region settings if (gSavedSettings.getBOOL("UseEnvironmentFromRegion")) { mSkyPresetCombo->selectByValue("Default"); } else { // Select the current presets in combo boxes. mSkyPresetCombo->selectByValue(LLEnvManagerNew::instance().getSkyPresetName()); } } // void wlfPanel_AdvSettings::populateDayCyclePresetsList() // { // mDayCyclePresetCombo->removeall(); // LLDayCycleManager::preset_name_list_t user_days, sys_days; // LLDayCycleManager::instance().getPresetNames(user_days, sys_days); // // Add user days. // for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it) // { // mDayCyclePresetCombo->add(*it); // } // if (user_days.size() > 0) // { // mDayCyclePresetCombo->addSeparator(); // } // // Add system days. // for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it) // { // mDayCyclePresetCombo->add(*it); // } //populate the combos with "Default" if using region settings // if (gSavedSettings.getBOOL("UseEnvironmentFromRegion")) // { // mDayCyclePresetCombo->selectByValue("Default"); // } // else // { // Select the current presets in combo boxes. // mDayCyclePresetCombo->selectByValue(LLEnvManagerNew::instance().getDayCycleName()); // } // } void wlfPanel_AdvSettings::updateTimeSlider() { F32 val = LLWLParamManager::getInstance()->mAnimator.getDayTime() - 0.25f; if(val < 0.0) { val++; } mTimeSlider->setValue(val); } // Hover junk void syncFromPreferenceSetting(LLSliderCtrl* sldrCtrl) { F32 value = gSavedPerAccountSettings.getF32("AvatarHoverOffsetZ"); sldrCtrl->setValue(value,FALSE); if (isAgentAvatarValid()) { LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z)); LL_INFOS("Avatar") << "setting hover from preference setting " << offset[2] << LL_ENDL; gAgentAvatarp->setHoverOffset(offset); } } void onHoverSliderMoved(const LLSD& val) { F32 value = val.asFloat(); LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z)); LL_INFOS("Avatar") << "setting hover from slider moved" << offset[2] << LL_ENDL; gAgentAvatarp->setHoverOffset(offset, false); } // Do send-to-the-server work when slider drag completes, or new // value entered as text. void onHoverSliderFinalCommit(const LLSD& val) { F32 value = val.asFloat(); gSavedPerAccountSettings.setF32("AvatarHoverOffsetZ", value); LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z)); LL_INFOS("Avatar") << "setting hover from slider final commit " << offset[2] << LL_ENDL; gAgentAvatarp->setHoverOffset(offset, true); // will send update this time. } void wlfPanel_AdvSettings::onRegionChanged() { LLViewerRegion* region = gAgent.getRegion(); if (region && region->simulatorFeaturesReceived()) { updateEditHoverEnabled(); } else if (region) { region->setSimulatorFeaturesReceivedCallback(boost::bind(&wlfPanel_AdvSettings::onSimulatorFeaturesReceived, this, _1)); } } void wlfPanel_AdvSettings::onSimulatorFeaturesReceived(const LLUUID& region_id) { const LLViewerRegion* region = gAgent.getRegion(); if (region && (region->getRegionID()==region_id)) { updateEditHoverEnabled(); } } void wlfPanel_AdvSettings::updateEditHoverEnabled() { const LLViewerRegion* region = gAgent.getRegion(); bool enabled = region && region->avatarHoverHeightEnabled(); if (mHoverHeight) mHoverHeight->setEnabled(enabled); if (enabled) { syncFromPreferenceSetting(mHoverHeight); } }