summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorandreykproductengine <akleshchev@productengine.com>2015-08-19 15:43:06 -0400
committerandreykproductengine <akleshchev@productengine.com>2015-08-19 15:43:06 -0400
commit75304b4ca81e3fdb9164ec607997a6c30616d8ca (patch)
tree4bee13989d3578a52e25eb867f94af08f2769ae3 /indra
parent6a5844d936c3317626cfcbe9d9cb66086d570fca (diff)
MAINT-5378 Add notices for avatar complexity changes
Diffstat (limited to 'indra')
-rwxr-xr-xindra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/llavatarrenderinfoaccountant.cpp7
-rw-r--r--indra/newview/llavatarrendernotifier.cpp182
-rw-r--r--indra/newview/llavatarrendernotifier.h73
-rwxr-xr-xindra/newview/llnotificationtiphandler.cpp16
-rwxr-xr-xindra/newview/llvoavatar.cpp25
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml24
7 files changed, 310 insertions, 19 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b5a6912da0..73b60a8ffe 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -133,6 +133,7 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarrenderinfoaccountant.cpp
+ llavatarrendernotifier.cpp
llavatarpropertiesprocessor.cpp
llblockedlistitem.cpp
llblocklist.cpp
@@ -755,6 +756,7 @@ set(viewer_HEADER_FILES
llavatarlistitem.h
llavatarpropertiesprocessor.h
llavatarrenderinfoaccountant.h
+ llavatarrendernotifier.h
llblockedlistitem.h
llblocklist.h
llbox.h
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index b8ec1e150b..595a5f0224 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -38,6 +38,7 @@
#include "httpresponse.h"
#include "llcorehttputil.h"
#include "llappcorehttp.h"
+#include "llavatarrendernotifier.h"
#include "lltimer.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
@@ -102,7 +103,7 @@ public:
void onCompleted(LLCore::HttpHandle handle,
LLCore::HttpResponse* response)
- {
+ {
LLCore::HttpStatus status = response->getStatus();
if (status)
{
@@ -120,8 +121,8 @@ public:
U32 overlimit = avatar_render_info[KEY_OVER_COMPLEXITY_LIMIT].asInteger();
LL_DEBUGS("AvatarRenderInfo") << "complexity limit: "<<reporting<<" reporting, "<<overlimit<<" over limit"<<LL_ENDL;
- //@TODO - at this point, pass reporting and overlimit to something
- // that remembers them and when they change displays a message
+
+ LLAvatarRenderNotifier::getInstance()->updateNotificationRegion(reporting, overlimit);
}
if (avatar_render_info.has(KEY_AGENTS))
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
new file mode 100644
index 0000000000..c7fdf4cce4
--- /dev/null
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -0,0 +1,182 @@
+/**
+ * @file llavatarrendernotifier.cpp
+ * @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$
+ */
+
+// Pre-compiled headers
+#include "llviewerprecompiledheaders.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llagentwearables.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llnotificationtemplate.h"
+#include "lltimer.h"
+#include "llviewercontrol.h"
+// associated header
+#include "llavatarrendernotifier.h"
+
+// when change exceeds this ration, notification is shown
+static const F32 RENDER_ALLOWED_CHANGE_PCT = 0.1;
+
+
+LLAvatarRenderNotifier::LLAvatarRenderNotifier() :
+mAgentsCount(0),
+mOverLimitAgents(0),
+mAgentComplexity(0),
+mOverLimitPct(0.0f),
+mLatestAgentsCount(0),
+mLatestOverLimitAgents(0),
+mLatestAgentComplexity(0),
+mLatestOverLimitPct(0.0f),
+mShowOverLimitAgents(false)
+{
+}
+
+void LLAvatarRenderNotifier::displayNotification()
+{
+ static LLCachedControl<U32> expire_delay(gSavedSettings, "ShowMyComplexityChanges", 20);
+
+ LLDate expire_date(LLDate::now().secondsSinceEpoch() + expire_delay);
+ LLSD args;
+ args["AGENT_COMPLEXITY"] = LLSD::Integer(mLatestAgentComplexity);
+ std::string notification_name;
+ if (mShowOverLimitAgents)
+ {
+ notification_name = "RegionAndAgentComplexity";
+ args["OVERLIMIT_PCT"] = LLSD::Integer(mLatestOverLimitPct);
+ }
+ else
+ {
+ notification_name = "AgentComplexity";
+ }
+
+ if (mNotificationPtr != NULL && mNotificationPtr->getName() != notification_name)
+ {
+ // since unique tag works only for same notification,
+ // old notification needs to be canceled manually
+ LLNotifications::instance().cancel(mNotificationPtr);
+ }
+
+ mNotificationPtr = LLNotifications::instance().add(LLNotification::Params()
+ .name(notification_name)
+ .expiry(expire_date)
+ .substitutions(args));
+}
+
+bool LLAvatarRenderNotifier::isNotificationVisible()
+{
+ return mNotificationPtr != NULL && mNotificationPtr->isActive();
+}
+
+void LLAvatarRenderNotifier::updateNotification()
+{
+ if (mAgentsCount == mLatestAgentsCount
+ && mOverLimitAgents == mLatestOverLimitAgents
+ && mAgentComplexity == mLatestAgentComplexity)
+ {
+ //no changes since last notification
+ return;
+ }
+
+ if (mLatestAgentComplexity == 0
+ || !gAgentWearables.areWearablesLoaded())
+ {
+ // data not ready, nothing to show.
+ return;
+ }
+
+ bool display_notification = false;
+ bool is_visible = isNotificationVisible();
+
+ if (mLatestOverLimitPct > 0 || mOverLimitPct > 0)
+ {
+ //include 'over limit' information into notification
+ mShowOverLimitAgents = true;
+ }
+ else
+ {
+ // make sure that 'over limit' won't be displayed only to be hidden in a second
+ mShowOverLimitAgents &= is_visible;
+ }
+
+ if (mAgentComplexity != mLatestAgentComplexity)
+ {
+ // if we have an agent complexity update, we always display it
+ display_notification = true;
+
+ // next 'over limit' update should be displayed as soon as possible if there is anything noteworthy
+ mPopUpDelayTimer.resetWithExpiry(0);
+ }
+ else if ((mPopUpDelayTimer.hasExpired() || is_visible)
+ && (mOverLimitPct > 0 || mLatestOverLimitPct > 0)
+ && abs(mOverLimitPct - mLatestOverLimitPct) > mLatestOverLimitPct * RENDER_ALLOWED_CHANGE_PCT)
+ {
+ // display in case of drop to/from zero and in case of significant (RENDER_ALLOWED_CHANGE_PCT) changes
+ display_notification = true;
+
+ // default timeout before next notification
+ static LLCachedControl<U32> pop_up_delay(gSavedSettings, "ComplexityChangesPopUpDelay", 300);
+ mPopUpDelayTimer.resetWithExpiry(pop_up_delay);
+ }
+
+ if (display_notification)
+ {
+ mAgentComplexity = mLatestAgentComplexity;
+ mAgentsCount = mLatestAgentsCount;
+ mOverLimitAgents = mLatestOverLimitAgents;
+ mOverLimitPct = mLatestOverLimitPct;
+
+ displayNotification();
+ }
+}
+
+void LLAvatarRenderNotifier::updateNotificationRegion(U32 agentcount, U32 overLimit)
+{
+ if (agentcount == 0)
+ {
+ // Data not ready
+ return;
+ }
+
+ // save current values for later use
+ mLatestAgentsCount = agentcount > overLimit ? agentcount - 1 : agentcount; // subtract self
+ mLatestOverLimitAgents = overLimit;
+ mLatestOverLimitPct = mLatestAgentsCount != 0 ? ((F32)overLimit / (F32)mLatestAgentsCount) * 100.0 : 0;
+
+ updateNotification();
+}
+
+void LLAvatarRenderNotifier::updateNotificationAgent(U32 agentComplexity)
+{
+ // save the value for use in following messages
+ mLatestAgentComplexity = agentComplexity;
+
+ updateNotification();
+}
+
diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h
new file mode 100644
index 0000000000..264c616543
--- /dev/null
+++ b/indra/newview/llavatarrendernotifier.h
@@ -0,0 +1,73 @@
+/**
+ * @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;
+
+// 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>
+{
+public:
+ LLAvatarRenderNotifier();
+
+ void displayNotification();
+ bool isNotificationVisible();
+
+ void updateNotification();
+ void updateNotificationRegion(U32 agentcount, U32 overLimit);
+ void updateNotificationAgent(U32 agentComplexity);
+
+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;
+};
+
+#endif /* ! defined(LL_llavatarrendernotifier_H) */
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 4ca961c1f9..596327e8f1 100755
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -113,11 +113,23 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
LLToast::Params p;
p.notif_id = notification->getID();
p.notification = notification;
- p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
p.panel = notify_box;
p.is_tip = true;
p.can_be_stored = false;
-
+
+ LLDate cur_time = LLDate::now();
+ LLDate exp_time = notification->getExpiration();
+ if (exp_time > cur_time)
+ {
+ // we have non-default expiration time - keep visible until expires
+ p.lifetime_secs = exp_time.secondsSinceEpoch() - cur_time.secondsSinceEpoch();
+ }
+ else
+ {
+ // use default time
+ p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
+ }
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a073ac10b8..86db3689c7 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -43,6 +43,7 @@
#include "llanimationstates.h"
#include "llavatarnamecache.h"
#include "llavatarpropertiesprocessor.h"
+#include "llavatarrendernotifier.h"
#include "llexperiencecache.h"
#include "llphysicsmotion.h"
#include "llviewercontrol.h"
@@ -8285,20 +8286,9 @@ void LLVOAvatar::idleUpdateRenderComplexity()
void LLVOAvatar::updateVisualComplexity()
{
- LL_DEBUGS("AvatarRender") << "avatar " << getID() << " appearance changed" << LL_ENDL;
- // Set the cache time to in the past so it's updated ASAP
- mVisualComplexityStale = true;
- LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 5);
-
- if ( isSelf() && show_my_complexity_changes )
- {
- // @TODO
- LL_INFOS("AvatarRender") << "popup that displays my complexity (" << mVisualComplexity << ")"
- << " for " << show_my_complexity_changes << " seconds"
- << LL_ENDL;
- }
-
-
+ LL_DEBUGS("AvatarRender") << "avatar " << getID() << " appearance changed" << LL_ENDL;
+ // Set the cache time to in the past so it's updated ASAP
+ mVisualComplexityStale = true;
}
// Calculations for mVisualComplexity value
@@ -8430,6 +8420,13 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
}
mVisualComplexity = cost;
mVisualComplexityStale = false;
+
+ LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20);
+
+ if (isSelf() && show_my_complexity_changes)
+ {
+ LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity);
+ }
}
}
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index d0ccf2e2d8..97c4c924e7 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3294,6 +3294,30 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
</notification>
<notification
+ icon = "notifytip.tga"
+ name = "RegionAndAgentComplexity"
+ type = "notifytip"
+ log_to_chat = "false">
+ <unique combine = "cancel_old">
+ <context>AgentComplexityNotice</context>
+ </unique>
+ Your visual complexity is [AGENT_COMPLEXITY].
+[OVERLIMIT_PCT]% of nearby users may not fully show you
+with complexity this high.
+ </notification>
+
+ <notification
+ icon = "notifytip.tga"
+ name = "AgentComplexity"
+ type = "notifytip"
+ log_to_chat = "false">
+ <unique combine = "cancel_old">
+ <context>AgentComplexityNotice</context>
+ </unique>
+Your visual complexity is [AGENT_COMPLEXITY].
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="FirstRun"
type="alertmodal">