diff options
author | Brad Kittenbrink <brad@lindenlab.com> | 2008-02-27 18:58:14 +0000 |
---|---|---|
committer | Brad Kittenbrink <brad@lindenlab.com> | 2008-02-27 18:58:14 +0000 |
commit | 6d52efe452aa8469e0343da1c7d108f3f52ab651 (patch) | |
tree | a87be48e9840d7fc1f7ee514d7c7f994e71fdb3c /indra/newview/llfloaterenvsettings.cpp | |
parent | 6027ad2630b8650cabcf00628ee9b0d25bedd67f (diff) |
Merge of windlight into release (QAR-286). This includes all changes in
windlight14 which have passed QA (up through r79932).
svn merge -r 80831:80833 svn+ssh://svn.lindenlab.com/svn/linden/branches/merge_windlight14_r80620
Diffstat (limited to 'indra/newview/llfloaterenvsettings.cpp')
-rw-r--r-- | indra/newview/llfloaterenvsettings.cpp | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp new file mode 100644 index 0000000000..197e2ba15e --- /dev/null +++ b/indra/newview/llfloaterenvsettings.cpp @@ -0,0 +1,384 @@ +/** + * @file llfloaterenvsettings.cpp + * @brief LLFloaterEnvSettings class definition + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + * + * Copyright (c) 2007-2007, 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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 "llfloaterenvsettings.h" + +#include "llfloaterwindlight.h" +#include "llfloaterwater.h" +#include "llvieweruictrlfactory.h" +#include "llsliderctrl.h" +#include "llcombobox.h" +#include "llcolorswatch.h" +#include "llwlanimator.h" + +#include "llwlparamset.h" +#include "llwlparammanager.h" +#include "llwaterparammanager.h" +#include "llmath.h" +#include "llviewerwindow.h" + +#include "pipeline.h" + +#include <sstream> + +LLFloaterEnvSettings* LLFloaterEnvSettings::sEnvSettings = NULL; + +LLFloaterEnvSettings::LLFloaterEnvSettings() : LLFloater("Environment Settings Floater") +{ + gUICtrlFactory->buildFloater(this, "floater_env_settings.xml"); + + // load it up + initCallbacks(); +} + +LLFloaterEnvSettings::~LLFloaterEnvSettings() +{ +} + +void LLFloaterEnvSettings::onClickHelp(void* data) +{ + LLFloaterEnvSettings* self = static_cast<LLFloaterEnvSettings*>(data); + + const char* xml_alert = "EnvSettingsHelpButton"; + LLAlertDialog* dialogp = gViewerWindow->alertXml(xml_alert); + if (dialogp) + { + LLFloater* root_floater = gFloaterView->getParentFloater(self); + if (root_floater) + { + root_floater->addDependentFloater(dialogp); + } + } +} + +void LLFloaterEnvSettings::initCallbacks(void) +{ + // our three sliders + childSetCommitCallback("EnvTimeSlider", onChangeDayTime, NULL); + childSetCommitCallback("EnvCloudSlider", onChangeCloudCoverage, NULL); + childSetCommitCallback("EnvWaterFogSlider", onChangeWaterFogDensity, + &LLWaterParamManager::instance()->mFogDensity); + + // color picker + childSetCommitCallback("EnvWaterColor", onChangeWaterColor, + &LLWaterParamManager::instance()->mFogColor); + + // WL Top + childSetAction("EnvAdvancedSkyButton", onOpenAdvancedSky, NULL); + childSetAction("EnvAdvancedWaterButton", onOpenAdvancedWater, NULL); + childSetAction("EnvUseEstateTimeButton", onUseEstateTime, NULL); + childSetAction("EnvSettingsHelpButton", onClickHelp, this); +} + + +// menu maintenance functions + +void LLFloaterEnvSettings::syncMenu() +{ + LLSliderCtrl* sldr; + sldr = LLUICtrlFactory::getSliderByName(sEnvSettings, + "EnvTimeSlider"); + if(NULL == sldr) + { + return; + } + + // sync the clock + F32 val = (F32)LLWLParamManager::instance()->mAnimator.getDayTime(); + LLString timeStr = timeToString(val); + + LLTextBox* textBox; + textBox = LLUICtrlFactory::getTextBoxByName(sEnvSettings, + "EnvTimeText"); + if(NULL == textBox) + { + return; + } + + textBox->setValue(timeStr); + + // sync time slider which starts at 6 AM + val -= 0.25; + if(val < 0) + { + val++; + } + sldr->setValue(val); + + // sync cloud coverage + bool err; + childSetValue("EnvCloudSlider", LLWLParamManager::instance()->mCurParams.getFloat("cloud_shadow", err)); + + LLWaterParamManager * param_mgr = LLWaterParamManager::instance(); + // sync water params + LLColor4 col = param_mgr->getFogColor(); + LLColorSwatchCtrl* colCtrl = sEnvSettings->getChild<LLColorSwatchCtrl>("EnvWaterColor"); + col.mV[3] = 1.0f; + colCtrl->set(col); + + childSetValue("EnvWaterFogSlider", param_mgr->mFogDensity.mExp); + param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp); + + // turn off Use Estate Time button if it's already being used + if(LLWLParamManager::instance()->mAnimator.mUseLindenTime) + { + childDisable("EnvUseEstateTimeButton"); + } else { + childEnable("EnvUseEstateTimeButton"); + } + + if(!gPipeline.canUseVertexShaders()) + { + childDisable("EnvWaterColor"); + childDisable("EnvWaterColorText"); + //childDisable("EnvAdvancedWaterButton"); + } + else + { + childEnable("EnvWaterColor"); + childEnable("EnvWaterColorText"); + //childEnable("EnvAdvancedWaterButton"); + } + + // only allow access to these if they are using windlight + if(!gPipeline.canUseWindLightShaders()) + { + + childDisable("EnvCloudSlider"); + childDisable("EnvCloudText"); + //childDisable("EnvAdvancedSkyButton"); + } + else + { + childEnable("EnvCloudSlider"); + childEnable("EnvCloudText"); + //childEnable("EnvAdvancedSkyButton"); + } +} + + +// static instance of it +LLFloaterEnvSettings* LLFloaterEnvSettings::instance() +{ + if (!sEnvSettings) + { + sEnvSettings = new LLFloaterEnvSettings(); + sEnvSettings->open(); + sEnvSettings->setFocus(TRUE); + } + return sEnvSettings; +} +void LLFloaterEnvSettings::show() +{ + LLFloaterEnvSettings* envSettings = instance(); + envSettings->syncMenu(); + + // comment in if you want the menu to rebuild each time + //gUICtrlFactory->buildFloater(envSettings, "floater_env_settings.xml"); + //envSettings->initCallbacks(); + + envSettings->open(); +} + +bool LLFloaterEnvSettings::isOpen() +{ + if (sEnvSettings != NULL) + { + return true; + } + return false; +} + +// virtual +void LLFloaterEnvSettings::onClose(bool app_quitting) +{ + if (sEnvSettings) + { + sEnvSettings->setVisible(FALSE); + } +} + + +void LLFloaterEnvSettings::onChangeDayTime(LLUICtrl* ctrl, void* userData) +{ + LLSliderCtrl* sldr; + sldr = LLUICtrlFactory::getSliderByName(sEnvSettings, + "EnvTimeSlider"); + + // deactivate animator + LLWLParamManager::instance()->mAnimator.mIsRunning = false; + LLWLParamManager::instance()->mAnimator.mUseLindenTime = false; + + F32 val = sldr->getValueF32() + 0.25f; + if(val > 1.0) + { + val--; + } + + LLWLParamManager::instance()->mAnimator.setDayTime((F64)val); + LLWLParamManager::instance()->mAnimator.update( + LLWLParamManager::instance()->mCurParams); +} + +void LLFloaterEnvSettings::onChangeCloudCoverage(LLUICtrl* ctrl, void* userData) +{ + LLSliderCtrl* sldr; + sldr = LLUICtrlFactory::getSliderByName(sEnvSettings, + "EnvCloudSlider"); + + // deactivate animator + //LLWLParamManager::instance()->mAnimator.mIsRunning = false; + //LLWLParamManager::instance()->mAnimator.mUseLindenTime = false; + + F32 val = sldr->getValueF32(); + LLWLParamManager::instance()->mCurParams.set("cloud_shadow", val); +} + +void LLFloaterEnvSettings::onChangeWaterFogDensity(LLUICtrl* ctrl, void* userData) +{ + LLSliderCtrl* sldr; + sldr = LLUICtrlFactory::getSliderByName(sEnvSettings, + "EnvWaterFogSlider"); + + if(NULL == sldr || NULL == userData) + { + return; + } + + WaterExpFloatControl * expFloatControl = static_cast<WaterExpFloatControl *>(userData); + + F32 val = sldr->getValueF32(); + expFloatControl->mExp = val; + LLWaterParamManager::instance()->setDensitySliderValue(val); + + expFloatControl->update(LLWaterParamManager::instance()->mCurParams); + LLWaterParamManager::instance()->propagateParameters(); +} + +void LLFloaterEnvSettings::onChangeWaterColor(LLUICtrl* ctrl, void* userData) +{ + LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl); + WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData); + *colorControl = swatch->get(); + + colorControl->update(LLWaterParamManager::instance()->mCurParams); + LLWaterParamManager::instance()->propagateParameters(); +} + + +void LLFloaterEnvSettings::onOpenAdvancedSky(void* userData) +{ + LLFloaterWindLight::show(); +} + +void LLFloaterEnvSettings::onOpenAdvancedWater(void* userData) +{ + LLFloaterWater::show(); +} + + +void LLFloaterEnvSettings::onUseEstateTime(void* userData) +{ + if(LLFloaterWindLight::isOpen()) + { + // select the blank value in + LLFloaterWindLight* wl = LLFloaterWindLight::instance(); + LLComboBox* box = LLUICtrlFactory::getComboBoxByName(wl, "WLPresetsCombo"); + box->selectByValue(""); + } + + LLWLParamManager::instance()->mAnimator.mIsRunning = true; + LLWLParamManager::instance()->mAnimator.mUseLindenTime = true; +} + +LLString LLFloaterEnvSettings::timeToString(F32 curTime) +{ + S32 hours; + S32 min; + bool isPM = false; + + // get hours and minutes + hours = (S32) (24.0 * curTime); + curTime -= ((F32) hours / 24.0f); + min = llround(24.0f * 60.0f * curTime); + + // handle case where it's 60 + if(min == 60) + { + hours++; + min = 0; + } + + // set for PM + if(hours >= 12 && hours < 24) + { + isPM = true; + } + + // convert to non-military notation + if(hours >= 24) + { + hours = 12; + } + else if(hours > 12) + { + hours -= 12; + } + else if(hours == 0) + { + hours = 12; + } + + // make the string + std::stringstream newTime; + newTime << hours << ":"; + + // double 0 + if(min < 10) + { + newTime << 0; + } + + // finish it + newTime << min << " "; + if(isPM) + { + newTime << "PM"; + } + else + { + newTime << "AM"; + } + + return newTime.str(); +} |