summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llui/llscrolllistcell.cpp73
-rw-r--r--indra/llui/llscrolllistcell.h21
-rw-r--r--indra/newview/llfloaterperformance.cpp118
-rw-r--r--indra/newview/llfloaterperformance.h4
-rw-r--r--indra/newview/skins/default/xui/en/floater_performance.xml3
5 files changed, 195 insertions, 24 deletions
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 13839da400..50f0f5f820 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -54,6 +54,10 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
{
cell = new LLScrollListIconText(cell_p);
}
+ else if (cell_p.type() == "image")
+ {
+ cell = new LLScrollListBar(cell_p);
+ }
else // default is "text"
{
cell = new LLScrollListText(cell_p);
@@ -166,6 +170,75 @@ void LLScrollListIcon::draw(const LLColor4& color, const LLColor4& highlight_col
}
//
+// LLScrollListBar
+//
+LLScrollListBar::LLScrollListBar(const LLScrollListCell::Params& p)
+ : LLScrollListCell(p),
+ mRatio(0),
+ mColor(p.color),
+ mBottom(1),
+ mLeftPad(1),
+ mRightPad(1)
+{}
+
+LLScrollListBar::~LLScrollListBar()
+{
+}
+
+/*virtual*/
+S32 LLScrollListBar::getHeight() const
+{
+ return LLScrollListCell::getHeight();
+}
+
+/*virtual*/
+const LLSD LLScrollListBar::getValue() const
+{
+ return LLStringUtil::null;
+}
+
+void LLScrollListBar::setValue(const LLSD& value)
+{
+ if (value.has("ratio"))
+ {
+ mRatio = value["ratio"].asReal();
+ }
+ if (value.has("bottom"))
+ {
+ mBottom = value["bottom"].asInteger();
+ }
+ if (value.has("left_pad"))
+ {
+ mLeftPad = value["left_pad"].asInteger();
+ }
+ if (value.has("right_pad"))
+ {
+ mRightPad = value["right_pad"].asInteger();
+ }
+}
+
+void LLScrollListBar::setColor(const LLColor4& color)
+{
+ mColor = color;
+}
+
+S32 LLScrollListBar::getWidth() const
+{
+ return LLScrollListCell::getWidth();
+}
+
+
+void LLScrollListBar::draw(const LLColor4& color, const LLColor4& highlight_color) const
+{
+ S32 bar_width = getWidth() - mLeftPad - mRightPad;
+ S32 left = bar_width - bar_width * mRatio;
+ left = llclamp(left, mLeftPad, getWidth() - mRightPad - 1);
+
+ gl_line_2d(left, mBottom, getWidth() - mRightPad, mBottom, mColor);
+ gl_line_2d(left, mBottom - 1, getWidth() - mRightPad, mBottom - 1, mColor);
+}
+
+//
// LLScrollListText
//
U32 LLScrollListText::sCount = 0;
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index 19576fb247..26a272b270 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -33,6 +33,7 @@
#include "lluistring.h"
#include "v4color.h"
#include "llui.h"
+#include "llgltexture.h"
class LLCheckBoxCtrl;
class LLSD;
@@ -192,6 +193,26 @@ private:
LLFontGL::HAlign mAlignment;
};
+
+class LLScrollListBar : public LLScrollListCell
+{
+public:
+ LLScrollListBar(const LLScrollListCell::Params& p);
+ /*virtual*/ ~LLScrollListBar();
+ /*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
+ /*virtual*/ S32 getWidth() const;
+ /*virtual*/ S32 getHeight() const;
+ /*virtual*/ const LLSD getValue() const;
+ /*virtual*/ void setColor(const LLColor4&);
+ /*virtual*/ void setValue(const LLSD& value);
+
+private:
+ LLColor4 mColor;
+ F32 mRatio;
+ S32 mBottom;
+ S32 mRightPad;
+ S32 mLeftPad;
+};
/*
* An interactive cell containing a check box.
*/
diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
index 424ca04b1f..beeebcb202 100644
--- a/indra/newview/llfloaterperformance.cpp
+++ b/indra/newview/llfloaterperformance.cpp
@@ -26,13 +26,15 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterperformance.h"
+#include "llagent.h"
+#include "llagentcamera.h"
#include "llappearancemgr.h"
#include "llavataractions.h"
#include "llavatarrendernotifier.h"
#include "llfeaturemanager.h"
+#include "llfloaterpreference.h" // LLAvatarComplexityControls
#include "llfloaterreg.h"
#include "llnamelistctrl.h"
-#include "llfloaterpreference.h" // LLAvatarComplexityControls
#include "llsliderctrl.h"
#include "lltextbox.h"
#include "lltrans.h"
@@ -40,12 +42,16 @@
#include "llvoavatarself.h"
const F32 REFRESH_INTERVAL = 1.0f;
-const S32 COMPLEXITY_THRESHOLD_1 = 100000;
-
+const S32 COMPLEXITY_THRESHOLD_HIGH = 100000;
+const S32 COMPLEXITY_THRESHOLD_MEDIUM = 30000;
+const S32 BAR_LEFT_PAD = 2;
+const S32 BAR_RIGHT_PAD = 5;
+const S32 BAR_BOTTOM_PAD = 9;
LLFloaterPerformance::LLFloaterPerformance(const LLSD& key)
: LLFloater(key),
- mUpdateTimer(new LLTimer())
+ mUpdateTimer(new LLTimer()),
+ mNearbyMaxComplexity(0)
{
}
@@ -120,6 +126,10 @@ void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel)
{
populateNearbyList();
}
+ else if (mComplexityPanel == selected_panel)
+ {
+ populateObjectList();
+ }
}
void LLFloaterPerformance::draw()
@@ -179,6 +189,7 @@ void LLFloaterPerformance::initBackBtn(LLPanel* panel)
void LLFloaterPerformance::populateHUDList()
{
+ S32 prev_pos = mHUDList->getScrollPos();
mHUDList->clearRows();
mHUDList->updateColumns(true);
@@ -186,9 +197,15 @@ void LLFloaterPerformance::populateHUDList()
hud_complexity_list_t::iterator iter = complexity_list.begin();
hud_complexity_list_t::iterator end = complexity_list.end();
-
+
+ U32 max_complexity = 0;
for (; iter != end; ++iter)
{
+ max_complexity = llmax(max_complexity, (*iter).objectsCost);
+ }
+
+ for (iter = complexity_list.begin(); iter != end; ++iter)
+ {
LLHUDComplexity hud_object_complexity = *iter;
LLSD item;
@@ -196,8 +213,12 @@ void LLFloaterPerformance::populateHUDList()
item["target"] = LLNameListCtrl::SPECIAL;
LLSD& row = item["columns"];
row[0]["column"] = "complex_visual";
- row[0]["type"] = "text";
- row[0]["value"] = "*";
+ row[0]["type"] = "image";
+ LLSD& value = row[0]["value"];
+ value["ratio"] = (F32)hud_object_complexity.objectsCost / max_complexity;
+ value["bottom"] = BAR_BOTTOM_PAD;
+ value["left_pad"] = BAR_LEFT_PAD;
+ value["right_pad"] = BAR_RIGHT_PAD;
row[1]["column"] = "complex_value";
row[1]["type"] = "text";
@@ -212,12 +233,14 @@ void LLFloaterPerformance::populateHUDList()
mHUDList->addElement(item);
}
mHUDList->sortByColumnIndex(1, FALSE);
+ mHUDList->setScrollPos(prev_pos);
mHUDsPanel->getChild<LLTextBox>("huds_value")->setValue(std::to_string(complexity_list.size()));
}
void LLFloaterPerformance::populateObjectList()
{
+ S32 prev_pos = mObjectList->getScrollPos();
mObjectList->clearRows();
mObjectList->updateColumns(true);
@@ -226,8 +249,14 @@ void LLFloaterPerformance::populateObjectList()
object_complexity_list_t::iterator iter = complexity_list.begin();
object_complexity_list_t::iterator end = complexity_list.end();
+ U32 max_complexity = 0;
for (; iter != end; ++iter)
{
+ max_complexity = llmax(max_complexity, (*iter).objectCost);
+ }
+
+ for (iter = complexity_list.begin(); iter != end; ++iter)
+ {
LLObjectComplexity object_complexity = *iter;
LLSD item;
@@ -235,8 +264,12 @@ void LLFloaterPerformance::populateObjectList()
item["target"] = LLNameListCtrl::SPECIAL;
LLSD& row = item["columns"];
row[0]["column"] = "complex_visual";
- row[0]["type"] = "text";
- row[0]["value"] = "*";
+ row[0]["type"] = "image";
+ LLSD& value = row[0]["value"];
+ value["ratio"] = (F32)object_complexity.objectCost / max_complexity;
+ value["bottom"] = BAR_BOTTOM_PAD;
+ value["left_pad"] = BAR_LEFT_PAD;
+ value["right_pad"] = BAR_RIGHT_PAD;
row[1]["column"] = "complex_value";
row[1]["type"] = "text";
@@ -251,30 +284,35 @@ void LLFloaterPerformance::populateObjectList()
mObjectList->addElement(item);
}
mObjectList->sortByColumnIndex(1, FALSE);
+ mObjectList->setScrollPos(prev_pos);
}
void LLFloaterPerformance::populateNearbyList()
{
+ S32 prev_pos = mNearbyList->getScrollPos();
mNearbyList->clearRows();
mNearbyList->updateColumns(true);
- S32 avatars = 0;
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
+ std::vector<LLCharacter*> valid_nearby_avs;
+ getNearbyAvatars(valid_nearby_avs);
- std::vector<LLCharacter*>::iterator char_iter = LLCharacter::sInstances.begin();
- while (char_iter != LLCharacter::sInstances.end())
+ std::vector<LLCharacter*>::iterator char_iter = valid_nearby_avs.begin();
+ while (char_iter != valid_nearby_avs.end())
{
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter);
- if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf())
+ if (avatar)
{
- avatar->calculateUpdateRenderComplexity();
-
LLSD item;
item["id"] = avatar->getID();
LLSD& row = item["columns"];
row[0]["column"] = "complex_visual";
- row[0]["type"] = "text";
- row[0]["value"] = "*";
+ row[0]["type"] = "image";
+ LLSD& value = row[0]["value"];
+ value["ratio"] = (F32)avatar->getVisualComplexity() / mNearbyMaxComplexity;
+ value["bottom"] = BAR_BOTTOM_PAD;
+ value["left_pad"] = BAR_LEFT_PAD;
+ value["right_pad"] = BAR_RIGHT_PAD;
row[1]["column"] = "complex_value";
row[1]["type"] = "text";
@@ -296,6 +334,11 @@ void LLFloaterPerformance::populateNearbyList()
if (avatar->getVisualComplexity() > max_render_cost)
{
color = "LabelDisabledColor";
+ LLScrollListBar* bar = dynamic_cast<LLScrollListBar*>(av_item->getColumn(0));
+ if (bar)
+ {
+ bar->setColor(LLUIColorTable::instance().getColor(color));
+ }
}
else if (LLAvatarActions::isFriend(avatar->getID()))
{
@@ -304,28 +347,55 @@ void LLFloaterPerformance::populateNearbyList()
name_text->setColor(LLUIColorTable::instance().getColor(color));
}
}
- avatars++;
}
char_iter++;
}
- mNearbyList->sortByColumnIndex(1, FALSE);
+ mNearbyList->sortByColumnIndex(1, FALSE);
+ mNearbyList->setScrollPos(prev_pos);
}
-void LLFloaterPerformance::updateNearbyComplexityDesc()
+void LLFloaterPerformance::getNearbyAvatars(std::vector<LLCharacter*> &valid_nearby_avs)
{
- static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
- S32 max_complexity = 0;
+ static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
+ F32 radius = render_far_clip * render_far_clip;
std::vector<LLCharacter*>::iterator char_iter = LLCharacter::sInstances.begin();
while (char_iter != LLCharacter::sInstances.end())
{
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter);
if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf())
{
- max_complexity = llmax(max_complexity, (S32)avatar->getVisualComplexity());
+ if ((dist_vec_squared(avatar->getPositionGlobal(), gAgent.getPositionGlobal()) > radius) &&
+ (dist_vec_squared(avatar->getPositionGlobal(), gAgentCamera.getCameraPositionGlobal()) > radius))
+ {
+ char_iter++;
+ continue;
+ }
+ avatar->calculateUpdateRenderComplexity();
+ mNearbyMaxComplexity = llmax(mNearbyMaxComplexity, (S32)avatar->getVisualComplexity());
+ valid_nearby_avs.push_back(*char_iter);
}
char_iter++;
}
- std::string desc = getString(max_complexity > llmin((S32)max_render_cost, COMPLEXITY_THRESHOLD_1) ? "very_high" : "medium");
+}
+
+void LLFloaterPerformance::updateNearbyComplexityDesc()
+{
+ std::string desc = getString("low");
+
+ static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
+ if (mMainPanel->getVisible())
+ {
+ std::vector<LLCharacter*> valid_nearby_avs;
+ getNearbyAvatars(valid_nearby_avs);
+ }
+ if (mNearbyMaxComplexity > COMPLEXITY_THRESHOLD_HIGH)
+ {
+ desc = getString("very_high");
+ }
+ else if (mNearbyMaxComplexity > COMPLEXITY_THRESHOLD_MEDIUM)
+ {
+ desc = getString("medium");
+ }
if (mMainPanel->getVisible())
{
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 7aec7c3f6c..ea15873b95 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -28,6 +28,7 @@
#include "llfloater.h"
+class LLCharacter;
class LLNameListCtrl;
class LLFloaterPerformance : public LLFloater
@@ -57,6 +58,7 @@ private:
void updateMaxComplexity();
void updateComplexityText();
+ void getNearbyAvatars(std::vector<LLCharacter*> &valid_nearby_avs);
void updateNearbyComplexityDesc();
LLPanel* mMainPanel;
@@ -72,6 +74,8 @@ private:
LLTimer* mUpdateTimer;
+ S32 mNearbyMaxComplexity;
+
boost::signals2::connection mComplexityChangedSignal;
};
diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml
index e415ac5be0..4cd3c7a603 100644
--- a/indra/newview/skins/default/xui/en/floater_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_performance.xml
@@ -12,6 +12,9 @@
<string
name="medium"
value="medium"/>
+ <string
+ name="low"
+ value="low"/>
<panel
bevel_style="none"
follows="left|top"