llfloaterwater.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llfloaterwater.h"
00035 
00036 #include "pipeline.h"
00037 #include "llsky.h"
00038 
00039 #include "llsliderctrl.h"
00040 #include "llspinctrl.h"
00041 #include "llcolorswatch.h"
00042 #include "llcheckboxctrl.h"
00043 #include "lltexturectrl.h"
00044 #include "lluictrlfactory.h"
00045 #include "llviewercamera.h"
00046 #include "llcombobox.h"
00047 #include "lllineeditor.h"
00048 #include "llfloaterdaycycle.h"
00049 #include "llboost.h"
00050 #include "llmultisliderctrl.h"
00051 
00052 #include "v4math.h"
00053 #include "llviewerdisplay.h"
00054 #include "llviewercontrol.h"
00055 #include "llviewerwindow.h"
00056 #include "llsavedsettingsglue.h"
00057 
00058 #include "llwaterparamset.h"
00059 #include "llwaterparammanager.h"
00060 #include "llpostprocess.h"
00061 
00062 #undef max
00063 
00064 LLFloaterWater* LLFloaterWater::sWaterMenu = NULL;
00065 
00066 std::set<std::string> LLFloaterWater::sDefaultPresets;
00067 
00068 LLFloaterWater::LLFloaterWater() : LLFloater("water floater")
00069 {
00070         LLUICtrlFactory::getInstance()->buildFloater(this, "floater_water.xml");
00071         
00072         // add the combo boxes
00073         LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
00074 
00075         if(comboBox != NULL) {
00076                 
00077                 std::map<std::string, LLWaterParamSet>::iterator mIt = 
00078                         LLWaterParamManager::instance()->mParamList.begin();
00079                 for(; mIt != LLWaterParamManager::instance()->mParamList.end(); mIt++) 
00080                 {
00081                         comboBox->add(mIt->first);
00082                 }
00083 
00084                 // set defaults on combo boxes
00085                 comboBox->selectByValue(LLSD("Default"));
00086         }
00087 
00088         LLString def_water = getString("WLDefaultWaterNames");
00089 
00090         // no editing or deleting of the blank string
00091         sDefaultPresets.insert("");
00092         boost_tokenizer tokens(def_water, boost::char_separator<char>(":"));
00093         for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
00094         {
00095                 LLString tok(*token_iter);
00096                 sDefaultPresets.insert(tok);
00097         }
00098 
00099         // load it up
00100         initCallbacks();
00101 }
00102 
00103 LLFloaterWater::~LLFloaterWater()
00104 {
00105 }
00106 
00107 void LLFloaterWater::initCallbacks(void) {
00108 
00109         // help buttons
00110         initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor");
00111         initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity");
00112         initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod");
00113         initHelpBtn("WaterGlowHelp", "HelpWaterGlow");  
00114         initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale");
00115         initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale");
00116         initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset");
00117 
00118         initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier");
00119         initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow");
00120         initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove");
00121 
00122         initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap");
00123         initHelpBtn("WaterWave1Help", "HelpWaterWave1");
00124         initHelpBtn("WaterWave2Help", "HelpWaterWave2");
00125 
00126         LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00127 
00128         childSetCommitCallback("WaterFogColor", onWaterFogColorMoved, &param_mgr->mFogColor);
00129 
00130         // 
00131         childSetCommitCallback("WaterGlow", onColorControlAMoved, &param_mgr->mFogColor);
00132 
00133         // fog density
00134         childSetCommitCallback("WaterFogDensity", onExpFloatControlMoved, &param_mgr->mFogDensity);
00135         childSetCommitCallback("WaterUnderWaterFogMod", onFloatControlMoved, &param_mgr->mUnderWaterFogMod);
00136 
00137         // blue density
00138         childSetCommitCallback("WaterNormalScaleX", onVector3ControlXMoved, &param_mgr->mNormalScale);
00139         childSetCommitCallback("WaterNormalScaleY", onVector3ControlYMoved, &param_mgr->mNormalScale);
00140         childSetCommitCallback("WaterNormalScaleZ", onVector3ControlZMoved, &param_mgr->mNormalScale);
00141 
00142         // fresnel
00143         childSetCommitCallback("WaterFresnelScale", onFloatControlMoved, &param_mgr->mFresnelScale);
00144         childSetCommitCallback("WaterFresnelOffset", onFloatControlMoved, &param_mgr->mFresnelOffset);
00145 
00146         // scale above/below
00147         childSetCommitCallback("WaterScaleAbove", onFloatControlMoved, &param_mgr->mScaleAbove);
00148         childSetCommitCallback("WaterScaleBelow", onFloatControlMoved, &param_mgr->mScaleBelow);
00149 
00150         // blur mult
00151         childSetCommitCallback("WaterBlurMult", onFloatControlMoved, &param_mgr->mBlurMultiplier);
00152 
00153         // Load/save
00154         LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
00155 
00156         //childSetAction("WaterLoadPreset", onLoadPreset, comboBox);
00157         childSetAction("WaterNewPreset", onNewPreset, comboBox);
00158         childSetAction("WaterSavePreset", onSavePreset, comboBox);
00159         childSetAction("WaterDeletePreset", onDeletePreset, comboBox);
00160 
00161         // wave direction
00162         childSetCommitCallback("WaterWave1DirX", onVector2ControlXMoved, &param_mgr->mWave1Dir);
00163         childSetCommitCallback("WaterWave1DirY", onVector2ControlYMoved, &param_mgr->mWave1Dir);
00164         childSetCommitCallback("WaterWave2DirX", onVector2ControlXMoved, &param_mgr->mWave2Dir);
00165         childSetCommitCallback("WaterWave2DirY", onVector2ControlYMoved, &param_mgr->mWave2Dir);
00166 
00167         comboBox->setCommitCallback(onChangePresetName);
00168 
00169         LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
00170         textCtrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
00171         childSetCommitCallback("WaterNormalMap", onNormalMapPicked, NULL);      
00172 }
00173 
00174 void LLFloaterWater::onClickHelp(void* data)
00175 {
00176         LLFloaterWater* self = LLFloaterWater::instance();
00177 
00178         const char* xml_alert = (const char*) data;
00179         LLAlertDialog* dialogp = gViewerWindow->alertXml(xml_alert);
00180         if (dialogp)
00181         {
00182                 LLFloater* root_floater = gFloaterView->getParentFloater(self);
00183                 if (root_floater)
00184                 {
00185                         root_floater->addDependentFloater(dialogp);
00186                 }
00187         }
00188 }
00189 
00190 void LLFloaterWater::initHelpBtn(const char* name, const char* xml_alert)
00191 {
00192         childSetAction(name, onClickHelp, (void*)xml_alert);
00193 }
00194 
00195 void LLFloaterWater::newPromptCallback(S32 option, const LLString& text, void* userData)
00196 {
00197         if(text == "")
00198         {
00199                 return;
00200         }
00201 
00202         if(option == 0) {
00203                 LLComboBox* comboBox = sWaterMenu->getChild<LLComboBox>( "WaterPresetsCombo");
00204 
00205                 LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00206 
00207                 // add the current parameters to the list
00208                 // see if it's there first
00209                 std::map<std::string, LLWaterParamSet>::iterator mIt = 
00210                         param_mgr->mParamList.find(text.c_str());
00211 
00212                 // if not there, add a new one
00213                 if(mIt == param_mgr->mParamList.end()) 
00214                 {
00215                         param_mgr->addParamSet(text.c_str(), 
00216                                 param_mgr->mCurParams);
00217                         comboBox->add(text);
00218                         comboBox->sortByName();
00219 
00220                         comboBox->setSelectedByValue(text, true);
00221 
00222                         param_mgr->savePreset(text);
00223 
00224                 // otherwise, send a message to the user
00225                 } 
00226                 else 
00227                 {
00228                         gViewerWindow->alertXml("ExistsWaterPresetAlert");
00229                 }
00230         }
00231 }
00232 
00233 void LLFloaterWater::syncMenu()
00234 {
00235         bool err;
00236 
00237         LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00238 
00239         LLWaterParamSet & current_params = param_mgr->mCurParams;
00240 
00241         // blue horizon
00242         param_mgr->mFogColor = current_params.getVector4(param_mgr->mFogColor.mName, err);
00243 
00244         LLColor4 col = param_mgr->getFogColor();
00245         childSetValue("WaterGlow", col.mV[3]);
00246         col.mV[3] = 1.0f;
00247         LLColorSwatchCtrl* colCtrl = sWaterMenu->getChild<LLColorSwatchCtrl>("WaterFogColor");
00248 
00249         colCtrl->set(col);
00250 
00251         // fog and wavelets
00252         param_mgr->mFogDensity.mExp = 
00253                 log(current_params.getFloat(param_mgr->mFogDensity.mName, err)) / 
00254                 log(param_mgr->mFogDensity.mBase);
00255         param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
00256         childSetValue("WaterFogDensity", param_mgr->mFogDensity.mExp);
00257         
00258         param_mgr->mUnderWaterFogMod.mX = 
00259                 current_params.getFloat(param_mgr->mUnderWaterFogMod.mName, err);
00260         childSetValue("WaterUnderWaterFogMod", param_mgr->mUnderWaterFogMod.mX);
00261 
00262         param_mgr->mNormalScale = current_params.getVector3(param_mgr->mNormalScale.mName, err);
00263         childSetValue("WaterNormalScaleX", param_mgr->mNormalScale.mX);
00264         childSetValue("WaterNormalScaleY", param_mgr->mNormalScale.mY);
00265         childSetValue("WaterNormalScaleZ", param_mgr->mNormalScale.mZ);
00266 
00267         // Fresnel
00268         param_mgr->mFresnelScale.mX = current_params.getFloat(param_mgr->mFresnelScale.mName, err);
00269         childSetValue("WaterFresnelScale", param_mgr->mFresnelScale.mX);
00270         param_mgr->mFresnelOffset.mX = current_params.getFloat(param_mgr->mFresnelOffset.mName, err);
00271         childSetValue("WaterFresnelOffset", param_mgr->mFresnelOffset.mX);
00272 
00273         // Scale Above/Below
00274         param_mgr->mScaleAbove.mX = current_params.getFloat(param_mgr->mScaleAbove.mName, err);
00275         childSetValue("WaterScaleAbove", param_mgr->mScaleAbove.mX);
00276         param_mgr->mScaleBelow.mX = current_params.getFloat(param_mgr->mScaleBelow.mName, err);
00277         childSetValue("WaterScaleBelow", param_mgr->mScaleBelow.mX);
00278 
00279         // blur mult
00280         param_mgr->mBlurMultiplier.mX = current_params.getFloat(param_mgr->mBlurMultiplier.mName, err);
00281         childSetValue("WaterBlurMult", param_mgr->mBlurMultiplier.mX);
00282 
00283         // wave directions
00284         param_mgr->mWave1Dir = current_params.getVector2(param_mgr->mWave1Dir.mName, err);
00285         childSetValue("WaterWave1DirX", param_mgr->mWave1Dir.mX);
00286         childSetValue("WaterWave1DirY", param_mgr->mWave1Dir.mY);
00287 
00288         param_mgr->mWave2Dir = current_params.getVector2(param_mgr->mWave2Dir.mName, err);
00289         childSetValue("WaterWave2DirX", param_mgr->mWave2Dir.mX);
00290         childSetValue("WaterWave2DirY", param_mgr->mWave2Dir.mY);
00291 
00292         LLTextureCtrl* textCtrl = sWaterMenu->getChild<LLTextureCtrl>("WaterNormalMap");
00293         textCtrl->setImageAssetID(param_mgr->getNormalMapID());
00294 }
00295 
00296 
00297 // static
00298 LLFloaterWater* LLFloaterWater::instance()
00299 {
00300         if (!sWaterMenu)
00301         {
00302                 sWaterMenu = new LLFloaterWater();
00303                 sWaterMenu->open();
00304                 sWaterMenu->setFocus(TRUE);
00305         }
00306         return sWaterMenu;
00307 }
00308 void LLFloaterWater::show()
00309 {
00310         LLFloaterWater* water = instance();
00311         water->syncMenu();
00312 
00313         // comment in if you want the menu to rebuild each time
00314         //LLUICtrlFactory::getInstance()->buildFloater(water, "floater_water.xml");
00315         //water->initCallbacks();
00316 
00317         water->open();
00318 }
00319 
00320 bool LLFloaterWater::isOpen()
00321 {
00322         if (sWaterMenu != NULL) {
00323                 return true;
00324         }
00325         return false;
00326 }
00327 
00328 // virtual
00329 void LLFloaterWater::onClose(bool app_quitting)
00330 {
00331         if (sWaterMenu)
00332         {
00333                 sWaterMenu->setVisible(FALSE);
00334         }
00335 }
00336 
00337 // vector control callbacks
00338 void LLFloaterWater::onVector3ControlXMoved(LLUICtrl* ctrl, void* userData)
00339 {
00340         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00341         WaterVector3Control * vectorControl = static_cast<WaterVector3Control *>(userData);
00342 
00343         vectorControl->mX = sldrCtrl->getValueF32();
00344 
00345         vectorControl->update(LLWaterParamManager::instance()->mCurParams);
00346 
00347         LLWaterParamManager::instance()->propagateParameters();
00348 }
00349 
00350 // vector control callbacks
00351 void LLFloaterWater::onVector3ControlYMoved(LLUICtrl* ctrl, void* userData)
00352 {
00353         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00354         WaterVector3Control * vectorControl = static_cast<WaterVector3Control *>(userData);
00355 
00356         vectorControl->mY = sldrCtrl->getValueF32();
00357 
00358         vectorControl->update(LLWaterParamManager::instance()->mCurParams);
00359 
00360         LLWaterParamManager::instance()->propagateParameters();
00361 }
00362 
00363 // vector control callbacks
00364 void LLFloaterWater::onVector3ControlZMoved(LLUICtrl* ctrl, void* userData)
00365 {
00366         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00367         WaterVector3Control * vectorControl = static_cast<WaterVector3Control *>(userData);
00368 
00369         vectorControl->mZ = sldrCtrl->getValueF32();
00370 
00371         vectorControl->update(LLWaterParamManager::instance()->mCurParams);
00372 
00373         LLWaterParamManager::instance()->propagateParameters();
00374 }
00375 
00376 
00377 // vector control callbacks
00378 void LLFloaterWater::onVector2ControlXMoved(LLUICtrl* ctrl, void* userData)
00379 {
00380         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00381         WaterVector2Control * vectorControl = static_cast<WaterVector2Control *>(userData);
00382 
00383         vectorControl->mX = sldrCtrl->getValueF32();
00384 
00385         vectorControl->update(LLWaterParamManager::instance()->mCurParams);
00386 
00387         LLWaterParamManager::instance()->propagateParameters();
00388 }
00389 
00390 // vector control callbacks
00391 void LLFloaterWater::onVector2ControlYMoved(LLUICtrl* ctrl, void* userData)
00392 {
00393         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00394         WaterVector2Control * vectorControl = static_cast<WaterVector2Control *>(userData);
00395 
00396         vectorControl->mY = sldrCtrl->getValueF32();
00397 
00398         vectorControl->update(LLWaterParamManager::instance()->mCurParams);
00399 
00400         LLWaterParamManager::instance()->propagateParameters();
00401 }
00402 
00403 // color control callbacks
00404 void LLFloaterWater::onColorControlRMoved(LLUICtrl* ctrl, void* userData)
00405 {
00406         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00407         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00408 
00409         colorControl->mR = sldrCtrl->getValueF32();
00410 
00411         // move i if it's the max
00412         if(colorControl->mR >= colorControl->mG 
00413                 && colorControl->mR >= colorControl->mB 
00414                 && colorControl->mHasSliderName)
00415         {
00416                 colorControl->mI = colorControl->mR;
00417                 std::string name = colorControl->mSliderName;
00418                 name.append("I");
00419                 
00420                 sWaterMenu->childSetValue(name, colorControl->mR);
00421         }
00422 
00423         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00424 
00425         LLWaterParamManager::instance()->propagateParameters();
00426 }
00427 
00428 void LLFloaterWater::onColorControlGMoved(LLUICtrl* ctrl, void* userData)
00429 {
00430         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00431         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00432 
00433         colorControl->mG = sldrCtrl->getValueF32();
00434 
00435         // move i if it's the max
00436         if(colorControl->mG >= colorControl->mR 
00437                 && colorControl->mG >= colorControl->mB
00438                 && colorControl->mHasSliderName)
00439         {
00440                 colorControl->mI = colorControl->mG;
00441                 std::string name = colorControl->mSliderName;
00442                 name.append("I");
00443 
00444                 sWaterMenu->childSetValue(name, colorControl->mG);
00445 
00446         }
00447 
00448         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00449 
00450         LLWaterParamManager::instance()->propagateParameters();
00451 }
00452 
00453 void LLFloaterWater::onColorControlBMoved(LLUICtrl* ctrl, void* userData)
00454 {
00455         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00456         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00457 
00458         colorControl->mB = sldrCtrl->getValueF32();
00459 
00460         // move i if it's the max
00461         if(colorControl->mB >= colorControl->mR
00462                 && colorControl->mB >= colorControl->mG
00463                 && colorControl->mHasSliderName)
00464         {
00465                 colorControl->mI = colorControl->mB;
00466                 std::string name = colorControl->mSliderName;
00467                 name.append("I");
00468 
00469                 sWaterMenu->childSetValue(name, colorControl->mB);
00470         }
00471 
00472         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00473 
00474         LLWaterParamManager::instance()->propagateParameters();
00475 }
00476 
00477 void LLFloaterWater::onColorControlAMoved(LLUICtrl* ctrl, void* userData)
00478 {
00479         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00480         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00481 
00482         colorControl->mA = sldrCtrl->getValueF32();
00483 
00484         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00485 
00486         LLWaterParamManager::instance()->propagateParameters();
00487 }
00488 
00489 
00490 void LLFloaterWater::onColorControlIMoved(LLUICtrl* ctrl, void* userData)
00491 {
00492         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00493         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00494 
00495         colorControl->mI = sldrCtrl->getValueF32();
00496         
00497         // only for sliders where we pass a name
00498         if(colorControl->mHasSliderName) 
00499         {
00500                 // set it to the top
00501                 F32 maxVal = std::max(std::max(colorControl->mR, colorControl->mG), colorControl->mB);
00502                 F32 iVal;
00503 
00504                 iVal = colorControl->mI;
00505 
00506                 // get the names of the other sliders
00507                 std::string rName = colorControl->mSliderName;
00508                 rName.append("R");
00509                 std::string gName = colorControl->mSliderName;
00510                 gName.append("G");
00511                 std::string bName = colorControl->mSliderName;
00512                 bName.append("B");
00513 
00514                 // handle if at 0
00515                 if(iVal == 0)
00516                 {
00517                         colorControl->mR = 0;
00518                         colorControl->mG = 0;
00519                         colorControl->mB = 0;
00520                 
00521                 // if all at the start
00522                 // set them all to the intensity
00523                 }
00524                 else if (maxVal == 0)
00525                 {
00526                         colorControl->mR = iVal;
00527                         colorControl->mG = iVal;
00528                         colorControl->mB = iVal;
00529                 }
00530                 else
00531                 {
00532                         // add delta amounts to each
00533                         F32 delta = (iVal - maxVal) / maxVal;
00534                         colorControl->mR *= (1.0f + delta);
00535                         colorControl->mG *= (1.0f + delta);
00536                         colorControl->mB *= (1.0f + delta);
00537                 }
00538 
00539                 // set the sliders to the new vals
00540                 sWaterMenu->childSetValue(rName.c_str(), colorControl->mR);
00541                 sWaterMenu->childSetValue(gName.c_str(), colorControl->mG);
00542                 sWaterMenu->childSetValue(bName.c_str(), colorControl->mB);
00543         }
00544 
00545         // now update the current parameters and send them to shaders
00546         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00547         LLWaterParamManager::instance()->propagateParameters();
00548 }
00549 
00550 void LLFloaterWater::onExpFloatControlMoved(LLUICtrl* ctrl, void* userData)
00551 {
00552         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00553         WaterExpFloatControl * expFloatControl = static_cast<WaterExpFloatControl *>(userData);
00554 
00555         F32 val = sldrCtrl->getValueF32();
00556         expFloatControl->mExp = val;
00557         LLWaterParamManager::instance()->setDensitySliderValue(val);
00558 
00559         expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
00560         LLWaterParamManager::instance()->propagateParameters();
00561 }
00562 
00563 void LLFloaterWater::onFloatControlMoved(LLUICtrl* ctrl, void* userData)
00564 {
00565         LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
00566         WaterFloatControl * floatControl = static_cast<WaterFloatControl *>(userData);
00567 
00568         floatControl->mX = sldrCtrl->getValueF32() / floatControl->mMult;
00569 
00570         floatControl->update(LLWaterParamManager::instance()->mCurParams);
00571         LLWaterParamManager::instance()->propagateParameters();
00572 }
00573 void LLFloaterWater::onWaterFogColorMoved(LLUICtrl* ctrl, void* userData)
00574 {
00575         LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
00576         WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);  
00577         *colorControl = swatch->get();
00578 
00579         colorControl->update(LLWaterParamManager::instance()->mCurParams);
00580         LLWaterParamManager::instance()->propagateParameters();
00581 }
00582 
00583 void LLFloaterWater::onBoolToggle(LLUICtrl* ctrl, void* userData)
00584 {
00585         LLCheckBoxCtrl* cbCtrl = static_cast<LLCheckBoxCtrl*>(ctrl);
00586 
00587         bool value = cbCtrl->get();
00588         (*(static_cast<BOOL *>(userData))) = value;
00589 }
00590 
00591 void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl, void* userData)
00592 {
00593         LLTextureCtrl* textCtrl = static_cast<LLTextureCtrl*>(ctrl);
00594         LLUUID textID = textCtrl->getImageAssetID();
00595         LLWaterParamManager::instance()->setNormalMapID(textID);
00596 }
00597 
00598 void LLFloaterWater::onNewPreset(void* userData)
00599 {
00600         gViewerWindow->alertXmlEditText("NewWaterPreset", LLString::format_map_t(), 
00601                 NULL, NULL, newPromptCallback, NULL);
00602 }
00603 
00604 void LLFloaterWater::onSavePreset(void* userData)
00605 {
00606         // get the name
00607         LLComboBox* comboBox = sWaterMenu->getChild<LLComboBox>("WaterPresetsCombo");
00608 
00609         // don't save the empty name
00610         if(comboBox->getSelectedItemLabel() == "")
00611         {
00612                 return;
00613         }
00614 
00615         LLWaterParamManager::instance()->mCurParams.mName = 
00616                 comboBox->getSelectedItemLabel();
00617 
00618         // check to see if it's a default and shouldn't be overwritten
00619         std::set<std::string>::iterator sIt = sDefaultPresets.find(
00620                 comboBox->getSelectedItemLabel().c_str());
00621         if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets")) 
00622         {
00623                 gViewerWindow->alertXml("WLNoEditDefault");
00624                 return;
00625         }
00626 
00627         gViewerWindow->alertXml("WLSavePresetAlert", saveAlertCallback, sWaterMenu);
00628 }
00629 
00630 void LLFloaterWater::saveAlertCallback(S32 option, void* userdata)
00631 {
00632         // if they choose save, do it.  Otherwise, don't do anything
00633         if(option == 0) 
00634         {
00635                 LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00636 
00637                 param_mgr->setParamSet(
00638                         param_mgr->mCurParams.mName, 
00639                         param_mgr->mCurParams);
00640 
00641                 // comment this back in to save to file
00642                 param_mgr->savePreset(param_mgr->mCurParams.mName);
00643         }
00644 
00645 }
00646 
00647 void LLFloaterWater::onDeletePreset(void* userData)
00648 {
00649         LLComboBox* combo_box = sWaterMenu->getChild<LLComboBox>("WaterPresetsCombo");
00650 
00651         if(combo_box->getSelectedValue().asString() == "")
00652         {
00653                 return;
00654         }
00655 
00656         LLString::format_map_t args;
00657         args["[SKY]"] = combo_box->getSelectedValue().asString();
00658         gViewerWindow->alertXml("WLDeletePresetAlert", args, deleteAlertCallback, sWaterMenu);
00659 }
00660 
00661 void LLFloaterWater::deleteAlertCallback(S32 option, void* userdata)
00662 {
00663         // if they choose delete, do it.  Otherwise, don't do anything
00664         if(option == 0) 
00665         {
00666                 LLComboBox* combo_box = sWaterMenu->getChild<LLComboBox>("WaterPresetsCombo");
00667                 LLFloaterDayCycle* day_cycle = NULL;
00668                 LLComboBox* key_combo = NULL;
00669                 LLMultiSliderCtrl* mult_sldr = NULL;
00670 
00671                 if(LLFloaterDayCycle::isOpen()) 
00672                 {
00673                         day_cycle = LLFloaterDayCycle::instance();
00674                         key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
00675                         mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
00676                 }
00677 
00678                 LLString name = combo_box->getSelectedValue().asString();
00679 
00680                 // check to see if it's a default and shouldn't be deleted
00681                 std::set<std::string>::iterator sIt = sDefaultPresets.find(name.c_str());
00682                 if(sIt != sDefaultPresets.end()) 
00683                 {
00684                         gViewerWindow->alertXml("WaterNoEditDefault");
00685                         return;
00686                 }
00687 
00688                 LLWaterParamManager::instance()->removeParamSet(name, true);
00689                 
00690                 // remove and choose another
00691                 S32 new_index = combo_box->getCurrentIndex();
00692 
00693                 combo_box->remove(name);
00694 
00695                 if(key_combo != NULL) 
00696                 {
00697                         key_combo->remove(name);
00698 
00699                         // remove from slider, as well
00700                         day_cycle->deletePreset(name);
00701                 }
00702 
00703                 // pick the previously selected index after delete
00704                 if(new_index > 0) 
00705                 {
00706                         new_index--;
00707                 }
00708                 
00709                 if(combo_box->getItemCount() > 0) 
00710                 {
00711                         combo_box->setCurrentByIndex(new_index);
00712                 }
00713         }
00714 }
00715 
00716 
00717 void LLFloaterWater::onChangePresetName(LLUICtrl* ctrl, void * userData)
00718 {
00719         LLComboBox * combo_box = static_cast<LLComboBox*>(ctrl);
00720         
00721         if(combo_box->getSimple() == "")
00722         {
00723                 return;
00724         }
00725         
00726         LLWaterParamManager::instance()->loadPreset(
00727                 combo_box->getSelectedValue().asString());
00728         sWaterMenu->syncMenu();
00729 }
00730 

Generated on Fri May 16 08:33:35 2008 for SecondLife by  doxygen 1.5.5