PageRenderTime 31ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/llenvmanager.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 678 lines | 493 code | 114 blank | 71 comment | 45 complexity | bc5820634dc5a28f8a383e00ba3da9f2 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llenvmanager.cpp
  3. * @brief Implementation of classes managing WindLight and water settings.
  4. *
  5. * $LicenseInfo:firstyear=2009&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 "llenvmanager.h"
  28. #include "llagent.h"
  29. #include "lldaycyclemanager.h"
  30. #include "llviewercontrol.h" // for gSavedSettings
  31. #include "llviewerregion.h"
  32. #include "llwaterparammanager.h"
  33. #include "llwlhandlers.h"
  34. #include "llwlparammanager.h"
  35. std::string LLEnvPrefs::getWaterPresetName() const
  36. {
  37. if (mWaterPresetName.empty())
  38. {
  39. llwarns << "Water preset name is empty" << llendl;
  40. }
  41. return mWaterPresetName;
  42. }
  43. std::string LLEnvPrefs::getSkyPresetName() const
  44. {
  45. if (mSkyPresetName.empty())
  46. {
  47. llwarns << "Sky preset name is empty" << llendl;
  48. }
  49. return mSkyPresetName;
  50. }
  51. std::string LLEnvPrefs::getDayCycleName() const
  52. {
  53. if (mDayCycleName.empty())
  54. {
  55. llwarns << "Day cycle name is empty" << llendl;
  56. }
  57. return mDayCycleName;
  58. }
  59. void LLEnvPrefs::setUseRegionSettings(bool val)
  60. {
  61. mUseRegionSettings = val;
  62. }
  63. void LLEnvPrefs::setUseWaterPreset(const std::string& name)
  64. {
  65. mUseRegionSettings = false;
  66. mWaterPresetName = name;
  67. }
  68. void LLEnvPrefs::setUseSkyPreset(const std::string& name)
  69. {
  70. mUseRegionSettings = false;
  71. mUseDayCycle = false;
  72. mSkyPresetName = name;
  73. }
  74. void LLEnvPrefs::setUseDayCycle(const std::string& name)
  75. {
  76. mUseRegionSettings = false;
  77. mUseDayCycle = true;
  78. mDayCycleName = name;
  79. }
  80. //=============================================================================
  81. LLEnvManagerNew::LLEnvManagerNew()
  82. {
  83. mInterpNextChangeMessage = true;
  84. // Set default environment settings.
  85. mUserPrefs.mUseRegionSettings = true;
  86. mUserPrefs.mUseDayCycle = true;
  87. mUserPrefs.mWaterPresetName = "Default";
  88. mUserPrefs.mSkyPresetName = "Default";
  89. mUserPrefs.mDayCycleName = "Default";
  90. }
  91. bool LLEnvManagerNew::getUseRegionSettings() const
  92. {
  93. return mUserPrefs.getUseRegionSettings();
  94. }
  95. bool LLEnvManagerNew::getUseDayCycle() const
  96. {
  97. return mUserPrefs.getUseDayCycle();
  98. }
  99. bool LLEnvManagerNew::getUseFixedSky() const
  100. {
  101. return mUserPrefs.getUseFixedSky();
  102. }
  103. std::string LLEnvManagerNew::getWaterPresetName() const
  104. {
  105. return mUserPrefs.getWaterPresetName();
  106. }
  107. std::string LLEnvManagerNew::getSkyPresetName() const
  108. {
  109. return mUserPrefs.getSkyPresetName();
  110. }
  111. std::string LLEnvManagerNew::getDayCycleName() const
  112. {
  113. return mUserPrefs.getDayCycleName();
  114. }
  115. const LLEnvironmentSettings& LLEnvManagerNew::getRegionSettings() const
  116. {
  117. return !mNewRegionPrefs.isEmpty() ? mNewRegionPrefs : mCachedRegionPrefs;
  118. }
  119. void LLEnvManagerNew::setRegionSettings(const LLEnvironmentSettings& new_settings)
  120. {
  121. // Set region settings override that will be used locally
  122. // until user either uploads the changes or goes to another region.
  123. mNewRegionPrefs = new_settings;
  124. }
  125. bool LLEnvManagerNew::usePrefs()
  126. {
  127. LL_DEBUGS("Windlight") << "Displaying preferred environment" << LL_ENDL;
  128. updateManagersFromPrefs(false);
  129. return true;
  130. }
  131. bool LLEnvManagerNew::useDefaults()
  132. {
  133. bool rslt;
  134. rslt = useDefaultWater();
  135. rslt &= useDefaultSky();
  136. return rslt;
  137. }
  138. bool LLEnvManagerNew::useRegionSettings()
  139. {
  140. bool rslt;
  141. rslt = useRegionSky();
  142. rslt &= useRegionWater();
  143. return rslt;
  144. }
  145. bool LLEnvManagerNew::useWaterPreset(const std::string& name)
  146. {
  147. LL_DEBUGS("Windlight") << "Displaying water preset " << name << LL_ENDL;
  148. LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
  149. bool rslt = water_mgr.getParamSet(name, water_mgr.mCurParams);
  150. llassert(rslt == true);
  151. return rslt;
  152. }
  153. bool LLEnvManagerNew::useWaterParams(const LLSD& params)
  154. {
  155. LL_DEBUGS("Windlight") << "Displaying water params" << LL_ENDL;
  156. LLWaterParamManager::instance().mCurParams.setAll(params);
  157. return true;
  158. }
  159. bool LLEnvManagerNew::useSkyPreset(const std::string& name)
  160. {
  161. LLWLParamManager& sky_mgr = LLWLParamManager::instance();
  162. LLWLParamSet param_set;
  163. if (!sky_mgr.getParamSet(LLWLParamKey(name, LLEnvKey::SCOPE_LOCAL), param_set))
  164. {
  165. llwarns << "No sky preset named " << name << llendl;
  166. return false;
  167. }
  168. LL_DEBUGS("Windlight") << "Displaying sky preset " << name << LL_ENDL;
  169. sky_mgr.applySkyParams(param_set.getAll());
  170. return true;
  171. }
  172. bool LLEnvManagerNew::useSkyParams(const LLSD& params)
  173. {
  174. LL_DEBUGS("Windlight") << "Displaying sky params" << LL_ENDL;
  175. LLWLParamManager::instance().applySkyParams(params);
  176. return true;
  177. }
  178. bool LLEnvManagerNew::useDayCycle(const std::string& name, LLEnvKey::EScope scope)
  179. {
  180. LLSD params;
  181. if (scope == LLEnvKey::SCOPE_REGION)
  182. {
  183. LL_DEBUGS("Windlight") << "Displaying region day cycle " << name << LL_ENDL;
  184. params = getRegionSettings().getWLDayCycle();
  185. }
  186. else
  187. {
  188. LL_DEBUGS("Windlight") << "Displaying local day cycle " << name << LL_ENDL;
  189. if (!LLDayCycleManager::instance().getPreset(name, params))
  190. {
  191. llwarns << "No day cycle named " << name << llendl;
  192. return false;
  193. }
  194. }
  195. bool rslt = LLWLParamManager::instance().applyDayCycleParams(params, scope);
  196. llassert(rslt == true);
  197. return rslt;
  198. }
  199. bool LLEnvManagerNew::useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time /* = 0.5*/)
  200. {
  201. LL_DEBUGS("Windlight") << "Displaying day cycle params" << LL_ENDL;
  202. return LLWLParamManager::instance().applyDayCycleParams(params, scope);
  203. }
  204. void LLEnvManagerNew::setUseRegionSettings(bool val)
  205. {
  206. mUserPrefs.setUseRegionSettings(val);
  207. saveUserPrefs();
  208. updateManagersFromPrefs(false);
  209. }
  210. void LLEnvManagerNew::setUseWaterPreset(const std::string& name)
  211. {
  212. // *TODO: make sure the preset exists.
  213. if (name.empty())
  214. {
  215. llwarns << "Empty water preset name passed" << llendl;
  216. return;
  217. }
  218. mUserPrefs.setUseWaterPreset(name);
  219. saveUserPrefs();
  220. updateManagersFromPrefs(false);
  221. }
  222. void LLEnvManagerNew::setUseSkyPreset(const std::string& name)
  223. {
  224. // *TODO: make sure the preset exists.
  225. if (name.empty())
  226. {
  227. llwarns << "Empty sky preset name passed" << llendl;
  228. return;
  229. }
  230. mUserPrefs.setUseSkyPreset(name);
  231. saveUserPrefs();
  232. updateManagersFromPrefs(false);
  233. }
  234. void LLEnvManagerNew::setUseDayCycle(const std::string& name)
  235. {
  236. if (!LLDayCycleManager::instance().presetExists(name))
  237. {
  238. llwarns << "Invalid day cycle name passed" << llendl;
  239. return;
  240. }
  241. mUserPrefs.setUseDayCycle(name);
  242. saveUserPrefs();
  243. updateManagersFromPrefs(false);
  244. }
  245. void LLEnvManagerNew::loadUserPrefs()
  246. {
  247. // operate on members directly to avoid side effects
  248. mUserPrefs.mWaterPresetName = gSavedSettings.getString("WaterPresetName");
  249. mUserPrefs.mSkyPresetName = gSavedSettings.getString("SkyPresetName");
  250. mUserPrefs.mDayCycleName = gSavedSettings.getString("DayCycleName");
  251. mUserPrefs.mUseRegionSettings = gSavedSettings.getBOOL("UseEnvironmentFromRegion");
  252. mUserPrefs.mUseDayCycle = gSavedSettings.getBOOL("UseDayCycle");
  253. }
  254. void LLEnvManagerNew::saveUserPrefs()
  255. {
  256. gSavedSettings.setString("WaterPresetName", getWaterPresetName());
  257. gSavedSettings.setString("SkyPresetName", getSkyPresetName());
  258. gSavedSettings.setString("DayCycleName", getDayCycleName());
  259. gSavedSettings.setBOOL("UseEnvironmentFromRegion", getUseRegionSettings());
  260. gSavedSettings.setBOOL("UseDayCycle", getUseDayCycle());
  261. mUsePrefsChangeSignal();
  262. }
  263. void LLEnvManagerNew::setUserPrefs(
  264. const std::string& water_preset,
  265. const std::string& sky_preset,
  266. const std::string& day_cycle_preset,
  267. bool use_fixed_sky,
  268. bool use_region_settings)
  269. {
  270. // operate on members directly to avoid side effects
  271. mUserPrefs.mWaterPresetName = water_preset;
  272. mUserPrefs.mSkyPresetName = sky_preset;
  273. mUserPrefs.mDayCycleName = day_cycle_preset;
  274. mUserPrefs.mUseRegionSettings = use_region_settings;
  275. mUserPrefs.mUseDayCycle = !use_fixed_sky;
  276. saveUserPrefs();
  277. updateManagersFromPrefs(false);
  278. }
  279. void LLEnvManagerNew::dumpUserPrefs()
  280. {
  281. LL_DEBUGS("Windlight") << "WaterPresetName: " << gSavedSettings.getString("WaterPresetName") << LL_ENDL;
  282. LL_DEBUGS("Windlight") << "SkyPresetName: " << gSavedSettings.getString("SkyPresetName") << LL_ENDL;
  283. LL_DEBUGS("Windlight") << "DayCycleName: " << gSavedSettings.getString("DayCycleName") << LL_ENDL;
  284. LL_DEBUGS("Windlight") << "UseEnvironmentFromRegion: " << gSavedSettings.getBOOL("UseEnvironmentFromRegion") << LL_ENDL;
  285. LL_DEBUGS("Windlight") << "UseDayCycle: " << gSavedSettings.getBOOL("UseDayCycle") << LL_ENDL;
  286. }
  287. void LLEnvManagerNew::dumpPresets()
  288. {
  289. const LLEnvironmentSettings& region_settings = getRegionSettings();
  290. std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : "Unknown region";
  291. // Dump water presets.
  292. LL_DEBUGS("Windlight") << "Waters:" << LL_ENDL;
  293. if (region_settings.getWaterParams().size() != 0)
  294. {
  295. LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
  296. }
  297. LLWaterParamManager::preset_name_list_t water_presets;
  298. LLWaterParamManager::instance().getPresetNames(water_presets);
  299. for (LLWaterParamManager::preset_name_list_t::const_iterator it = water_presets.begin(); it != water_presets.end(); ++it)
  300. {
  301. LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
  302. }
  303. // Dump sky presets.
  304. LL_DEBUGS("Windlight") << "Skies:" << LL_ENDL;
  305. LLWLParamManager::preset_key_list_t sky_preset_keys;
  306. LLWLParamManager::instance().getPresetKeys(sky_preset_keys);
  307. for (LLWLParamManager::preset_key_list_t::const_iterator it = sky_preset_keys.begin(); it != sky_preset_keys.end(); ++it)
  308. {
  309. std::string preset_name = it->name;
  310. std::string item_title;
  311. if (it->scope == LLEnvKey::SCOPE_LOCAL) // local preset
  312. {
  313. item_title = preset_name;
  314. }
  315. else // region preset
  316. {
  317. item_title = preset_name + " (" + region_name + ")";
  318. }
  319. LL_DEBUGS("Windlight") << " - " << item_title << LL_ENDL;
  320. }
  321. // Dump day cycles.
  322. LL_DEBUGS("Windlight") << "Days:" << LL_ENDL;
  323. const LLSD& cur_region_dc = region_settings.getWLDayCycle();
  324. if (cur_region_dc.size() != 0)
  325. {
  326. LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
  327. }
  328. LLDayCycleManager::preset_name_list_t days;
  329. LLDayCycleManager::instance().getPresetNames(days);
  330. for (LLDayCycleManager::preset_name_list_t::const_iterator it = days.begin(); it != days.end(); ++it)
  331. {
  332. LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
  333. }
  334. }
  335. void LLEnvManagerNew::requestRegionSettings()
  336. {
  337. LLEnvironmentRequest::initiate();
  338. }
  339. bool LLEnvManagerNew::sendRegionSettings(const LLEnvironmentSettings& new_settings)
  340. {
  341. LLSD metadata;
  342. metadata["regionID"] = gAgent.getRegion()->getRegionID();
  343. // add last received update ID to outbound message so simulator can handle concurrent updates
  344. metadata["messageID"] = mLastReceivedID;
  345. return LLEnvironmentApply::initiateRequest(new_settings.makePacket(metadata));
  346. }
  347. boost::signals2::connection LLEnvManagerNew::setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb)
  348. {
  349. return mUsePrefsChangeSignal.connect(cb);
  350. }
  351. boost::signals2::connection LLEnvManagerNew::setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb)
  352. {
  353. return mRegionSettingsChangeSignal.connect(cb);
  354. }
  355. boost::signals2::connection LLEnvManagerNew::setRegionChangeCallback(const region_change_signal_t::slot_type& cb)
  356. {
  357. return mRegionChangeSignal.connect(cb);
  358. }
  359. boost::signals2::connection LLEnvManagerNew::setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb)
  360. {
  361. return mRegionSettingsAppliedSignal.connect(cb);
  362. }
  363. // static
  364. bool LLEnvManagerNew::canEditRegionSettings()
  365. {
  366. LLViewerRegion* region = gAgent.getRegion();
  367. BOOL owner_or_god = gAgent.isGodlike() || (region && region->getOwner() == gAgent.getID());
  368. BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager());
  369. LL_DEBUGS("Windlight") << "Can edit region settings: " << (bool) owner_or_god_or_manager << LL_ENDL;
  370. return owner_or_god_or_manager;
  371. }
  372. // static
  373. const std::string LLEnvManagerNew::getScopeString(LLEnvKey::EScope scope)
  374. {
  375. switch(scope)
  376. {
  377. case LLEnvKey::SCOPE_LOCAL:
  378. return LLTrans::getString("LocalSettings");
  379. case LLEnvKey::SCOPE_REGION:
  380. return LLTrans::getString("RegionSettings");
  381. default:
  382. return " (?)";
  383. }
  384. }
  385. void LLEnvManagerNew::onRegionCrossing()
  386. {
  387. LL_DEBUGS("Windlight") << "Crossed region" << LL_ENDL;
  388. onRegionChange(true);
  389. }
  390. void LLEnvManagerNew::onTeleport()
  391. {
  392. LL_DEBUGS("Windlight") << "Teleported" << LL_ENDL;
  393. onRegionChange(false);
  394. }
  395. void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
  396. {
  397. // If the message was valid, grab the UUID from it and save it for next outbound update message.
  398. mLastReceivedID = content[0]["messageID"].asUUID();
  399. // Refresh cached region settings.
  400. LL_DEBUGS("Windlight") << "Caching region environment settings: " << content << LL_ENDL;
  401. F32 sun_hour = 0; // *TODO
  402. LLEnvironmentSettings new_settings(content[1], content[2], content[3], sun_hour);
  403. mCachedRegionPrefs = new_settings;
  404. // Load region sky presets.
  405. LLWLParamManager::instance().refreshRegionPresets();
  406. // If using server settings, update managers.
  407. if (getUseRegionSettings())
  408. {
  409. updateManagersFromPrefs(mInterpNextChangeMessage);
  410. }
  411. // Let interested parties know about the region settings update.
  412. mRegionSettingsChangeSignal();
  413. // reset
  414. mInterpNextChangeMessage = false;
  415. }
  416. void LLEnvManagerNew::onRegionSettingsApplyResponse(bool ok)
  417. {
  418. LL_DEBUGS("Windlight") << "Applying region settings " << (ok ? "succeeded" : "failed") << LL_ENDL;
  419. // Clear locally modified region settings because they have just been uploaded.
  420. mNewRegionPrefs.clear();
  421. mRegionSettingsAppliedSignal(ok);
  422. }
  423. //-- private methods ----------------------------------------------------------
  424. // virtual
  425. void LLEnvManagerNew::initSingleton()
  426. {
  427. LL_DEBUGS("Windlight") << "Initializing LLEnvManagerNew" << LL_ENDL;
  428. loadUserPrefs();
  429. }
  430. void LLEnvManagerNew::updateSkyFromPrefs()
  431. {
  432. bool success = true;
  433. // Sync sky with user prefs.
  434. if (getUseRegionSettings()) // apply region-wide settings
  435. {
  436. success = useRegionSky();
  437. }
  438. else // apply user-specified settings
  439. {
  440. if (getUseDayCycle())
  441. {
  442. success = useDayCycle(getDayCycleName(), LLEnvKey::SCOPE_LOCAL);
  443. }
  444. else
  445. {
  446. success = useSkyPreset(getSkyPresetName());
  447. }
  448. }
  449. // If something went wrong, fall back to defaults.
  450. if (!success)
  451. {
  452. // *TODO: fix user prefs
  453. useDefaultSky();
  454. }
  455. }
  456. void LLEnvManagerNew::updateWaterFromPrefs(bool interpolate)
  457. {
  458. LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
  459. LLSD target_water_params;
  460. // Determine new water settings based on user prefs.
  461. {
  462. // Fall back to default water.
  463. LLWaterParamSet default_water;
  464. water_mgr.getParamSet("Default", default_water);
  465. target_water_params = default_water.getAll();
  466. }
  467. if (getUseRegionSettings())
  468. {
  469. // *TODO: make sure whether region settings belong to the current region?
  470. const LLSD& region_water_params = getRegionSettings().getWaterParams();
  471. if (region_water_params.size() != 0) // region has no water settings
  472. {
  473. LL_DEBUGS("Windlight") << "Applying region water" << LL_ENDL;
  474. target_water_params = region_water_params;
  475. }
  476. else
  477. {
  478. LL_DEBUGS("Windlight") << "Applying default water" << LL_ENDL;
  479. }
  480. }
  481. else
  482. {
  483. std::string water = getWaterPresetName();
  484. LL_DEBUGS("Windlight") << "Applying water preset [" << water << "]" << LL_ENDL;
  485. LLWaterParamSet params;
  486. if (!water_mgr.getParamSet(water, params))
  487. {
  488. llwarns << "No water preset named " << water << ", falling back to defaults" << llendl;
  489. water_mgr.getParamSet("Default", params);
  490. // *TODO: Fix user preferences accordingly.
  491. }
  492. target_water_params = params.getAll();
  493. }
  494. // Sync water with user prefs.
  495. water_mgr.applyParams(target_water_params, interpolate);
  496. }
  497. void LLEnvManagerNew::updateManagersFromPrefs(bool interpolate)
  498. {
  499. // Apply water settings.
  500. updateWaterFromPrefs(interpolate);
  501. // Apply sky settings.
  502. updateSkyFromPrefs();
  503. }
  504. bool LLEnvManagerNew::useRegionSky()
  505. {
  506. const LLEnvironmentSettings& region_settings = getRegionSettings();
  507. // If region is set to defaults,
  508. if (region_settings.getSkyMap().size() == 0)
  509. {
  510. // well... apply the default sky settings.
  511. useDefaultSky();
  512. return true;
  513. }
  514. // *TODO: Support fixed sky from region.
  515. // Otherwise apply region day cycle.
  516. LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
  517. return useDayCycleParams(
  518. region_settings.getWLDayCycle(),
  519. LLEnvKey::SCOPE_REGION,
  520. region_settings.getDayTime());
  521. }
  522. bool LLEnvManagerNew::useRegionWater()
  523. {
  524. const LLEnvironmentSettings& region_settings = getRegionSettings();
  525. const LLSD& region_water = region_settings.getWaterParams();
  526. // If region is set to defaults,
  527. if (region_water.size() == 0)
  528. {
  529. // well... apply the default water settings.
  530. return useDefaultWater();
  531. }
  532. // Otherwise apply region water.
  533. LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
  534. return useWaterParams(region_water);
  535. }
  536. bool LLEnvManagerNew::useDefaultSky()
  537. {
  538. return useDayCycle("Default", LLEnvKey::SCOPE_LOCAL);
  539. }
  540. bool LLEnvManagerNew::useDefaultWater()
  541. {
  542. return useWaterPreset("Default");
  543. }
  544. void LLEnvManagerNew::onRegionChange(bool interpolate)
  545. {
  546. // Avoid duplicating region setting requests
  547. // by checking whether the region is actually changing.
  548. LLViewerRegion* regionp = gAgent.getRegion();
  549. LLUUID region_uuid = regionp ? regionp->getRegionID() : LLUUID::null;
  550. if (region_uuid == mCurRegionUUID)
  551. {
  552. return;
  553. }
  554. // Clear locally modified region settings.
  555. mNewRegionPrefs.clear();
  556. // *TODO: clear environment settings of the previous region?
  557. // Request environment settings of the new region.
  558. LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL;
  559. mCurRegionUUID = region_uuid;
  560. mInterpNextChangeMessage = interpolate;
  561. requestRegionSettings();
  562. // Let interested parties know agent region has been changed.
  563. mRegionChangeSignal();
  564. }