diff options
| -rw-r--r-- | indra/llui/llscrolllistcell.cpp | 73 | ||||
| -rw-r--r-- | indra/llui/llscrolllistcell.h | 21 | ||||
| -rw-r--r-- | indra/newview/llfloaterperformance.cpp | 118 | ||||
| -rw-r--r-- | indra/newview/llfloaterperformance.h | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_performance.xml | 3 | 
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"  | 
