summaryrefslogtreecommitdiff
path: root/indra/llinventory/llsettingsdaycycle.h
blob: d37423ea9ae8eb7415674a34c3229bde471d1389 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/**
* @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<LLSettingsWater> LLSettingsWaterPtr_t;
typedef PTR_NAMESPACE::shared_ptr<LLSettingsSky> 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<LLSettingsBase::TrackPosition, LLSettingsBase::ptr_t>  CycleTrack_t;
    typedef std::vector<CycleTrack_t>                                       CycleList_t;
    typedef PTR_NAMESPACE::shared_ptr<LLSettingsDay>                        ptr_t;
    typedef PTR_NAMESPACE::weak_ptr<LLSettingsDay>                          wptr_t;
    typedef std::vector<LLSettingsBase::TrackPosition>                      KeyframeList_t;
    typedef std::pair<CycleTrack_t::iterator, CycleTrack_t::iterator>       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