PageRenderTime 80ms CodeModel.GetById 57ms RepoModel.GetById 0ms app.codeStats 1ms

/indra/newview/llfloatereditsky.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 923 lines | 629 code | 179 blank | 115 comment | 65 complexity | 44ac92f6f0f218c8a5e39935fdbb7588 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llfloatereditsky.cpp
  3. * @brief Floater to create or edit a sky preset
  4. *
  5. * $LicenseInfo:firstyear=2011&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2011, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "llfloatereditsky.h"
  28. // libs
  29. #include "llbutton.h"
  30. #include "llcheckboxctrl.h"
  31. #include "llcombobox.h"
  32. #include "llmultisliderctrl.h"
  33. #include "llnotifications.h"
  34. #include "llnotificationsutil.h"
  35. #include "llsliderctrl.h"
  36. #include "lltabcontainer.h"
  37. #include "lltimectrl.h"
  38. // newview
  39. #include "llagent.h"
  40. #include "llcolorswatch.h"
  41. #include "llregioninfomodel.h"
  42. #include "llviewerregion.h"
  43. static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f;
  44. static const F32 WL_BLUE_HORIZON_DENSITY_SCALE = 2.0f;
  45. static const F32 WL_CLOUD_SLIDER_SCALE = 1.0f;
  46. static F32 sun_pos_to_time24(F32 sun_pos)
  47. {
  48. return fmodf(sun_pos * 24.0f + 6, 24.0f);
  49. }
  50. static F32 time24_to_sun_pos(F32 time24)
  51. {
  52. F32 sun_pos = fmodf((time24 - 6) / 24.0f, 1.0f);
  53. if (sun_pos < 0) ++sun_pos;
  54. return sun_pos;
  55. }
  56. LLFloaterEditSky::LLFloaterEditSky(const LLSD &key)
  57. : LLFloater(key)
  58. , mSkyPresetNameEditor(NULL)
  59. , mSkyPresetCombo(NULL)
  60. , mMakeDefaultCheckBox(NULL)
  61. , mSaveButton(NULL)
  62. {
  63. }
  64. // virtual
  65. BOOL LLFloaterEditSky::postBuild()
  66. {
  67. mSkyPresetNameEditor = getChild<LLLineEditor>("sky_preset_name");
  68. mSkyPresetCombo = getChild<LLComboBox>("sky_preset_combo");
  69. mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
  70. mSaveButton = getChild<LLButton>("save");
  71. initCallbacks();
  72. // Create the sun position scrubber on the slider.
  73. getChild<LLMultiSliderCtrl>("WLSunPos")->addSlider(12.f);
  74. return TRUE;
  75. }
  76. // virtual
  77. void LLFloaterEditSky::onOpen(const LLSD& key)
  78. {
  79. bool new_preset = isNewPreset();
  80. std::string param = key.asString();
  81. std::string floater_title = getString(std::string("title_") + param);
  82. std::string hint = getString(std::string("hint_" + param));
  83. // Update floater title.
  84. setTitle(floater_title);
  85. // Update the hint at the top.
  86. getChild<LLUICtrl>("hint")->setValue(hint);
  87. // Hide the hint to the right of the combo if we're invoked to create a new preset.
  88. getChildView("note")->setVisible(!new_preset);
  89. // Switch between the sky presets combobox and preset name input field.
  90. mSkyPresetCombo->setVisible(!new_preset);
  91. mSkyPresetNameEditor->setVisible(new_preset);
  92. reset();
  93. }
  94. // virtual
  95. void LLFloaterEditSky::onClose(bool app_quitting)
  96. {
  97. if (!app_quitting) // there's no point to change environment if we're quitting
  98. {
  99. LLEnvManagerNew::instance().usePrefs(); // revert changes made to current environment
  100. }
  101. }
  102. // virtual
  103. void LLFloaterEditSky::draw()
  104. {
  105. syncControls();
  106. LLFloater::draw();
  107. }
  108. void LLFloaterEditSky::initCallbacks(void)
  109. {
  110. // *TODO: warn user if a region environment update comes while we're editing a region sky preset.
  111. mSkyPresetNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this), NULL);
  112. mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEditSky::onSkyPresetSelected, this));
  113. mSkyPresetCombo->setTextEntryCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this));
  114. mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnSave, this));
  115. getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnCancel, this));
  116. LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditSky::onRegionSettingsChange, this));
  117. LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetListChange, this));
  118. // Connect to region info updates.
  119. LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditSky::onRegionInfoUpdate, this));
  120. //-------------------------------------------------------------------------
  121. LLWLParamManager& param_mgr = LLWLParamManager::instance();
  122. // blue horizon
  123. getChild<LLUICtrl>("WLBlueHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueHorizon));
  124. // haze density, horizon, mult, and altitude
  125. getChild<LLUICtrl>("WLHazeDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mHazeDensity));
  126. getChild<LLUICtrl>("WLHazeHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mHazeHorizon));
  127. getChild<LLUICtrl>("WLDensityMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDensityMult));
  128. getChild<LLUICtrl>("WLMaxAltitude")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mMaxAlt));
  129. // blue density
  130. getChild<LLUICtrl>("WLBlueDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueDensity));
  131. // Lighting
  132. // sunlight
  133. getChild<LLUICtrl>("WLSunlight")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mSunlight));
  134. // glow
  135. getChild<LLUICtrl>("WLGlowR")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowRMoved, this, _1, &param_mgr.mGlow));
  136. getChild<LLUICtrl>("WLGlowB")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowBMoved, this, _1, &param_mgr.mGlow));
  137. // ambient
  138. getChild<LLUICtrl>("WLAmbient")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mAmbient));
  139. // time of day
  140. getChild<LLUICtrl>("WLSunPos")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm)); // multi-slider
  141. getChild<LLTimeCtrl>("WLDayTime")->setCommitCallback(boost::bind(&LLFloaterEditSky::onTimeChanged, this)); // time ctrl
  142. getChild<LLUICtrl>("WLEastAngle")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm));
  143. // Clouds
  144. // Cloud Color
  145. getChild<LLUICtrl>("WLCloudColor")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mCloudColor));
  146. // Cloud
  147. getChild<LLUICtrl>("WLCloudX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudMain));
  148. getChild<LLUICtrl>("WLCloudY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudMain));
  149. getChild<LLUICtrl>("WLCloudDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudMain));
  150. // Cloud Detail
  151. getChild<LLUICtrl>("WLCloudDetailX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudDetail));
  152. getChild<LLUICtrl>("WLCloudDetailY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudDetail));
  153. getChild<LLUICtrl>("WLCloudDetailDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudDetail));
  154. // Cloud extras
  155. getChild<LLUICtrl>("WLCloudCoverage")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudCoverage));
  156. getChild<LLUICtrl>("WLCloudScale")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudScale));
  157. getChild<LLUICtrl>("WLCloudLockX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXToggled, this, _1));
  158. getChild<LLUICtrl>("WLCloudLockY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYToggled, this, _1));
  159. getChild<LLUICtrl>("WLCloudScrollX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXMoved, this, _1));
  160. getChild<LLUICtrl>("WLCloudScrollY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYMoved, this, _1));
  161. getChild<LLUICtrl>("WLDistanceMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDistanceMult));
  162. // Dome
  163. getChild<LLUICtrl>("WLGamma")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mWLGamma));
  164. getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterEditSky::onStarAlphaMoved, this, _1));
  165. }
  166. //=================================================================================================
  167. void LLFloaterEditSky::syncControls()
  168. {
  169. bool err;
  170. LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
  171. LLWLParamSet& cur_params = param_mgr->mCurParams;
  172. // blue horizon
  173. param_mgr->mBlueHorizon = cur_params.getVector(param_mgr->mBlueHorizon.mName, err);
  174. setColorSwatch("WLBlueHorizon", param_mgr->mBlueHorizon, WL_BLUE_HORIZON_DENSITY_SCALE);
  175. // haze density, horizon, mult, and altitude
  176. param_mgr->mHazeDensity = cur_params.getVector(param_mgr->mHazeDensity.mName, err);
  177. childSetValue("WLHazeDensity", param_mgr->mHazeDensity.r);
  178. param_mgr->mHazeHorizon = cur_params.getVector(param_mgr->mHazeHorizon.mName, err);
  179. childSetValue("WLHazeHorizon", param_mgr->mHazeHorizon.r);
  180. param_mgr->mDensityMult = cur_params.getVector(param_mgr->mDensityMult.mName, err);
  181. childSetValue("WLDensityMult", param_mgr->mDensityMult.x *
  182. param_mgr->mDensityMult.mult);
  183. param_mgr->mMaxAlt = cur_params.getVector(param_mgr->mMaxAlt.mName, err);
  184. childSetValue("WLMaxAltitude", param_mgr->mMaxAlt.x);
  185. // blue density
  186. param_mgr->mBlueDensity = cur_params.getVector(param_mgr->mBlueDensity.mName, err);
  187. setColorSwatch("WLBlueDensity", param_mgr->mBlueDensity, WL_BLUE_HORIZON_DENSITY_SCALE);
  188. // Lighting
  189. // sunlight
  190. param_mgr->mSunlight = cur_params.getVector(param_mgr->mSunlight.mName, err);
  191. setColorSwatch("WLSunlight", param_mgr->mSunlight, WL_SUN_AMBIENT_SLIDER_SCALE);
  192. // glow
  193. param_mgr->mGlow = cur_params.getVector(param_mgr->mGlow.mName, err);
  194. childSetValue("WLGlowR", 2 - param_mgr->mGlow.r / 20.0f);
  195. childSetValue("WLGlowB", -param_mgr->mGlow.b / 5.0f);
  196. // ambient
  197. param_mgr->mAmbient = cur_params.getVector(param_mgr->mAmbient.mName, err);
  198. setColorSwatch("WLAmbient", param_mgr->mAmbient, WL_SUN_AMBIENT_SLIDER_SCALE);
  199. F32 time24 = sun_pos_to_time24(param_mgr->mCurParams.getFloat("sun_angle",err) / F_TWO_PI);
  200. getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
  201. getChild<LLTimeCtrl>("WLDayTime")->setTime24(time24);
  202. childSetValue("WLEastAngle", param_mgr->mCurParams.getFloat("east_angle",err) / F_TWO_PI);
  203. // Clouds
  204. // Cloud Color
  205. param_mgr->mCloudColor = cur_params.getVector(param_mgr->mCloudColor.mName, err);
  206. setColorSwatch("WLCloudColor", param_mgr->mCloudColor, WL_CLOUD_SLIDER_SCALE);
  207. // Cloud
  208. param_mgr->mCloudMain = cur_params.getVector(param_mgr->mCloudMain.mName, err);
  209. childSetValue("WLCloudX", param_mgr->mCloudMain.r);
  210. childSetValue("WLCloudY", param_mgr->mCloudMain.g);
  211. childSetValue("WLCloudDensity", param_mgr->mCloudMain.b);
  212. // Cloud Detail
  213. param_mgr->mCloudDetail = cur_params.getVector(param_mgr->mCloudDetail.mName, err);
  214. childSetValue("WLCloudDetailX", param_mgr->mCloudDetail.r);
  215. childSetValue("WLCloudDetailY", param_mgr->mCloudDetail.g);
  216. childSetValue("WLCloudDetailDensity", param_mgr->mCloudDetail.b);
  217. // Cloud extras
  218. param_mgr->mCloudCoverage = cur_params.getVector(param_mgr->mCloudCoverage.mName, err);
  219. param_mgr->mCloudScale = cur_params.getVector(param_mgr->mCloudScale.mName, err);
  220. childSetValue("WLCloudCoverage", param_mgr->mCloudCoverage.x);
  221. childSetValue("WLCloudScale", param_mgr->mCloudScale.x);
  222. // cloud scrolling
  223. bool lockX = !param_mgr->mCurParams.getEnableCloudScrollX();
  224. bool lockY = !param_mgr->mCurParams.getEnableCloudScrollY();
  225. childSetValue("WLCloudLockX", lockX);
  226. childSetValue("WLCloudLockY", lockY);
  227. // disable if locked, enable if not
  228. if (lockX)
  229. {
  230. childDisable("WLCloudScrollX");
  231. }
  232. else
  233. {
  234. childEnable("WLCloudScrollX");
  235. }
  236. if (lockY)
  237. {
  238. childDisable("WLCloudScrollY");
  239. }
  240. else
  241. {
  242. childEnable("WLCloudScrollY");
  243. }
  244. // *HACK cloud scrolling is off my an additive of 10
  245. childSetValue("WLCloudScrollX", param_mgr->mCurParams.getCloudScrollX() - 10.0f);
  246. childSetValue("WLCloudScrollY", param_mgr->mCurParams.getCloudScrollY() - 10.0f);
  247. param_mgr->mDistanceMult = cur_params.getVector(param_mgr->mDistanceMult.mName, err);
  248. childSetValue("WLDistanceMult", param_mgr->mDistanceMult.x);
  249. // Tweak extras
  250. param_mgr->mWLGamma = cur_params.getVector(param_mgr->mWLGamma.mName, err);
  251. childSetValue("WLGamma", param_mgr->mWLGamma.x);
  252. childSetValue("WLStarAlpha", param_mgr->mCurParams.getStarBrightness());
  253. }
  254. void LLFloaterEditSky::setColorSwatch(const std::string& name, const WLColorControl& from_ctrl, F32 k)
  255. {
  256. // Set the value, dividing it by <k> first.
  257. LLVector4 color_vec = from_ctrl;
  258. getChild<LLColorSwatchCtrl>(name)->set(LLColor4(color_vec / k));
  259. }
  260. // color control callbacks
  261. void LLFloaterEditSky::onColorControlMoved(LLUICtrl* ctrl, WLColorControl* color_ctrl)
  262. {
  263. LLWLParamManager::getInstance()->mAnimator.deactivate();
  264. LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
  265. LLVector4 color_vec(swatch->get().mV);
  266. // Set intensity to maximum of the RGB values.
  267. color_vec.mV[3] = llmax(color_vec.mV[0], llmax(color_vec.mV[1], color_vec.mV[2]));
  268. // Multiply RGB values by the appropriate factor.
  269. F32 k = WL_CLOUD_SLIDER_SCALE;
  270. if (color_ctrl->isSunOrAmbientColor)
  271. {
  272. k = WL_SUN_AMBIENT_SLIDER_SCALE;
  273. }
  274. if (color_ctrl->isBlueHorizonOrDensity)
  275. {
  276. k = WL_BLUE_HORIZON_DENSITY_SCALE;
  277. }
  278. color_vec *= k; // intensity isn't affected by the multiplication
  279. // Apply the new RGBI value.
  280. *color_ctrl = color_vec;
  281. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  282. LLWLParamManager::getInstance()->propagateParameters();
  283. }
  284. void LLFloaterEditSky::onColorControlRMoved(LLUICtrl* ctrl, void* userdata)
  285. {
  286. LLWLParamManager::getInstance()->mAnimator.deactivate();
  287. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  288. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  289. color_ctrl->r = sldr_ctrl->getValueF32();
  290. if (color_ctrl->isSunOrAmbientColor)
  291. {
  292. color_ctrl->r *= WL_SUN_AMBIENT_SLIDER_SCALE;
  293. }
  294. if (color_ctrl->isBlueHorizonOrDensity)
  295. {
  296. color_ctrl->r *= WL_BLUE_HORIZON_DENSITY_SCALE;
  297. }
  298. // move i if it's the max
  299. if (color_ctrl->r >= color_ctrl->g && color_ctrl->r >= color_ctrl->b && color_ctrl->hasSliderName)
  300. {
  301. color_ctrl->i = color_ctrl->r;
  302. std::string name = color_ctrl->mSliderName;
  303. name.append("I");
  304. if (color_ctrl->isSunOrAmbientColor)
  305. {
  306. childSetValue(name, color_ctrl->r / WL_SUN_AMBIENT_SLIDER_SCALE);
  307. }
  308. else if (color_ctrl->isBlueHorizonOrDensity)
  309. {
  310. childSetValue(name, color_ctrl->r / WL_BLUE_HORIZON_DENSITY_SCALE);
  311. }
  312. else
  313. {
  314. childSetValue(name, color_ctrl->r);
  315. }
  316. }
  317. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  318. LLWLParamManager::getInstance()->propagateParameters();
  319. }
  320. void LLFloaterEditSky::onColorControlGMoved(LLUICtrl* ctrl, void* userdata)
  321. {
  322. LLWLParamManager::getInstance()->mAnimator.deactivate();
  323. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  324. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  325. color_ctrl->g = sldr_ctrl->getValueF32();
  326. if (color_ctrl->isSunOrAmbientColor)
  327. {
  328. color_ctrl->g *= WL_SUN_AMBIENT_SLIDER_SCALE;
  329. }
  330. if (color_ctrl->isBlueHorizonOrDensity)
  331. {
  332. color_ctrl->g *= WL_BLUE_HORIZON_DENSITY_SCALE;
  333. }
  334. // move i if it's the max
  335. if (color_ctrl->g >= color_ctrl->r && color_ctrl->g >= color_ctrl->b && color_ctrl->hasSliderName)
  336. {
  337. color_ctrl->i = color_ctrl->g;
  338. std::string name = color_ctrl->mSliderName;
  339. name.append("I");
  340. if (color_ctrl->isSunOrAmbientColor)
  341. {
  342. childSetValue(name, color_ctrl->g / WL_SUN_AMBIENT_SLIDER_SCALE);
  343. }
  344. else if (color_ctrl->isBlueHorizonOrDensity)
  345. {
  346. childSetValue(name, color_ctrl->g / WL_BLUE_HORIZON_DENSITY_SCALE);
  347. }
  348. else
  349. {
  350. childSetValue(name, color_ctrl->g);
  351. }
  352. }
  353. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  354. LLWLParamManager::getInstance()->propagateParameters();
  355. }
  356. void LLFloaterEditSky::onColorControlBMoved(LLUICtrl* ctrl, void* userdata)
  357. {
  358. LLWLParamManager::getInstance()->mAnimator.deactivate();
  359. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  360. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  361. color_ctrl->b = sldr_ctrl->getValueF32();
  362. if (color_ctrl->isSunOrAmbientColor)
  363. {
  364. color_ctrl->b *= WL_SUN_AMBIENT_SLIDER_SCALE;
  365. }
  366. if (color_ctrl->isBlueHorizonOrDensity)
  367. {
  368. color_ctrl->b *= WL_BLUE_HORIZON_DENSITY_SCALE;
  369. }
  370. // move i if it's the max
  371. if (color_ctrl->b >= color_ctrl->r && color_ctrl->b >= color_ctrl->g && color_ctrl->hasSliderName)
  372. {
  373. color_ctrl->i = color_ctrl->b;
  374. std::string name = color_ctrl->mSliderName;
  375. name.append("I");
  376. if (color_ctrl->isSunOrAmbientColor)
  377. {
  378. childSetValue(name, color_ctrl->b / WL_SUN_AMBIENT_SLIDER_SCALE);
  379. }
  380. else if (color_ctrl->isBlueHorizonOrDensity)
  381. {
  382. childSetValue(name, color_ctrl->b / WL_BLUE_HORIZON_DENSITY_SCALE);
  383. }
  384. else
  385. {
  386. childSetValue(name, color_ctrl->b);
  387. }
  388. }
  389. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  390. LLWLParamManager::getInstance()->propagateParameters();
  391. }
  392. /// GLOW SPECIFIC CODE
  393. void LLFloaterEditSky::onGlowRMoved(LLUICtrl* ctrl, void* userdata)
  394. {
  395. LLWLParamManager::getInstance()->mAnimator.deactivate();
  396. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  397. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  398. // scaled by 20
  399. color_ctrl->r = (2 - sldr_ctrl->getValueF32()) * 20;
  400. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  401. LLWLParamManager::getInstance()->propagateParameters();
  402. }
  403. /// \NOTE that we want NEGATIVE (-) B
  404. void LLFloaterEditSky::onGlowBMoved(LLUICtrl* ctrl, void* userdata)
  405. {
  406. LLWLParamManager::getInstance()->mAnimator.deactivate();
  407. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  408. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  409. /// \NOTE that we want NEGATIVE (-) B and NOT by 20 as 20 is too big
  410. color_ctrl->b = -sldr_ctrl->getValueF32() * 5;
  411. color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
  412. LLWLParamManager::getInstance()->propagateParameters();
  413. }
  414. void LLFloaterEditSky::onFloatControlMoved(LLUICtrl* ctrl, void* userdata)
  415. {
  416. LLWLParamManager::getInstance()->mAnimator.deactivate();
  417. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  418. WLFloatControl * floatControl = static_cast<WLFloatControl *>(userdata);
  419. floatControl->x = sldr_ctrl->getValueF32() / floatControl->mult;
  420. floatControl->update(LLWLParamManager::getInstance()->mCurParams);
  421. LLWLParamManager::getInstance()->propagateParameters();
  422. }
  423. // Lighting callbacks
  424. // time of day
  425. void LLFloaterEditSky::onSunMoved(LLUICtrl* ctrl, void* userdata)
  426. {
  427. LLWLParamManager::getInstance()->mAnimator.deactivate();
  428. LLMultiSliderCtrl* sun_msldr = getChild<LLMultiSliderCtrl>("WLSunPos");
  429. LLSliderCtrl* east_sldr = getChild<LLSliderCtrl>("WLEastAngle");
  430. LLTimeCtrl* time_ctrl = getChild<LLTimeCtrl>("WLDayTime");
  431. WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
  432. F32 time24 = sun_msldr->getCurSliderValue();
  433. time_ctrl->setTime24(time24); // sync the time ctrl with the new sun position
  434. // get the two angles
  435. LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
  436. param_mgr->mCurParams.setSunAngle(F_TWO_PI * time24_to_sun_pos(time24));
  437. param_mgr->mCurParams.setEastAngle(F_TWO_PI * east_sldr->getValueF32());
  438. // set the sun vector
  439. color_ctrl->r = -sin(param_mgr->mCurParams.getEastAngle()) *
  440. cos(param_mgr->mCurParams.getSunAngle());
  441. color_ctrl->g = sin(param_mgr->mCurParams.getSunAngle());
  442. color_ctrl->b = cos(param_mgr->mCurParams.getEastAngle()) *
  443. cos(param_mgr->mCurParams.getSunAngle());
  444. color_ctrl->i = 1.f;
  445. color_ctrl->update(param_mgr->mCurParams);
  446. param_mgr->propagateParameters();
  447. }
  448. void LLFloaterEditSky::onTimeChanged()
  449. {
  450. F32 time24 = getChild<LLTimeCtrl>("WLDayTime")->getTime24();
  451. getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
  452. onSunMoved(getChild<LLUICtrl>("WLSunPos"), &LLWLParamManager::instance().mLightnorm);
  453. }
  454. void LLFloaterEditSky::onStarAlphaMoved(LLUICtrl* ctrl)
  455. {
  456. LLWLParamManager::getInstance()->mAnimator.deactivate();
  457. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  458. LLWLParamManager::getInstance()->mCurParams.setStarBrightness(sldr_ctrl->getValueF32());
  459. }
  460. // Clouds
  461. void LLFloaterEditSky::onCloudScrollXMoved(LLUICtrl* ctrl)
  462. {
  463. LLWLParamManager::getInstance()->mAnimator.deactivate();
  464. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  465. // *HACK all cloud scrolling is off by an additive of 10.
  466. LLWLParamManager::getInstance()->mCurParams.setCloudScrollX(sldr_ctrl->getValueF32() + 10.0f);
  467. }
  468. void LLFloaterEditSky::onCloudScrollYMoved(LLUICtrl* ctrl)
  469. {
  470. LLWLParamManager::getInstance()->mAnimator.deactivate();
  471. LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
  472. // *HACK all cloud scrolling is off by an additive of 10.
  473. LLWLParamManager::getInstance()->mCurParams.setCloudScrollY(sldr_ctrl->getValueF32() + 10.0f);
  474. }
  475. void LLFloaterEditSky::onCloudScrollXToggled(LLUICtrl* ctrl)
  476. {
  477. LLWLParamManager::getInstance()->mAnimator.deactivate();
  478. LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
  479. bool lock = cb_ctrl->get();
  480. LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollX(!lock);
  481. LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollX");
  482. if (cb_ctrl->get())
  483. {
  484. sldr->setEnabled(false);
  485. }
  486. else
  487. {
  488. sldr->setEnabled(true);
  489. }
  490. }
  491. void LLFloaterEditSky::onCloudScrollYToggled(LLUICtrl* ctrl)
  492. {
  493. LLWLParamManager::getInstance()->mAnimator.deactivate();
  494. LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
  495. bool lock = cb_ctrl->get();
  496. LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollY(!lock);
  497. LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollY");
  498. if (cb_ctrl->get())
  499. {
  500. sldr->setEnabled(false);
  501. }
  502. else
  503. {
  504. sldr->setEnabled(true);
  505. }
  506. }
  507. //=================================================================================================
  508. void LLFloaterEditSky::reset()
  509. {
  510. if (isNewPreset())
  511. {
  512. mSkyPresetNameEditor->setValue(LLSD());
  513. mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
  514. }
  515. else
  516. {
  517. refreshSkyPresetsList();
  518. // Disable controls until a sky preset to edit is selected.
  519. enableEditing(false);
  520. }
  521. }
  522. bool LLFloaterEditSky::isNewPreset() const
  523. {
  524. return mKey.asString() == "new";
  525. }
  526. void LLFloaterEditSky::refreshSkyPresetsList()
  527. {
  528. mSkyPresetCombo->removeall();
  529. LLWLParamManager::preset_name_list_t region_presets, user_presets, sys_presets;
  530. LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
  531. #if 0 // Disable editing region skies until the workflow is clear enough.
  532. // Add region presets.
  533. std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
  534. for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
  535. {
  536. std::string item_title = *it + " (" + region_name + ")";
  537. mSkyPresetCombo->add(item_title, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toLLSD());
  538. }
  539. if (region_presets.size() > 0)
  540. {
  541. mSkyPresetCombo->addSeparator();
  542. }
  543. #endif
  544. // Add user presets.
  545. for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
  546. {
  547. mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
  548. }
  549. if (user_presets.size() > 0)
  550. {
  551. mSkyPresetCombo->addSeparator();
  552. }
  553. // Add system presets.
  554. for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
  555. {
  556. mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
  557. }
  558. mSkyPresetCombo->setLabel(getString("combo_label"));
  559. }
  560. void LLFloaterEditSky::enableEditing(bool enable)
  561. {
  562. // Enable/disable the tab and their contents.
  563. LLTabContainer* tab_container = getChild<LLTabContainer>("WindLight Tabs");
  564. tab_container->setEnabled(enable);
  565. for (S32 i = 0; i < tab_container->getTabCount(); ++i)
  566. {
  567. tab_container->enableTabButton(i, enable);
  568. tab_container->getPanelByIndex(i)->setCtrlsEnabled(enable);
  569. }
  570. // Enable/disable saving.
  571. mSaveButton->setEnabled(enable);
  572. mMakeDefaultCheckBox->setEnabled(enable);
  573. }
  574. void LLFloaterEditSky::saveRegionSky()
  575. {
  576. LLWLParamKey key(getSelectedSkyPreset());
  577. llassert(key.scope == LLEnvKey::SCOPE_REGION);
  578. LL_DEBUGS("Windlight") << "Saving region sky preset: " << key.name << llendl;
  579. LLWLParamManager& wl_mgr = LLWLParamManager::instance();
  580. wl_mgr.mCurParams.mName = key.name;
  581. wl_mgr.setParamSet(key, wl_mgr.mCurParams);
  582. // *TODO: save to cached region settings.
  583. LL_WARNS("Windlight") << "Saving region sky is not fully implemented yet" << LL_ENDL;
  584. }
  585. LLWLParamKey LLFloaterEditSky::getSelectedSkyPreset()
  586. {
  587. LLWLParamKey key;
  588. if (mSkyPresetNameEditor->getVisible())
  589. {
  590. key.name = mSkyPresetNameEditor->getText();
  591. key.scope = LLEnvKey::SCOPE_LOCAL;
  592. }
  593. else
  594. {
  595. LLSD combo_val = mSkyPresetCombo->getValue();
  596. if (!combo_val.isArray()) // manually typed text
  597. {
  598. key.name = combo_val.asString();
  599. key.scope = LLEnvKey::SCOPE_LOCAL;
  600. }
  601. else
  602. {
  603. key.fromLLSD(combo_val);
  604. }
  605. }
  606. return key;
  607. }
  608. void LLFloaterEditSky::onSkyPresetNameEdited()
  609. {
  610. // Disable saving a sky preset having empty name.
  611. LLWLParamKey key = getSelectedSkyPreset();
  612. mSaveButton->setEnabled(!key.name.empty());
  613. }
  614. void LLFloaterEditSky::onSkyPresetSelected()
  615. {
  616. LLWLParamKey key = getSelectedSkyPreset();
  617. LLWLParamSet sky_params;
  618. if (!LLWLParamManager::instance().getParamSet(key, sky_params))
  619. {
  620. // Manually entered string?
  621. LL_WARNS("Windlight") << "No sky preset named " << key.toString() << LL_ENDL;
  622. return;
  623. }
  624. LLEnvManagerNew::instance().useSkyParams(sky_params.getAll());
  625. //syncControls();
  626. bool can_edit = (key.scope == LLEnvKey::SCOPE_LOCAL || LLEnvManagerNew::canEditRegionSettings());
  627. enableEditing(can_edit);
  628. mMakeDefaultCheckBox->setEnabled(key.scope == LLEnvKey::SCOPE_LOCAL);
  629. }
  630. bool LLFloaterEditSky::onSaveAnswer(const LLSD& notification, const LLSD& response)
  631. {
  632. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  633. // If they choose save, do it. Otherwise, don't do anything
  634. if (option == 0)
  635. {
  636. onSaveConfirmed();
  637. }
  638. return false;
  639. }
  640. void LLFloaterEditSky::onSaveConfirmed()
  641. {
  642. // Save current params to the selected preset.
  643. LLWLParamKey key(getSelectedSkyPreset());
  644. LL_DEBUGS("Windlight") << "Saving sky preset " << key.name << LL_ENDL;
  645. LLWLParamManager& wl_mgr = LLWLParamManager::instance();
  646. if (wl_mgr.hasParamSet(key))
  647. {
  648. wl_mgr.setParamSet(key, wl_mgr.mCurParams);
  649. }
  650. else
  651. {
  652. wl_mgr.addParamSet(key, wl_mgr.mCurParams);
  653. }
  654. wl_mgr.savePreset(key);
  655. // Change preference if requested.
  656. if (mMakeDefaultCheckBox->getValue())
  657. {
  658. LL_DEBUGS("Windlight") << key.name << " is now the new preferred sky preset" << llendl;
  659. LLEnvManagerNew::instance().setUseSkyPreset(key.name);
  660. }
  661. closeFloater();
  662. }
  663. void LLFloaterEditSky::onBtnSave()
  664. {
  665. LLWLParamKey selected_sky = getSelectedSkyPreset();
  666. LLWLParamManager& wl_mgr = LLWLParamManager::instance();
  667. if (selected_sky.scope == LLEnvKey::SCOPE_REGION)
  668. {
  669. saveRegionSky();
  670. closeFloater();
  671. return;
  672. }
  673. std::string name = selected_sky.name;
  674. if (name.empty())
  675. {
  676. // *TODO: show an alert
  677. llwarns << "Empty sky preset name" << llendl;
  678. return;
  679. }
  680. // Don't allow overwriting system presets.
  681. if (wl_mgr.isSystemPreset(name))
  682. {
  683. LLNotificationsUtil::add("WLNoEditDefault");
  684. return;
  685. }
  686. // Save, ask for confirmation for overwriting an existing preset.
  687. if (wl_mgr.hasParamSet(selected_sky))
  688. {
  689. LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditSky::onSaveAnswer, this, _1, _2));
  690. }
  691. else
  692. {
  693. // new preset, hence no confirmation needed
  694. onSaveConfirmed();
  695. }
  696. }
  697. void LLFloaterEditSky::onBtnCancel()
  698. {
  699. closeFloater();
  700. }
  701. void LLFloaterEditSky::onSkyPresetListChange()
  702. {
  703. LLWLParamKey key = getSelectedSkyPreset(); // preset being edited
  704. if (!LLWLParamManager::instance().hasParamSet(key))
  705. {
  706. // Preset we've been editing doesn't exist anymore. Close the floater.
  707. closeFloater(false);
  708. }
  709. else
  710. {
  711. // A new preset has been added.
  712. // Refresh the presets list, though it may not make sense as the floater is about to be closed.
  713. refreshSkyPresetsList();
  714. }
  715. }
  716. void LLFloaterEditSky::onRegionSettingsChange()
  717. {
  718. // If creating a new sky, don't bother.
  719. if (isNewPreset())
  720. {
  721. return;
  722. }
  723. if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION) // if editing a region sky
  724. {
  725. // reset the floater to its initial state
  726. reset();
  727. // *TODO: Notify user?
  728. }
  729. else // editing a local sky
  730. {
  731. refreshSkyPresetsList();
  732. }
  733. }
  734. void LLFloaterEditSky::onRegionInfoUpdate()
  735. {
  736. bool can_edit = true;
  737. // If we've selected a region sky preset for editing.
  738. if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION)
  739. {
  740. // check whether we have the access
  741. can_edit = LLEnvManagerNew::canEditRegionSettings();
  742. }
  743. enableEditing(can_edit);
  744. }