llfloaterdaycycle.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llfloaterdaycycle.h"
00035 
00036 #include "pipeline.h"
00037 #include "llsky.h"
00038 
00039 #include "llsliderctrl.h"
00040 #include "llmultislider.h"
00041 #include "llmultisliderctrl.h"
00042 #include "llspinctrl.h"
00043 #include "llcheckboxctrl.h"
00044 #include "lluictrlfactory.h"
00045 #include "llviewercamera.h"
00046 #include "llcombobox.h"
00047 #include "lllineeditor.h"
00048 #include "llwlanimator.h"
00049 
00050 #include "v4math.h"
00051 #include "llviewerdisplay.h"
00052 #include "llviewercontrol.h"
00053 #include "llviewerwindow.h"
00054 
00055 #include "llwlparamset.h"
00056 #include "llwlparammanager.h"
00057 #include "llpostprocess.h"
00058 #include "llfloaterwindlight.h"
00059 
00060 
00061 LLFloaterDayCycle* LLFloaterDayCycle::sDayCycle = NULL;
00062 std::map<LLString, LLWLSkyKey> LLFloaterDayCycle::sSliderToKey;
00063 const F32 LLFloaterDayCycle::sHoursPerDay = 24.0f;
00064 
00065 LLFloaterDayCycle::LLFloaterDayCycle() : LLFloater("Day Cycle Floater")
00066 {
00067         LLUICtrlFactory::getInstance()->buildFloater(this, "floater_day_cycle_options.xml");
00068         
00069         // add the combo boxes
00070         LLComboBox* keyCombo = getChild<LLComboBox>("WLKeyPresets");
00071 
00072         if(keyCombo != NULL) 
00073         {
00074                 std::map<std::string, LLWLParamSet>::iterator mIt = 
00075                         LLWLParamManager::instance()->mParamList.begin();
00076                 for(; mIt != LLWLParamManager::instance()->mParamList.end(); mIt++) 
00077                 {
00078                         keyCombo->add(LLString(mIt->first));
00079                 }
00080 
00081                 // set defaults on combo boxes
00082                 keyCombo->selectFirstItem();
00083         }
00084 
00085         // add the time slider
00086         LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
00087 
00088         sldr->addSlider();
00089 
00090         // load it up
00091         initCallbacks();
00092 }
00093 
00094 LLFloaterDayCycle::~LLFloaterDayCycle()
00095 {
00096 }
00097 
00098 void LLFloaterDayCycle::onClickHelp(void* data)
00099 {
00100 
00101         LLFloaterDayCycle* self = LLFloaterDayCycle::instance();
00102 
00103         const char* xml_alert = (const char*) data;
00104         LLAlertDialog* dialogp = gViewerWindow->alertXml(xml_alert);
00105         if (dialogp)
00106         {
00107                 LLFloater* root_floater = gFloaterView->getParentFloater(self);
00108                 if (root_floater)
00109                 {
00110                         root_floater->addDependentFloater(dialogp);
00111                 }
00112         }
00113 }
00114 
00115 void LLFloaterDayCycle::initHelpBtn(const char* name, const char* xml_alert)
00116 {
00117         childSetAction(name, onClickHelp, (void*)xml_alert);
00118 }
00119 
00120 void LLFloaterDayCycle::initCallbacks(void) 
00121 {
00122         initHelpBtn("WLDayCycleHelp", "HelpDayCycle");
00123 
00124         // WL Day Cycle
00125         childSetCommitCallback("WLTimeSlider", onTimeSliderMoved, NULL);
00126         childSetCommitCallback("WLDayCycleKeys", onKeyTimeMoved, NULL);
00127         childSetCommitCallback("WLCurKeyHour", onKeyTimeChanged, NULL);
00128         childSetCommitCallback("WLCurKeyMin", onKeyTimeChanged, NULL);
00129         childSetCommitCallback("WLKeyPresets", onKeyPresetChanged, NULL);
00130 
00131         childSetCommitCallback("WLLengthOfDayHour", onTimeRateChanged, NULL);
00132         childSetCommitCallback("WLLengthOfDayMin", onTimeRateChanged, NULL);
00133         childSetCommitCallback("WLLengthOfDaySec", onTimeRateChanged, NULL);
00134         childSetAction("WLUseLindenTime", onUseLindenTime, NULL);
00135         childSetAction("WLAnimSky", onRunAnimSky, NULL);
00136         childSetAction("WLStopAnimSky", onStopAnimSky, NULL);
00137 
00138         childSetAction("WLLoadDayCycle", onLoadDayCycle, NULL);
00139         childSetAction("WLSaveDayCycle", onSaveDayCycle, NULL);
00140 
00141         childSetAction("WLAddKey", onAddKey, NULL);
00142         childSetAction("WLDeleteKey", onDeleteKey, NULL);
00143 }
00144 
00145 void LLFloaterDayCycle::syncMenu()
00146 {
00147 //      std::map<std::string, LLVector4> & currentParams = LLWLParamManager::instance()->mCurParams.mParamValues;
00148         
00149         // set time
00150         LLMultiSliderCtrl* sldr = LLFloaterDayCycle::sDayCycle->getChild<LLMultiSliderCtrl>("WLTimeSlider");
00151         sldr->setCurSliderValue((F32)LLWLParamManager::instance()->mAnimator.getDayTime() * sHoursPerDay);
00152 
00153         LLSpinCtrl* secSpin = sDayCycle->getChild<LLSpinCtrl>("WLLengthOfDaySec");
00154         LLSpinCtrl* minSpin = sDayCycle->getChild<LLSpinCtrl>("WLLengthOfDayMin");
00155         LLSpinCtrl* hourSpin = sDayCycle->getChild<LLSpinCtrl>("WLLengthOfDayHour");
00156 
00157         F32 curRate;
00158         F32 hours, min, sec;
00159 
00160         // get the current rate
00161         curRate = LLWLParamManager::instance()->mDay.mDayRate;
00162         hours = (F32)((int)(curRate / 60 / 60));
00163         curRate -= (hours * 60 * 60);
00164         min = (F32)((int)(curRate / 60));
00165         curRate -= (min * 60);
00166         sec = curRate;
00167 
00168         hourSpin->setValue(hours);
00169         minSpin->setValue(min);
00170         secSpin->setValue(sec);
00171 
00172         // turn off Use Estate Time button if it's already being used
00173         if(     LLWLParamManager::instance()->mAnimator.mUseLindenTime == true)
00174         {
00175                 LLFloaterDayCycle::sDayCycle->childDisable("WLUseLindenTime");
00176         } 
00177         else 
00178         {
00179                 LLFloaterDayCycle::sDayCycle->childEnable("WLUseLindenTime");
00180         }
00181 }
00182 
00183 void LLFloaterDayCycle::syncSliderTrack()
00184 {
00185         // clear the slider
00186         LLMultiSliderCtrl* kSldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00187 
00188         kSldr->clear();
00189         sSliderToKey.clear();
00190 
00191         // add sliders
00192         std::map<F32, std::string>::iterator mIt = 
00193                 LLWLParamManager::instance()->mDay.mTimeMap.begin();
00194         for(; mIt != LLWLParamManager::instance()->mDay.mTimeMap.end(); mIt++) 
00195         {
00196                 addSliderKey(mIt->first * sHoursPerDay, mIt->second.c_str());
00197         }
00198 }
00199 
00200 void LLFloaterDayCycle::syncTrack()
00201 {
00202         // if no keys, do nothing
00203         if(sSliderToKey.size() == 0) 
00204         {
00205                 return;
00206         }
00207         
00208         LLMultiSliderCtrl* sldr;
00209         sldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00210                 "WLDayCycleKeys");
00211         llassert_always(sSliderToKey.size() == sldr->getValue().size());
00212         
00213         LLMultiSliderCtrl* tSldr;
00214         tSldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00215                 "WLTimeSlider");
00216 
00217         // create a new animation track
00218         LLWLParamManager::instance()->mDay.clearKeys();
00219         
00220         // add the keys one by one
00221         std::map<LLString, LLWLSkyKey>::iterator mIt = sSliderToKey.begin();
00222         for(; mIt != sSliderToKey.end(); mIt++) 
00223         {
00224                 LLWLParamManager::instance()->mDay.addKey(mIt->second.time / sHoursPerDay, 
00225                         mIt->second.presetName);
00226         }
00227         
00228         // set the param manager's track to the new one
00229         LLWLParamManager::instance()->resetAnimator(
00230                 tSldr->getCurSliderValue() / sHoursPerDay, false);
00231 
00232         LLWLParamManager::instance()->mAnimator.update(
00233                 LLWLParamManager::instance()->mCurParams);
00234 }
00235 
00236 // static
00237 LLFloaterDayCycle* LLFloaterDayCycle::instance()
00238 {
00239         if (!sDayCycle)
00240         {
00241                 sDayCycle = new LLFloaterDayCycle();
00242                 sDayCycle->open();
00243                 sDayCycle->setFocus(TRUE);
00244         }
00245         return sDayCycle;
00246 }
00247 
00248 bool LLFloaterDayCycle::isOpen()
00249 {
00250         if (sDayCycle != NULL) 
00251         {
00252                 return true;
00253         }
00254         return false;
00255 }
00256 
00257 void LLFloaterDayCycle::show()
00258 {
00259         LLFloaterDayCycle* dayCycle = instance();
00260         dayCycle->syncMenu();
00261         syncSliderTrack();
00262 
00263         // comment in if you want the menu to rebuild each time
00264         //LLUICtrlFactory::getInstance()->buildFloater(dayCycle, "floater_day_cycle_options.xml");
00265         //dayCycle->initCallbacks();
00266 
00267         dayCycle->open();
00268 }
00269 
00270 // virtual
00271 void LLFloaterDayCycle::onClose(bool app_quitting)
00272 {
00273         if (sDayCycle)
00274         {
00275                 sDayCycle->setVisible(FALSE);
00276         }
00277 }
00278 
00279 void LLFloaterDayCycle::onRunAnimSky(void* userData)
00280 {
00281         // if no keys, do nothing
00282         if(sSliderToKey.size() == 0) 
00283         {
00284                 return;
00285         }
00286         
00287         LLMultiSliderCtrl* sldr;
00288         sldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00289         llassert_always(sSliderToKey.size() == sldr->getValue().size());
00290 
00291         LLMultiSliderCtrl* tSldr;
00292         tSldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLTimeSlider");
00293 
00294         // turn off linden time
00295         LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00296 
00297         // set the param manager's track to the new one
00298         LLWLParamManager::instance()->resetAnimator(
00299                 tSldr->getCurSliderValue() / sHoursPerDay, true);
00300 
00301         llassert_always(LLWLParamManager::instance()->mAnimator.mTimeTrack.size() == sldr->getValue().size());
00302 }
00303 
00304 void LLFloaterDayCycle::onStopAnimSky(void* userData)
00305 {
00306         // if no keys, do nothing
00307         if(sSliderToKey.size() == 0) {
00308                 return;
00309         }
00310 
00311         // turn off animation and using linden time
00312         LLWLParamManager::instance()->mAnimator.mIsRunning = false;
00313         LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00314 }
00315 
00316 void LLFloaterDayCycle::onUseLindenTime(void* userData)
00317 {
00318         LLFloaterWindLight* wl = LLFloaterWindLight::instance();
00319         LLComboBox* box = wl->getChild<LLComboBox>("WLPresetsCombo");
00320         box->selectByValue(""); 
00321 
00322         LLWLParamManager::instance()->mAnimator.mIsRunning = true;
00323         LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;  
00324 }
00325 
00326 void LLFloaterDayCycle::onLoadDayCycle(void* userData)
00327 {
00328         LLWLParamManager::instance()->mDay.loadDayCycle("Default.xml");
00329         
00330         // sync it all up
00331         syncSliderTrack();
00332         syncMenu();
00333 
00334         // set the param manager's track to the new one
00335         LLMultiSliderCtrl* tSldr;
00336         tSldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00337                 "WLTimeSlider");
00338         LLWLParamManager::instance()->resetAnimator(
00339                 tSldr->getCurSliderValue() / sHoursPerDay, false);
00340 
00341         // and draw it
00342         LLWLParamManager::instance()->mAnimator.update(
00343                 LLWLParamManager::instance()->mCurParams);
00344 }
00345 
00346 void LLFloaterDayCycle::onSaveDayCycle(void* userData)
00347 {
00348         LLWLParamManager::instance()->mDay.saveDayCycle("Default.xml");
00349 }
00350 
00351 
00352 void LLFloaterDayCycle::onTimeSliderMoved(LLUICtrl* ctrl, void* userData)
00353 {
00354         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00355                 "WLTimeSlider");
00356 
00358         F32 val = sldr->getCurSliderValue() / sHoursPerDay;
00359         
00360         // set the value, turn off animation
00361         LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
00362         LLWLParamManager::instance()->mAnimator.mIsRunning = false;
00363         LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00364 
00365         // then call update once
00366         LLWLParamManager::instance()->mAnimator.update(
00367                 LLWLParamManager::instance()->mCurParams);
00368 }
00369 
00370 void LLFloaterDayCycle::onKeyTimeMoved(LLUICtrl* ctrl, void* userData)
00371 {
00372         LLComboBox* comboBox = sDayCycle->getChild<LLComboBox>("WLKeyPresets");
00373         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00374         LLSpinCtrl* hourSpin = sDayCycle->getChild<LLSpinCtrl>("WLCurKeyHour");
00375         LLSpinCtrl* minSpin = sDayCycle->getChild<LLSpinCtrl>("WLCurKeyMin");
00376 
00377         if(sldr->getValue().size() == 0) {
00378                 return;
00379         }
00380 
00381         // make sure we have a slider
00382         const LLString& curSldr = sldr->getCurSlider();
00383         if(curSldr == "") {
00384                 return;
00385         }
00386 
00387         F32 time = sldr->getCurSliderValue();
00388 
00389         // check to see if a key exists
00390         LLString presetName = sSliderToKey[curSldr].presetName;
00391         sSliderToKey[curSldr].time = time;
00392 
00393         // if it exists, turn on check box
00394         comboBox->selectByValue(presetName);
00395 
00396         // now set the spinners
00397         F32 hour = (F32)((S32)time);
00398         F32 min = (time - hour) * 60;
00399 
00400         // handle imprecision
00401         if(min >= 59) {
00402                 min = 0;
00403                 hour += 1;
00404         }
00405 
00406         hourSpin->set(hour);
00407         minSpin->set(min);
00408 
00409         syncTrack();
00410 
00411 }
00412 
00413 void LLFloaterDayCycle::onKeyTimeChanged(LLUICtrl* ctrl, void* userData)
00414 {
00415         // if no keys, skipped
00416         if(sSliderToKey.size() == 0) {
00417                 return;
00418         }
00419 
00420         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00421                 "WLDayCycleKeys");
00422         LLSpinCtrl* hourSpin = sDayCycle->getChild<LLSpinCtrl>( 
00423                 "WLCurKeyHour");
00424         LLSpinCtrl* minSpin = sDayCycle->getChild<LLSpinCtrl>( 
00425                 "WLCurKeyMin");
00426 
00427         F32 hour = hourSpin->get();
00428         F32 min = minSpin->get();
00429         F32 val = hour + min / 60.0f;
00430 
00431         const LLString& curSldr = sldr->getCurSlider();
00432         sldr->setCurSliderValue(val, TRUE);
00433         F32 time = sldr->getCurSliderValue() / sHoursPerDay;
00434 
00435         // now set the key's time in the sliderToKey map
00436         LLString presetName = sSliderToKey[curSldr].presetName;
00437         sSliderToKey[curSldr].time = time;
00438 
00439         syncTrack();
00440 }
00441 
00442 void LLFloaterDayCycle::onKeyPresetChanged(LLUICtrl* ctrl, void* userData)
00443 {
00444         // get the time
00445         LLComboBox* comboBox = sDayCycle->getChild<LLComboBox>( 
00446                 "WLKeyPresets");
00447         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00448                 "WLDayCycleKeys");
00449 
00450         // do nothing if no sliders
00451         if(sldr->getValue().size() == 0) {
00452                 return;
00453         }
00454 
00455         // change the map
00456         LLString newPreset(comboBox->getSelectedValue().asString());
00457         const LLString& curSldr = sldr->getCurSlider();
00458 
00459         // if null, don't use
00460         if(curSldr == "") {
00461                 return;
00462         }
00463 
00464         sSliderToKey[curSldr].presetName = newPreset;
00465 
00466         syncTrack();
00467 }
00468 
00469 void LLFloaterDayCycle::onTimeRateChanged(LLUICtrl* ctrl, void* userData)
00470 {
00471         // get the time
00472         LLSpinCtrl* secSpin = sDayCycle->getChild<LLSpinCtrl>( 
00473                 "WLLengthOfDaySec");
00474 
00475         LLSpinCtrl* minSpin = sDayCycle->getChild<LLSpinCtrl>( 
00476                 "WLLengthOfDayMin");
00477 
00478         LLSpinCtrl* hourSpin = sDayCycle->getChild<LLSpinCtrl>( 
00479                 "WLLengthOfDayHour");
00480 
00481         F32 hour;
00482         hour = (F32)hourSpin->getValue().asReal();
00483         F32 min;
00484         min = (F32)minSpin->getValue().asReal();
00485         F32 sec;
00486         sec = (F32)secSpin->getValue().asReal();
00487 
00488         F32 time = 60.0f * 60.0f * hour + 60.0f * min + sec;
00489         if(time <= 0) {
00490                 time = 1;
00491         }
00492         LLWLParamManager::instance()->mDay.mDayRate = time;
00493 
00494         syncTrack();
00495 }
00496 
00497 void LLFloaterDayCycle::onAddKey(void* userData)
00498 {
00499         LLComboBox* comboBox = sDayCycle->getChild<LLComboBox>( 
00500                 "WLKeyPresets");
00501         LLMultiSliderCtrl* kSldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00502                 "WLDayCycleKeys");
00503         LLMultiSliderCtrl* tSldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00504                 "WLTimeSlider");
00505         
00506         llassert_always(sSliderToKey.size() == kSldr->getValue().size());
00507 
00508         // get the values
00509         LLString newPreset(comboBox->getSelectedValue().asString());
00510 
00511         // add the slider key
00512         addSliderKey(tSldr->getCurSliderValue(), newPreset);
00513 
00514         syncTrack();
00515 }
00516 
00517 void LLFloaterDayCycle::addSliderKey(F32 time, const LLString & presetName)
00518 {
00519         LLMultiSliderCtrl* kSldr = sDayCycle->getChild<LLMultiSliderCtrl>( 
00520                 "WLDayCycleKeys");
00521 
00522         // make a slider
00523         const LLString& sldrName = kSldr->addSlider(time);
00524         if(sldrName == "") {
00525                 return;
00526         }
00527 
00528         // set the key
00529         LLWLSkyKey newKey;
00530         newKey.presetName = presetName;
00531         newKey.time = kSldr->getCurSliderValue();
00532 
00533         llassert_always(sldrName != LLString::null);
00534 
00535         // add to map
00536         sSliderToKey.insert(std::pair<LLString, LLWLSkyKey>(sldrName, newKey));
00537 
00538         llassert_always(sSliderToKey.size() == kSldr->getValue().size());
00539 
00540 }
00541 
00542 void LLFloaterDayCycle::deletePreset(LLString& presetName)
00543 {
00544         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00545 
00547         std::map<LLString, LLWLSkyKey>::iterator curr_preset, next_preset;
00548         for(curr_preset = sSliderToKey.begin(); curr_preset != sSliderToKey.end(); curr_preset = next_preset)
00549         {
00550                 next_preset = curr_preset;
00551                 ++next_preset;
00552                 if (curr_preset->second.presetName == presetName)
00553                 {
00554                         sldr->deleteSlider(curr_preset->first);
00555                         sSliderToKey.erase(curr_preset);
00556                 }
00557         }
00558 }
00559 
00560 void LLFloaterDayCycle::onDeleteKey(void* userData)
00561 {
00562         if(sSliderToKey.size() == 0) {
00563                 return;
00564         }
00565 
00566         LLComboBox* comboBox = sDayCycle->getChild<LLComboBox>( 
00567                 "WLKeyPresets");
00568         LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00569 
00570         // delete from map
00571         const LLString& sldrName = sldr->getCurSlider();
00572         std::map<LLString, LLWLSkyKey>::iterator mIt = sSliderToKey.find(sldrName);
00573         sSliderToKey.erase(mIt);
00574 
00575         sldr->deleteCurSlider();
00576 
00577         if(sSliderToKey.size() == 0) {
00578                 return;
00579         }
00580 
00581         const LLString& name = sldr->getCurSlider();
00582         comboBox->selectByValue(sSliderToKey[name].presetName);
00583         F32 time = sSliderToKey[name].time;
00584 
00585         LLSpinCtrl* hourSpin = sDayCycle->getChild<LLSpinCtrl>("WLCurKeyHour");
00586         LLSpinCtrl* minSpin = sDayCycle->getChild<LLSpinCtrl>("WLCurKeyMin");
00587 
00588         // now set the spinners
00589         F32 hour = (F32)((S32)time);
00590         F32 min = (time - hour) / 60;
00591         hourSpin->set(hour);
00592         minSpin->set(min);
00593 
00594         syncTrack();
00595 
00596 }

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