summaryrefslogtreecommitdiff
path: root/indra/newview/llavatarrendernotifier.h
blob: 97c24c3cba177ae800592f32287356c85f03c6a7 (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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/**
 * @file   llavatarrendernotifier.h
 * @author andreykproductengine
 * @date   2015-08-05
 * @brief
 *
 * $LicenseInfo:firstyear=2013&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2013, 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$
 */

#if ! defined(LL_llavatarrendernotifier_H)
#define LL_llavatarrendernotifier_H

#include "llnotificationptr.h"

class LLViewerRegion;

struct LLHUDComplexity
{
    LLHUDComplexity()
    {
        reset();
    }
    void reset()
    {
        objectId = LLUUID::null;
        objectName = "";
        objectsCost = 0;
        objectsCount = 0;
        texturesCost = 0;
        texturesCount = 0;
        largeTexturesCount = 0;
        texturesMemoryTotal = (F64Bytes)0;
    }
    LLUUID objectId;
    std::string objectName;
    std::string jointName;
    U32 objectsCost;
    U32 objectsCount;
    U32 texturesCost;
    U32 texturesCount;
    U32 largeTexturesCount;
    F64Bytes texturesMemoryTotal;
};

typedef std::list<LLHUDComplexity> hud_complexity_list_t;

struct LLObjectComplexity
{
    LLObjectComplexity()
    {
        reset();
    }
    void reset()
    {
        objectId = LLUUID::null;
        objectName = "";
        objectCost = 0;
    }
    LLUUID objectId;
    std::string objectName;
    U32 objectCost;
};

typedef std::list<LLObjectComplexity> object_complexity_list_t;

// Class to notify user about drastic changes in agent's render weights or if other agents
// reported that user's agent is too 'heavy' for their settings
class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier>
{
    LLSINGLETON(LLAvatarRenderNotifier);

public:
    void displayNotification(bool show_over_limit);
    bool isNotificationVisible();

    void updateNotificationRegion(U32 agentcount, U32 overLimit);
    void updateNotificationState();
    void updateNotificationAgent(U32 agentComplexity);

    void setObjectComplexityList(object_complexity_list_t object_list) { mObjectComplexityList = object_list; }
    object_complexity_list_t getObjectComplexityList() { return mObjectComplexityList; }

private:

    LLNotificationPtr mNotificationPtr;

    // to prevent notification from popping up too often, show it only
    // if certain amount of time passed since previous notification
    LLFrameTimer mPopUpDelayTimer;

    // values since last notification for comparison purposes
    U32 mAgentsCount;
    U32 mOverLimitAgents;
    U32 mAgentComplexity;
    F32 mOverLimitPct;

    // last reported values
    U32 mLatestAgentsCount;
    U32 mLatestOverLimitAgents;
    U32 mLatestAgentComplexity;
    F32 mLatestOverLimitPct;

    bool mShowOverLimitAgents;
    std::string overLimitMessage();

    // initial outfit related variables (state control)
    bool mNotifyOutfitLoading;

    // COF (inventory folder) and Skeleton (voavatar) are used to spot changes in outfit.
    S32 mLastCofVersion;
    S32 mLastSkeletonSerialNum;
    // Used to detect changes in voavatar's rezzed status.
    // If value decreases - there were changes in outfit.
    S32 mLastOutfitRezStatus;

    object_complexity_list_t mObjectComplexityList;
};

// Class to notify user about heavy set of HUD
class LLHUDRenderNotifier : public LLSingleton<LLHUDRenderNotifier>
{
    LLSINGLETON(LLHUDRenderNotifier);
    ~LLHUDRenderNotifier();

public:
    void updateNotificationHUD(hud_complexity_list_t complexity);
    bool isNotificationVisible();

    hud_complexity_list_t getHUDComplexityList() { return mHUDComplexityList; }
    S32 getHUDsCount() { return mHUDsCount; }

private:
    enum EWarnLevel
    {
        WARN_NONE = -1,
        WARN_TEXTURES = 0, // least important
        WARN_CRAMPED,
        WARN_HEAVY,
        WARN_COST,
        WARN_MEMORY, //most important
    };

    LLNotificationPtr mHUDNotificationPtr;

    static EWarnLevel getWarningType(LLHUDComplexity object_complexity, LLHUDComplexity cmp_complexity);
    void displayHUDNotification(EWarnLevel warn_type, LLUUID obj_id = LLUUID::null,  std::string object_name = "", std::string joint_name = "");

    LLHUDComplexity mReportedHUDComplexity;
    EWarnLevel mReportedHUDWarning;
    LLHUDComplexity mLatestHUDComplexity;
    LLFrameTimer mHUDPopUpDelayTimer;
    hud_complexity_list_t mHUDComplexityList;
    S32 mHUDsCount;
};

#endif /* ! defined(LL_llavatarrendernotifier_H) */