diff options
29 files changed, 2670 insertions, 549 deletions
| diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 13839da400..c5f53823f3 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() == "bar") +    { +        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/CMakeLists.txt b/indra/newview/CMakeLists.txt index 87caca56af..c222b10d2d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -287,9 +287,11 @@ set(viewer_SOURCE_FILES      llfloaterpathfindinglinksets.cpp      llfloaterpathfindingobjects.cpp      llfloaterpay.cpp +    llfloaterperformance.cpp      llfloaterperms.cpp      llfloaterpostprocess.cpp      llfloaterpreference.cpp +    llfloaterpreferencesgraphicsadvanced.cpp      llfloaterpreferenceviewadvanced.cpp      llfloaterpreviewtrash.cpp      llfloaterproperties.cpp @@ -929,9 +931,11 @@ set(viewer_HEADER_FILES      llfloaterpathfindinglinksets.h      llfloaterpathfindingobjects.h      llfloaterpay.h +    llfloaterperformance.h      llfloaterperms.h      llfloaterpostprocess.h      llfloaterpreference.h +    llfloaterpreferencesgraphicsadvanced.h      llfloaterpreferenceviewadvanced.h      llfloaterpreviewtrash.h      llfloaterproperties.h diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp index 94584a623b..8b09f7903d 100644 --- a/indra/newview/llavatarrendernotifier.cpp +++ b/indra/newview/llavatarrendernotifier.cpp @@ -235,6 +235,12 @@ void LLAvatarRenderNotifier::updateNotificationAgent(U32 agentComplexity)      // save the value for use in following messages      mLatestAgentComplexity = agentComplexity; +    static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20); +    if (!show_my_complexity_changes) +    { +        return; +    } +      if (!isAgentAvatarValid() || !gAgentWearables.areWearablesLoaded())      {          // data not ready, nothing to show. @@ -282,7 +288,8 @@ static const char* e_hud_messages[] =  };  LLHUDRenderNotifier::LLHUDRenderNotifier() : -mReportedHUDWarning(WARN_NONE) +mReportedHUDWarning(WARN_NONE), +mHUDsCount(0)  {  } @@ -298,6 +305,15 @@ void LLHUDRenderNotifier::updateNotificationHUD(hud_complexity_list_t complexity          return;      } +    mHUDComplexityList = complexity; +    mHUDsCount = mHUDComplexityList.size(); + +    static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20); +    if (!show_my_complexity_changes) +    { +        return; +    } +              // TODO:      // Find a way to show message with list of issues, but without making it too large      // and intrusive. diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h index ec17b3d9e6..37130bfcf6 100644 --- a/indra/newview/llavatarrendernotifier.h +++ b/indra/newview/llavatarrendernotifier.h @@ -63,6 +63,25 @@ struct LLHUDComplexity  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> @@ -77,6 +96,9 @@ public:      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; @@ -109,6 +131,8 @@ private:      // 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 @@ -121,6 +145,9 @@ public:      void updateNotificationHUD(hud_complexity_list_t complexity);      bool isNotificationVisible(); +    hud_complexity_list_t getHUDComplexityList() { return mHUDComplexityList; } +    S32 getHUDsCount() { return mHUDsCount; } +  private:      enum EWarnLevel      { @@ -141,6 +168,8 @@ private:      EWarnLevel mReportedHUDWarning;      LLHUDComplexity mLatestHUDComplexity;      LLFrameTimer mHUDPopUpDelayTimer; +    hud_complexity_list_t mHUDComplexityList; +    S32 mHUDsCount;  };  #endif /* ! defined(LL_llavatarrendernotifier_H) */ diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp index b8f854feb3..7d098e6c88 100644 --- a/indra/newview/llfloateravatarrendersettings.cpp +++ b/indra/newview/llfloateravatarrendersettings.cpp @@ -89,7 +89,6 @@ BOOL LLFloaterAvatarRenderSettings::postBuild()      LLFloater::postBuild();      mAvatarSettingsList = getChild<LLNameListCtrl>("render_settings_list");      mAvatarSettingsList->setRightMouseDownCallback(boost::bind(&LLFloaterAvatarRenderSettings::onAvatarListRightClick, this, _1, _2, _3)); -    getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterAvatarRenderSettings::onFilterEdit, this, _2));  	return TRUE;  } @@ -133,37 +132,13 @@ void LLFloaterAvatarRenderSettings::updateList()      {          item_params.value = iter->first;          LLAvatarNameCache::get(iter->first, &av_name); -        if(!isHiddenRow(av_name.getCompleteName())) -        { -            item_params.columns.add().value(av_name.getCompleteName()).column("name"); -            std::string setting = getString(iter->second == 1 ? "av_never_render" : "av_always_render"); -            item_params.columns.add().value(setting).column("setting"); -            std::string timestamp = createTimestamp(LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first)); -            item_params.columns.add().value(timestamp).column("timestamp"); -            mAvatarSettingsList->addNameItemRow(item_params); -        } +        item_params.columns.add().value(av_name.getCompleteName()).column("name"); +        std::string setting = getString(iter->second == 1 ? "av_never_render" : "av_always_render"); +        item_params.columns.add().value(setting).column("setting"); +        mAvatarSettingsList->addNameItemRow(item_params);      }  } -void LLFloaterAvatarRenderSettings::onFilterEdit(const std::string& search_string) -{ -    std::string filter_upper = search_string; -    LLStringUtil::toUpper(filter_upper); -    if (mNameFilter != filter_upper) -    { -        mNameFilter = filter_upper; -        mNeedsUpdate = true; -    } -} - -bool LLFloaterAvatarRenderSettings::isHiddenRow(const std::string& av_name) -{ -    if (mNameFilter.empty()) return false; -    std::string upper_name = av_name; -    LLStringUtil::toUpper(upper_name); -    return std::string::npos == upper_name.find(mNameFilter); -} -  static LLVOAvatar* find_avatar(const LLUUID& id)  {      LLViewerObject *obj = gObjectList.findObject(id); @@ -214,6 +189,10 @@ bool LLFloaterAvatarRenderSettings::isActionChecked(const LLSD& userdata, const      {          return (visual_setting == S32(LLVOAvatar::AV_RENDER_NORMALLY));      } +    else if ("non_default" == command_name) +    { +        return (visual_setting != S32(LLVOAvatar::AV_RENDER_NORMALLY)); +    }      else if ("never" == command_name)      {          return (visual_setting == S32(LLVOAvatar::AV_DO_NOT_RENDER)); diff --git a/indra/newview/llfloateravatarrendersettings.h b/indra/newview/llfloateravatarrendersettings.h index 00ee074f17..2e0a844afd 100644 --- a/indra/newview/llfloateravatarrendersettings.h +++ b/indra/newview/llfloateravatarrendersettings.h @@ -48,7 +48,6 @@ public:      void onAvatarListRightClick(LLUICtrl* ctrl, S32 x, S32 y);      void updateList(); -    void onFilterEdit(const std::string& search_string);      void onCustomAction (const LLSD& userdata, const LLUUID& av_id);      bool isActionChecked(const LLSD& userdata, const LLUUID& av_id);      void onClickAdd(const LLSD& userdata); @@ -59,15 +58,12 @@ public:      static void setNeedsUpdate();  private: -    bool isHiddenRow(const std::string& av_name);      void callbackAvatarPicked(const uuid_vec_t& ids, S32 visual_setting);      void removePicker();      bool mNeedsUpdate;      LLListContextMenu* mContextMenu;      LLNameListCtrl* mAvatarSettingsList; - -    std::string mNameFilter;  }; diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp new file mode 100644 index 0000000000..a2fb8c130d --- /dev/null +++ b/indra/newview/llfloaterperformance.cpp @@ -0,0 +1,524 @@ +/**  + * @file llfloaterperformance.cpp + * + * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2021, 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$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloaterperformance.h" + +#include "llagent.h" +#include "llagentcamera.h" +#include "llappearancemgr.h" +#include "llavataractions.h" +#include "llavatarrendernotifier.h" +#include "llcheckboxctrl.h" +#include "llfeaturemanager.h" +#include "llfloaterpreference.h" // LLAvatarComplexityControls +#include "llfloaterreg.h" +#include "llnamelistctrl.h" +#include "llsliderctrl.h" +#include "lltextbox.h" +#include "lltrans.h" +#include "llviewerobjectlist.h" +#include "llvoavatar.h" +#include "llvoavatarself.h"  +#include "pipeline.h" + +const F32 REFRESH_INTERVAL = 1.0f; +const S32 BAR_LEFT_PAD = 2; +const S32 BAR_RIGHT_PAD = 5; +const S32 BAR_BOTTOM_PAD = 9; + +class LLExceptionsContextMenu : public LLListContextMenu +{ +public: +    LLExceptionsContextMenu(LLFloaterPerformance* floater_settings) +        :   mFloaterPerformance(floater_settings) +    {} +protected: +    LLContextMenu* createMenu() +    { +        LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; +        LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; +        registrar.add("Settings.SetRendering", boost::bind(&LLFloaterPerformance::onCustomAction, mFloaterPerformance, _2, mUUIDs.front())); +        enable_registrar.add("Settings.IsSelected", boost::bind(&LLFloaterPerformance::isActionChecked, mFloaterPerformance, _2, mUUIDs.front())); +        LLContextMenu* menu = createFromFile("menu_avatar_rendering_settings.xml"); + +        return menu; +    } + +    LLFloaterPerformance* mFloaterPerformance; +}; + +LLFloaterPerformance::LLFloaterPerformance(const LLSD& key) +:   LLFloater(key), +    mUpdateTimer(new LLTimer()), +    mNearbyMaxComplexity(0) +{ +    mContextMenu = new LLExceptionsContextMenu(this); +} + +LLFloaterPerformance::~LLFloaterPerformance() +{ +    mComplexityChangedSignal.disconnect(); +    delete mContextMenu; +    delete mUpdateTimer; +} + +BOOL LLFloaterPerformance::postBuild() +{ +    mMainPanel = getChild<LLPanel>("panel_performance_main"); +    mNearbyPanel = getChild<LLPanel>("panel_performance_nearby"); +    mComplexityPanel = getChild<LLPanel>("panel_performance_complexity"); +    mSettingsPanel = getChild<LLPanel>("panel_performance_preferences"); +    mHUDsPanel = getChild<LLPanel>("panel_performance_huds"); + +    getChild<LLPanel>("nearby_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mNearbyPanel)); +    getChild<LLPanel>("complexity_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mComplexityPanel)); +    getChild<LLPanel>("settings_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mSettingsPanel)); +    getChild<LLPanel>("huds_subpanel")->setMouseDownCallback(boost::bind(&LLFloaterPerformance::showSelectedPanel, this, mHUDsPanel)); + +    initBackBtn(mNearbyPanel); +    initBackBtn(mComplexityPanel); +    initBackBtn(mSettingsPanel); +    initBackBtn(mHUDsPanel); + +    mHUDList = mHUDsPanel->getChild<LLNameListCtrl>("hud_list"); +    mHUDList->setNameListType(LLNameListCtrl::SPECIAL); +    mHUDList->setHoverIconName("StopReload_Off"); +    mHUDList->setIconClickedCallback(boost::bind(&LLFloaterPerformance::detachItem, this, _1)); + +    mObjectList = mComplexityPanel->getChild<LLNameListCtrl>("obj_list"); +    mObjectList->setNameListType(LLNameListCtrl::SPECIAL); +    mObjectList->setHoverIconName("StopReload_Off"); +    mObjectList->setIconClickedCallback(boost::bind(&LLFloaterPerformance::detachItem, this, _1)); + +    mSettingsPanel->getChild<LLButton>("advanced_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickAdvanced, this)); +    mSettingsPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickHideAvatars, this)); +    mSettingsPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->set(!LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_AVATAR)); + +    mNearbyPanel->getChild<LLButton>("exceptions_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickExceptions, this)); +    mNearbyList = mNearbyPanel->getChild<LLNameListCtrl>("nearby_list"); +    mNearbyList->setRightMouseDownCallback(boost::bind(&LLFloaterPerformance::onAvatarListRightClick, this, _1, _2, _3)); + +    updateComplexityText(); +    mComplexityChangedSignal = gSavedSettings.getControl("IndirectMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPerformance::updateComplexityText, this)); +    mNearbyPanel->getChild<LLSliderCtrl>("IndirectMaxComplexity")->setCommitCallback(boost::bind(&LLFloaterPerformance::updateMaxComplexity, this)); + +    LLAvatarComplexityControls::setIndirectMaxArc(); + +    return TRUE; +} + +void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel) +{ +    hidePanels(); +    mMainPanel->setVisible(FALSE); +    selected_panel->setVisible(TRUE); + +    if (mHUDsPanel == selected_panel) +    { +        populateHUDList(); +    } +    else if (mNearbyPanel == selected_panel) +    { +        populateNearbyList(); +    } +    else if (mComplexityPanel == selected_panel) +    { +        populateObjectList(); +    } +} + +void LLFloaterPerformance::draw() +{ +    const S32 NUM_PERIODS = 50; + +    if (mUpdateTimer->hasExpired()) +    { +        getChild<LLTextBox>("fps_value")->setValue((S32)llround(LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::FPS, NUM_PERIODS))); +        if (mHUDsPanel->getVisible()) +        { +            populateHUDList(); +        } +        else if (mNearbyPanel->getVisible()) +        { +            populateNearbyList(); +        } +        else if (mComplexityPanel->getVisible()) +        { +            populateObjectList(); +        } +        else if (mSettingsPanel->getVisible()) +        { +            mSettingsPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->set(!LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_AVATAR)); +        } + +        mUpdateTimer->setTimerExpirySec(REFRESH_INTERVAL); +    } +    LLFloater::draw(); +} + +void LLFloaterPerformance::showMainPanel() +{ +    hidePanels(); +    mMainPanel->setVisible(TRUE); +} + +void LLFloaterPerformance::hidePanels() +{ +    mNearbyPanel->setVisible(FALSE); +    mComplexityPanel->setVisible(FALSE); +    mHUDsPanel->setVisible(FALSE); +    mSettingsPanel->setVisible(FALSE); +} + +void LLFloaterPerformance::initBackBtn(LLPanel* panel) +{ +    panel->getChild<LLButton>("back_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::showMainPanel, this)); + +    panel->getChild<LLTextBox>("back_lbl")->setShowCursorHand(false); +    panel->getChild<LLTextBox>("back_lbl")->setSoundFlags(LLView::MOUSE_UP); +    panel->getChild<LLTextBox>("back_lbl")->setClickedCallback(boost::bind(&LLFloaterPerformance::showMainPanel, this)); +} + +void LLFloaterPerformance::populateHUDList() +{ +    S32 prev_pos = mHUDList->getScrollPos(); +    LLUUID prev_selected_id = mHUDList->getSelectedSpecialId(); +    mHUDList->clearRows(); +    mHUDList->updateColumns(true); + +    hud_complexity_list_t complexity_list = LLHUDRenderNotifier::getInstance()->getHUDComplexityList(); + +    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; +        item["special_id"] = hud_object_complexity.objectId; +        item["target"] = LLNameListCtrl::SPECIAL; +        LLSD& row = item["columns"]; +        row[0]["column"] = "complex_visual"; +        row[0]["type"] = "bar"; +        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"; +        row[1]["value"] = std::to_string(hud_object_complexity.objectsCost); +        row[1]["font"]["name"] = "SANSSERIF"; +  +        row[2]["column"] = "name"; +        row[2]["type"] = "text"; +        row[2]["value"] = hud_object_complexity.objectName; +        row[2]["font"]["name"] = "SANSSERIF"; + +        mHUDList->addElement(item); +    } +    mHUDList->sortByColumnIndex(1, FALSE); +    mHUDList->setScrollPos(prev_pos); +    mHUDList->selectItemBySpecialId(prev_selected_id); +} + +void LLFloaterPerformance::populateObjectList() +{ +    S32 prev_pos = mObjectList->getScrollPos(); +    LLUUID prev_selected_id = mObjectList->getSelectedSpecialId(); +    mObjectList->clearRows(); +    mObjectList->updateColumns(true); + +    object_complexity_list_t complexity_list = LLAvatarRenderNotifier::getInstance()->getObjectComplexityList(); + +    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; +        item["special_id"] = object_complexity.objectId; +        item["target"] = LLNameListCtrl::SPECIAL; +        LLSD& row = item["columns"]; +        row[0]["column"] = "complex_visual"; +        row[0]["type"] = "bar"; +        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"; +        row[1]["value"] = std::to_string(object_complexity.objectCost); +        row[1]["font"]["name"] = "SANSSERIF"; + +        row[2]["column"] = "name"; +        row[2]["type"] = "text"; +        row[2]["value"] = object_complexity.objectName; +        row[2]["font"]["name"] = "SANSSERIF"; + +        mObjectList->addElement(item); +    } +    mObjectList->sortByColumnIndex(1, FALSE); +    mObjectList->setScrollPos(prev_pos); +    mObjectList->selectItemBySpecialId(prev_selected_id); +} + +void LLFloaterPerformance::populateNearbyList() +{ +    S32 prev_pos = mNearbyList->getScrollPos(); +    LLUUID prev_selected_id = mNearbyList->getStringUUIDSelectedItem(); +    mNearbyList->clearRows(); +    mNearbyList->updateColumns(true); + +    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 = valid_nearby_avs.begin(); +    while (char_iter != valid_nearby_avs.end()) +    { +        LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*char_iter); +        if (avatar && (LLVOAvatar::AOA_INVISIBLE != avatar->getOverallAppearance())) +        { +            LLSD item; +            item["id"] = avatar->getID(); +            LLSD& row = item["columns"]; +            row[0]["column"] = "complex_visual"; +            row[0]["type"] = "bar"; +            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"; +            row[1]["value"] = std::to_string( avatar->getVisualComplexity()); +            row[1]["font"]["name"] = "SANSSERIF"; + +            row[2]["column"] = "name"; +            row[2]["type"] = "text"; +            row[2]["value"] = avatar->getFullname(); +            row[2]["font"]["name"] = "SANSSERIF"; + +            LLScrollListItem* av_item = mNearbyList->addElement(item); +            if(av_item) +            { +                LLScrollListText* name_text = dynamic_cast<LLScrollListText*>(av_item->getColumn(2)); +                if (name_text) +                { +                    std::string color = "white"; +                    if (LLVOAvatar::AOA_JELLYDOLL == avatar->getOverallAppearance()) +                    { +                        color = "LabelDisabledColor"; +                        LLScrollListBar* bar = dynamic_cast<LLScrollListBar*>(av_item->getColumn(0)); +                        if (bar) +                        { +                            bar->setColor(LLUIColorTable::instance().getColor(color)); +                        } +                    } +                    else if (LLVOAvatar::AOA_NORMAL == avatar->getOverallAppearance()) +                    { +                        color =  LLAvatarActions::isFriend(avatar->getID()) ? "ConversationFriendColor" : "white"; +                    } +                    name_text->setColor(LLUIColorTable::instance().getColor(color)); +                } +            } +        } +        char_iter++; +    } +    mNearbyList->sortByColumnIndex(1, FALSE); +    mNearbyList->setScrollPos(prev_pos); +    mNearbyList->selectByID(prev_selected_id); +} + +void LLFloaterPerformance::getNearbyAvatars(std::vector<LLCharacter*> &valid_nearby_avs) +{ +    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()) +        { +            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++; +    } +} + +void LLFloaterPerformance::detachItem(const LLUUID& item_id) +{ +    LLAppearanceMgr::instance().removeItemFromAvatar(item_id); +} + +void LLFloaterPerformance::onClickAdvanced() +{ +    LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->saveSettings(); +    } +    LLFloaterReg::showInstance("prefs_graphics_advanced"); +} + +void LLFloaterPerformance::onClickHideAvatars() +{ +    LLPipeline::toggleRenderTypeControl(LLPipeline::RENDER_TYPE_AVATAR); +} + +void LLFloaterPerformance::onClickExceptions() +{ +    LLFloaterReg::showInstance("avatar_render_settings"); +} + +void LLFloaterPerformance::updateMaxComplexity() +{ +    LLAvatarComplexityControls::updateMax( +        mNearbyPanel->getChild<LLSliderCtrl>("IndirectMaxComplexity"), +        mNearbyPanel->getChild<LLTextBox>("IndirectMaxComplexityText")); +} + +void LLFloaterPerformance::updateComplexityText() +{ +    LLAvatarComplexityControls::setText(gSavedSettings.getU32("RenderAvatarMaxComplexity"), +        mNearbyPanel->getChild<LLTextBox>("IndirectMaxComplexityText", true)); +} + +static LLVOAvatar* find_avatar(const LLUUID& id) +{ +    LLViewerObject *obj = gObjectList.findObject(id); +    while (obj && obj->isAttachment()) +    { +        obj = (LLViewerObject *)obj->getParent(); +    } + +    if (obj && obj->isAvatar()) +    { +        return (LLVOAvatar*)obj; +    } +    else +    { +        return NULL; +    } +} + +void LLFloaterPerformance::onCustomAction(const LLSD& userdata, const LLUUID& av_id) +{ +    const std::string command_name = userdata.asString(); + +    S32 new_setting = 0; +    if ("default" == command_name) +    { +        new_setting = S32(LLVOAvatar::AV_RENDER_NORMALLY); +    } +    else if ("never" == command_name) +    { +        new_setting = S32(LLVOAvatar::AV_DO_NOT_RENDER); +    } +    else if ("always" == command_name) +    { +        new_setting = S32(LLVOAvatar::AV_ALWAYS_RENDER); +    } + +    LLVOAvatar *avatarp = find_avatar(av_id); +    if (avatarp) +    { +        avatarp->setVisualMuteSettings(LLVOAvatar::VisualMuteSettings(new_setting)); +    } +    else +    { +        LLRenderMuteList::getInstance()->saveVisualMuteSetting(av_id, new_setting); +    } +} + + +bool LLFloaterPerformance::isActionChecked(const LLSD& userdata, const LLUUID& av_id) +{ +    const std::string command_name = userdata.asString(); + +    S32 visual_setting = LLRenderMuteList::getInstance()->getSavedVisualMuteSetting(av_id); +    if ("default" == command_name) +    { +        return (visual_setting == S32(LLVOAvatar::AV_RENDER_NORMALLY)); +    } +    else if ("non_default" == command_name) +    { +        return (visual_setting != S32(LLVOAvatar::AV_RENDER_NORMALLY)); +    } +    else if ("never" == command_name) +    { +        return (visual_setting == S32(LLVOAvatar::AV_DO_NOT_RENDER)); +    } +    else if ("always" == command_name) +    { +        return (visual_setting == S32(LLVOAvatar::AV_ALWAYS_RENDER)); +    } +    return false; +} + +void LLFloaterPerformance::onAvatarListRightClick(LLUICtrl* ctrl, S32 x, S32 y) +{ +    LLNameListCtrl* list = dynamic_cast<LLNameListCtrl*>(ctrl); +    if (!list) return; +    list->selectItemAt(x, y, MASK_NONE); +    uuid_vec_t selected_uuids; + +    if(list->getCurrentID().notNull()) +    { +        selected_uuids.push_back(list->getCurrentID()); +        mContextMenu->show(ctrl, selected_uuids, x, y); +    } +} + +// EOF diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h new file mode 100644 index 0000000000..58f9447d4c --- /dev/null +++ b/indra/newview/llfloaterperformance.h @@ -0,0 +1,88 @@ +/**  + * @file llfloaterperformance.h + * + * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2021, 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_LLFLOATERPERFORMANCE_H +#define LL_LLFLOATERPERFORMANCE_H + +#include "llfloater.h" +#include "lllistcontextmenu.h" + +class LLCharacter; +class LLNameListCtrl; + +class LLFloaterPerformance : public LLFloater +{ +public: +    LLFloaterPerformance(const LLSD& key); +    virtual ~LLFloaterPerformance(); + +    /*virtual*/ BOOL postBuild(); +    /*virtual*/ void draw(); + +    void showSelectedPanel(LLPanel* selected_panel); +    void showMainPanel(); +    void hidePanels(); + +    void detachItem(const LLUUID& item_id); + +    void onAvatarListRightClick(LLUICtrl* ctrl, S32 x, S32 y); + +    void onCustomAction (const LLSD& userdata, const LLUUID& av_id); +    bool isActionChecked(const LLSD& userdata, const LLUUID& av_id); + +private: +    void initBackBtn(LLPanel* panel); +    void populateHUDList(); +    void populateObjectList(); +    void populateNearbyList(); + +    void onClickAdvanced(); +    void onClickHideAvatars(); +    void onClickExceptions(); + +    void updateMaxComplexity(); +    void updateComplexityText(); + +    void getNearbyAvatars(std::vector<LLCharacter*> &valid_nearby_avs); + +    LLPanel* mMainPanel; +    LLPanel* mNearbyPanel; +    LLPanel* mComplexityPanel; +    LLPanel* mHUDsPanel; +    LLPanel* mSettingsPanel; +    LLNameListCtrl* mHUDList; +    LLNameListCtrl* mObjectList; +    LLNameListCtrl* mNearbyList; + +    LLListContextMenu* mContextMenu; + +    LLTimer* mUpdateTimer; + +    S32 mNearbyMaxComplexity; + +    boost::signals2::connection	mComplexityChangedSignal; +}; + +#endif // LL_LLFLOATERPERFORMANCE_H diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 6bf2136f60..1ab6621c4c 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -50,6 +50,7 @@  #include "llfloaterreg.h"  #include "llfloaterabout.h"  #include "llfavoritesbar.h" +#include "llfloaterpreferencesgraphicsadvanced.h"  #include "llfloatersidepanelcontainer.h"  #include "llfloaterimsession.h"  #include "llkeyboard.h" @@ -74,7 +75,6 @@  #include "llviewereventrecorder.h"  #include "llviewermessage.h"  #include "llviewerwindow.h" -#include "llviewershadermgr.h"  #include "llviewerthrottle.h"  #include "llvoavatarself.h"  #include "llvotree.h" @@ -98,11 +98,9 @@  #include "lltextbox.h"  #include "llui.h"  #include "llviewerobjectlist.h" -#include "llvoavatar.h"  #include "llvovolume.h"  #include "llwindow.h"  #include "llworld.h" -#include "pipeline.h"  #include "lluictrlfactory.h"  #include "llviewermedia.h"  #include "llpluginclassmedia.h" @@ -115,8 +113,6 @@  #include "llpresetsmanager.h"  #include "llviewercontrol.h"  #include "llpresetsmanager.h" -#include "llfeaturemanager.h" -#include "llviewertexturelist.h"  #include "llsearchableui.h" @@ -751,33 +747,6 @@ void LLFloaterPreference::onRenderOptionEnable()  	refreshEnabledGraphics();  } -void LLFloaterPreferenceGraphicsAdvanced::onRenderOptionEnable() -{ -	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if (instance) -	{ -		instance->refresh(); -	} - -	refreshEnabledGraphics(); -} - -void LLFloaterPreferenceGraphicsAdvanced::onAdvancedAtmosphericsEnable() -{ -	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if (instance) -	{ -		instance->refresh(); -	} - -	refreshEnabledGraphics(); -} - -void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledGraphics() -{ -	refreshEnabledState(); -} -  void LLFloaterPreference::onAvatarImpostorsEnable()  {  	refreshEnabledGraphics(); @@ -1216,124 +1185,6 @@ void LLFloaterPreference::refreshEnabledState()  	getChildView("block_list")->setEnabled(LLLoginInstance::getInstance()->authSuccess());  } -void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() -{ -	LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections"); -	LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText"); - -	// Reflections -    BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps; -	ctrl_reflections->setEnabled(reflections); -	reflections_text->setEnabled(reflections); - -    // Transparent Water -    LLCheckBoxCtrl* transparent_water_ctrl = getChild<LLCheckBoxCtrl>("TransparentWater"); - -	// Bump & Shiny	 -	LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny"); -	bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump"); -	bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE); -     -	// Avatar Mode -	// Enable Avatar Shaders -	LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); -	// Avatar Render Mode -	LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth"); -	 -	bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"); -	if (LLViewerShaderMgr::sInitialized) -	{ -		S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; -		avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE; -	} - -	ctrl_avatar_vp->setEnabled(avatar_vp_enabled); -	 -    if (gSavedSettings.getBOOL("RenderAvatarVP") == FALSE) -    { -        ctrl_avatar_cloth->setEnabled(FALSE); -    }  -    else -    { -        ctrl_avatar_cloth->setEnabled(TRUE); -    } - -    // Vertex Shaders, Global Shader Enable -    // SL-12594 Basic shaders are always enabled. DJH TODO clean up now-orphaned state handling code -    LLSliderCtrl* terrain_detail = getChild<LLSliderCtrl>("TerrainDetail");   // can be linked with control var -    LLTextBox* terrain_text = getChild<LLTextBox>("TerrainDetailText"); - -    terrain_detail->setEnabled(FALSE); -    terrain_text->setEnabled(FALSE); - -    // WindLight -    LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders"); -    LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); -    LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); -    ctrl_wind_light->setEnabled(TRUE); -    sky->setEnabled(TRUE); -    sky_text->setEnabled(TRUE); - -    //Deferred/SSAO/Shadows -    LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); -     -    BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && -                        ((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) && -                        ((transparent_water_ctrl && transparent_water_ctrl->get()) ? TRUE : FALSE) && -                        gGLManager.mHasFramebufferObject && -                        gSavedSettings.getBOOL("RenderAvatarVP") && -                        (ctrl_wind_light->get()) ? TRUE : FALSE; - -    ctrl_deferred->setEnabled(enabled); - -	LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); -	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); -	LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail"); -	LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText"); - -	// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it -	enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE); -	 -	ctrl_deferred->set(gSavedSettings.getBOOL("RenderDeferred")); - -	ctrl_ssao->setEnabled(enabled); -	ctrl_dof->setEnabled(enabled); - -	enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"); - -	ctrl_shadow->setEnabled(enabled); -	shadow_text->setEnabled(enabled); - -	// Hardware settings -	F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple"); -	S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting(); -	S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier); -	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value()); -	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value()); - -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") || -		!gGLManager.mHasVertexBufferObject) -	{ -		getChildView("vbo")->setEnabled(FALSE); -	} - -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") || -		!gGLManager.mHasVertexBufferObject) -	{ -		getChildView("texture compression")->setEnabled(FALSE); -	} - -	// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance -	LLUICtrl* gamma_ctrl = getChild<LLUICtrl>("gamma"); -	gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders()); -	getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders()); -	getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders()); -	getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred")); - -	// now turn off any features that are unavailable -	disableUnavailableSettings(); -} -  // static  void LLAvatarComplexityControls::setIndirectControls()  { @@ -1376,118 +1227,6 @@ void LLAvatarComplexityControls::setIndirectMaxArc()  	gSavedSettings.setU32("IndirectMaxComplexity", indirect_max_arc);  } -void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() -{	 -	LLComboBox* ctrl_reflections   = getChild<LLComboBox>("Reflections"); -	LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText"); -	LLCheckBoxCtrl* ctrl_avatar_vp     = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); -	LLCheckBoxCtrl* ctrl_avatar_cloth  = getChild<LLCheckBoxCtrl>("AvatarCloth"); -	LLCheckBoxCtrl* ctrl_wind_light    = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders"); -	LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); -	LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail"); -	LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText"); -	LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); -	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); -	LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); -	LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); - -	// disabled windlight -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) -	{ -		ctrl_wind_light->setEnabled(FALSE); -		ctrl_wind_light->setValue(FALSE); - -		sky->setEnabled(FALSE); -		sky_text->setEnabled(FALSE); - -		//deferred needs windlight, disable deferred -		ctrl_shadows->setEnabled(FALSE); -		ctrl_shadows->setValue(0); -		shadows_text->setEnabled(FALSE); -		 -		ctrl_ssao->setEnabled(FALSE); -		ctrl_ssao->setValue(FALSE); - -		ctrl_dof->setEnabled(FALSE); -		ctrl_dof->setValue(FALSE); - -		ctrl_deferred->setEnabled(FALSE); -		ctrl_deferred->setValue(FALSE); -	} - -	// disabled deferred -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") || -		!gGLManager.mHasFramebufferObject) -	{ -		ctrl_shadows->setEnabled(FALSE); -		ctrl_shadows->setValue(0); -		shadows_text->setEnabled(FALSE); -		 -		ctrl_ssao->setEnabled(FALSE); -		ctrl_ssao->setValue(FALSE); - -		ctrl_dof->setEnabled(FALSE); -		ctrl_dof->setValue(FALSE); - -		ctrl_deferred->setEnabled(FALSE); -		ctrl_deferred->setValue(FALSE); -	} -	 -	// disabled deferred SSAO -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO")) -	{ -		ctrl_ssao->setEnabled(FALSE); -		ctrl_ssao->setValue(FALSE); -	} -	 -	// disabled deferred shadows -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail")) -	{ -		ctrl_shadows->setEnabled(FALSE); -		ctrl_shadows->setValue(0); -		shadows_text->setEnabled(FALSE); -	} - -	// disabled reflections -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail")) -	{ -		ctrl_reflections->setEnabled(FALSE); -		ctrl_reflections->setValue(FALSE); -		reflections_text->setEnabled(FALSE); -	} -	 -	// disabled av -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP")) -	{ -		ctrl_avatar_vp->setEnabled(FALSE); -		ctrl_avatar_vp->setValue(FALSE); -		 -		ctrl_avatar_cloth->setEnabled(FALSE); -		ctrl_avatar_cloth->setValue(FALSE); - -		//deferred needs AvatarVP, disable deferred -		ctrl_shadows->setEnabled(FALSE); -		ctrl_shadows->setValue(0); -		shadows_text->setEnabled(FALSE); -		 -		ctrl_ssao->setEnabled(FALSE); -		ctrl_ssao->setValue(FALSE); - -		ctrl_dof->setEnabled(FALSE); -		ctrl_dof->setValue(FALSE); - -		ctrl_deferred->setEnabled(FALSE); -		ctrl_deferred->setValue(FALSE); -	} - -	// disabled cloth -	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth")) -	{ -		ctrl_avatar_cloth->setEnabled(FALSE); -		ctrl_avatar_cloth->setValue(FALSE); -	} -} -  void LLFloaterPreference::refresh()  {  	LLPanel::refresh(); @@ -1503,32 +1242,6 @@ void LLFloaterPreference::refresh()      updateClickActionViews();  } -void LLFloaterPreferenceGraphicsAdvanced::refresh() -{ -	getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer)  gSavedSettings.getU32("RenderFSAASamples")); - -	// sliders and their text boxes -	//	mPostProcess = gSavedSettings.getS32("RenderGlowResolutionPow"); -	// slider text boxes -	updateSliderText(getChild<LLSliderCtrl>("ObjectMeshDetail",		true), getChild<LLTextBox>("ObjectMeshDetailText",		true)); -	updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail",	true), getChild<LLTextBox>("FlexibleMeshDetailText",	true)); -	updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail",		true), getChild<LLTextBox>("TreeMeshDetailText",		true)); -	updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail",		true), getChild<LLTextBox>("AvatarMeshDetailText",		true)); -	updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail",	true), getChild<LLTextBox>("AvatarPhysicsDetailText",		true)); -	updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail",	true), getChild<LLTextBox>("TerrainMeshDetailText",		true)); -	updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess",	true), getChild<LLTextBox>("PostProcessText",			true)); -	updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail",		true), getChild<LLTextBox>("SkyMeshDetailText",			true)); -	updateSliderText(getChild<LLSliderCtrl>("TerrainDetail",		true), getChild<LLTextBox>("TerrainDetailText",			true));	 -    LLAvatarComplexityControls::setIndirectControls(); -	setMaxNonImpostorsText( -        gSavedSettings.getU32("RenderAvatarMaxNonImpostors"), -        getChild<LLTextBox>("IndirectMaxNonImpostorsText", true)); -    LLAvatarComplexityControls::setText( -        gSavedSettings.getU32("RenderAvatarMaxComplexity"), -        getChild<LLTextBox>("IndirectMaxComplexityText", true)); -	refreshEnabledState(); -} -  void LLFloaterPreference::onCommitWindowedMode()  {  	refresh(); @@ -1742,63 +1455,6 @@ void LLFloaterPreference::refreshUI()  	refresh();  } -void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box) -{ -	if (text_box == NULL || ctrl== NULL) -		return; - -	// get range and points when text should change -	F32 value = (F32)ctrl->getValue().asReal(); -	F32 min = ctrl->getMinValue(); -	F32 max = ctrl->getMaxValue(); -	F32 range = max - min; -	llassert(range > 0); -	F32 midPoint = min + range / 3.0f; -	F32 highPoint = min + (2.0f * range / 3.0f); - -	// choose the right text -	if (value < midPoint) -	{ -		text_box->setText(LLTrans::getString("GraphicsQualityLow")); -	}  -	else if (value < highPoint) -	{ -		text_box->setText(LLTrans::getString("GraphicsQualityMid")); -	} -	else -	{ -		text_box->setText(LLTrans::getString("GraphicsQualityHigh")); -	} -} - -void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors() -{ -	// Called when the IndirectMaxNonImpostors control changes -	// Responsible for fixing the slider label (IndirectMaxNonImpostorsText) and setting RenderAvatarMaxNonImpostors -	LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxNonImpostors",true); -	U32 value = ctrl->getValue().asInteger(); - -	if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value) -	{ -		value=0; -	} -	gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value); -	LLVOAvatar::updateImpostorRendering(value); // make it effective immediately -	setMaxNonImpostorsText(value, getChild<LLTextBox>("IndirectMaxNonImpostorsText")); -} - -void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTextBox* text_box) -{ -	if (0 == value) -	{ -		text_box->setText(LLTrans::getString("no_limit")); -	} -	else -	{ -		text_box->setText(llformat("%d", value)); -	} -} -  void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* value_label)  {  	// Called when the IndirectMaxComplexity control changes @@ -1891,22 +1547,6 @@ bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map      return true;  } -void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity() -{ -	// Called when the IndirectMaxComplexity control changes -    LLAvatarComplexityControls::updateMax( -        getChild<LLSliderCtrl>("IndirectMaxComplexity"), -        getChild<LLTextBox>("IndirectMaxComplexityText")); - -    LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -    if (floater_preferences) -    { -        LLAvatarComplexityControls::updateMax( -            floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"), -            floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText")); -    } -} -  void LLFloaterPreference::onChangeMaturity()  {  	U8 sim_access = gSavedSettings.getU32("PreferredMaturity"); @@ -3310,18 +2950,6 @@ void LLPanelPreferenceControls::onCancelKeyBind()      pControlsTable->deselectAllItems();  } -LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const LLSD& key) -	: LLFloater(key) -{ -    mCommitCallbackRegistrar.add("Pref.RenderOptionUpdate",            boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onRenderOptionEnable, this)); -	mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxNonImpostors", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors,this)); -	mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity",   boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity,this)); -} - -LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced() -{ -} -  LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)  	: LLFloater(key),  	  mSocksSettingsDirty(false) @@ -3331,41 +2959,6 @@ LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)  	mCommitCallbackRegistrar.add("Proxy.Change",            boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this));  } -BOOL LLFloaterPreferenceGraphicsAdvanced::postBuild() -{ -    // Don't do this on Mac as their braindead GL versioning -    // sets this when 8x and 16x are indeed available -    // -#if !LL_DARWIN -    if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f) -    { //remove FSAA settings above "4x" -        LLComboBox* combo = getChild<LLComboBox>("fsaa"); -        combo->remove("8x"); -        combo->remove("16x"); -    } -	 -	LLCheckBoxCtrl *use_HiDPI = getChild<LLCheckBoxCtrl>("use HiDPI"); -	use_HiDPI->setVisible(FALSE); -#endif - -    return TRUE; -} - -void LLFloaterPreferenceGraphicsAdvanced::onOpen(const LLSD& key) -{ -    refresh(); -} - -void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting) -{ -	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if (instance) -	{ -		instance->cancel(); -	} -	updateMaxComplexity(); -} -  LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()  {  } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 1268935712..f86104ed99 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -109,9 +109,10 @@ public:  	// updates click/double-click action controls depending on values from settings.xml  	void updateClickActionViews(); +    void		onBtnOK(const LLSD& userdata); +    void		onBtnCancel(const LLSD& userdata); +  protected:	 -	void		onBtnOK(const LLSD& userdata); -	void		onBtnCancel(const LLSD& userdata);  	void		onClickClearCache();			// Clear viewer texture cache, vfs, and VO cache on next startup  	void		onClickBrowserClearCache();		// Clear web history and caches as well as viewer caches above @@ -347,32 +348,6 @@ private:  	S32 mEditingMode;  }; -class LLFloaterPreferenceGraphicsAdvanced : public LLFloater -{ -  public:  -	LLFloaterPreferenceGraphicsAdvanced(const LLSD& key); -	~LLFloaterPreferenceGraphicsAdvanced(); -	/*virtual*/ BOOL postBuild(); -	void onOpen(const LLSD& key); -	void onClickCloseBtn(bool app_quitting); -	void disableUnavailableSettings(); -	void refreshEnabledGraphics(); -	void refreshEnabledState(); -	void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); -	void updateMaxNonImpostors(); -	void setMaxNonImpostorsText(U32 value, LLTextBox* text_box); -	void updateMaxComplexity(); -	void setMaxComplexityText(U32 value, LLTextBox* text_box); -	static void setIndirectControls(); -	static void setIndirectMaxNonImpostors(); -	static void setIndirectMaxArc(); -	void refresh(); -	// callback for when client modifies a render option -	void onRenderOptionEnable(); -    void onAdvancedAtmosphericsEnable(); -	LOG_CLASS(LLFloaterPreferenceGraphicsAdvanced); -}; -  class LLAvatarComplexityControls  {    public:  diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp new file mode 100644 index 0000000000..404cdf5280 --- /dev/null +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -0,0 +1,466 @@ +/**  + * @file llfloaterpreferencesgraphicsadvanced.cpp + * @brief floater for adjusting camera position + * + * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2021, 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$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloaterpreferencesgraphicsadvanced.h" + +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfeaturemanager.h" +#include "llfloaterpreference.h" +#include "llfloaterreg.h" +#include "llsliderctrl.h" +#include "lltextbox.h" +#include "lltrans.h" +#include "llviewershadermgr.h" +#include "llviewertexturelist.h" +#include "llvoavatar.h" +#include "pipeline.h" + + +LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const LLSD& key) +    : LLFloater(key) +{ +    mCommitCallbackRegistrar.add("Pref.RenderOptionUpdate",            boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onRenderOptionEnable, this)); +    mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxNonImpostors", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors,this)); +    mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity",   boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity,this)); + +    mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onBtnCancel, this, _2)); +    mCommitCallbackRegistrar.add("Pref.OK",     boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onBtnOK, this, _2)); +} + +LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced() +{ +} + +BOOL LLFloaterPreferenceGraphicsAdvanced::postBuild() +{ +    // Don't do this on Mac as their braindead GL versioning +    // sets this when 8x and 16x are indeed available +    // +#if !LL_DARWIN +    if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f) +    { //remove FSAA settings above "4x" +        LLComboBox* combo = getChild<LLComboBox>("fsaa"); +        combo->remove("8x"); +        combo->remove("16x"); +    } + +    LLCheckBoxCtrl *use_HiDPI = getChild<LLCheckBoxCtrl>("use HiDPI"); +    use_HiDPI->setVisible(FALSE); +#endif + +    return TRUE; +} + +void LLFloaterPreferenceGraphicsAdvanced::onOpen(const LLSD& key) +{ +    refresh(); +} + +void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting) +{ +    LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->cancel(); +    } +    updateMaxComplexity(); +} + +void LLFloaterPreferenceGraphicsAdvanced::onRenderOptionEnable() +{ +    LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->refresh(); +    } + +    refreshEnabledGraphics(); +} + +void LLFloaterPreferenceGraphicsAdvanced::onAdvancedAtmosphericsEnable() +{ +    LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->refresh(); +    } + +    refreshEnabledGraphics(); +} + +void LLFloaterPreferenceGraphicsAdvanced::refresh() +{ +    getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer)  gSavedSettings.getU32("RenderFSAASamples")); + +    // sliders and their text boxes +    //	mPostProcess = gSavedSettings.getS32("RenderGlowResolutionPow"); +    // slider text boxes +    updateSliderText(getChild<LLSliderCtrl>("ObjectMeshDetail",		true), getChild<LLTextBox>("ObjectMeshDetailText",		true)); +    updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail",	true), getChild<LLTextBox>("FlexibleMeshDetailText",	true)); +    updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail",		true), getChild<LLTextBox>("TreeMeshDetailText",		true)); +    updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail",		true), getChild<LLTextBox>("AvatarMeshDetailText",		true)); +    updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail",	true), getChild<LLTextBox>("AvatarPhysicsDetailText",		true)); +    updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail",	true), getChild<LLTextBox>("TerrainMeshDetailText",		true)); +    updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess",	true), getChild<LLTextBox>("PostProcessText",			true)); +    updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail",		true), getChild<LLTextBox>("SkyMeshDetailText",			true)); +    updateSliderText(getChild<LLSliderCtrl>("TerrainDetail",		true), getChild<LLTextBox>("TerrainDetailText",			true));	 +    LLAvatarComplexityControls::setIndirectControls(); +    setMaxNonImpostorsText( +        gSavedSettings.getU32("RenderAvatarMaxNonImpostors"), +        getChild<LLTextBox>("IndirectMaxNonImpostorsText", true)); +    LLAvatarComplexityControls::setText( +        gSavedSettings.getU32("RenderAvatarMaxComplexity"), +        getChild<LLTextBox>("IndirectMaxComplexityText", true)); +    refreshEnabledState(); +} + +void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledGraphics() +{ +    refreshEnabledState(); +} + +void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity() +{ +    // Called when the IndirectMaxComplexity control changes +    LLAvatarComplexityControls::updateMax( +        getChild<LLSliderCtrl>("IndirectMaxComplexity"), +        getChild<LLTextBox>("IndirectMaxComplexityText")); + +    LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); +    if (floater_preferences) +    { +        LLAvatarComplexityControls::updateMax( +            floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"), +            floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText")); +    } +} + +void LLFloaterPreferenceGraphicsAdvanced::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box) +{ +    if (text_box == NULL || ctrl== NULL) +        return; + +    // get range and points when text should change +    F32 value = (F32)ctrl->getValue().asReal(); +    F32 min = ctrl->getMinValue(); +    F32 max = ctrl->getMaxValue(); +    F32 range = max - min; +    llassert(range > 0); +    F32 midPoint = min + range / 3.0f; +    F32 highPoint = min + (2.0f * range / 3.0f); + +    // choose the right text +    if (value < midPoint) +    { +        text_box->setText(LLTrans::getString("GraphicsQualityLow")); +    }  +    else if (value < highPoint) +    { +        text_box->setText(LLTrans::getString("GraphicsQualityMid")); +    } +    else +    { +        text_box->setText(LLTrans::getString("GraphicsQualityHigh")); +    } +} + +void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors() +{ +    // Called when the IndirectMaxNonImpostors control changes +    // Responsible for fixing the slider label (IndirectMaxNonImpostorsText) and setting RenderAvatarMaxNonImpostors +    LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxNonImpostors",true); +    U32 value = ctrl->getValue().asInteger(); + +    if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value) +    { +        value=0; +    } +    gSavedSettings.setU32("RenderAvatarMaxNonImpostors", value); +    LLVOAvatar::updateImpostorRendering(value); // make it effective immediately +    setMaxNonImpostorsText(value, getChild<LLTextBox>("IndirectMaxNonImpostorsText")); +} + +void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTextBox* text_box) +{ +    if (0 == value) +    { +        text_box->setText(LLTrans::getString("no_limit")); +    } +    else +    { +        text_box->setText(llformat("%d", value)); +    } +} + +void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() +{	 +    LLComboBox* ctrl_reflections   = getChild<LLComboBox>("Reflections"); +    LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText"); +    LLCheckBoxCtrl* ctrl_avatar_vp     = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); +    LLCheckBoxCtrl* ctrl_avatar_cloth  = getChild<LLCheckBoxCtrl>("AvatarCloth"); +    LLCheckBoxCtrl* ctrl_wind_light    = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders"); +    LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); +    LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail"); +    LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText"); +    LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); +    LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); +    LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); +    LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); + +    // disabled windlight +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) +    { +        ctrl_wind_light->setEnabled(FALSE); +        ctrl_wind_light->setValue(FALSE); + +        sky->setEnabled(FALSE); +        sky_text->setEnabled(FALSE); + +        //deferred needs windlight, disable deferred +        ctrl_shadows->setEnabled(FALSE); +        ctrl_shadows->setValue(0); +        shadows_text->setEnabled(FALSE); + +        ctrl_ssao->setEnabled(FALSE); +        ctrl_ssao->setValue(FALSE); + +        ctrl_dof->setEnabled(FALSE); +        ctrl_dof->setValue(FALSE); + +        ctrl_deferred->setEnabled(FALSE); +        ctrl_deferred->setValue(FALSE); +    } + +    // disabled deferred +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") || +        !gGLManager.mHasFramebufferObject) +    { +        ctrl_shadows->setEnabled(FALSE); +        ctrl_shadows->setValue(0); +        shadows_text->setEnabled(FALSE); + +        ctrl_ssao->setEnabled(FALSE); +        ctrl_ssao->setValue(FALSE); + +        ctrl_dof->setEnabled(FALSE); +        ctrl_dof->setValue(FALSE); + +        ctrl_deferred->setEnabled(FALSE); +        ctrl_deferred->setValue(FALSE); +    } + +    // disabled deferred SSAO +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO")) +    { +        ctrl_ssao->setEnabled(FALSE); +        ctrl_ssao->setValue(FALSE); +    } + +    // disabled deferred shadows +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail")) +    { +        ctrl_shadows->setEnabled(FALSE); +        ctrl_shadows->setValue(0); +        shadows_text->setEnabled(FALSE); +    } + +    // disabled reflections +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail")) +    { +        ctrl_reflections->setEnabled(FALSE); +        ctrl_reflections->setValue(FALSE); +        reflections_text->setEnabled(FALSE); +    } + +    // disabled av +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP")) +    { +        ctrl_avatar_vp->setEnabled(FALSE); +        ctrl_avatar_vp->setValue(FALSE); + +        ctrl_avatar_cloth->setEnabled(FALSE); +        ctrl_avatar_cloth->setValue(FALSE); + +        //deferred needs AvatarVP, disable deferred +        ctrl_shadows->setEnabled(FALSE); +        ctrl_shadows->setValue(0); +        shadows_text->setEnabled(FALSE); + +        ctrl_ssao->setEnabled(FALSE); +        ctrl_ssao->setValue(FALSE); + +        ctrl_dof->setEnabled(FALSE); +        ctrl_dof->setValue(FALSE); + +        ctrl_deferred->setEnabled(FALSE); +        ctrl_deferred->setValue(FALSE); +    } + +    // disabled cloth +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth")) +    { +        ctrl_avatar_cloth->setEnabled(FALSE); +        ctrl_avatar_cloth->setValue(FALSE); +    } +} + +void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() +{ +    LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections"); +    LLTextBox* reflections_text = getChild<LLTextBox>("ReflectionsText"); + +    // Reflections +    BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps; +    ctrl_reflections->setEnabled(reflections); +    reflections_text->setEnabled(reflections); + +    // Transparent Water +    LLCheckBoxCtrl* transparent_water_ctrl = getChild<LLCheckBoxCtrl>("TransparentWater"); + +    // Bump & Shiny	 +    LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny"); +    bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump"); +    bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE); + +    // Avatar Mode +    // Enable Avatar Shaders +    LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); +    // Avatar Render Mode +    LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth"); + +    bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"); +    if (LLViewerShaderMgr::sInitialized) +    { +        S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; +        avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE; +    } + +    ctrl_avatar_vp->setEnabled(avatar_vp_enabled); + +    if (gSavedSettings.getBOOL("RenderAvatarVP") == FALSE) +    { +        ctrl_avatar_cloth->setEnabled(FALSE); +    }  +    else +    { +        ctrl_avatar_cloth->setEnabled(TRUE); +    } + +    // Vertex Shaders, Global Shader Enable +    // SL-12594 Basic shaders are always enabled. DJH TODO clean up now-orphaned state handling code +    LLSliderCtrl* terrain_detail = getChild<LLSliderCtrl>("TerrainDetail");   // can be linked with control var +    LLTextBox* terrain_text = getChild<LLTextBox>("TerrainDetailText"); + +    terrain_detail->setEnabled(FALSE); +    terrain_text->setEnabled(FALSE); + +    // WindLight +    LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders"); +    LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); +    LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); +    ctrl_wind_light->setEnabled(TRUE); +    sky->setEnabled(TRUE); +    sky_text->setEnabled(TRUE); + +    //Deferred/SSAO/Shadows +    LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); + +    BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && +        ((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) && +        ((transparent_water_ctrl && transparent_water_ctrl->get()) ? TRUE : FALSE) && +        gGLManager.mHasFramebufferObject && +        gSavedSettings.getBOOL("RenderAvatarVP") && +        (ctrl_wind_light->get()) ? TRUE : FALSE; + +    ctrl_deferred->setEnabled(enabled); + +    LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); +    LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); +    LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail"); +    LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText"); + +    // note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it +    enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE); + +    ctrl_deferred->set(gSavedSettings.getBOOL("RenderDeferred")); + +    ctrl_ssao->setEnabled(enabled); +    ctrl_dof->setEnabled(enabled); + +    enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"); + +    ctrl_shadow->setEnabled(enabled); +    shadow_text->setEnabled(enabled); + +    // Hardware settings +    F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple"); +    S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting(); +    S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier); +    getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value()); +    getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value()); + +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") || +        !gGLManager.mHasVertexBufferObject) +    { +        getChildView("vbo")->setEnabled(FALSE); +    } + +    if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") || +        !gGLManager.mHasVertexBufferObject) +    { +        getChildView("texture compression")->setEnabled(FALSE); +    } + +    // if no windlight shaders, turn off nighttime brightness, gamma, and fog distance +    LLUICtrl* gamma_ctrl = getChild<LLUICtrl>("gamma"); +    gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders()); +    getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders()); +    getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders()); +    getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred")); + +    // now turn off any features that are unavailable +    disableUnavailableSettings(); +} + +void LLFloaterPreferenceGraphicsAdvanced::onBtnOK(const LLSD& userdata) +{ +    LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->onBtnOK(userdata); +    } +} + +void LLFloaterPreferenceGraphicsAdvanced::onBtnCancel(const LLSD& userdata) +{ +    LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences"); +    if (instance) +    { +        instance->onBtnCancel(userdata); +    } +} diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.h b/indra/newview/llfloaterpreferencesgraphicsadvanced.h new file mode 100644 index 0000000000..3e9046eba9 --- /dev/null +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.h @@ -0,0 +1,63 @@ +/**  + * @file llfloaterpreferencesgraphicsadvanced.h + * + * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2021, 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 LLFLOATERPREFERENCEGRAPHICSADVANCED_H +#define LLFLOATERPREFERENCEGRAPHICSADVANCED_H + +#include "llcontrol.h" +#include "llfloater.h" + +class LLSliderCtrl; +class LLTextBox; + +class LLFloaterPreferenceGraphicsAdvanced : public LLFloater +{ +public:  +    LLFloaterPreferenceGraphicsAdvanced(const LLSD& key); +    ~LLFloaterPreferenceGraphicsAdvanced(); +    /*virtual*/ BOOL postBuild(); +    void onOpen(const LLSD& key); +    void onClickCloseBtn(bool app_quitting); +    void disableUnavailableSettings(); +    void refreshEnabledGraphics(); +    void refreshEnabledState(); +    void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); +    void updateMaxNonImpostors(); +    void setMaxNonImpostorsText(U32 value, LLTextBox* text_box); +    void updateMaxComplexity(); +    void setMaxComplexityText(U32 value, LLTextBox* text_box); +    void refresh(); +    // callback for when client modifies a render option +    void onRenderOptionEnable(); +    void onAdvancedAtmosphericsEnable(); +    LOG_CLASS(LLFloaterPreferenceGraphicsAdvanced); + +protected:	 +    void		onBtnOK(const LLSD& userdata); +    void		onBtnCancel(const LLSD& userdata); +}; + +#endif //LLFLOATERPREFERENCEGRAPHICSADVANCED_H + diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 3209d23e43..92805e03f0 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -67,7 +67,9 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)  	mNameColumn(p.name_column.column_name),  	mAllowCallingCardDrop(p.allow_calling_card_drop),  	mShortNames(p.short_names), -	mPendingLookupsRemaining(0) +	mPendingLookupsRemaining(0), +    mHoverIconName("Info_Small"), +    mNameListType(INDIVIDUAL)  {}  // public @@ -134,7 +136,12 @@ BOOL LLNameListCtrl::handleDragAndDrop(  void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience)  { -	if(is_experience) +    if (isSpecialType()) +    { +        mIconClickedSignal(avatar_id); +        return; +    } +    if(is_experience)  	{  		LLFloaterReg::showInstance("experience_profile", avatar_id, true);  		return; @@ -215,14 +222,16 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  	S32 column_index = getColumnIndexFromOffset(x);  	LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y));  	LLFloater* floater = gFloaterView->getParentFloater(this); -	if (floater  + + +    if (floater   		&& floater->isFrontmost()  		&& hit_item -		&& column_index == mNameColumnIndex) +		&& ((column_index == mNameColumnIndex) || isSpecialType()))  	{ -		// ...this is the column with the avatar name -		LLUUID avatar_id = hit_item->getUUID(); -		if (avatar_id.notNull()) +        // ...this is the column with the avatar name +		LLUUID item_id = isSpecialType() ? hit_item->getSpecialID() : hit_item->getUUID(); +		if (item_id.notNull())  		{  			// ...valid avatar id @@ -230,13 +239,13 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  			if (hit_cell)  			{  				S32 row_index = getItemIndex(hit_item); -				LLRect cell_rect = getCellRect(row_index, column_index); +				LLRect cell_rect = getCellRect(row_index, isSpecialType() ? getNumColumns() - 1 : column_index);  				// Convert rect local to screen coordinates  				LLRect sticky_rect;  				localRectToScreen(cell_rect, &sticky_rect);  				// Spawn at right side of cell -				LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); +				LLPointer<LLUIImage> icon = LLUI::getUIImage(mHoverIconName);  				S32 screenX = sticky_rect.mRight - info_icon_size;  				S32 screenY = sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight()) / 2;  				LLCoordGL pos(screenX, screenY); @@ -250,7 +259,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  					LLToolTip::Params params;  					params.background_visible(false); -					params.click_callback(boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group, is_experience)); +					params.click_callback(boost::bind(&LLNameListCtrl::showInspector, this, item_id, is_group, is_experience));  					params.delay_time(0.0f);		// spawn instantly on hover  					params.image(icon);  					params.message(""); @@ -321,6 +330,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(  	// use supplied name by default  	std::string fullname = name_item.name; +  	switch(name_item.target)  	{  	case GROUP: @@ -339,8 +349,10 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(  		}  		break;  	case SPECIAL: -		// just use supplied name -		break; +        { +        item->setSpecialID(name_item.special_id()); +        return item; +        }  	case INDIVIDUAL:  		{  			LLAvatarName av_name; @@ -420,7 +432,8 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)  	for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++)  	{  		LLScrollListItem* item = *it; -		if (item->getUUID() == agent_id) +        LLUUID cur_id = isSpecialType() ? dynamic_cast<LLNameListItem*>(item)->getSpecialID() : item->getUUID(); +        if (cur_id == agent_id)  		{  			idx = getItemIndex(item);  			break; @@ -451,6 +464,34 @@ LLScrollListItem* LLNameListCtrl::getNameItemByAgentId(const LLUUID& agent_id)  	return NULL;  } +void LLNameListCtrl::selectItemBySpecialId(const LLUUID& special_id) +{ +    if (special_id.isNull()) +    { +        return; +    } + +    for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++) +    { +        LLNameListItem* item = dynamic_cast<LLNameListItem*>(*it); +        if (item && item->getSpecialID() == special_id) +        { +            item->setSelected(TRUE); +            break; +        } +    } +} + +LLUUID LLNameListCtrl::getSelectedSpecialId() +{ +    LLNameListItem* item = dynamic_cast<LLNameListItem*>(getFirstSelected()); +    if(item) +    { +        return item->getSpecialID(); +    } +    return LLUUID(); +} +  void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,  									   const LLAvatarName& av_name,  									   std::string suffix, diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index ef0be135e6..d7e991c94d 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -46,6 +46,8 @@ public:  	void setIsGroup(bool is_group) { mIsGroup = is_group; }  	bool isExperience() const { return mIsExperience; }  	void setIsExperience(bool is_experience) { mIsExperience = is_experience; } +    void setSpecialID(const LLUUID& special_id) { mSpecialID = special_id; } +    const LLUUID& getSpecialID() const { return mSpecialID; }  protected:  	friend class LLNameListCtrl; @@ -68,6 +70,8 @@ protected:  private:  	bool mIsGroup;  	bool mIsExperience; + +    LLUUID mSpecialID;  }; @@ -95,10 +99,12 @@ public:  	{  		Optional<std::string>				name;  		Optional<ENameType, NameTypeNames>	target; +        Optional<LLUUID>                    special_id;  		NameItem()  		:	name("name"), -			target("target", INDIVIDUAL) +			target("target", INDIVIDUAL), +            special_id("special_id", LLUUID())  		{}  	}; @@ -156,6 +162,9 @@ public:  	LLScrollListItem* getNameItemByAgentId(const LLUUID& agent_id); +    void selectItemBySpecialId(const LLUUID& special_id); +    LLUUID getSelectedSpecialId(); +  	// LLView interface  	/*virtual*/ BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask,  									  BOOL drop, EDragAndDropType cargo_type, void *cargo_data, @@ -170,6 +179,12 @@ public:  	/*virtual*/ void updateColumns(bool force_update);  	/*virtual*/ void mouseOverHighlightNthItem( S32 index ); + +    bool isSpecialType() { return (mNameListType == SPECIAL); } + +    void setNameListType(e_name_type type) { mNameListType = type; } +    void setHoverIconName(std::string icon_name) { mHoverIconName = icon_name; } +  private:  	void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);  	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item); @@ -186,6 +201,11 @@ private:  	S32 mPendingLookupsRemaining;  	namelist_complete_signal_t mNameListCompleteSignal; + +    std::string     mHoverIconName; +    e_name_type     mNameListType; + +    boost::signals2::signal<void(const LLUUID &)> mIconClickedSignal;  public:  	boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback)  @@ -193,6 +213,10 @@ public:  		return mNameListCompleteSignal.connect(onNameListCompleteCallback);   	} +    boost::signals2::connection setIconClickedCallback(boost::function<void(const LLUUID &)> cb)  +    {  +        return mIconClickedSignal.connect(cb);  +    }  }; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 5a05f89758..d491812773 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -105,9 +105,11 @@  #include "llfloaterpathfindingconsole.h"  #include "llfloaterpathfindinglinksets.h"  #include "llfloaterpay.h" +#include "llfloaterperformance.h"  #include "llfloaterperms.h"  #include "llfloaterpostprocess.h"  #include "llfloaterpreference.h" +#include "llfloaterpreferencesgraphicsadvanced.h"  #include "llfloaterpreferenceviewadvanced.h"  #include "llfloaterpreviewtrash.h"  #include "llfloaterproperties.h" @@ -304,6 +306,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>);  	LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>);  	LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); +	LLFloaterReg::add("performance", "floater_performance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerformance>);  	LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);  	LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index e085a945a8..86322e8421 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -10533,7 +10533,8 @@ void LLVOAvatar::accountRenderComplexityForObject(      const F32 max_attachment_complexity,      LLVOVolume::texture_cost_t& textures,      U32& cost, -    hud_complexity_list_t& hud_complexity_list) +    hud_complexity_list_t& hud_complexity_list, +    object_complexity_list_t& object_complexity_list)  {      if (attached_object && !attached_object->isHUDAttachment())  		{ @@ -10552,12 +10553,12 @@ void LLVOAvatar::accountRenderComplexityForObject(                              F32 attachment_volume_cost = 0;                              F32 attachment_texture_cost = 0;                              F32 attachment_children_cost = 0; -                const F32 animated_object_attachment_surcharge = 1000; +                            const F32 animated_object_attachment_surcharge = 1000; -                if (attached_object->isAnimatedObject()) -                { -                    attachment_volume_cost += animated_object_attachment_surcharge; -                } +                            if (attached_object->isAnimatedObject()) +                            { +                                attachment_volume_cost += animated_object_attachment_surcharge; +                            }  							attachment_volume_cost += volume->getRenderCost(textures);  							const_child_list_t children = volume->getChildren(); @@ -10591,6 +10592,15 @@ void LLVOAvatar::accountRenderComplexityForObject(                                                     << LL_ENDL;                              // Limit attachment complexity to avoid signed integer flipping of the wearer's ACI                              cost += (U32)llclamp(attachment_total_cost, MIN_ATTACHMENT_COMPLEXITY, max_attachment_complexity); + +                            if (isSelf()) +                            { +                                LLObjectComplexity object_complexity; +                                object_complexity.objectName = attached_object->getAttachmentItemName(); +                                object_complexity.objectId = attached_object->getAttachmentItemID(); +                                object_complexity.objectCost = attachment_total_cost; +                                object_complexity_list.push_back(object_complexity); +                            }  						}  					}  				} @@ -10677,6 +10687,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  		U32 cost = VISUAL_COMPLEXITY_UNKNOWN;  		LLVOVolume::texture_cost_t textures;  		hud_complexity_list_t hud_complexity_list; +        object_complexity_list_t object_complexity_list;  		for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  		{ @@ -10720,7 +10731,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()              if (volp && !volp->isAttachment())              {                  accountRenderComplexityForObject(volp, max_attachment_complexity, -                                                 textures, cost, hud_complexity_list); +                                                 textures, cost, hud_complexity_list, object_complexity_list);              }          } @@ -10736,7 +10747,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  			{                  const LLViewerObject* attached_object = attachment_iter->get();                  accountRenderComplexityForObject(attached_object, max_attachment_complexity, -                                                 textures, cost, hud_complexity_list); +                                                 textures, cost, hud_complexity_list, object_complexity_list);  			}  		} @@ -10795,13 +10806,13 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  		mVisualComplexity = cost;  		mVisualComplexityStale = false; -        static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20); - -        if (isSelf() && show_my_complexity_changes) +        if (isSelf())          {              // Avatar complexity              LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity); +            LLAvatarRenderNotifier::getInstance()->setObjectComplexityList(object_complexity_list); +              // HUD complexity              LLHUDRenderNotifier::getInstance()->updateNotificationHUD(hud_complexity_list);          } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 74ef589ca4..f83f9d4eaf 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -299,7 +299,8 @@ public:                                                       const F32 max_attachment_complexity,                                                       LLVOVolume::texture_cost_t& textures,                                                       U32& cost, -                                                     hud_complexity_list_t& hud_complexity_list); +                                                     hud_complexity_list_t& hud_complexity_list, +                                                     object_complexity_list_t& object_complexity_list);  	void			calculateUpdateRenderComplexity();  	static const U32 VISUAL_COMPLEXITY_UNKNOWN;  	void			updateVisualComplexity(); diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 7beb013fba..e8d3c12d39 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -967,6 +967,9 @@      name="OutfitGalleryItemUnselected"      value="0.4 0.4 0.4 1" />    <color -    name="AddPaymentPanel" +    name="PanelGray"      value="0.27 0.27 0.27 1" /> +  <color +    name="PerformanceMid" +    value="1 0.8 0 1" />  </colors> diff --git a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml index 1f980564d4..ac88263aa1 100644 --- a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml +++ b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml @@ -19,7 +19,7 @@    </floater.string>    <panel     background_opaque="false" -   bg_alpha_color="AddPaymentPanel" +   bg_alpha_color="PanelGray"     border_visible="false"     background_visible="true"     label="wrapper_panel" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_render_settings.xml b/indra/newview/skins/default/xui/en/floater_avatar_render_settings.xml index e088d4d2a1..d222dca98b 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_render_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_render_settings.xml @@ -10,7 +10,7 @@   save_rect="true"   single_instance="true"   reuse_instance="true" - title="AVATAR RENDER SETTINGS" + title="AVATAR DISPLAY EXCEPTIONS"   width="300">      <string       name="av_never_render" @@ -18,53 +18,45 @@      <string       name="av_always_render"       value="Always"/> -    <filter_editor -     follows="left|top|right" -     height="23" -     layout="topleft" -     left="8" -     right="-47" -     label="Filter People" -     max_length_chars="300" -     name="people_filter_input" -     text_color="Black" -     text_pad_left="10" -     top="4" /> -    <menu_button -     follows="top|right" -     height="25" -     image_hover_unselected="Toolbar_Middle_Over" -     image_overlay="AddItem_Off" -     image_selected="Toolbar_Middle_Selected" -     image_unselected="Toolbar_Middle_Off" -     layout="topleft" -     left_pad="7" -     menu_filename="menu_avatar_rendering_settings_add.xml" -     menu_position="bottomleft" -     name="plus_btn" -     tool_tip="Actions on selected person" -     top="3" -     width="31" />      <name_list -     bottom="-8" +     bottom="-33"       draw_heading="true"       follows="all"       left="8"       multi_select="false"       name="render_settings_list"       right="-8" -     top="32"> +     top="0">          <name_list.columns           label="Name"           name="name" -         relative_width="0.5" /> +         relative_width="0.65" />          <name_list.columns -         label="Render setting" +         label="Full detail"           name="setting" -         relative_width="0.25" /> -        <name_list.columns -         label="Date added" -         name="timestamp" -         relative_width="0.25" /> +         relative_width="0.35" />       </name_list> +    <panel +     bg_alpha_color="ScrollBgWriteableColor" +     background_visible="true" +     background_opaque="false" +     bevel_style="none" +     follows="bottom|left|right" +     name="add_subpanel" +     layout="topleft" +     height="28" +     top_pad="0"> +     <menu_button +       follows="bottom|left" +       height="25" +       label="Add someone..." +       layout="topleft" +       menu_filename="menu_avatar_rendering_settings_add.xml" +       menu_position="bottomleft" +       name="plus_btn" +       tool_tip="Actions on selected person" +       top="1" +       left="8" +       width="120" /> +     </panel>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml new file mode 100644 index 0000000000..210b2f8792 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_performance.xml @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + height="692" + layout="topleft" + name="performance" + save_rect="true" + title="IMPROVE GRAPHICS SPEED" + width="580"> +  <panel +   bevel_style="none" +   follows="left|top" +   height="540" +   width="580" +   name="panel_top" +   visible="true" +   layout="topleft" +   left="0"    +   top="0"> +    <panel +     bg_alpha_color="black" +     background_visible="true" +     background_opaque="false" +     border="false" +     bevel_style="none" +     follows="left|top" +     height="40" +     width="560" +     name="fps_subpanel" +     layout="topleft" +     left="10" +     top="5"> +      <text +       follows="left|top" +       font="SansSerifHuge" +       text_color="White" +       height="20" +       layout="topleft" +       left="20" +       top="8" +       name="fps_value" +       width="40"> +          75 +      </text> +      <text +       follows="left|top" +       font="SansSerifLarge" +       text_color="White" +       height="20" +       layout="topleft" +       left_pad="0" +       top="13" +       name="fps_lbl" +       width="450"> +          frames per second +      </text> +      <text +       follows="left|top" +       text_color="White" +       height="20" +       layout="topleft" +       left="395" +       top="7" +       name="fps_desc1_lbl" +       width="150"> +        Allow 5-10 seconds for +      </text> +      <text +       follows="left|top" +       text_color="White" +       height="20" +       layout="topleft" +       top_pad="-3" +       name="fps_desc2_lbl" +       width="150"> +        changes to take full effect. +      </text> +    </panel> +  </panel> +  <panel +   bevel_style="none" +   follows="left|top" +   height="540" +   width="580" +   name="panel_performance_main" +   visible="true" +   layout="topleft" +   left="0"    +   top="60">     +    <panel +     bg_alpha_color="PanelGray" +     background_visible="true" +     background_opaque="false" +     border="true" +     bevel_style="none" +     follows="left|top" +     height="70" +     width="560" +     name="settings_subpanel" +     layout="topleft" +     left="10" +     top="5"> +        <text +         follows="left|top" +         font="SansSerifLarge" +         text_color="White" +         height="20" +         layout="topleft" +         left="10" +         name="settings_lbl" +         top="12" +         width="180"> +          Graphics settings +        </text> +        <text +         follows="left|top" +         font="SansSerif" +         text_color="White" +         height="20" +         layout="topleft" +         left="10" +         name="settings_desc" +         top_pad="10" +         width="395"> +          Choose settings for distance, water, lighting and more. +        </text> +        <icon +         height="16" +         width="16" +         image_name="Arrow_Right_Off" +         mouse_opaque="true" +         name="icon_arrow3" +         follows="right|top" +         top="29" +         right="-20"/> +      </panel> +    <panel +     bg_alpha_color="PanelGray" +     background_visible="true" +     background_opaque="false" +     border="true" +     bevel_style="none" +     follows="left|top" +     height="70" +     width="560" +     name="nearby_subpanel" +     layout="topleft" +     top_pad="20"> +      <text +       follows="left|top" +       font="SansSerifLarge" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="avatars_nearby_lbl" +       top="12" +       width="205"> +          Avatars nearby +      </text> +      <text +       follows="left|top" +       font="SansSerif" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="avatars_nearby_desc" +       top_pad="10" +       width="395"> +          Manage which nearby avatars are fully displayed. +      </text> +      <icon +       height="16" +       width="16" +       image_name="Arrow_Right_Off" +       mouse_opaque="true" +       name="icon_arrow2" +       follows="right|top" +       top="29" +       right="-20"/> +    </panel> +    <panel +     bg_alpha_color="PanelGray" +     background_visible="true" +     background_opaque="false" +     border="true" +     bevel_style="none" +     follows="left|top" +     height="70" +     width="560" +     name="complexity_subpanel" +     layout="topleft" +     top_pad="20"> +      <text +       follows="left|top" +       font="SansSerifLarge" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="complexity_lbl" +       top="12" +       width="180"> +          Your avatar complexity +      </text> +      <text +       follows="left|top" +       font="SansSerif" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="complexity_info" +       top_pad="10" +       width="455"> +          Reduce the complexity of your avatar if you aren't satisfied with current FPS. +      </text> +      <icon +       height="16" +       width="16" +       image_name="Arrow_Right_Off" +       mouse_opaque="true" +       name="icon_arrow4" +       follows="right|top" +       top="29" +       right="-20"/> +    </panel> +    <panel +     bg_alpha_color="PanelGray" +     background_visible="true" +     background_opaque="false" +     border="true" +     bevel_style="none" +     follows="left|top" +     height="70" +     width="560" +     name="huds_subpanel" +     layout="topleft" +     top_pad="20"> +      <text +       follows="left|top" +       font="SansSerifLarge" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="huds_lbl" +       top="12" +       width="135"> +          Your active HUDs +      </text> +      <text +       follows="left|top" +       font="SansSerif" +       text_color="White" +       height="20" +       layout="topleft" +       left="10" +       name="huds_desc" +       top_pad="10" +       width="395"> +          Removing HUDs you are not using can improve speed. +      </text> +      <icon +       height="16" +       width="16" +       image_name="Arrow_Right_Off" +       mouse_opaque="true" +       name="icon_arrow4" +       follows="right|top" +       top="29" +       right="-20"/> +    </panel> +  </panel> +  <panel +    filename="panel_performance_nearby.xml" +    follows="all" +    layout="topleft" +    left="0" +    name="panel_performance_nearby" +    visible="false" +    top="55" /> +  <panel +    filename="panel_performance_complexity.xml" +    follows="all" +    layout="topleft" +    left="0" +    name="panel_performance_complexity" +    visible="false" +    top="55" /> +  <panel +    filename="panel_performance_preferences.xml" +    follows="all" +    layout="topleft" +    left="0" +    name="panel_performance_preferences" +    visible="false" +    top="55" /> +  <panel +    filename="panel_performance_huds.xml" +    follows="all" +    layout="topleft" +    left="0" +    name="panel_performance_huds" +    visible="false" +    top="55" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings.xml b/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings.xml index 5163cd3115..1a18483418 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings.xml @@ -3,24 +3,25 @@   layout="topleft"   name="Settings">      <menu_item_check -     label="Default" -     layout="topleft" -     name="default"> -        <on_click function="Settings.SetRendering" parameter="default"/> -	<on_check function="Settings.IsSelected" parameter="default" />   -    </menu_item_check> -    <menu_item_check -     label="Always render" +     label="Always full detail"       layout="topleft"       name="always_render">          <on_click function="Settings.SetRendering" parameter="always"/> -	<on_check function="Settings.IsSelected" parameter="always" />   +        <on_check function="Settings.IsSelected" parameter="always" />        </menu_item_check>      <menu_item_check -     label="Never render" +     label="Never full detail"       layout="topleft"       name="never_render">          <on_click function="Settings.SetRendering" parameter="never"/> -	<on_check function="Settings.IsSelected" parameter="never" />   -    </menu_item_check>   +        <on_check function="Settings.IsSelected" parameter="never" /> +    </menu_item_check> +    <menu_item_check +     label="Remove from exceptions" +     layout="topleft" +     name="default"> +        <on_click function="Settings.SetRendering" parameter="default"/> +        <on_check function="Settings.IsSelected" parameter="default" /> +        <on_visible function="Settings.IsSelected" parameter="non_default" /> +  </menu_item_check>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings_add.xml b/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings_add.xml index c64b24ed70..6e09eb5981 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings_add.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_rendering_settings_add.xml @@ -4,13 +4,13 @@       left="0" bottom="0" visible="false"       mouse_opaque="false">    <menu_item_call -   label="Always Render a Resident..." +   label="Always full detail..."     name="add_avatar_always_render">        <on_click         function="Settings.AddNewEntry" parameter="always"/>    </menu_item_call>    <menu_item_call -   label="Never Render a Resident..." +   label="Never full detail..."     name="add_avatar_never_render">        <on_click         function="Settings.AddNewEntry"  parameter="never"/> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 72cce2208f..177f995b12 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -127,6 +127,13 @@               function="Floater.Toggle"               parameter="preferences" />          </menu_item_call> +        <menu_item_call +          label="Performance..." +          name="Performance"> +          <menu_item_call.on_click +           function="Floater.Toggle" +           parameter="performance" /> +        </menu_item_call>           <menu_item_call           label="Toolbar buttons..."           name="Toolbars"> diff --git a/indra/newview/skins/default/xui/en/panel_performance_complexity.xml b/indra/newview/skins/default/xui/en/panel_performance_complexity.xml new file mode 100644 index 0000000000..b2f65f9488 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_performance_complexity.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + bevel_style="none" + follows="left|top" + height="490" + width="580" + name="panel_performance_complexity" + layout="topleft" + left="0" + top="0"> +  <button +    height="16" +    width="16" +    layout="topleft" +    mouse_opaque="true" +    follows="left|top" +    name="back_btn" +    top="7" +    image_selected="Arrow_Left_Off" +    image_pressed="Arrow_Left_Off" +    image_unselected="Arrow_Left_Off" +    left="15" +    is_toggle="true"> +  </button> +  <text +   follows="left|top" +   height="20" +   layout="topleft" +   left_pad="3" +   top="10" +   name="back_lbl" +   width="40"> +    Back +  </text> +  <text +   follows="left|top" +   font="SansSerifLarge" +   text_color="white" +   height="20" +   layout="topleft" +   left="20" +   top_pad="10" +   name="attachments_title" +   width="195"> +    Your avatar complexity  +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="5" +   left="20" +   name="attachments_desc1" +   width="580"> +    If your avatar is very complex, some other people may not see you in full detail and +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="3" +   left="20" +   name="attachments_desc2" +   width="580"> +    your own graphics speed may be reduced. +  </text> +  <name_list +    column_padding="0" +    draw_stripes="true" +    height="220" +    follows="left|top" +    layout="topleft" +    name="obj_list" +    top_pad="10" +    width="540"> +      <name_list.columns +       label="" +       name="complex_visual" +       width="90" /> +      <name_list.columns +       label="" +       name="complex_value" +       width="40" /> +      <name_list.columns +       label="" +       name="name"/> +  </name_list> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_performance_huds.xml b/indra/newview/skins/default/xui/en/panel_performance_huds.xml new file mode 100644 index 0000000000..7dcadc557b --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_performance_huds.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + bevel_style="none" + follows="left|top" + height="490" + width="580" + name="panel_performance_huds" + layout="topleft" + left="0" + top="0"> +  <button +    height="16" +    width="16" +    layout="topleft" +    mouse_opaque="true" +    follows="left|top" +    name="back_btn" +    top="7" +    image_selected="Arrow_Left_Off" +    image_pressed="Arrow_Left_Off" +    image_unselected="Arrow_Left_Off" +    left="15" +    is_toggle="true"> +  </button> +  <text +   follows="left|top" +   height="20" +   layout="topleft" +   left_pad="3" +   top="10" +   name="back_lbl" +   width="40"> +    Back +  </text> +  <text +   follows="left|top" +   font="SansSerifLarge" +   text_color="White" +   height="20" +   layout="topleft" +   left="20" +   top_pad="10" +   name="huds_title" +   width="135"> +    Your active HUDs +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="5" +   left="20" +   name="huds_desc1" +   width="540"> +    Detaching HUDs you aren't using saves memory and can make Second Life run faster. +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="3" +   left="20" +   name="huds_desc2" +   width="540"> +    Note: Using a HUD's minimize button does not detach it.  +  </text> +  <name_list +    column_padding="0" +    draw_stripes="true" +    height="220" +    follows="left|top" +    layout="topleft" +    name="hud_list" +    top_pad="10" +    width="540"> +        <name_list.columns +         label="" +         name="complex_visual" +         width="90" /> +        <name_list.columns +         label="" +         name="complex_value" +         width="40" /> +        <name_list.columns +         label="" +         name="name"/> +  </name_list> +</panel> + diff --git a/indra/newview/skins/default/xui/en/panel_performance_nearby.xml b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml new file mode 100644 index 0000000000..4cc7ffda40 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + bevel_style="none" + follows="left|top" + height="490" + width="580" + name="panel_performance_nearby" + layout="topleft" + left="0" + top="0"> +  <button +    height="16" +    width="16" +    layout="topleft" +    mouse_opaque="true" +    follows="left|top" +    name="back_btn" +    top="7" +    image_selected="Arrow_Left_Off" +    image_pressed="Arrow_Left_Off" +    image_unselected="Arrow_Left_Off" +    left="15" +    is_toggle="true"> +  </button> +  <text +   follows="left|top" +   height="20" +   layout="topleft" +   left_pad="3" +   top="10" +   name="back_lbl" +   width="40"> +    Back +  </text> +  <text +   follows="left|top" +   font="SansSerifLarge" +   text_color="White" +   height="20" +   layout="topleft" +   left="20" +   top_pad="10" +   name="av_nearby_title" +   width="205"> +    Avatars nearby +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left="20" +   top_pad="5" +   name="av_nearby_desc" +   width="580"> +    Avatars more complex than your chosen limit will be shown in silhouette. +  </text> +  <slider +    control_name="IndirectMaxComplexity" +    tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll" +    follows="left|top" +    height="16" +    initial_value="101" +    increment="1" +    label="Maximum avatar complexity" +    text_color="White" +    label_width="165" +    layout="topleft" +    min_val="1" +    max_val="101" +    name="IndirectMaxComplexity" +    show_text="false" +    top_pad="10" +    width="300"> +  </slider> +  <text +    type="string" +    length="1" +    follows="left|top" +    height="16" +    layout="topleft" +    top_delta="0" +    left_delta="304" +    text_color="White" +    name="IndirectMaxComplexityText" +    width="65"> +    0 +  </text> +  <name_list +    column_padding="0" +    draw_stripes="true" +    height="220" +    left="20" +    follows="left|top" +    layout="topleft" +    sort_column="complex_value" +    name="nearby_list" +    name_column="name" +    top_pad="10" +    width="540"> +        <name_list.columns +         label="" +         name="complex_visual" +         width="90" /> +        <name_list.columns +         label="" +         name="complex_value" +         width="50" /> +        <name_list.columns +         label="" +         name="name"/> +  </name_list> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left="20" +   top_pad="10" +   name="av_nearby_desc2" +   width="580"> +     You can also right-click on an avatar in-world to control display. +  </text> +  <button +    height="23" +    label="Exceptions..." +    layout="topleft" +    left="460" +    top_delta="2" +    name="exceptions_btn" +    width="100"> +  </button> +  <check_box +    control_name="AlwaysRenderFriends" +    height="16" +    initial_value="true" +    label="Always display friends in full detail" +    label_text.text_color="White" +    layout="topleft" +    name="display_friends" +    top_pad="3" +    left="18" +    width="256"> +  </check_box> + +  +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml new file mode 100644 index 0000000000..fb62e7beb3 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml @@ -0,0 +1,570 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + bevel_style="none" + follows="left|top" + height="630" + width="580" + name="panel_performance_preferences" + layout="topleft" + left="0" + top="0"> +  <button +    height="16" +    width="16" +    layout="topleft" +    mouse_opaque="true" +    follows="left|top" +    name="back_btn" +    top="7" +    image_selected="Arrow_Left_Off" +    image_pressed="Arrow_Left_Off" +    image_unselected="Arrow_Left_Off" +    left="15" +    is_toggle="true"> +  </button> +  <text +   follows="left|top" +   height="20" +   layout="topleft" +   left_pad="3" +   top="10" +   name="back_lbl" +   width="40"> +    Back +  </text> +  <text +   follows="left|top" +   font="SansSerifLarge" +   text_color="white" +   height="20" +   layout="topleft" +   left="20" +   top_pad="10" +   name="settings_title" +   width="300"> +    Graphics settings +  </text> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border1" +    top_pad="8" +    width="540"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="30" +   name="quality_lbl" +   width="100"> +    Shortcuts +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left_pad="40" +   name="fastest_lbl" +   width="40"> +    Fastest +  </text> +  <radio_group +   control_name="RenderQualityPerformance" +   follows="top|left" +   draw_border="false" +   height="25" +   layout="topleft" +   left_pad="5" +   name="graphics_quality" +   top_delta="0" +   width="243"> +    <radio_item +     height="16" +     layout="topleft" +     left="3" +     name="0" +     top="0" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="1" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="2" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="3" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="4" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="5" +     width="7" /> +    <radio_item +     height="16" +     layout="topleft" +     left_pad="30" +     name="6" +     width="7" /> +  </radio_group> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left_pad="10" +   top_delta="1" +   name="quality_lbl" +   width="70"> +    Best quality +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="15" +   left="160" +   name="quality_desc" +   width="380"> +    Choosing a shortcut will reset all manual changes you have made. +  </text> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border2" +    top_pad="15" +    left="20" +    width="540"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="20" +   left="20" +   name="distance_lbl" +   width="100"> +    Visibility distance +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left_pad="40" +   name="faster_lbl" +   width="40"> +    Faster +  </text> +  <slider +    control_name="RenderFarClip" +    decimal_digits="0" +    follows="left|top" +    top_delta="-1" +    height="16" +    increment="8" +    initial_value="160" +    label_width="90" +    layout="topleft" +    min_val="64" +    max_val="512" +    name="draw_distance" +    left_pad="5" +    width="250" /> +  <text +    type="string" +    length="1" +    follows="left|top" +    height="12" +    layout="topleft" +    left_pad="1" +    top_delta="0" +    name="draw_distance_m" +    width="20"> +    m +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   left_pad="10" +   top_delta="1" +   name="farther_lbl" +   width="40"> +    Farther +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="15" +   left="160" +   name="distance_desc1" +   width="350"> +    To see more land when you zoom out, increase the distance. +  </text> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border3" +    top_pad="15" +    left="20" +    width="540"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="20" +   left="20" +   name="environment_lbl" +   width="100"> +    Environment +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_delta="0" +   left="160" +   name="enhancements_desc" +   width="350"> +    Each enhancement improves realism but can reduce speed. +  </text> +  <check_box +    control_name="WindLightUseAtmosShaders" +    height="16" +    initial_value="true" +    label="Atmospheric shaders" +    layout="topleft" +    name="atmospheric_shaders" +    top_pad="5" +    left="157" +    width="280"> +  </check_box> +  <check_box +    control_name="RenderDeferred" +    height="16" +    initial_value="true" +    label="Advanced Lighting" +    layout="topleft" +    name="advanced_lighting_model" +    top_delta="24" +    width="280"> +  </check_box>   +  <text +    type="string" +    length="1" +    follows="left|top" +    height="16" +    layout="topleft" +    left="160" +    name="RenderShadowDetailText" +    text_readonly_color="LabelDisabledColor" +    top_pad="10" +    width="128"> +    Shadows: +  </text> +  <combo_box +   control_name="RenderShadowDetail" +   height="18" +   layout="topleft" +   left_delta="150" +   top_delta="0" +   name="ShadowDetail" +   width="150"> +    <combo_box.item +      label="None" +      name="0" +      value="0"/> +    <combo_box.item +      label="Sun/Moon" +      name="1" +      value="1"/> +    <combo_box.item +      label="Sun/Moon + Projectors" +      name="2" +      value="2"/> +  </combo_box> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border3" +    top_pad="15" +    left="20" +    width="540"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="20" +   left="20" +   name="water_lbl" +   width="100"> +    Water +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_delta="0" +   left="160" +   name="water_desc" +   width="350"> +    Reducing or turning off water effects can greatly improve frame rate. +  </text> +  <check_box +    control_name="RenderTransparentWater" +    height="16" +    initial_value="true" +    label="Transparent Water" +    layout="topleft" +    name="TransparentWater" +    top_delta="24" +    left="157" +    width="280"> +  </check_box> +  <text +    type="string" +    length="1" +    follows="left|top" +    height="16" +    layout="topleft" +    name="ReflectionsText" +    text_readonly_color="LabelDisabledColor" +    top_pad="16" +    left="160" +    width="128"> +    Water Reflections: +  </text> +  <combo_box +    control_name="RenderReflectionDetail" +    height="18" +    layout="topleft" +    left_delta="150" +    top_delta="0" +    name="Reflections" +    width="150"> +    <combo_box.item +      label="None; opaque" +      name="0" +      value="-2"/> +    <combo_box.item +      label="None; transparent" +      name="0" +      value="-1"/> +    <combo_box.item +      label="Minimal" +      name="0" +      value="0"/> +    <combo_box.item +      label="Terrain and trees" +      name="1" +      value="1"/> +    <combo_box.item +      label="All static objects" +      name="2" +      value="2"/> +    <combo_box.item +      label="All avatars and objects" +      name="3" +      value="3"/> +    <combo_box.item +      label="Everything" +      name="4" +      value="4"/> +  </combo_box> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border4" +    top_pad="15" +    left="20" +    width="540"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_pad="20" +   left="20" +   name="photo_lbl" +   width="100"> +    Photography +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   text_color="White" +   height="18" +   layout="topleft" +   top_delta="0" +   left="160" +   name="photo_desc" +   width="350"> +    Maximum detail is good for photos, but can slow frame rate. +  </text> +  <spinner +   control_name="RenderVolumeLODFactor" +   follows="left|top" +   height="23" +   increment="0.125" +   label="Distance detail:" +   label_width="95" +   layout="topleft" +   max_val="4" +   min_val="0" +   name="render_volume_lod" +   top_pad="10" +   width="150" /> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   top_delta="3" +   left_pad="10" +   name="photo_desc" +   width="180"> +      (Enter value between 0.0 and 4.0) +  </text> +  <check_box +    height="16" +    initial_value="true" +    label="Hide avatars completely (good for landscape photos)" +    layout="topleft" +    name="hide_avatars" +    top_delta="29" +    left="157" +    width="280"> +  </check_box> +  <view_border +    bevel_style="in" +    height="0" +    layout="topleft" +    name="border5" +    top_pad="10" +    left="20" +    width="540"/> +  <button +    follows="top|left" +    height="23" +    label="Open Advanced Settings" +    layout="topleft" +    left="160" +    name="advanced_btn" +    top_pad="12" +    width="200"/> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   top="78" +   left="213" +   name="1_lbl" +   width="7"> +    1 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="31" +   name="2_lbl" +   width="7"> +    2 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="30" +   name="3_lbl" +   width="7"> +    3 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="30" +   name="4_lbl" +   width="7"> +    4 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="30" +   name="5_lbl" +   width="7"> +    5 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="30" +   name="6_lbl" +   width="7"> +      6 +  </text> +  <text +   follows="left|top" +   font="SansSerifSmall" +   height="18" +   layout="topleft" +   left_pad="30" +   name="7_lbl" +   width="7"> +    7 +  </text> +</panel> | 
