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
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
00082 keyCombo->selectFirstItem();
00083 }
00084
00085
00086 LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
00087
00088 sldr->addSlider();
00089
00090
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
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
00148
00149
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
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
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
00186 LLMultiSliderCtrl* kSldr = sDayCycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
00187
00188 kSldr->clear();
00189 sSliderToKey.clear();
00190
00191
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
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
00218 LLWLParamManager::instance()->mDay.clearKeys();
00219
00220
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
00229 LLWLParamManager::instance()->resetAnimator(
00230 tSldr->getCurSliderValue() / sHoursPerDay, false);
00231
00232 LLWLParamManager::instance()->mAnimator.update(
00233 LLWLParamManager::instance()->mCurParams);
00234 }
00235
00236
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
00264
00265
00266
00267 dayCycle->open();
00268 }
00269
00270
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
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
00295 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00296
00297
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
00307 if(sSliderToKey.size() == 0) {
00308 return;
00309 }
00310
00311
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
00331 syncSliderTrack();
00332 syncMenu();
00333
00334
00335 LLMultiSliderCtrl* tSldr;
00336 tSldr = sDayCycle->getChild<LLMultiSliderCtrl>(
00337 "WLTimeSlider");
00338 LLWLParamManager::instance()->resetAnimator(
00339 tSldr->getCurSliderValue() / sHoursPerDay, false);
00340
00341
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
00361 LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
00362 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
00363 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00364
00365
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
00382 const LLString& curSldr = sldr->getCurSlider();
00383 if(curSldr == "") {
00384 return;
00385 }
00386
00387 F32 time = sldr->getCurSliderValue();
00388
00389
00390 LLString presetName = sSliderToKey[curSldr].presetName;
00391 sSliderToKey[curSldr].time = time;
00392
00393
00394 comboBox->selectByValue(presetName);
00395
00396
00397 F32 hour = (F32)((S32)time);
00398 F32 min = (time - hour) * 60;
00399
00400
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
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
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
00445 LLComboBox* comboBox = sDayCycle->getChild<LLComboBox>(
00446 "WLKeyPresets");
00447 LLMultiSliderCtrl* sldr = sDayCycle->getChild<LLMultiSliderCtrl>(
00448 "WLDayCycleKeys");
00449
00450
00451 if(sldr->getValue().size() == 0) {
00452 return;
00453 }
00454
00455
00456 LLString newPreset(comboBox->getSelectedValue().asString());
00457 const LLString& curSldr = sldr->getCurSlider();
00458
00459
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
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
00509 LLString newPreset(comboBox->getSelectedValue().asString());
00510
00511
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
00523 const LLString& sldrName = kSldr->addSlider(time);
00524 if(sldrName == "") {
00525 return;
00526 }
00527
00528
00529 LLWLSkyKey newKey;
00530 newKey.presetName = presetName;
00531 newKey.time = kSldr->getCurSliderValue();
00532
00533 llassert_always(sldrName != LLString::null);
00534
00535
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
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
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 }