llfloaterenvsettings.cpp

Go to the documentation of this file.
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         // load it up
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         // our three sliders
00087         childSetCommitCallback("EnvTimeSlider", onChangeDayTime, NULL);
00088         childSetCommitCallback("EnvCloudSlider", onChangeCloudCoverage, NULL);
00089         childSetCommitCallback("EnvWaterFogSlider", onChangeWaterFogDensity, 
00090                 &LLWaterParamManager::instance()->mFogDensity); 
00091 
00092         // color picker
00093         childSetCommitCallback("EnvWaterColor", onChangeWaterColor, 
00094                 &LLWaterParamManager::instance()->mFogColor);
00095 
00096         // WL Top
00097         childSetAction("EnvAdvancedSkyButton", onOpenAdvancedSky, NULL);
00098         childSetAction("EnvAdvancedWaterButton", onOpenAdvancedWater, NULL);
00099         childSetAction("EnvUseEstateTimeButton", onUseEstateTime, NULL);
00100         childSetAction("EnvSettingsHelpButton", onClickHelp, this);
00101 }
00102 
00103 
00104 // menu maintenance functions
00105 
00106 void LLFloaterEnvSettings::syncMenu()
00107 {
00108         LLSliderCtrl* sldr;
00109         sldr = sEnvSettings->getChild<LLSliderCtrl>("EnvTimeSlider");
00110 
00111         // sync the clock
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         // sync time slider which starts at 6 AM        
00121         val -= 0.25;
00122         if(val < 0) 
00123         {
00124                 val++;
00125         }
00126         sldr->setValue(val);
00127 
00128         // sync cloud coverage
00129         bool err;
00130         childSetValue("EnvCloudSlider", LLWLParamManager::instance()->mCurParams.getFloat("cloud_shadow", err));
00131 
00132         LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
00133         // sync water params
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         // turn off Use Estate Time button if it's already being used
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                 //childDisable("EnvAdvancedWaterButton");               
00155         }
00156         else
00157         {
00158                 childEnable("EnvWaterColor");
00159                 childEnable("EnvWaterColorText");
00160                 //childEnable("EnvAdvancedWaterButton");                
00161         }
00162 
00163         // only allow access to these if they are using windlight
00164         if(!gPipeline.canUseWindLightShaders())
00165         {
00166 
00167                 childDisable("EnvCloudSlider");
00168                 childDisable("EnvCloudText");
00169                 //childDisable("EnvAdvancedSkyButton");
00170         }
00171         else
00172         {
00173                 childEnable("EnvCloudSlider");
00174                 childEnable("EnvCloudText");
00175                 //childEnable("EnvAdvancedSkyButton");
00176         }
00177 }
00178 
00179 
00180 // static instance of it
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         // comment in if you want the menu to rebuild each time
00197         //LLUICtrlFactory::getInstance()->buildFloater(envSettings, "floater_env_settings.xml");
00198         //envSettings->initCallbacks();
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 // virtual
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         // deactivate animator
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         // deactivate animator
00248         //LLWLParamManager::instance()->mAnimator.mIsRunning = false;
00249         //LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
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                 // select the blank value in 
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         // get hours and minutes
00318         hours = (S32) (24.0 * curTime);
00319         curTime -= ((F32) hours / 24.0f);
00320         min = llround(24.0f * 60.0f * curTime);
00321 
00322         // handle case where it's 60
00323         if(min == 60) 
00324         {
00325                 hours++;
00326                 min = 0;
00327         }
00328 
00329         // set for PM
00330         if(hours >= 12 && hours < 24)
00331         {
00332                 isPM = true;
00333         }
00334 
00335         // convert to non-military notation
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         // make the string
00350         std::stringstream newTime;
00351         newTime << hours << ":";
00352         
00353         // double 0
00354         if(min < 10) 
00355         {
00356                 newTime << 0;
00357         }
00358         
00359         // finish it
00360         newTime << min << " ";
00361         if(isPM) 
00362         {
00363                 newTime << "PM";
00364         } 
00365         else 
00366         {
00367                 newTime << "AM";
00368         }
00369 
00370         return newTime.str();
00371 }

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