00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llfloaterenvsettings.h"
00035
00036 #include "llfloaterwindlight.h"
00037 #include "llfloaterwater.h"
00038 #include "lluictrlfactory.h"
00039 #include "llsliderctrl.h"
00040 #include "llcombobox.h"
00041 #include "llcolorswatch.h"
00042 #include "llwlanimator.h"
00043
00044 #include "llwlparamset.h"
00045 #include "llwlparammanager.h"
00046 #include "llwaterparammanager.h"
00047 #include "llmath.h"
00048 #include "llviewerwindow.h"
00049
00050 #include "pipeline.h"
00051
00052 #include <sstream>
00053
00054 LLFloaterEnvSettings* LLFloaterEnvSettings::sEnvSettings = NULL;
00055
00056 LLFloaterEnvSettings::LLFloaterEnvSettings() : LLFloater("Environment Settings Floater")
00057 {
00058 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_env_settings.xml");
00059
00060
00061 initCallbacks();
00062 }
00063
00064 LLFloaterEnvSettings::~LLFloaterEnvSettings()
00065 {
00066 }
00067
00068 void LLFloaterEnvSettings::onClickHelp(void* data)
00069 {
00070 LLFloaterEnvSettings* self = static_cast<LLFloaterEnvSettings*>(data);
00071
00072 const char* xml_alert = "EnvSettingsHelpButton";
00073 LLAlertDialog* dialogp = gViewerWindow->alertXml(xml_alert);
00074 if (dialogp)
00075 {
00076 LLFloater* root_floater = gFloaterView->getParentFloater(self);
00077 if (root_floater)
00078 {
00079 root_floater->addDependentFloater(dialogp);
00080 }
00081 }
00082 }
00083
00084 void LLFloaterEnvSettings::initCallbacks(void)
00085 {
00086
00087 childSetCommitCallback("EnvTimeSlider", onChangeDayTime, NULL);
00088 childSetCommitCallback("EnvCloudSlider", onChangeCloudCoverage, NULL);
00089 childSetCommitCallback("EnvWaterFogSlider", onChangeWaterFogDensity,
00090 &LLWaterParamManager::instance()->mFogDensity);
00091
00092
00093 childSetCommitCallback("EnvWaterColor", onChangeWaterColor,
00094 &LLWaterParamManager::instance()->mFogColor);
00095
00096
00097 childSetAction("EnvAdvancedSkyButton", onOpenAdvancedSky, NULL);
00098 childSetAction("EnvAdvancedWaterButton", onOpenAdvancedWater, NULL);
00099 childSetAction("EnvUseEstateTimeButton", onUseEstateTime, NULL);
00100 childSetAction("EnvSettingsHelpButton", onClickHelp, this);
00101 }
00102
00103
00104
00105
00106 void LLFloaterEnvSettings::syncMenu()
00107 {
00108 LLSliderCtrl* sldr;
00109 sldr = sEnvSettings->getChild<LLSliderCtrl>("EnvTimeSlider");
00110
00111
00112 F32 val = (F32)LLWLParamManager::instance()->mAnimator.getDayTime();
00113 LLString timeStr = timeToString(val);
00114
00115 LLTextBox* textBox;
00116 textBox = sEnvSettings->getChild<LLTextBox>("EnvTimeText");
00117
00118 textBox->setValue(timeStr);
00119
00120
00121 val -= 0.25;
00122 if(val < 0)
00123 {
00124 val++;
00125 }
00126 sldr->setValue(val);
00127
00128
00129 bool err;
00130 childSetValue("EnvCloudSlider", LLWLParamManager::instance()->mCurParams.getFloat("cloud_shadow", err));
00131
00132 LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00133
00134 LLColor4 col = param_mgr->getFogColor();
00135 LLColorSwatchCtrl* colCtrl = sEnvSettings->getChild<LLColorSwatchCtrl>("EnvWaterColor");
00136 col.mV[3] = 1.0f;
00137 colCtrl->set(col);
00138
00139 childSetValue("EnvWaterFogSlider", param_mgr->mFogDensity.mExp);
00140 param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
00141
00142
00143 if(LLWLParamManager::instance()->mAnimator.mUseLindenTime)
00144 {
00145 childDisable("EnvUseEstateTimeButton");
00146 } else {
00147 childEnable("EnvUseEstateTimeButton");
00148 }
00149
00150 if(!gPipeline.canUseVertexShaders())
00151 {
00152 childDisable("EnvWaterColor");
00153 childDisable("EnvWaterColorText");
00154
00155 }
00156 else
00157 {
00158 childEnable("EnvWaterColor");
00159 childEnable("EnvWaterColorText");
00160
00161 }
00162
00163
00164 if(!gPipeline.canUseWindLightShaders())
00165 {
00166
00167 childDisable("EnvCloudSlider");
00168 childDisable("EnvCloudText");
00169
00170 }
00171 else
00172 {
00173 childEnable("EnvCloudSlider");
00174 childEnable("EnvCloudText");
00175
00176 }
00177 }
00178
00179
00180
00181 LLFloaterEnvSettings* LLFloaterEnvSettings::instance()
00182 {
00183 if (!sEnvSettings)
00184 {
00185 sEnvSettings = new LLFloaterEnvSettings();
00186 sEnvSettings->open();
00187 sEnvSettings->setFocus(TRUE);
00188 }
00189 return sEnvSettings;
00190 }
00191 void LLFloaterEnvSettings::show()
00192 {
00193 LLFloaterEnvSettings* envSettings = instance();
00194 envSettings->syncMenu();
00195
00196
00197
00198
00199
00200 envSettings->open();
00201 }
00202
00203 bool LLFloaterEnvSettings::isOpen()
00204 {
00205 if (sEnvSettings != NULL)
00206 {
00207 return true;
00208 }
00209 return false;
00210 }
00211
00212
00213 void LLFloaterEnvSettings::onClose(bool app_quitting)
00214 {
00215 if (sEnvSettings)
00216 {
00217 sEnvSettings->setVisible(FALSE);
00218 }
00219 }
00220
00221
00222 void LLFloaterEnvSettings::onChangeDayTime(LLUICtrl* ctrl, void* userData)
00223 {
00224 LLSliderCtrl* sldr;
00225 sldr = sEnvSettings->getChild<LLSliderCtrl>("EnvTimeSlider");
00226
00227
00228 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
00229 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
00230
00231 F32 val = sldr->getValueF32() + 0.25f;
00232 if(val > 1.0)
00233 {
00234 val--;
00235 }
00236
00237 LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
00238 LLWLParamManager::instance()->mAnimator.update(
00239 LLWLParamManager::instance()->mCurParams);
00240 }
00241
00242 void LLFloaterEnvSettings::onChangeCloudCoverage(LLUICtrl* ctrl, void* userData)
00243 {
00244 LLSliderCtrl* sldr;
00245 sldr = sEnvSettings->getChild<LLSliderCtrl>("EnvCloudSlider");
00246
00247
00248
00249
00250
00251 F32 val = sldr->getValueF32();
00252 LLWLParamManager::instance()->mCurParams.set("cloud_shadow", val);
00253 }
00254
00255 void LLFloaterEnvSettings::onChangeWaterFogDensity(LLUICtrl* ctrl, void* userData)
00256 {
00257 LLSliderCtrl* sldr;
00258 sldr = sEnvSettings->getChild<LLSliderCtrl>("EnvWaterFogSlider");
00259
00260 if(NULL == userData)
00261 {
00262 return;
00263 }
00264
00265 WaterExpFloatControl * expFloatControl = static_cast<WaterExpFloatControl *>(userData);
00266
00267 F32 val = sldr->getValueF32();
00268 expFloatControl->mExp = val;
00269 LLWaterParamManager::instance()->setDensitySliderValue(val);
00270
00271 expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
00272 LLWaterParamManager::instance()->propagateParameters();
00273 }
00274
00275 void LLFloaterEnvSettings::onChangeWaterColor(LLUICtrl* ctrl, void* userData)
00276 {
00277 LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
00278 WaterColorControl * colorControl = static_cast<WaterColorControl *>(userData);
00279 *colorControl = swatch->get();
00280
00281 colorControl->update(LLWaterParamManager::instance()->mCurParams);
00282 LLWaterParamManager::instance()->propagateParameters();
00283 }
00284
00285
00286 void LLFloaterEnvSettings::onOpenAdvancedSky(void* userData)
00287 {
00288 LLFloaterWindLight::show();
00289 }
00290
00291 void LLFloaterEnvSettings::onOpenAdvancedWater(void* userData)
00292 {
00293 LLFloaterWater::show();
00294 }
00295
00296
00297 void LLFloaterEnvSettings::onUseEstateTime(void* userData)
00298 {
00299 if(LLFloaterWindLight::isOpen())
00300 {
00301
00302 LLFloaterWindLight* wl = LLFloaterWindLight::instance();
00303 LLComboBox* box = wl->getChild<LLComboBox>("WLPresetsCombo");
00304 box->selectByValue("");
00305 }
00306
00307 LLWLParamManager::instance()->mAnimator.mIsRunning = true;
00308 LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
00309 }
00310
00311 LLString LLFloaterEnvSettings::timeToString(F32 curTime)
00312 {
00313 S32 hours;
00314 S32 min;
00315 bool isPM = false;
00316
00317
00318 hours = (S32) (24.0 * curTime);
00319 curTime -= ((F32) hours / 24.0f);
00320 min = llround(24.0f * 60.0f * curTime);
00321
00322
00323 if(min == 60)
00324 {
00325 hours++;
00326 min = 0;
00327 }
00328
00329
00330 if(hours >= 12 && hours < 24)
00331 {
00332 isPM = true;
00333 }
00334
00335
00336 if(hours >= 24)
00337 {
00338 hours = 12;
00339 }
00340 else if(hours > 12)
00341 {
00342 hours -= 12;
00343 }
00344 else if(hours == 0)
00345 {
00346 hours = 12;
00347 }
00348
00349
00350 std::stringstream newTime;
00351 newTime << hours << ":";
00352
00353
00354 if(min < 10)
00355 {
00356 newTime << 0;
00357 }
00358
00359
00360 newTime << min << " ";
00361 if(isPM)
00362 {
00363 newTime << "PM";
00364 }
00365 else
00366 {
00367 newTime << "AM";
00368 }
00369
00370 return newTime.str();
00371 }