/** * @file llsettingsdaycycle.h * @author optional * @brief A base class for asset based settings groups. * * $LicenseInfo:2011&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2017, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #ifndef LL_SETTINGS_DAYCYCLE_H #define LL_SETTINGS_DAYCYCLE_H #include "llsettingsbase.h" class LLSettingsWater; class LLSettingsSky; // These are alias for LLSettingsWater::ptr_t and LLSettingsSky::ptr_t respectively. // Here for definitions only. typedef PTR_NAMESPACE::shared_ptr LLSettingsWaterPtr_t; typedef PTR_NAMESPACE::shared_ptr LLSettingsSkyPtr_t; class LLSettingsDay : public LLSettingsBase { public: // 32-bit as LLSD only supports that width at present typedef S32Seconds Seconds; static const std::string SETTING_KEYID; static const std::string SETTING_KEYNAME; static const std::string SETTING_KEYKFRAME; static const std::string SETTING_KEYHASH; static const std::string SETTING_TRACKS; static const std::string SETTING_FRAMES; static const Seconds MINIMUM_DAYLENGTH; static const Seconds DEFAULT_DAYLENGTH; static const Seconds MAXIMUM_DAYLENGTH; static const Seconds MINIMUM_DAYOFFSET; static const Seconds DEFAULT_DAYOFFSET; static const Seconds MAXIMUM_DAYOFFSET; static const U32 TRACK_WATER; static const U32 TRACK_GROUND_LEVEL; static const U32 TRACK_MAX; static const U32 FRAME_MAX; static const F32 DEFAULT_FRAME_SLOP_FACTOR; static const LLUUID DEFAULT_ASSET_ID; typedef std::map CycleTrack_t; typedef std::vector CycleList_t; typedef PTR_NAMESPACE::shared_ptr ptr_t; typedef PTR_NAMESPACE::weak_ptr wptr_t; typedef std::vector KeyframeList_t; typedef std::pair TrackBound_t; //--------------------------------------------------------------------- LLSettingsDay(const LLSD &data); virtual ~LLSettingsDay() { }; bool initialize(bool validate_frames = false); virtual ptr_t buildClone() = 0; virtual ptr_t buildDeepCloneAndUncompress() = 0; virtual LLSD& getSettings() SETTINGS_OVERRIDE; virtual void setLLSDDirty() override; virtual LLSettingsType::type_e getSettingsTypeValue() const SETTINGS_OVERRIDE { return LLSettingsType::ST_DAYCYCLE; } //--------------------------------------------------------------------- virtual std::string getSettingsType() const SETTINGS_OVERRIDE { return std::string("daycycle"); } // Settings status virtual void blend(LLSettingsBase::ptr_t &other, F64 mix) SETTINGS_OVERRIDE; static LLSD defaults(); //--------------------------------------------------------------------- KeyframeList_t getTrackKeyframes(S32 track); bool moveTrackKeyframe(S32 track, const LLSettingsBase::TrackPosition& old_frame, const LLSettingsBase::TrackPosition& new_frame); bool removeTrackKeyframe(S32 track, const LLSettingsBase::TrackPosition& frame); void setWaterAtKeyframe(const LLSettingsWaterPtr_t &water, const LLSettingsBase::TrackPosition& keyframe); LLSettingsWaterPtr_t getWaterAtKeyframe(const LLSettingsBase::TrackPosition& keyframe) const; void setSkyAtKeyframe(const LLSettingsSkyPtr_t &sky, const LLSettingsBase::TrackPosition& keyframe, S32 track); LLSettingsSkyPtr_t getSkyAtKeyframe(const LLSettingsBase::TrackPosition& keyframe, S32 track) const; void setSettingsAtKeyframe(const LLSettingsBase::ptr_t &settings, const LLSettingsBase::TrackPosition& keyframe, S32 track); LLSettingsBase::ptr_t getSettingsAtKeyframe(const LLSettingsBase::TrackPosition& keyframe, S32 track) const; CycleTrack_t::value_type getSettingsNearKeyframe(const LLSettingsBase::TrackPosition &keyframe, S32 track, F32 fudge) const; //--------------------------------------------------------------------- void startDayCycle(); virtual LLSettingsSkyPtr_t getDefaultSky() const = 0; virtual LLSettingsWaterPtr_t getDefaultWater() const = 0; virtual LLSettingsSkyPtr_t buildSky(LLSD) const = 0; virtual LLSettingsWaterPtr_t buildWater(LLSD) const = 0; void setInitialized(bool value = true) { mInitialized = value; } CycleTrack_t & getCycleTrack(S32 track); const CycleTrack_t & getCycleTrackConst(S32 track) const; bool clearCycleTrack(S32 track); bool replaceCycleTrack(S32 track, const CycleTrack_t &source); bool isTrackEmpty(S32 track) const; virtual validation_list_t getValidationList() const SETTINGS_OVERRIDE; static validation_list_t validationList(); virtual LLSettingsBase::ptr_t buildDerivedClone() SETTINGS_OVERRIDE { return buildClone(); } LLSettingsBase::TrackPosition getUpperBoundFrame(S32 track, const LLSettingsBase::TrackPosition& keyframe); LLSettingsBase::TrackPosition getLowerBoundFrame(S32 track, const LLSettingsBase::TrackPosition& keyframe); static LLUUID GetDefaultAssetId(); protected: LLSettingsDay(); virtual void updateSettings() SETTINGS_OVERRIDE; bool mInitialized; private: CycleList_t mDayTracks; LLSD mDaySettings; LLSettingsBase::Seconds mLastUpdateTime; static CycleTrack_t::iterator getEntryAtOrBefore(CycleTrack_t &track, const LLSettingsBase::TrackPosition& keyframe); static CycleTrack_t::iterator getEntryAtOrAfter(CycleTrack_t &track, const LLSettingsBase::TrackPosition& keyframe); TrackBound_t getBoundingEntries(CycleTrack_t &track, const LLSettingsBase::TrackPosition& keyframe); }; #endif