Merge remote-tracking branch 'll-perfflt/DRTVWR-539' into perffloater
commit
31f358f451
|
|
@ -580,6 +580,31 @@ namespace LLTrace
|
|||
return typename RelatedTypes<T>::fractional_t(getPeriodMeanPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMedianPerSec(const StatType<T>& stat, S32 num_periods = S32_MAX)
|
||||
{
|
||||
num_periods = llmin(num_periods, getNumRecordedPeriods());
|
||||
|
||||
std::vector <typename RelatedTypes<typename T::value_t>::fractional_t> buf;
|
||||
for (S32 i = 1; i <= num_periods; i++)
|
||||
{
|
||||
Recording& recording = getPrevRecording(i);
|
||||
if (recording.getDuration() > (F32Seconds)0.f)
|
||||
{
|
||||
buf.push_back(recording.getPerSec(stat));
|
||||
}
|
||||
}
|
||||
std::sort(buf.begin(), buf.end());
|
||||
|
||||
return typename RelatedTypes<T>::fractional_t((buf.size() % 2 == 0) ? (buf[buf.size() / 2 - 1] + buf[buf.size() / 2]) / 2 : buf[buf.size() / 2]);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename RelatedTypes<T>::fractional_t getPeriodMedianPerSec(const CountStatHandle<T>& stat, S32 num_periods = S32_MAX)
|
||||
{
|
||||
return typename RelatedTypes<T>::fractional_t(getPeriodMedianPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
|
||||
}
|
||||
|
||||
//
|
||||
// PERIODIC STANDARD DEVIATION
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -165,6 +169,74 @@ 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_rect_2d(left, mBottom, getWidth() - mRightPad, mBottom - 1, mColor);
|
||||
}
|
||||
|
||||
//
|
||||
// LLScrollListText
|
||||
//
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "lluistring.h"
|
||||
#include "v4color.h"
|
||||
#include "llui.h"
|
||||
#include "llgltexture.h"
|
||||
|
||||
class LLCheckBoxCtrl;
|
||||
class LLSD;
|
||||
|
|
@ -153,6 +154,7 @@ public:
|
|||
|
||||
void setText(const LLStringExplicit& text);
|
||||
void setFontStyle(const U8 font_style);
|
||||
void setAlignment(LLFontGL::HAlign align) { mFontAlignment = align; }
|
||||
|
||||
protected:
|
||||
LLUIString mText;
|
||||
|
|
@ -192,6 +194,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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -397,9 +397,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
|
||||
|
|
@ -1176,9 +1178,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
|
||||
|
|
|
|||
|
|
@ -638,4 +638,14 @@
|
|||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="my_environments"
|
||||
/>
|
||||
<command name="performance"
|
||||
available_in_toybox="true"
|
||||
icon="Command_Performance_Icon"
|
||||
label_ref="Command_Performance_Label"
|
||||
tooltip_ref="Command_Performance_Tooltip"
|
||||
execute_function="Floater.ToggleOrBringToFront"
|
||||
execute_parameters="performance"
|
||||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="performance"
|
||||
/>
|
||||
</commands>
|
||||
|
|
|
|||
|
|
@ -244,6 +244,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.
|
||||
|
|
@ -291,7 +297,8 @@ static const char* e_hud_messages[] =
|
|||
};
|
||||
|
||||
LLHUDRenderNotifier::LLHUDRenderNotifier() :
|
||||
mReportedHUDWarning(WARN_NONE)
|
||||
mReportedHUDWarning(WARN_NONE),
|
||||
mHUDsCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -307,6 +314,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.
|
||||
|
|
|
|||
|
|
@ -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) */
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@
|
|||
#include "llnotificationhandler.h"
|
||||
#include "llnotificationmanager.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
|
||||
LLFloaterAutoReplaceSettings::LLFloaterAutoReplaceSettings(const LLSD& key)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,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;
|
||||
}
|
||||
|
|
@ -135,37 +134,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);
|
||||
|
|
@ -216,6 +191,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));
|
||||
|
|
|
|||
|
|
@ -50,7 +50,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);
|
||||
|
|
@ -61,15 +60,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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,568 @@
|
|||
/**
|
||||
* @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 "llradiogroup.h"
|
||||
#include "llsliderctrl.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "pipeline.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llmutelist.h"
|
||||
#include "fsavatarrenderpersistence.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<LLRadioGroup>("graphics_quality")->setCommitCallback(boost::bind(&LLFloaterPerformance::onChangeQuality, this, _2));
|
||||
|
||||
mNearbyPanel->getChild<LLButton>("exceptions_btn")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickExceptions, this));
|
||||
mNearbyPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->setCommitCallback(boost::bind(&LLFloaterPerformance::onClickHideAvatars, this));
|
||||
mNearbyPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->set(!LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_AVATAR));
|
||||
mNearbyList = mNearbyPanel->getChild<LLNameListCtrl>("nearby_list");
|
||||
mNearbyList->setRightMouseDownCallback(boost::bind(&LLFloaterPerformance::onAvatarListRightClick, this, _1, _2, _3));
|
||||
|
||||
updateComplexityText();
|
||||
mComplexityChangedSignal = gSavedSettings.getControl("RenderAvatarMaxComplexity")->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().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS)));
|
||||
if (mHUDsPanel->getVisible())
|
||||
{
|
||||
populateHUDList();
|
||||
}
|
||||
else if (mNearbyPanel->getVisible())
|
||||
{
|
||||
populateNearbyList();
|
||||
mNearbyPanel->getChild<LLCheckBoxCtrl>("hide_avatars")->set(!LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_AVATAR));
|
||||
}
|
||||
else if (mComplexityPanel->getVisible())
|
||||
{
|
||||
populateObjectList();
|
||||
}
|
||||
|
||||
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;
|
||||
S32 obj_cost_short = llmax((S32)hud_object_complexity.objectsCost / 1000, 1);
|
||||
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)obj_cost_short / max_complexity * 1000;
|
||||
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(obj_cost_short);
|
||||
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";
|
||||
|
||||
LLScrollListItem* obj = mHUDList->addElement(item);
|
||||
if (obj)
|
||||
{
|
||||
LLScrollListText* value_text = dynamic_cast<LLScrollListText*>(obj->getColumn(1));
|
||||
if (value_text)
|
||||
{
|
||||
value_text->setAlignment(LLFontGL::HCENTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
S32 obj_cost_short = llmax((S32)object_complexity.objectCost / 1000, 1);
|
||||
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)obj_cost_short / max_complexity * 1000;
|
||||
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(obj_cost_short);
|
||||
row[1]["font"]["name"] = "SANSSERIF";
|
||||
|
||||
row[2]["column"] = "name";
|
||||
row[2]["type"] = "text";
|
||||
row[2]["value"] = object_complexity.objectName;
|
||||
row[2]["font"]["name"] = "SANSSERIF";
|
||||
|
||||
LLScrollListItem* obj = mObjectList->addElement(item);
|
||||
if (obj)
|
||||
{
|
||||
LLScrollListText* value_text = dynamic_cast<LLScrollListText*>(obj->getColumn(1));
|
||||
if (value_text)
|
||||
{
|
||||
value_text->setAlignment(LLFontGL::HCENTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
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()))
|
||||
{
|
||||
S32 complexity_short = llmax((S32)avatar->getVisualComplexity() / 1000, 1);;
|
||||
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)complexity_short / mNearbyMaxComplexity * 1000;
|
||||
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(complexity_short);
|
||||
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* value_text = dynamic_cast<LLScrollListText*>(av_item->getColumn(1));
|
||||
if (value_text)
|
||||
{
|
||||
value_text->setAlignment(LLFontGL::HCENTER);
|
||||
}
|
||||
LLScrollListText* name_text = dynamic_cast<LLScrollListText*>(av_item->getColumn(2));
|
||||
if (name_text)
|
||||
{
|
||||
if (avatar->isSelf())
|
||||
{
|
||||
name_text->setColor(LLUIColorTable::instance().getColor("DrYellow"));
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
mNearbyMaxComplexity = 0;
|
||||
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())
|
||||
{
|
||||
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::onChangeQuality(const LLSD& data)
|
||||
{
|
||||
LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
|
||||
if (instance)
|
||||
{
|
||||
instance->onChangeQuality(data);
|
||||
}
|
||||
}
|
||||
|
||||
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"),
|
||||
true);
|
||||
}
|
||||
|
||||
void LLFloaterPerformance::updateComplexityText()
|
||||
{
|
||||
LLAvatarComplexityControls::setText(gSavedSettings.getU32("RenderAvatarMaxComplexity"),
|
||||
mNearbyPanel->getChild<LLTextBox>("IndirectMaxComplexityText", true),
|
||||
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();
|
||||
|
||||
LLVOAvatar::VisualMuteSettings new_setting = LLVOAvatar::AV_RENDER_NORMALLY;
|
||||
if ("default" == command_name)
|
||||
{
|
||||
new_setting = LLVOAvatar::AV_RENDER_NORMALLY;
|
||||
}
|
||||
else if ("never" == command_name)
|
||||
{
|
||||
new_setting = LLVOAvatar::AV_DO_NOT_RENDER;
|
||||
}
|
||||
else if ("always" == command_name)
|
||||
{
|
||||
new_setting = LLVOAvatar::AV_ALWAYS_RENDER;
|
||||
}
|
||||
|
||||
LLVOAvatar *avatarp = find_avatar(av_id);
|
||||
if (avatarp)
|
||||
{
|
||||
avatarp->setVisualMuteSettings(new_setting);
|
||||
}
|
||||
else
|
||||
{
|
||||
FSAvatarRenderPersistence::instance().setAvatarRenderSettings(av_id, new_setting);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool LLFloaterPerformance::isActionChecked(const LLSD& userdata, const LLUUID& av_id)
|
||||
{
|
||||
const std::string command_name = userdata.asString();
|
||||
|
||||
auto visual_setting = FSAvatarRenderPersistence::instance().getAvatarRenderSettings(av_id);
|
||||
|
||||
if ("default" == command_name)
|
||||
{
|
||||
return (visual_setting == LLVOAvatar::AV_RENDER_NORMALLY);
|
||||
}
|
||||
else if ("non_default" == command_name)
|
||||
{
|
||||
return (visual_setting != LLVOAvatar::AV_RENDER_NORMALLY);
|
||||
}
|
||||
else if ("never" == command_name)
|
||||
{
|
||||
return (visual_setting == LLVOAvatar::AV_DO_NOT_RENDER);
|
||||
}
|
||||
else if ("always" == command_name)
|
||||
{
|
||||
return (visual_setting == 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()) && (list->getCurrentID() != gAgentID))
|
||||
{
|
||||
selected_uuids.push_back(list->getCurrentID());
|
||||
mContextMenu->show(ctrl, selected_uuids, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/**
|
||||
* @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 onChangeQuality(const LLSD& data);
|
||||
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
|
||||
|
|
@ -53,6 +53,7 @@
|
|||
#include "llfloaterreg.h"
|
||||
#include "llfloaterabout.h"
|
||||
#include "llfavoritesbar.h"
|
||||
#include "llfloaterpreferencesgraphicsadvanced.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
//#include "llfloaterimsession.h"
|
||||
|
|
@ -84,7 +85,6 @@
|
|||
#include "llviewereventrecorder.h"
|
||||
#include "llviewermessage.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llviewershadermgr.h"
|
||||
#include "llviewerthrottle.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llvotree.h"
|
||||
|
|
@ -108,11 +108,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"
|
||||
|
|
@ -128,8 +126,6 @@
|
|||
#include "llpresetsmanager.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llpresetsmanager.h"
|
||||
#include "llfeaturemanager.h"
|
||||
#include "llviewertexturelist.h"
|
||||
|
||||
#include "llsearchableui.h"
|
||||
|
||||
|
|
@ -170,7 +166,7 @@
|
|||
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
#include "llfiltereditor.h"
|
||||
|
||||
#include "llviewershadermgr.h"
|
||||
//<FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
|
||||
//const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
|
||||
char const* const VISIBILITY_DEFAULT = "default";
|
||||
|
|
@ -507,6 +503,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
|
|||
|
||||
LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
|
||||
|
||||
mComplexityChangedSignal = gSavedSettings.getControl("RenderAvatarMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPreference::updateComplexityText, this));
|
||||
|
||||
mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance()));
|
||||
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
|
||||
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
|
||||
|
|
@ -892,6 +890,7 @@ void LLFloaterPreference::onDoNotDisturbResponseChanged()
|
|||
LLFloaterPreference::~LLFloaterPreference()
|
||||
{
|
||||
LLConversationLog::instance().removeObserver(this);
|
||||
mComplexityChangedSignal.disconnect();
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
|
|
@ -1276,33 +1275,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();
|
||||
|
|
@ -2730,32 +2702,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();
|
||||
|
|
@ -3176,7 +3122,7 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe
|
|||
}
|
||||
}
|
||||
|
||||
void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* value_label)
|
||||
void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* value_label, bool short_val)
|
||||
{
|
||||
// Called when the IndirectMaxComplexity control changes
|
||||
// Responsible for fixing the slider label (IndirectMaxComplexityText) and setting RenderAvatarMaxComplexity
|
||||
|
|
@ -3198,10 +3144,10 @@ void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* valu
|
|||
}
|
||||
|
||||
gSavedSettings.setU32("RenderAvatarMaxComplexity", (U32)max_arc);
|
||||
setText(max_arc, value_label);
|
||||
setText(max_arc, value_label, short_val);
|
||||
}
|
||||
|
||||
void LLAvatarComplexityControls::setText(U32 value, LLTextBox* text_box)
|
||||
void LLAvatarComplexityControls::setText(U32 value, LLTextBox* text_box, bool short_val)
|
||||
{
|
||||
if (0 == value)
|
||||
{
|
||||
|
|
@ -3213,7 +3159,8 @@ void LLAvatarComplexityControls::setText(U32 value, LLTextBox* text_box)
|
|||
//text_box->setText(llformat("%d", value));
|
||||
std::string output_string;
|
||||
LLLocale locale("");
|
||||
LLResMgr::getInstance()->getIntegerString(output_string, value);
|
||||
|
||||
LLResMgr::getInstance()->getIntegerString(output_string, value/(short_val?1000:1));
|
||||
text_box->setText(output_string);
|
||||
}
|
||||
}
|
||||
|
|
@ -3224,14 +3171,12 @@ void LLFloaterPreference::updateMaxComplexity()
|
|||
LLAvatarComplexityControls::updateMax(
|
||||
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
}
|
||||
|
||||
LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance<LLFloaterPreferenceGraphicsAdvanced>("prefs_graphics_advanced");
|
||||
if (floater_graphics_advanced)
|
||||
{
|
||||
LLAvatarComplexityControls::updateMax(
|
||||
floater_graphics_advanced->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
floater_graphics_advanced->getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
}
|
||||
void LLFloaterPreference::updateComplexityText()
|
||||
{
|
||||
LLAvatarComplexityControls::setText(gSavedSettings.getU32("RenderAvatarMaxComplexity"),
|
||||
getChild<LLTextBox>("IndirectMaxComplexityText", true));
|
||||
}
|
||||
|
||||
bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
|
||||
|
|
@ -3273,22 +3218,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");
|
||||
|
|
@ -5050,18 +4979,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)
|
||||
|
|
@ -5071,41 +4988,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()
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,12 +120,10 @@ public:
|
|||
// updates click/double-click action controls depending on values from settings.xml
|
||||
void updateClickActionViews();
|
||||
|
||||
// <FS:CR> Make onBtnOk() public for settings backup panel
|
||||
//protected:
|
||||
void onBtnOK(const LLSD& userdata);
|
||||
protected:
|
||||
// </FS:CR>
|
||||
void onBtnCancel(const LLSD& userdata);
|
||||
void onBtnOK(const LLSD& userdata);
|
||||
void onBtnCancel(const LLSD& userdata);
|
||||
|
||||
protected:
|
||||
|
||||
//void onClickClearCache(); // Clear viewer texture cache, file cache on next startup // AO: was protected, moved to public
|
||||
void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
|
||||
|
|
@ -301,6 +299,7 @@ private:
|
|||
void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response);
|
||||
void updateDeleteTranscriptsButton();
|
||||
void updateMaxComplexity();
|
||||
void updateComplexityText();
|
||||
static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map);
|
||||
|
||||
static std::string sSkin;
|
||||
|
|
@ -321,6 +320,8 @@ private:
|
|||
LLSearchEditor *mFilterEdit;
|
||||
std::unique_ptr< ll::prefs::SearchData > mSearchData;
|
||||
|
||||
boost::signals2::connection mComplexityChangedSignal;
|
||||
|
||||
void onUpdateFilterTerm( bool force = false );
|
||||
void collectSearchableItems();
|
||||
|
||||
|
|
@ -473,37 +474,11 @@ 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:
|
||||
static void updateMax(LLSliderCtrl* slider, LLTextBox* value_label);
|
||||
static void setText(U32 value, LLTextBox* text_box);
|
||||
static void updateMax(LLSliderCtrl* slider, LLTextBox* value_label, bool short_val = false);
|
||||
static void setText(U32 value, LLTextBox* text_box, bool short_val = false);
|
||||
static void setIndirectControls();
|
||||
static void setIndirectMaxNonImpostors();
|
||||
static void setIndirectMaxArc();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,468 @@
|
|||
/**
|
||||
* @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"
|
||||
#include "llviewercontrol.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()
|
||||
{
|
||||
mComplexityChangedSignal.disconnect();
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
mComplexityChangedSignal = gSavedSettings.getControl("RenderAvatarMaxComplexity")->getCommitSignal()->connect(boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateComplexityText, this));
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
void LLFloaterPreferenceGraphicsAdvanced::updateComplexityText()
|
||||
{
|
||||
LLAvatarComplexityControls::setText(gSavedSettings.getU32("RenderAvatarMaxComplexity"),
|
||||
getChild<LLTextBox>("IndirectMaxComplexityText", true));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
/**
|
||||
* @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 updateComplexityText();
|
||||
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);
|
||||
|
||||
boost::signals2::connection mComplexityChangedSignal;
|
||||
};
|
||||
|
||||
#endif //LLFLOATERPREFERENCEGRAPHICSADVANCED_H
|
||||
|
||||
|
|
@ -71,9 +71,11 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
|
|||
mNameColumnIndex(p.name_column.column_index),
|
||||
mNameColumn(p.name_column.column_name),
|
||||
mAllowCallingCardDrop(p.allow_calling_card_drop),
|
||||
mShortNames(p.short_names)
|
||||
mShortNames(p.short_names),
|
||||
// <FS:Ansariel> Fix Baker's NameListCtrl un-fix
|
||||
//mPendingLookupsRemaining(0)
|
||||
// mPendingLookupsRemaining(0),
|
||||
mHoverIconName("Info_Small"),
|
||||
mNameListType(INDIVIDUAL)
|
||||
{}
|
||||
|
||||
// public
|
||||
|
|
@ -140,7 +142,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;
|
||||
|
|
@ -224,14 +231,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
|
||||
|
||||
|
|
@ -239,13 +248,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);
|
||||
|
|
@ -259,7 +268,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("");
|
||||
|
|
@ -336,6 +345,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
|
|||
|
||||
// use supplied name by default
|
||||
std::string fullname = name_item.name;
|
||||
|
||||
switch(name_item.target)
|
||||
{
|
||||
case GROUP:
|
||||
|
|
@ -354,8 +364,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;
|
||||
|
|
@ -366,7 +378,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
|
|||
else if (LLAvatarNameCache::get(id, &av_name))
|
||||
{
|
||||
if (mShortNames)
|
||||
fullname = av_name.getDisplayName();
|
||||
fullname = av_name.getDisplayName(true);
|
||||
else
|
||||
fullname = av_name.getCompleteName();
|
||||
}
|
||||
|
|
@ -437,7 +449,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;
|
||||
|
|
@ -469,6 +482,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,
|
||||
|
|
|
|||
|
|
@ -52,6 +52,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;
|
||||
|
|
@ -74,6 +76,8 @@ protected:
|
|||
private:
|
||||
bool mIsGroup;
|
||||
bool mIsExperience;
|
||||
|
||||
LLUUID mSpecialID;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -104,10 +108,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())
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
@ -168,6 +174,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,
|
||||
|
|
@ -182,6 +191,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);
|
||||
|
|
@ -199,14 +214,24 @@ private:
|
|||
// <FS:Ansariel> Fix Baker's NameListCtrl un-fix
|
||||
// S32 mPendingLookupsRemaining;
|
||||
// namelist_complete_signal_t mNameListCompleteSignal;
|
||||
//
|
||||
//public:
|
||||
// </FS:Ansariel>
|
||||
std::string mHoverIconName;
|
||||
e_name_type mNameListType;
|
||||
|
||||
boost::signals2::signal<void(const LLUUID &)> mIconClickedSignal;
|
||||
|
||||
public:
|
||||
// <FS:Ansariel> Fix Baker's NameListCtrl un-fix
|
||||
// boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback)
|
||||
// {
|
||||
// return mNameListCompleteSignal.connect(onNameListCompleteCallback);
|
||||
// }
|
||||
// </FS:Ansariel>
|
||||
|
||||
boost::signals2::connection setIconClickedCallback(boost::function<void(const LLUUID &)> cb)
|
||||
{
|
||||
return mIconClickedSignal.connect(cb);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -379,6 +381,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>);
|
||||
|
|
|
|||
|
|
@ -3868,6 +3868,8 @@ bool check_avatar_render_mode(U32 mode)
|
|||
return FSAvatarRenderPersistence::instance().getAvatarRenderSettings(avatar->getID()) == LLVOAvatar::AV_ALWAYS_RENDER;
|
||||
// [/RLVa:KB]
|
||||
// return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_ALWAYS_RENDER);
|
||||
case 4:
|
||||
return FSAvatarRenderPersistence::instance().getAvatarRenderSettings(avatar->getID()) == LLVOAvatar::AV_RENDER_NORMALLY;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2704,7 +2704,11 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
|
|||
&& !(disable_all_render_types) && !isSelf())
|
||||
// </FS:CR>
|
||||
{
|
||||
return;
|
||||
if (!mIsControlAvatar)
|
||||
{
|
||||
idleUpdateNameTag( mLastRootPos );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Update should be happening max once per frame.
|
||||
|
|
@ -11608,8 +11612,9 @@ void LLVOAvatar::accountRenderComplexityForObject(
|
|||
hud_complexity_list_t& hud_complexity_list,
|
||||
// <FS:Ansariel> Show per-item complexity in COF
|
||||
std::map<LLUUID, U32>& item_complexity,
|
||||
std::map<LLUUID, U32>& temp_item_complexity)
|
||||
std::map<LLUUID, U32>& temp_item_complexity,
|
||||
// </FS:Ansariel>
|
||||
object_complexity_list_t& object_complexity_list)
|
||||
{
|
||||
if (attached_object && !attached_object->isHUDAttachment())
|
||||
{
|
||||
|
|
@ -11628,12 +11633,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();
|
||||
|
|
@ -11679,8 +11684,13 @@ void LLVOAvatar::accountRenderComplexityForObject(
|
|||
{
|
||||
temp_item_complexity.insert(std::make_pair(attached_object->getID(), (U32)attachment_total_cost));
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -11775,6 +11785,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;
|
||||
//<FS:Beq> BOM constrain number of bake requests when BOM not supported
|
||||
// for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
|
||||
for (U8 baked_index = 0; baked_index < getNumBakes(); baked_index++)
|
||||
|
|
@ -11822,8 +11833,8 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
|
|||
{
|
||||
accountRenderComplexityForObject(volp, max_attachment_complexity,
|
||||
// <FS:Ansariel> Show per-item complexity in COF
|
||||
//textures, cost, hud_complexity_list);
|
||||
textures, cost, hud_complexity_list, item_complexity, temp_item_complexity);
|
||||
// textures, cost, hud_complexity_list, object_complexity_list);
|
||||
textures, cost, hud_complexity_list, item_complexity, temp_item_complexity, object_complexity_list);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
|
|
@ -11849,8 +11860,8 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
|
|||
const LLViewerObject* attached_object = attachment_iter->get();
|
||||
accountRenderComplexityForObject(attached_object, max_attachment_complexity,
|
||||
// <FS:Ansariel> Show per-item complexity in COF
|
||||
//textures, cost, hud_complexity_list);
|
||||
textures, cost, hud_complexity_list, item_complexity, temp_item_complexity);
|
||||
// textures, cost, hud_complexity_list, object_complexity_list);
|
||||
textures, cost, hud_complexity_list, item_complexity, temp_item_complexity, object_complexity_list);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
|
|
@ -11912,13 +11923,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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -313,8 +313,9 @@ public:
|
|||
hud_complexity_list_t& hud_complexity_list,
|
||||
// <FS:Ansariel> Show per-item complexity in COF
|
||||
std::map<LLUUID, U32>& item_complexity,
|
||||
std::map<LLUUID, U32>& temp_item_complexity);
|
||||
std::map<LLUUID, U32>& temp_item_complexity,
|
||||
// </FS:Ansariel>
|
||||
object_complexity_list_t& object_complexity_list);
|
||||
void calculateUpdateRenderComplexity();
|
||||
static const U32 VISUAL_COMPLEXITY_UNKNOWN;
|
||||
void updateVisualComplexity();
|
||||
|
|
|
|||
|
|
@ -1270,7 +1270,7 @@
|
|||
name="OutfitGalleryItemUnselected"
|
||||
value="0.4 0.4 0.4 1" />
|
||||
<color
|
||||
name="AddPaymentPanel"
|
||||
name="PanelGray"
|
||||
value="0.27 0.27 0.27 1" />
|
||||
|
||||
<!-- <FS:CR> Script Editor Colors -->
|
||||
|
|
@ -1348,4 +1348,7 @@
|
|||
<color
|
||||
name="AreaSearchBeaconColor"
|
||||
reference="Blue_80" />
|
||||
<color
|
||||
name="PerformanceMid"
|
||||
value="1 0.8 0 1" />
|
||||
</colors>
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ with the same filename but different name
|
|||
<texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
|
||||
<texture name="Command_Environments_Icon" file_name="toolbar_icons/environments.png" preload="true" />
|
||||
<texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
|
||||
<texture name="Command_Performance_Icon" file_name="toolbar_icons/performance.png" preload="true" />
|
||||
<texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
|
||||
<texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
|
||||
<texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 451 B |
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,307 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
height="592"
|
||||
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="42">
|
||||
167
|
||||
</text>
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="White"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left_pad="3"
|
||||
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="50"
|
||||
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="7"
|
||||
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="0"
|
||||
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="19"
|
||||
right="-20"/>
|
||||
</panel>
|
||||
<panel
|
||||
bg_alpha_color="PanelGray"
|
||||
background_visible="true"
|
||||
background_opaque="false"
|
||||
border="true"
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="50"
|
||||
width="560"
|
||||
name="nearby_subpanel"
|
||||
layout="topleft"
|
||||
top_pad="10">
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="White"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
name="avatars_nearby_lbl"
|
||||
top="7"
|
||||
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="0"
|
||||
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="19"
|
||||
right="-20"/>
|
||||
</panel>
|
||||
<panel
|
||||
bg_alpha_color="PanelGray"
|
||||
background_visible="true"
|
||||
background_opaque="false"
|
||||
border="true"
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="50"
|
||||
width="560"
|
||||
name="complexity_subpanel"
|
||||
layout="topleft"
|
||||
top_pad="10">
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="White"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
name="complexity_lbl"
|
||||
top="7"
|
||||
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="0"
|
||||
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="19"
|
||||
right="-20"/>
|
||||
</panel>
|
||||
<panel
|
||||
bg_alpha_color="PanelGray"
|
||||
background_visible="true"
|
||||
background_opaque="false"
|
||||
border="true"
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="50"
|
||||
width="560"
|
||||
name="huds_subpanel"
|
||||
layout="topleft"
|
||||
top_pad="10">
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="White"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
name="huds_lbl"
|
||||
top="7"
|
||||
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="0"
|
||||
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="19"
|
||||
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>
|
||||
|
|
@ -167,20 +167,13 @@
|
|||
</menu_item_call>
|
||||
|
||||
<menu_item_separator />
|
||||
|
||||
<context_menu
|
||||
label="Display this avatar"
|
||||
layout="topleft"
|
||||
name="Render Avatar">
|
||||
<menu_item_check
|
||||
name="RenderNormally"
|
||||
label="Render Normally">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="0" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="0" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
name="DoNotRender"
|
||||
label="Do Not Render">
|
||||
name="AlwaysRenderFully"
|
||||
label="Always full detail">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="1" />
|
||||
|
|
@ -189,8 +182,8 @@
|
|||
parameter="1" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
name="AlwaysRenderFully"
|
||||
label="Render Fully">
|
||||
name="DoNotRender"
|
||||
label="Never full detail">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="2" />
|
||||
|
|
@ -198,7 +191,20 @@
|
|||
function="Avatar.SetImpostorMode"
|
||||
parameter="2" />
|
||||
</menu_item_check>
|
||||
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="4" />
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="0" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_call
|
||||
label="Exceptions..."
|
||||
name="RenderExceptions">
|
||||
<menu_item_call.on_click
|
||||
function="Floater.ToggleOrBringToFront"
|
||||
parameter="avatar_render_settings" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Block Particle Owner"
|
||||
|
|
|
|||
|
|
@ -196,36 +196,49 @@
|
|||
|
||||
<menu_item_separator />
|
||||
|
||||
<menu_item_check
|
||||
name="RenderNormally"
|
||||
label="Render Normally">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="0" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="0" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
name="DoNotRender"
|
||||
label="Do Not Render">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="1" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="1" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
name="AlwaysRenderFully"
|
||||
label="Render Fully">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="2" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="2" />
|
||||
</menu_item_check>
|
||||
<context_menu
|
||||
label="Display this avatar"
|
||||
layout="topleft"
|
||||
name="Render Avatar">
|
||||
<menu_item_check
|
||||
name="AlwaysRenderFully"
|
||||
label="Always full detail">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="2" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="2" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
name="DoNotRender"
|
||||
label="Never full detail">
|
||||
<menu_item_check.on_check
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="1" />
|
||||
<menu_item_check.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="1" />
|
||||
</menu_item_check>
|
||||
<menu_item_call
|
||||
name="RenderNormally"
|
||||
label="Remove from exceptions">
|
||||
<menu_item_call.on_visible
|
||||
function="Avatar.CheckImpostorMode"
|
||||
parameter="4" />
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.SetImpostorMode"
|
||||
parameter="0" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_call
|
||||
label="Exceptions..."
|
||||
name="RenderExceptions">
|
||||
<menu_item_call.on_click
|
||||
function="Floater.ToggleOrBringToFront"
|
||||
parameter="avatar_render_settings" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -1198,7 +1198,16 @@
|
|||
parameter="UseDebugMenus" />
|
||||
</menu_item_check>
|
||||
</menu>
|
||||
|
||||
<menu_item_check
|
||||
label="Improve graphics speed..."
|
||||
name="Performance">
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="performance" />
|
||||
<menu_item_check.on_check
|
||||
function="Floater.Visible"
|
||||
parameter="performance" />
|
||||
</menu_item_check>
|
||||
<menu_item_separator/>
|
||||
|
||||
<menu_item_call
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="530"
|
||||
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">
|
||||
Attachments make your avatar more complex. If your avatar is very complex, some other
|
||||
</text>
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifSmall"
|
||||
text_color="White"
|
||||
height="18"
|
||||
layout="topleft"
|
||||
top_pad="3"
|
||||
left="20"
|
||||
name="attachments_desc2"
|
||||
width="580">
|
||||
people may not see you in full detail, and your graphics speed may be reduced. Removing
|
||||
</text>
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifSmall"
|
||||
text_color="White"
|
||||
height="18"
|
||||
layout="topleft"
|
||||
top_pad="3"
|
||||
left="20"
|
||||
name="attachments_desc3"
|
||||
width="580">
|
||||
heavy attachments that you don’t need can help.
|
||||
</text>
|
||||
<name_list
|
||||
column_padding="0"
|
||||
draw_stripes="true"
|
||||
height="379"
|
||||
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>
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="530"
|
||||
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="400"
|
||||
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>
|
||||
|
||||
|
|
@ -0,0 +1,214 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="530"
|
||||
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">
|
||||
Hide the most complex avatars to boost speed.
|
||||
</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 complexity (K)"
|
||||
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="280"
|
||||
left="20"
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
sort_column="complex_value"
|
||||
short_names="true"
|
||||
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>
|
||||
<view_border
|
||||
bevel_style="in"
|
||||
height="0"
|
||||
layout="topleft"
|
||||
name="border"
|
||||
top_pad="15"
|
||||
left="20"
|
||||
width="540"/>
|
||||
<check_box
|
||||
height="16"
|
||||
initial_value="true"
|
||||
label="Hide avatars completely (good for landscape photos)"
|
||||
layout="topleft"
|
||||
name="hide_avatars"
|
||||
top_delta="15"
|
||||
left="18"
|
||||
width="280">
|
||||
</check_box>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="15"
|
||||
layout="topleft"
|
||||
left="20"
|
||||
name="name_tags_textbox"
|
||||
top_pad="10"
|
||||
width="400">
|
||||
Name tags:
|
||||
</text>
|
||||
<radio_group
|
||||
control_name="AvatarNameTagMode"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left="120"
|
||||
top_delta="0"
|
||||
name="name_tag_mode">
|
||||
<radio_item
|
||||
label="Off"
|
||||
name="radio"
|
||||
top_delta="20"
|
||||
layout="topleft"
|
||||
height="16"
|
||||
left="0"
|
||||
value="0"
|
||||
width="75" />
|
||||
<radio_item
|
||||
label="On"
|
||||
left_pad="0"
|
||||
layout="topleft"
|
||||
top_delta="0"
|
||||
height="16"
|
||||
name="radio2"
|
||||
value="1"
|
||||
width="75" />
|
||||
<radio_item
|
||||
label="Show briefly"
|
||||
left_pad="0"
|
||||
name="radio3"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
top_delta="0"
|
||||
value="2"
|
||||
width="160" />
|
||||
</radio_group>
|
||||
|
||||
</panel>
|
||||
|
|
@ -0,0 +1,553 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
bevel_style="none"
|
||||
follows="left|top"
|
||||
height="530"
|
||||
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>
|
||||
<button
|
||||
follows="top|left"
|
||||
height="23"
|
||||
label="Open Advanced Settings"
|
||||
layout="topleft"
|
||||
left="360"
|
||||
name="advanced_btn"
|
||||
top_delta="0"
|
||||
width="200"/>
|
||||
<view_border
|
||||
bevel_style="in"
|
||||
height="0"
|
||||
layout="topleft"
|
||||
name="border1"
|
||||
left="20"
|
||||
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="5"
|
||||
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="5"
|
||||
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="7"
|
||||
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="7"
|
||||
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>
|
||||
<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>
|
||||
|
|
@ -2665,6 +2665,7 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_MiniMap_Label">Mini-map</string>
|
||||
<string name="Command_Move_Label">Walk / run / fly</string>
|
||||
<string name="Command_People_Label">People</string>
|
||||
<string name="Command_Performance_Label">Graphics speed</string>
|
||||
<string name="Command_Picks_Label">Picks</string>
|
||||
<string name="Command_Places_Label">Places</string>
|
||||
<string name="Command_Preferences_Label">Preferences</string>
|
||||
|
|
@ -2730,6 +2731,7 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_MiniMap_Tooltip">Show nearby people (CTRL+SHIFT+M)</string>
|
||||
<string name="Command_Move_Tooltip">Moving your avatar</string>
|
||||
<string name="Command_People_Tooltip">Friends, groups, and nearby people (CTRL+SHIFT+A)</string>
|
||||
<string name="Command_Performance_Tooltip">Tune graphics settings</string>
|
||||
<string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
|
||||
<string name="Command_Places_Tooltip">Places you've saved (ALT+H)</string>
|
||||
<string name="Command_Preferences_Tooltip">Preferences (CTRL+P)</string>
|
||||
|
|
@ -2928,7 +2930,7 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="preset_combo_label">-Empty list-</string>
|
||||
<string name="Default">Default</string>
|
||||
<string name="none_paren_cap">(None)</string>
|
||||
<string name="no_limit">No Limit</string>
|
||||
<string name="no_limit">No limit</string>
|
||||
|
||||
<string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
|
||||
The physics shape contains triangles which are too small. Try simplifying the physics model.
|
||||
|
|
|
|||
Loading…
Reference in New Issue