/** * @file llfloaterwater.cpp * @brief LLFloaterWater class definition * * $LicenseInfo:firstyear=2007&license=viewergpl$ * * Copyright (c) 2007-2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at * http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, * and agree to abide by those obligations. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llfloaterwater.h" // libs #include "llcheckboxctrl.h" #include "llcolorswatch.h" #include "llcombobox.h" #include "llnotificationsutil.h" #include "llsliderctrl.h" #include "lltexturectrl.h" #include "lluictrlfactory.h" #include "llfloaterdaycycle.h" // newview #include "llagent.h" #include "llwaterparammanager.h" #include "llwaterparamset.h" #include "rlvactions.h" #undef max // Fixes a Windows compiler error LLFloaterWater* LLFloaterWater::sWaterMenu = NULL; std::set LLFloaterWater::sDefaultPresets; LLFloaterWater::LLFloaterWater() : LLFloater(std::string("water floater")) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_water.xml"); // add the combo boxes mWaterPresetCombo = getChild("WaterPresetsCombo"); if (mWaterPresetCombo != NULL) { populateWaterPresetsList(); mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterWater::onChangePresetName, this, _1)); } // no editing or deleting of the blank string sDefaultPresets.insert(""); boost_tokenizer tokens(getString("WLDefaultWaterNames"), boost::char_separator(":")); for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) { std::string tok(*token_iter); sDefaultPresets.insert(tok); } // load it up initCallbacks(); } LLFloaterWater::~LLFloaterWater() { } void LLFloaterWater::initCallbacks(void) { // help buttons initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor"); initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity"); initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod"); //initHelpBtn("WaterGlowHelp", "HelpWaterGlow"); initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale"); initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale"); initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset"); initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier"); initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow"); initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove"); initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap"); initHelpBtn("WaterWave1Help", "HelpWaterWave1"); initHelpBtn("WaterWave2Help", "HelpWaterWave2"); //------------------------------------------------------------------------- LLWaterParamManager& water_mgr = LLWaterParamManager::instance(); getChild("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &water_mgr.mFogColor)); //getChild("WaterGlow")->setCommitCallback(boost::bind(&LLFloaterWater::onColorControlAMoved, this, _1, &water_mgr.mFogColor)); // fog density getChild("WaterFogDensity")->setCommitCallback(boost::bind(&LLFloaterWater::onExpFloatControlMoved, this, _1, &water_mgr.mFogDensity)); getChild("WaterUnderWaterFogMod")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mUnderWaterFogMod)); // blue density getChild("WaterNormalScaleX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlXMoved, this, _1, &water_mgr.mNormalScale)); getChild("WaterNormalScaleY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlYMoved, this, _1, &water_mgr.mNormalScale)); getChild("WaterNormalScaleZ")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlZMoved, this, _1, &water_mgr.mNormalScale)); // fresnel getChild("WaterFresnelScale")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelScale)); getChild("WaterFresnelOffset")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelOffset)); // scale above/below getChild("WaterScaleAbove")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mScaleAbove)); getChild("WaterScaleBelow")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mScaleBelow)); // blur mult getChild("WaterBlurMult")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &water_mgr.mBlurMultiplier)); // Load/save //getChild("WaterLoadPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onLoadPreset, this, mWaterPresetCombo)); getChild("WaterNewPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onNewPreset, this)); getChild("WaterDeletePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onDeletePreset, this)); getChild("WaterSavePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onSavePreset, this, _1)); // wave direction getChild("WaterWave1DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave1Dir)); getChild("WaterWave1DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave1Dir)); getChild("WaterWave2DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave2Dir)); getChild("WaterWave2DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave2Dir)); LLTextureCtrl* texture_ctrl = getChild("WaterNormalMap"); texture_ctrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL); texture_ctrl->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1)); // next/prev buttons //getChild("next")->setCommitCallback(boost::bind(&LLFloaterWater::onClickNext, this)); //getChild("prev")->setCommitCallback(boost::bind(&LLFloaterWater::onClickPrev, this)); } void LLFloaterWater::onClickHelp(void* data) { LLFloaterWater* self = LLFloaterWater::instance(); const std::string* xml_alert = (std::string*)data; self->addContextualNotification(*xml_alert); } void LLFloaterWater::initHelpBtn(const std::string& name, const std::string& xml_alert) { childSetAction(name, onClickHelp, new std::string(xml_alert)); } bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response) { std::string text = response["message"].asString(); if(text.empty()) { return false; } S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if(option == 0) { LLWaterParamManager * param_mgr = LLWaterParamManager::getInstance(); // add the current parameters to the list // see if it's there first // if not there, add a new one if(!LLWaterParamManager::getInstance()->hasParamSet(text)) { param_mgr->addParamSet(text, param_mgr->mCurParams); mWaterPresetCombo->add(text); mWaterPresetCombo->sortByName(); mWaterPresetCombo->selectByValue(text); param_mgr->savePreset(text); LLEnvManagerNew::instance().setUseWaterPreset(text); // otherwise, send a message to the user } else { LLNotificationsUtil::add("ExistsWaterPresetAlert"); } } return false; } void LLFloaterWater::syncMenu() { bool err; LLWaterParamManager& water_mgr = LLWaterParamManager::instance(); LLWaterParamSet& current_params = water_mgr.mCurParams; if (mWaterPresetCombo->getSelectedItemLabel() != LLEnvManagerNew::instance().getWaterPresetName()) { mWaterPresetCombo->selectByValue(LLEnvManagerNew::instance().getWaterPresetName()); } // blue horizon water_mgr.mFogColor = current_params.getVector4(water_mgr.mFogColor.mName, err); LLColor4 col = water_mgr.getFogColor(); //getChild("WaterGlow")->setValue(col.mV[3]); col.mV[3] = 1.0f; getChild("WaterFogColor")->set(col); // fog and wavelets water_mgr.mFogDensity.mExp = log(current_params.getFloat(water_mgr.mFogDensity.mName, err)) / log(water_mgr.mFogDensity.mBase); water_mgr.setDensitySliderValue(water_mgr.mFogDensity.mExp); getChild("WaterFogDensity")->setValue(water_mgr.mFogDensity.mExp); water_mgr.mUnderWaterFogMod.mX = current_params.getFloat(water_mgr.mUnderWaterFogMod.mName, err); getChild("WaterUnderWaterFogMod")->setValue(water_mgr.mUnderWaterFogMod.mX); water_mgr.mNormalScale = current_params.getVector3(water_mgr.mNormalScale.mName, err); getChild("WaterNormalScaleX")->setValue(water_mgr.mNormalScale.mX); getChild("WaterNormalScaleY")->setValue(water_mgr.mNormalScale.mY); getChild("WaterNormalScaleZ")->setValue(water_mgr.mNormalScale.mZ); // Fresnel water_mgr.mFresnelScale.mX = current_params.getFloat(water_mgr.mFresnelScale.mName, err); getChild("WaterFresnelScale")->setValue(water_mgr.mFresnelScale.mX); water_mgr.mFresnelOffset.mX = current_params.getFloat(water_mgr.mFresnelOffset.mName, err); getChild("WaterFresnelOffset")->setValue(water_mgr.mFresnelOffset.mX); // Scale Above/Below water_mgr.mScaleAbove.mX = current_params.getFloat(water_mgr.mScaleAbove.mName, err); getChild("WaterScaleAbove")->setValue(water_mgr.mScaleAbove.mX); water_mgr.mScaleBelow.mX = current_params.getFloat(water_mgr.mScaleBelow.mName, err); getChild("WaterScaleBelow")->setValue(water_mgr.mScaleBelow.mX); // blur mult water_mgr.mBlurMultiplier.mX = current_params.getFloat(water_mgr.mBlurMultiplier.mName, err); getChild("WaterBlurMult")->setValue(water_mgr.mBlurMultiplier.mX); // wave directions water_mgr.mWave1Dir = current_params.getVector2(water_mgr.mWave1Dir.mName, err); getChild("WaterWave1DirX")->setValue(water_mgr.mWave1Dir.mX); getChild("WaterWave1DirY")->setValue(water_mgr.mWave1Dir.mY); water_mgr.mWave2Dir = current_params.getVector2(water_mgr.mWave2Dir.mName, err); getChild("WaterWave2DirX")->setValue(water_mgr.mWave2Dir.mX); getChild("WaterWave2DirY")->setValue(water_mgr.mWave2Dir.mY); LLTextureCtrl* textCtrl = getChild("WaterNormalMap"); textCtrl->setImageAssetID(water_mgr.getNormalMapID()); } // static LLFloaterWater* LLFloaterWater::instance() { if (!sWaterMenu) { sWaterMenu = new LLFloaterWater(); sWaterMenu->open(); sWaterMenu->setFocus(TRUE); } return sWaterMenu; } void LLFloaterWater::show() { if (RlvActions::hasBehaviour(RLV_BHVR_SETENV)) return; if (!sWaterMenu) { LLFloaterWater* water = instance(); water->syncMenu(); // comment in if you want the menu to rebuild each time //LLUICtrlFactory::getInstance()->buildFloater(water, "floater_water.xml"); //water->initCallbacks(); } else { if (sWaterMenu->getVisible()) { sWaterMenu->close(); } else { sWaterMenu->open(); } } } bool LLFloaterWater::isOpen() { if (sWaterMenu != NULL) { return sWaterMenu->getVisible(); } return false; } // virtual void LLFloaterWater::onClose(bool app_quitting) { if (sWaterMenu) { sWaterMenu->setVisible(FALSE); } } // color control callbacks void LLFloaterWater::onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); color_ctrl->mR = sldr_ctrl->getValueF32(); // move i if it's the max if (color_ctrl->mR >= color_ctrl->mG && color_ctrl->mR >= color_ctrl->mB && color_ctrl->mHasSliderName) { color_ctrl->mI = color_ctrl->mR; std::string name = color_ctrl->mSliderName; name.append("I"); getChild(name)->setValue(color_ctrl->mR); } color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); color_ctrl->mG = sldr_ctrl->getValueF32(); // move i if it's the max if (color_ctrl->mG >= color_ctrl->mR && color_ctrl->mG >= color_ctrl->mB && color_ctrl->mHasSliderName) { color_ctrl->mI = color_ctrl->mG; std::string name = color_ctrl->mSliderName; name.append("I"); getChild(name)->setValue(color_ctrl->mG); } color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); color_ctrl->mB = sldr_ctrl->getValueF32(); // move i if it's the max if (color_ctrl->mB >= color_ctrl->mR && color_ctrl->mB >= color_ctrl->mG && color_ctrl->mHasSliderName) { color_ctrl->mI = color_ctrl->mB; std::string name = color_ctrl->mSliderName; name.append("I"); getChild(name)->setValue(color_ctrl->mB); } color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); color_ctrl->mA = sldr_ctrl->getValueF32(); color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); color_ctrl->mI = sldr_ctrl->getValueF32(); // only for sliders where we pass a name if (color_ctrl->mHasSliderName) { // set it to the top F32 maxVal = std::max(std::max(color_ctrl->mR, color_ctrl->mG), color_ctrl->mB); F32 iVal; iVal = color_ctrl->mI; // get the names of the other sliders std::string rName = color_ctrl->mSliderName; rName.append("R"); std::string gName = color_ctrl->mSliderName; gName.append("G"); std::string bName = color_ctrl->mSliderName; bName.append("B"); // handle if at 0 if(iVal == 0) { color_ctrl->mR = 0; color_ctrl->mG = 0; color_ctrl->mB = 0; // if all at the start // set them all to the intensity } else if (maxVal == 0) { color_ctrl->mR = iVal; color_ctrl->mG = iVal; color_ctrl->mB = iVal; } else { // add delta amounts to each F32 delta = (iVal - maxVal) / maxVal; color_ctrl->mR *= (1.0f + delta); color_ctrl->mG *= (1.0f + delta); color_ctrl->mB *= (1.0f + delta); } // set the sliders to the new vals getChild(rName)->setValue(color_ctrl->mR); getChild(gName)->setValue(color_ctrl->mG); getChild(bName)->setValue(color_ctrl->mB); } // now update the current parameters and send them to shaders color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } // vector control callbacks void LLFloaterWater::onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); vector_ctrl->mX = sldr_ctrl->getValueF32(); vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } // vector control callbacks void LLFloaterWater::onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); vector_ctrl->mY = sldr_ctrl->getValueF32(); vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } // vector control callbacks void LLFloaterWater::onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); vector_ctrl->mZ = sldr_ctrl->getValueF32(); vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } // vector control callbacks void LLFloaterWater::onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); vector_ctrl->mX = sldr_ctrl->getValueF32(); vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } // vector control callbacks void LLFloaterWater::onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); vector_ctrl->mY = sldr_ctrl->getValueF32(); vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); floatControl->mX = sldr_ctrl->getValueF32() / floatControl->mMult; floatControl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl) { LLSliderCtrl* sldr_ctrl = static_cast(ctrl); F32 val = sldr_ctrl->getValueF32(); expFloatControl->mExp = val; LLWaterParamManager::getInstance()->setDensitySliderValue(val); expFloatControl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl) { LLColorSwatchCtrl* swatch = static_cast(ctrl); *color_ctrl = swatch->get(); color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams); LLWaterParamManager::getInstance()->propagateParameters(); } void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl) { LLTextureCtrl* textCtrl = static_cast(ctrl); LLUUID textID = textCtrl->getImageAssetID(); LLWaterParamManager::getInstance()->setNormalMapID(textID); } //============================================================================= void LLFloaterWater::onNewPreset() { LLNotificationsUtil::add("NewWaterPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2)); } void LLFloaterWater::onSavePreset(LLUICtrl* ctrl) { // don't save the empty name if(mWaterPresetCombo->getSelectedItemLabel().empty()) { return; } if (ctrl->getValue().asString() == "save_inventory_item") { } else { LLWaterParamManager::getInstance()->mCurParams.mName = mWaterPresetCombo->getSelectedItemLabel(); // check to see if it's a default and shouldn't be overwritten std::set::iterator sIt = sDefaultPresets.find(mWaterPresetCombo->getSelectedItemLabel()); if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets")) { LLNotificationsUtil::add("WLNoEditDefault"); return; } LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2)); } } bool LLFloaterWater::saveNotecardCallback(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); // if they choose save, do it. Otherwise, don't do anything if(option == 0) { LLWaterParamManager * param_mgr = LLWaterParamManager::getInstance(); param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams); param_mgr->savePresetToNotecard(param_mgr->mCurParams.mName); } return false; } bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); // if they choose save, do it. Otherwise, don't do anything if(option == 0) { LLWaterParamManager* param_mgr = LLWaterParamManager::getInstance(); param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams); // comment this back in to save to file param_mgr->savePreset(param_mgr->mCurParams.mName); } return false; } void LLFloaterWater::onDeletePreset() { if(mWaterPresetCombo->getSelectedValue().asString().empty()) { return; } LLSD args; args["SKY"] = mWaterPresetCombo->getSelectedValue().asString(); LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2)); } bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); // If they choose delete, do it. Otherwise, don't do anything if(option == 0) { LLFloaterDayCycle* day_cycle = NULL; LLComboBox* key_combo = NULL; if(LLFloaterDayCycle::isOpen()) { day_cycle = LLFloaterDayCycle::instance(); key_combo = day_cycle->getChild("WaterKeyPresets"); } std::string name = mWaterPresetCombo->getSelectedValue().asString(); // check to see if it's a default and shouldn't be deleted std::set::iterator sIt = sDefaultPresets.find(name); if(sIt != sDefaultPresets.end()) { LLNotificationsUtil::add("WaterNoEditDefault"); return false; } LLWaterParamManager::getInstance()->removeParamSet(name, true); // remove and choose another S32 new_index = mWaterPresetCombo->getCurrentIndex(); mWaterPresetCombo->remove(name); if(key_combo != NULL) { key_combo->remove(name); // remove from slider, as well day_cycle->deletePreset(name); } // pick the previously selected index after delete if(new_index > 0) { --new_index; } if(mWaterPresetCombo->getItemCount() > 0) { mWaterPresetCombo->setCurrentByIndex(new_index); } } return false; } void LLFloaterWater::onChangePresetName(LLUICtrl* ctrl) { LLComboBox* combo_box = static_cast(ctrl); if(combo_box->getSimple().empty()) { return; } const std::string& wwset = combo_box->getSelectedValue().asString(); if (LLWaterParamManager::getInstance()->hasParamSet(wwset)) { LLEnvManagerNew::instance().setUseWaterPreset(wwset); } else { //if that failed, use region's // LLEnvManagerNew::instance().useRegionWater(); LLEnvManagerNew::instance().setUseWaterPreset("Default"); } syncMenu(); } void LLFloaterWater::onClickNext() { S32 index = mWaterPresetCombo->getCurrentIndex(); ++index; if (index == mWaterPresetCombo->getItemCount()) index = 0; mWaterPresetCombo->setCurrentByIndex(index); LLFloaterWater::onChangePresetName(mWaterPresetCombo); } void LLFloaterWater::onClickPrev() { S32 index = mWaterPresetCombo->getCurrentIndex(); if (index == 0) index = mWaterPresetCombo->getItemCount(); --index; mWaterPresetCombo->setCurrentByIndex(index); LLFloaterWater::onChangePresetName(mWaterPresetCombo); } void LLFloaterWater::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); } mWaterPresetCombo->selectByValue(LLEnvManagerNew::instance().getWaterPresetName()); }