288 lines
8.4 KiB
C++
288 lines
8.4 KiB
C++
/**
|
|
* @file llenvmanager.h
|
|
* @brief Declaration of classes managing WindLight and water settings.
|
|
*
|
|
* $LicenseInfo:firstyear=2009&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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$
|
|
*/
|
|
|
|
#ifndef LL_LLENVMANAGER_H
|
|
#define LL_LLENVMANAGER_H
|
|
|
|
#include "llmemory.h"
|
|
#include "llsd.h"
|
|
|
|
class LLWLParamManager;
|
|
class LLWaterParamManager;
|
|
class LLWLAnimator;
|
|
class WindLightRefresh;
|
|
|
|
// generic key
|
|
struct LLEnvKey
|
|
{
|
|
public:
|
|
// Note: enum ordering is important; for example, a region-level floater (1) will see local and region (all values that are <=)
|
|
typedef enum e_scope
|
|
{
|
|
SCOPE_LOCAL, // 0
|
|
SCOPE_REGION//, // 1
|
|
// SCOPE_ESTATE, // 2
|
|
// etc.
|
|
} EScope;
|
|
};
|
|
|
|
class LLEnvironmentSettings
|
|
{
|
|
public:
|
|
LLEnvironmentSettings() :
|
|
mWLDayCycle(LLSD::emptyMap()),
|
|
mSkyMap(LLSD::emptyMap()),
|
|
mWaterParams(LLSD::emptyMap()),
|
|
mDayTime(0.f)
|
|
{}
|
|
LLEnvironmentSettings(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime) :
|
|
mWLDayCycle(dayCycle),
|
|
mSkyMap(skyMap),
|
|
mWaterParams(waterParams),
|
|
mDayTime(dayTime)
|
|
{}
|
|
~LLEnvironmentSettings() {}
|
|
|
|
void saveParams(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime)
|
|
{
|
|
mWLDayCycle = dayCycle;
|
|
mSkyMap = skyMap;
|
|
mWaterParams = waterParams;
|
|
mDayTime = dayTime;
|
|
}
|
|
|
|
const LLSD& getWLDayCycle() const
|
|
{
|
|
return mWLDayCycle;
|
|
}
|
|
|
|
const LLSD& getWaterParams() const
|
|
{
|
|
return mWaterParams;
|
|
}
|
|
|
|
const LLSD& getSkyMap() const
|
|
{
|
|
return mSkyMap;
|
|
}
|
|
|
|
F64 getDayTime() const
|
|
{
|
|
return mDayTime;
|
|
}
|
|
|
|
bool isEmpty() const
|
|
{
|
|
return mWLDayCycle.size() == 0;
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
*this = LLEnvironmentSettings();
|
|
}
|
|
|
|
LLSD makePacket(const LLSD& metadata) const
|
|
{
|
|
LLSD full_packet = LLSD::emptyArray();
|
|
|
|
// 0: metadata
|
|
full_packet.append(metadata);
|
|
|
|
// 1: day cycle
|
|
full_packet.append(mWLDayCycle);
|
|
|
|
// 2: map of sky setting names to sky settings (as LLSD)
|
|
full_packet.append(mSkyMap);
|
|
|
|
// 3: water params
|
|
full_packet.append(mWaterParams);
|
|
|
|
return full_packet;
|
|
}
|
|
|
|
private:
|
|
LLSD mWLDayCycle, mWaterParams, mSkyMap;
|
|
F64 mDayTime;
|
|
};
|
|
|
|
/**
|
|
* User environment preferences.
|
|
*/
|
|
class LLEnvPrefs
|
|
{
|
|
public:
|
|
LLEnvPrefs() : mUseRegionSettings(true), mUseDayCycle(true) {}
|
|
|
|
bool getUseRegionSettings() const { return mUseRegionSettings; }
|
|
bool getUseDayCycle() const { return mUseDayCycle; }
|
|
bool getUseFixedSky() const { return !getUseDayCycle(); }
|
|
|
|
std::string getWaterPresetName() const;
|
|
std::string getSkyPresetName() const;
|
|
std::string getDayCycleName() const;
|
|
|
|
void setUseRegionSettings(bool val);
|
|
void setUseWaterPreset(const std::string& name);
|
|
void setUseSkyPreset(const std::string& name);
|
|
void setUseDayCycle(const std::string& name);
|
|
|
|
bool mUseRegionSettings;
|
|
bool mUseDayCycle;
|
|
std::string mWaterPresetName;
|
|
std::string mSkyPresetName;
|
|
std::string mDayCycleName;
|
|
};
|
|
|
|
/**
|
|
* Setting:
|
|
* 1. Use region settings.
|
|
* 2. Use my setting: <water preset> + <fixed_sky>|<day_cycle>
|
|
*/
|
|
class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
|
|
{
|
|
LOG_CLASS(LLEnvManagerNew);
|
|
public:
|
|
typedef boost::signals2::signal<void()> prefs_change_signal_t;
|
|
typedef boost::signals2::signal<void()> region_settings_change_signal_t;
|
|
typedef boost::signals2::signal<void()> region_change_signal_t;
|
|
typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t;
|
|
|
|
LLEnvManagerNew();
|
|
|
|
// getters to access user env. preferences
|
|
bool getUseRegionSettings() const;
|
|
bool getUseDayCycle() const;
|
|
bool getUseFixedSky() const;
|
|
std::string getWaterPresetName() const;
|
|
std::string getSkyPresetName() const;
|
|
std::string getDayCycleName() const;
|
|
|
|
/// @return cached env. settings of the current region.
|
|
const LLEnvironmentSettings& getRegionSettings() const;
|
|
|
|
/**
|
|
* Set new region settings without uploading them to the region.
|
|
*
|
|
* The override will be reset when the changes are applied to the region (=uploaded)
|
|
* or user teleports to another region.
|
|
*/
|
|
void setRegionSettings(const LLEnvironmentSettings& new_settings);
|
|
|
|
// Change environment w/o changing user preferences.
|
|
bool usePrefs();
|
|
bool useDefaults();
|
|
bool useRegionSettings();
|
|
bool useWaterPreset(const std::string& name);
|
|
bool useWaterParams(const LLSD& params);
|
|
bool useSkyPreset(const std::string& name, bool interpolate = false);
|
|
bool useSkyParams(const LLSD& params);
|
|
bool useDayCycle(const std::string& name, LLEnvKey::EScope scope);
|
|
bool useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time = 0.5);
|
|
|
|
// setters for user env. preferences
|
|
void setUseRegionSettings(bool val, bool interpolate = false);
|
|
void setUseWaterPreset(const std::string& name, bool interpolate = false);
|
|
void setUseSkyPreset(const std::string& name, bool interpolate = false);
|
|
void setUseDayCycle(const std::string& name, bool interpolate = false);
|
|
void setUserPrefs(
|
|
const std::string& water_preset,
|
|
const std::string& sky_preset,
|
|
const std::string& day_cycle_preset,
|
|
bool use_fixed_sky,
|
|
bool use_region_settings);
|
|
|
|
// debugging methods
|
|
void dumpUserPrefs();
|
|
void dumpPresets();
|
|
|
|
// Misc.
|
|
void requestRegionSettings();
|
|
bool sendRegionSettings(const LLEnvironmentSettings& new_settings);
|
|
boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb);
|
|
boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb);
|
|
boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb);
|
|
boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb);
|
|
|
|
static bool canEditRegionSettings(); /// @return true if we have access to editing region environment
|
|
static const std::string getScopeString(LLEnvKey::EScope scope);
|
|
|
|
// Public callbacks.
|
|
void onRegionCrossing();
|
|
void onTeleport();
|
|
void onRegionSettingsResponse(const LLSD& content);
|
|
void onRegionSettingsApplyResponse(bool ok);
|
|
|
|
private:
|
|
friend class LLSingleton<LLEnvManagerNew>;
|
|
/*virtual*/ void initSingleton();
|
|
|
|
void loadUserPrefs();
|
|
void saveUserPrefs();
|
|
|
|
void updateSkyFromPrefs(bool interpolate = false);
|
|
void updateWaterFromPrefs(bool interpolate);
|
|
void updateManagersFromPrefs(bool interpolate);
|
|
|
|
public:
|
|
bool useRegionSky();
|
|
bool useRegionWater();
|
|
|
|
private:
|
|
friend class WindLightRefresh;
|
|
bool useDefaultSky();
|
|
bool useDefaultWater();
|
|
|
|
void onRegionChange(bool interpolate);
|
|
|
|
/// Emitted when user environment preferences change.
|
|
prefs_change_signal_t mUsePrefsChangeSignal;
|
|
|
|
/// Emitted when region environment settings update comes.
|
|
region_settings_change_signal_t mRegionSettingsChangeSignal;
|
|
|
|
/// Emitted when agent region changes. Move to LLAgent?
|
|
region_change_signal_t mRegionChangeSignal;
|
|
|
|
/// Emitted when agent region changes. Move to LLAgent?
|
|
region_settings_applied_signal_t mRegionSettingsAppliedSignal;
|
|
|
|
LLEnvPrefs mUserPrefs; /// User environment preferences.
|
|
LLEnvironmentSettings mCachedRegionPrefs; /// Cached region environment settings.
|
|
LLEnvironmentSettings mNewRegionPrefs; /// Not-yet-uploaded modified region env. settings.
|
|
bool mInterpNextChangeMessage; /// Interpolate env. settings on next region change.
|
|
LLUUID mCurRegionUUID; /// To avoid duplicated region env. settings requests.
|
|
LLUUID mLastReceivedID; /// Id of last received region env. settings.
|
|
};
|
|
|
|
#endif // LL_LLENVMANAGER_H
|
|
|