summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterenvsettings.cpp
diff options
context:
space:
mode:
authorBrad Kittenbrink <brad@lindenlab.com>2008-02-27 18:58:14 +0000
committerBrad Kittenbrink <brad@lindenlab.com>2008-02-27 18:58:14 +0000
commit6d52efe452aa8469e0343da1c7d108f3f52ab651 (patch)
treea87be48e9840d7fc1f7ee514d7c7f994e71fdb3c /indra/newview/llfloaterenvsettings.cpp
parent6027ad2630b8650cabcf00628ee9b0d25bedd67f (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.cpp384
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();
+}