Merge branch 'DRTVWR-530-maint' of https://bitbucket.org/lindenlab/viewer

master
Ansariel 2021-08-24 10:47:18 +02:00
commit 1536fdd1c3
75 changed files with 912 additions and 363 deletions

View File

@ -3334,9 +3334,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>60f008c5fd31641ad4e61ac751ce15d1</string>
<string>7d59c592a937988cb1d0b7eddc11c7c5</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75748/723495/uriparser-0.9.4-darwin64-555117.tar.bz2</string>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81641/768120/uriparser-0.9.4-darwin64-559421.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -3370,9 +3370,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>00aff37a6f5e1fe08456702d28706cf6</string>
<string>0ea100b4a9c906100b1bcc68b852e98e</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75751/723507/uriparser-0.9.4-windows-555117.tar.bz2</string>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81650/768175/uriparser-0.9.4-windows-559421.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -3382,9 +3382,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>ff27a91f3941c7bef5e1613a064cb048</string>
<string>0789d651ef5636236b5ffc5089d8dc49</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75750/723506/uriparser-0.9.4-windows64-555117.tar.bz2</string>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81651/768176/uriparser-0.9.4-windows64-559421.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>

View File

@ -1102,6 +1102,7 @@ Nicky Dasmijn
OPEN-187
STORM-1937
OPEN-187
SL-15234
STORM-2010
STORM-2082
MAINT-6665

View File

@ -189,7 +189,6 @@ LLMetricPerformanceTesterBasic::~LLMetricPerformanceTesterBasic()
void LLMetricPerformanceTesterBasic::preOutputTestResults(LLSD* sd)
{
incrementCurrentCount() ;
(*sd)[getCurrentLabelName()]["Name"] = mName ;
}
void LLMetricPerformanceTesterBasic::postOutputTestResults(LLSD* sd)

View File

@ -81,8 +81,29 @@ protected:
};
class LLPluginProcessCreationThread : public LLThread
{
public:
LLPluginProcessCreationThread(LLPluginProcessParent *parent) :
LLThread("LLPluginProcessCreationThread", gAPRPoolp),
pParent(parent)
{
}
protected:
// Inherited from LLThread, should run once
/*virtual*/ void run(void)
{
pParent->createPluginProcess();
}
private:
LLPluginProcessParent *pParent;
};
LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
mIncomingQueueMutex()
mIncomingQueueMutex(),
pProcessCreationThread(NULL)
{
if(!sInstancesMutex)
{
@ -111,6 +132,18 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
LLPluginProcessParent::~LLPluginProcessParent()
{
LL_DEBUGS("Plugin") << "destructor" << LL_ENDL;
if (pProcessCreationThread)
{
if (!pProcessCreationThread->isStopped())
{
// Shouldn't happen at this stage
LL_WARNS("Plugin") << "Shutting down active pProcessCreationThread" << LL_ENDL;
pProcessCreationThread->shutdown();
ms_sleep(20);
}
delete pProcessCreationThread;
pProcessCreationThread = NULL;
}
// Destroy any remaining shared memory regions
sharedMemoryRegionsType::iterator iter;
@ -320,6 +353,35 @@ bool LLPluginProcessParent::accept()
return result;
}
bool LLPluginProcessParent::createPluginProcess()
{
if (!mProcess)
{
// Only argument to the launcher is the port number we're listening on
mProcessParams.args.add(stringize(mBoundPort));
mProcess = LLProcess::create(mProcessParams);
return mProcess != NULL;
}
return false;
}
void LLPluginProcessParent::clearProcessCreationThread()
{
if (pProcessCreationThread)
{
if (!pProcessCreationThread->isStopped())
{
pProcessCreationThread->shutdown();
}
else
{
delete pProcessCreationThread;
pProcessCreationThread = NULL;
}
}
}
void LLPluginProcessParent::idle(void)
{
bool idle_again;
@ -327,8 +389,9 @@ void LLPluginProcessParent::idle(void)
do
{
// process queued messages
mIncomingQueueMutex.lock();
while(!mIncomingQueue.empty())
// Inside main thread, it is preferable not to block it on mutex.
bool locked = mIncomingQueueMutex.trylock();
while(locked && !mIncomingQueue.empty())
{
LLPluginMessage message = mIncomingQueue.front();
mIncomingQueue.pop();
@ -336,10 +399,13 @@ void LLPluginProcessParent::idle(void)
receiveMessage(message);
mIncomingQueueMutex.lock();
locked = mIncomingQueueMutex.trylock();
}
mIncomingQueueMutex.unlock();
if (locked)
{
mIncomingQueueMutex.unlock();
}
// Give time to network processing
if(mMessagePipe)
@ -487,15 +553,30 @@ void LLPluginProcessParent::idle(void)
case STATE_LISTENING:
{
// Launch the plugin process.
if (mDebug && !pProcessCreationThread)
{
createPluginProcess();
if (!mProcess)
{
errorState();
}
}
else if (pProcessCreationThread == NULL)
{
// exe plugin process allocation can be hindered by a number
// of factors, don't hold whole viewer because of it, use thread
pProcessCreationThread = new LLPluginProcessCreationThread(this);
pProcessCreationThread->start();
}
else if (!mProcess && pProcessCreationThread->isStopped())
{
delete pProcessCreationThread;
pProcessCreationThread = NULL;
errorState();
}
// Only argument to the launcher is the port number we're listening on
mProcessParams.args.add(stringize(mBoundPort));
if (! (mProcess = LLProcess::create(mProcessParams)))
{
errorState();
}
else
if (mProcess)
{
if(mDebug)
{
@ -524,6 +605,15 @@ void LLPluginProcessParent::idle(void)
// This will allow us to time out if the process never starts.
mHeartbeat.start();
mHeartbeat.setTimerExpirySec(mPluginLaunchTimeout);
// pProcessCreationThread should have stopped by this point,
// but check just in case it paused on statistics sync
if (pProcessCreationThread && pProcessCreationThread->isStopped())
{
delete pProcessCreationThread;
pProcessCreationThread = NULL;
}
setState(STATE_LAUNCHED);
}
}
@ -626,6 +716,7 @@ void LLPluginProcessParent::idle(void)
killSockets();
setState(STATE_DONE);
dirtyPollSet();
clearProcessCreationThread();
break;
case STATE_DONE:

View File

@ -69,6 +69,11 @@ public:
const std::string &plugin_filename,
bool debug);
// Creates a process
// returns true if process already exists or if created,
// false if failed to create
bool createPluginProcess();
void idle(void);
// returns true if the plugin is on its way to steady state
@ -163,12 +168,15 @@ private:
bool accept();
void clearProcessCreationThread();
LLSocket::ptr_t mListenSocket;
LLSocket::ptr_t mSocket;
U32 mBoundPort;
LLProcess::Params mProcessParams;
LLProcessPtr mProcess;
LLThread *pProcessCreationThread;
std::string mPluginFile;
std::string mPluginDir;

View File

@ -1293,6 +1293,14 @@ bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
// // larger than original and if we keep going, reordering will cause a crash
// return false;
// }
if (mMaterialList.size() > ref->mMaterialList.size())
{
LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL;
// We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be
// larger than original and if we keep going, reordering will cause a crash
return false;
}
// std::map<std::string, U32> index_map;

View File

@ -575,6 +575,58 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&
}
}
// static
// Same as toggleInstanceOrBringToFront but does not close floater.
// unlike showInstance() does not trigger onOpen() if already open
void LLFloaterReg::showInstanceOrBringToFront(const LLSD& sdname, const LLSD& key)
{
std::string name = sdname.asString();
LLFloater* instance = getInstance(name, key);
if (!instance)
{
LL_DEBUGS() << "Unable to get instance of floater '" << name << "'" << LL_ENDL;
return;
}
// If hosted, we need to take that into account
LLFloater* host = instance->getHost();
if (host)
{
if (host->isMinimized() || !host->isShown() || !host->isFrontmost())
{
host->setMinimized(FALSE);
instance->openFloater(key);
instance->setVisibleAndFrontmost(true, key);
}
else if (!instance->getVisible())
{
instance->openFloater(key);
instance->setVisibleAndFrontmost(true, key);
instance->setFocus(TRUE);
}
}
else
{
if (instance->isMinimized())
{
instance->setMinimized(FALSE);
instance->setVisibleAndFrontmost(true, key);
}
else if (!instance->isShown())
{
instance->openFloater(key);
instance->setVisibleAndFrontmost(true, key);
}
else if (!instance->isFrontmost())
{
instance->setVisibleAndFrontmost(true, key);
}
}
}
// static
U32 LLFloaterReg::getVisibleFloaterInstanceCount()
{

View File

@ -157,6 +157,7 @@ public:
// Callback wrappers
static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD());
static void showInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD());
// Typed find / get / show
template <class T>

View File

@ -1710,6 +1710,20 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
updateItem(LLSD().with("sigtype", "add").with("id", pNotif->id()), pNotif);
}
void LLNotifications::load(const LLNotificationPtr pNotif)
{
if (pNotif == NULL) return;
// first see if we already have it -- if so, that's a problem
LLNotificationSet::iterator it=mItems.find(pNotif);
if (it != mItems.end())
{
LL_ERRS() << "Notification loaded a second time to the master notification channel." << LL_ENDL;
}
updateItem(LLSD().with("sigtype", "load").with("id", pNotif->id()), pNotif);
}
void LLNotifications::cancel(LLNotificationPtr pNotif)
{
if (pNotif == NULL || pNotif->isCancelled()) return;

View File

@ -933,6 +933,7 @@ public:
LLNotificationPtr add(const LLNotification::Params& p);
void add(const LLNotificationPtr pNotif);
void load(const LLNotificationPtr pNotif);
void cancel(LLNotificationPtr pNotif);
void cancelByName(const std::string& name);
void cancelByOwner(const LLUUID ownerId);
@ -1136,6 +1137,11 @@ private:
mHistory.push_back(p);
}
void onLoad(LLNotificationPtr p)
{
mHistory.push_back(p);
}
std::vector<LLNotificationPtr> mHistory;
};

View File

@ -79,6 +79,14 @@ const LLSD LLScrollListCell::getValue() const
return LLStringUtil::null;
}
// virtual
const LLSD LLScrollListCell::getAltValue() const
{
return LLStringUtil::null;
}
//
// LLScrollListIcon
//
@ -173,6 +181,7 @@ U32 LLScrollListText::sCount = 0;
LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
: LLScrollListCell(p),
mText(p.label.isProvided() ? p.label() : p.value().asString()),
mAltText(p.alt_value().asString()),
mFont(p.font),
mColor(p.color),
mUseColor(p.color.isProvided()),
@ -275,10 +284,22 @@ void LLScrollListText::setValue(const LLSD& text)
setText(text.asString());
}
//virtual
void LLScrollListText::setAltValue(const LLSD& text)
{
mAltText = text.asString();
}
//virtual
const LLSD LLScrollListText::getValue() const
{
return LLSD(mText.getString());
return LLSD(mText.getString());
}
//virtual
const LLSD LLScrollListText::getAltValue() const
{
return LLSD(mAltText.getString());
}

View File

@ -60,6 +60,7 @@ public:
Optional<void*> userdata;
Optional<LLSD> value; // state of checkbox, icon id/name, date
Optional<LLSD> alt_value;
Optional<std::string> label; // description or text
Optional<std::string> tool_tip;
@ -76,6 +77,7 @@ public:
enabled("enabled", true),
visible("visible", true),
value("value"),
alt_value("alt_value", ""),
label("label"),
tool_tip("tool_tip", ""),
font("font", LLFontGL::getFontSansSerifSmall()),
@ -98,7 +100,9 @@ public:
virtual S32 getContentWidth() const { return 0; }
virtual S32 getHeight() const { return 0; }
virtual const LLSD getValue() const;
virtual const LLSD getAltValue() const;
virtual void setValue(const LLSD& value) { }
virtual void setAltValue(const LLSD& value) { }
virtual const std::string &getToolTip() const { return mToolTip; }
virtual void setToolTip(const std::string &str) { mToolTip = str; }
virtual BOOL getVisible() const { return TRUE; }
@ -138,7 +142,9 @@ public:
/*virtual*/ S32 getContentWidth() const;
/*virtual*/ S32 getHeight() const;
/*virtual*/ void setValue(const LLSD& value);
/*virtual*/ void setAltValue(const LLSD& value);
/*virtual*/ const LLSD getValue() const;
/*virtual*/ const LLSD getAltValue() const;
/*virtual*/ BOOL getVisible() const;
/*virtual*/ void highlightText(S32 offset, S32 num_chars);
@ -156,6 +162,7 @@ public:
protected:
LLUIString mText;
LLUIString mAltText;
S32 mTextWidth;
const LLFontGL* mFont;
LLColor4 mColor;

View File

@ -68,9 +68,10 @@ static LLDefaultChildRegistry::Register<LLScrollListCtrl> r("scroll_list");
// local structures & classes.
struct SortScrollListItem
{
SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal)
SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal, bool alternate_sort)
: mSortOrders(sort_orders)
, mSortSignal(sort_signal)
, mAltSort(alternate_sort)
{}
bool operator()(const LLScrollListItem* i1, const LLScrollListItem* i2)
@ -95,7 +96,14 @@ struct SortScrollListItem
}
else
{
sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
if (mAltSort && !cell1->getAltValue().asString().empty() && !cell2->getAltValue().asString().empty())
{
sort_result = order * LLStringUtil::compareDict(cell1->getAltValue().asString(), cell2->getAltValue().asString());
}
else
{
sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
}
}
if (sort_result != 0)
{
@ -111,6 +119,7 @@ struct SortScrollListItem
typedef std::vector<std::pair<S32, BOOL> > sort_order_t;
const LLScrollListCtrl::sort_signal_t* mSortSignal;
const sort_order_t& mSortOrders;
const bool mAltSort;
};
//---------------------------------------------------------------------------
@ -219,6 +228,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mSearchColumn(p.search_column),
mColumnPadding(p.column_padding),
mRowPadding(p.row_padding),
mAlternateSort(false),
mContextMenuType(MENU_NONE),
mIsFriendSignal(NULL),
// <FS:Ansariel> Fix for FS-specific people list (radar)
@ -3098,7 +3108,7 @@ void LLScrollListCtrl::updateSort() const
std::stable_sort(
mItemList.begin(),
mItemList.end(),
SortScrollListItem(mSortColumns,mSortCallback));
SortScrollListItem(mSortColumns,mSortCallback, mAlternateSort));
mSorted = true;
}
@ -3114,7 +3124,7 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending)
std::stable_sort(
mItemList.begin(),
mItemList.end(),
SortScrollListItem(sort_column,mSortCallback));
SortScrollListItem(sort_column,mSortCallback,mAlternateSort));
}
void LLScrollListCtrl::dirtyColumns()

View File

@ -421,6 +421,8 @@ public:
BOOL hasSortOrder() const;
void clearSortOrder();
void setAlternateSort() { mAlternateSort = true; }
S32 selectMultiple( uuid_vec_t ids );
// conceptually const, but mutates mItemList
void updateSort() const;
@ -519,6 +521,8 @@ private:
bool mColumnsDirty;
bool mColumnWidthsDirty;
bool mAlternateSort;
mutable item_list mItemList;
LLScrollListItem *mLastSelected;

View File

@ -44,7 +44,8 @@ LLScrollListItem::LLScrollListItem( const Params& p )
mSelectedIndex(-1),
mEnabled(p.enabled),
mUserdata(p.userdata),
mItemValue(p.value)
mItemValue(p.value),
mItemAltValue(p.alt_value)
{
}

View File

@ -55,6 +55,7 @@ public:
Optional<bool> enabled;
Optional<void*> userdata;
Optional<LLSD> value;
Optional<LLSD> alt_value;
Ignored name; // use for localization tools
Ignored type;
@ -65,6 +66,7 @@ public:
Params()
: enabled("enabled", true),
value("value"),
alt_value("alt_value"),
name("name"),
type("type"),
length("length"),
@ -97,6 +99,7 @@ public:
virtual LLUUID getUUID() const { return mItemValue.asUUID(); }
LLSD getValue() const { return mItemValue; }
LLSD getAltValue() const { return mItemAltValue; }
void setRect(LLRect rect) { mRectangle = rect; }
LLRect getRect() const { return mRectangle; }
@ -131,6 +134,7 @@ private:
BOOL mEnabled;
void* mUserdata;
LLSD mItemValue;
LLSD mItemAltValue;
std::vector<LLScrollListCell *> mColumns;
LLRect mRectangle;
};

View File

@ -197,6 +197,7 @@ mHelpImpl(NULL)
reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleInstance, _2, LLSD()));
reg.add("Floater.ToggleOrBringToFront", boost::bind(&LLFloaterReg::toggleInstanceOrBringToFront, _2, LLSD()));
reg.add("Floater.Show", boost::bind(&LLFloaterReg::showInstance, _2, LLSD(), FALSE));
reg.add("Floater.ShowOrBringToFront", boost::bind(&LLFloaterReg::showInstanceOrBringToFront, _2, LLSD()));
reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideInstance, _2, LLSD()));
// Button initialization callback for toggle buttons

View File

@ -42,6 +42,7 @@ ECursorType getCursorFromString(const std::string& cursor_string)
cursor_string_table["UI_CURSOR_SIZENESW"] = UI_CURSOR_SIZENESW;
cursor_string_table["UI_CURSOR_SIZEWE"] = UI_CURSOR_SIZEWE;
cursor_string_table["UI_CURSOR_SIZENS"] = UI_CURSOR_SIZENS;
cursor_string_table["UI_CURSOR_SIZEALL"] = UI_CURSOR_SIZEALL;
cursor_string_table["UI_CURSOR_NO"] = UI_CURSOR_NO;
cursor_string_table["UI_CURSOR_WORKING"] = UI_CURSOR_WORKING;
cursor_string_table["UI_CURSOR_TOOLGRAB"] = UI_CURSOR_TOOLGRAB;
@ -61,6 +62,7 @@ ECursorType getCursorFromString(const std::string& cursor_string)
cursor_string_table["UI_CURSOR_TOOLCAMERA"] = UI_CURSOR_TOOLCAMERA;
cursor_string_table["UI_CURSOR_TOOLPAN"] = UI_CURSOR_TOOLPAN;
cursor_string_table["UI_CURSOR_TOOLZOOMIN"] = UI_CURSOR_TOOLZOOMIN;
cursor_string_table["UI_CURSOR_TOOLZOOMOUT"] = UI_CURSOR_TOOLZOOMOUT;
cursor_string_table["UI_CURSOR_TOOLPICKOBJECT3"] = UI_CURSOR_TOOLPICKOBJECT3;
cursor_string_table["UI_CURSOR_TOOLPLAY"] = UI_CURSOR_TOOLPLAY;
cursor_string_table["UI_CURSOR_TOOLPAUSE"] = UI_CURSOR_TOOLPAUSE;

View File

@ -38,6 +38,7 @@ enum ECursorType {
UI_CURSOR_SIZENESW,
UI_CURSOR_SIZEWE,
UI_CURSOR_SIZENS,
UI_CURSOR_SIZEALL,
UI_CURSOR_NO,
UI_CURSOR_WORKING,
UI_CURSOR_TOOLGRAB,
@ -57,6 +58,7 @@ enum ECursorType {
UI_CURSOR_TOOLCAMERA,
UI_CURSOR_TOOLPAN,
UI_CURSOR_TOOLZOOMIN,
UI_CURSOR_TOOLZOOMOUT,
UI_CURSOR_TOOLPICKOBJECT3,
UI_CURSOR_TOOLPLAY,
UI_CURSOR_TOOLPAUSE,

View File

@ -1434,6 +1434,7 @@ const char* cursorIDToName(int id)
case UI_CURSOR_SIZENESW: return "UI_CURSOR_SIZENESW";
case UI_CURSOR_SIZEWE: return "UI_CURSOR_SIZEWE";
case UI_CURSOR_SIZENS: return "UI_CURSOR_SIZENS";
case UI_CURSOR_SIZEALL: return "UI_CURSOR_SIZEALL";
case UI_CURSOR_NO: return "UI_CURSOR_NO";
case UI_CURSOR_WORKING: return "UI_CURSOR_WORKING";
case UI_CURSOR_TOOLGRAB: return "UI_CURSOR_TOOLGRAB";
@ -1453,6 +1454,7 @@ const char* cursorIDToName(int id)
case UI_CURSOR_TOOLCAMERA: return "UI_CURSOR_TOOLCAMERA";
case UI_CURSOR_TOOLPAN: return "UI_CURSOR_TOOLPAN";
case UI_CURSOR_TOOLZOOMIN: return "UI_CURSOR_TOOLZOOMIN";
case UI_CURSOR_TOOLZOOMOUT: return "UI_CURSOR_TOOLZOOMOUT";
case UI_CURSOR_TOOLPICKOBJECT3: return "UI_CURSOR_TOOLPICKOBJECT3";
case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY";
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";

View File

@ -2107,6 +2107,7 @@ void LLWindowSDL::initCursors(BOOL useLegacyCursors) // <FS:LO> Legacy cursor se
mSDLCursors[UI_CURSOR_SIZENESW] = makeSDLCursorFromBMP("sizenesw.BMP",17,17);
mSDLCursors[UI_CURSOR_SIZEWE] = makeSDLCursorFromBMP("sizewe.BMP",16,14);
mSDLCursors[UI_CURSOR_SIZENS] = makeSDLCursorFromBMP("sizens.BMP",17,16);
mSDLCursors[UI_CURSOR_SIZEALL] = makeSDLCursorFromBMP("sizeall.BMP", 17, 17);
mSDLCursors[UI_CURSOR_NO] = makeSDLCursorFromBMP("llno.BMP",8,8);
mSDLCursors[UI_CURSOR_WORKING] = makeSDLCursorFromBMP("working.BMP",12,15);
mSDLCursors[UI_CURSOR_TOOLGRAB] = makeSDLCursorFromBMP("lltoolgrab.BMP",2,13);
@ -2126,6 +2127,7 @@ void LLWindowSDL::initCursors(BOOL useLegacyCursors) // <FS:LO> Legacy cursor se
mSDLCursors[UI_CURSOR_TOOLCAMERA] = makeSDLCursorFromBMP("lltoolcamera.BMP",7,5);
mSDLCursors[UI_CURSOR_TOOLPAN] = makeSDLCursorFromBMP("lltoolpan.BMP",7,5);
mSDLCursors[UI_CURSOR_TOOLZOOMIN] = makeSDLCursorFromBMP("lltoolzoomin.BMP",7,5);
mSDLCursors[UI_CURSOR_TOOLZOOMOUT] = makeSDLCursorFromBMP("lltoolzoomout.BMP", 7, 5);
mSDLCursors[UI_CURSOR_TOOLPICKOBJECT3] = makeSDLCursorFromBMP("toolpickobject3.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLPLAY] = makeSDLCursorFromBMP("toolplay.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0);

View File

@ -1918,8 +1918,9 @@ void LLWindowWin32::initCursors(BOOL useLegacyCursors) // <FS:LO> Legacy cursor
mCursor[ UI_CURSOR_CROSS ] = LoadCursor(NULL, IDC_CROSS);
mCursor[ UI_CURSOR_SIZENWSE ] = LoadCursor(NULL, IDC_SIZENWSE);
mCursor[ UI_CURSOR_SIZENESW ] = LoadCursor(NULL, IDC_SIZENESW);
mCursor[ UI_CURSOR_SIZEWE ] = LoadCursor(NULL, IDC_SIZEWE);
mCursor[ UI_CURSOR_SIZENS ] = LoadCursor(NULL, IDC_SIZENS);
mCursor[ UI_CURSOR_SIZEWE ] = LoadCursor(NULL, IDC_SIZEWE);
mCursor[ UI_CURSOR_SIZENS ] = LoadCursor(NULL, IDC_SIZENS);
mCursor[ UI_CURSOR_SIZEALL ] = LoadCursor(NULL, IDC_SIZEALL);
mCursor[ UI_CURSOR_NO ] = LoadCursor(NULL, IDC_NO);
mCursor[ UI_CURSOR_WORKING ] = LoadCursor(NULL, IDC_APPSTARTING);
@ -1941,6 +1942,7 @@ void LLWindowWin32::initCursors(BOOL useLegacyCursors) // <FS:LO> Legacy cursor
mCursor[ UI_CURSOR_TOOLCAMERA ] = LoadCursor(module, TEXT("TOOLCAMERA"));
mCursor[ UI_CURSOR_TOOLPAN ] = LoadCursor(module, TEXT("TOOLPAN"));
mCursor[ UI_CURSOR_TOOLZOOMIN ] = LoadCursor(module, TEXT("TOOLZOOMIN"));
mCursor[ UI_CURSOR_TOOLZOOMOUT ] = LoadCursor(module, TEXT("TOOLZOOMOUT"));
mCursor[ UI_CURSOR_TOOLPICKOBJECT3 ] = LoadCursor(module, TEXT("TOOLPICKOBJECT3"));
mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE"));
/*<FS:LO> Legacy cursor setting from main program

View File

@ -393,21 +393,86 @@ void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)
switch (type)
{
case dullahan::CT_POINTER:
name = "arrow";
break;
case dullahan::CT_POINTER:
name = "UI_CURSOR_ARROW";
break;
case dullahan::CT_CROSS:
name = "UI_CURSOR_CROSS";
break;
case dullahan::CT_HAND:
name = "UI_CURSOR_HAND";
break;
case dullahan::CT_IBEAM:
name = "ibeam";
break;
case dullahan::CT_NORTHSOUTHRESIZE:
name = "splitv";
break;
case dullahan::CT_EASTWESTRESIZE:
name = "splith";
break;
case dullahan::CT_HAND:
name = "hand";
name = "UI_CURSOR_IBEAM";
break;
case dullahan::CT_WAIT:
name = "UI_CURSOR_WAIT";
break;
//case dullahan::CT_HELP:
case dullahan::CT_ROWRESIZE:
case dullahan::CT_NORTHRESIZE:
case dullahan::CT_SOUTHRESIZE:
case dullahan::CT_NORTHSOUTHRESIZE:
name = "UI_CURSOR_SIZENS";
break;
case dullahan::CT_COLUMNRESIZE:
case dullahan::CT_EASTRESIZE:
case dullahan::CT_WESTRESIZE:
case dullahan::CT_EASTWESTRESIZE:
name = "UI_CURSOR_SIZEWE";
break;
case dullahan::CT_NORTHEASTRESIZE:
case dullahan::CT_SOUTHWESTRESIZE:
case dullahan::CT_NORTHEASTSOUTHWESTRESIZE:
name = "UI_CURSOR_SIZENESW";
break;
case dullahan::CT_SOUTHEASTRESIZE:
case dullahan::CT_NORTHWESTRESIZE:
case dullahan::CT_NORTHWESTSOUTHEASTRESIZE:
name = "UI_CURSOR_SIZENWSE";
break;
case dullahan::CT_MOVE:
name = "UI_CURSOR_SIZEALL";
break;
//case dullahan::CT_MIDDLEPANNING:
//case dullahan::CT_EASTPANNING:
//case dullahan::CT_NORTHPANNING:
//case dullahan::CT_NORTHEASTPANNING:
//case dullahan::CT_NORTHWESTPANNING:
//case dullahan::CT_SOUTHPANNING:
//case dullahan::CT_SOUTHEASTPANNING:
//case dullahan::CT_SOUTHWESTPANNING:
//case dullahan::CT_WESTPANNING:
//case dullahan::CT_VERTICALTEXT:
//case dullahan::CT_CELL:
//case dullahan::CT_CONTEXTMENU:
case dullahan::CT_ALIAS:
name = "UI_CURSOR_TOOLMEDIAOPEN";
break;
case dullahan::CT_PROGRESS:
name = "UI_CURSOR_WORKING";
break;
case dullahan::CT_COPY:
name = "UI_CURSOR_ARROWCOPY";
break;
case dullahan::CT_NONE:
name = "UI_CURSOR_NO";
break;
case dullahan::CT_NODROP:
case dullahan::CT_NOTALLOWED:
name = "UI_CURSOR_NOLOCKED";
break;
case dullahan::CT_ZOOMIN:
name = "UI_CURSOR_TOOLZOOMIN";
break;
case dullahan::CT_ZOOMOUT:
name = "UI_CURSOR_TOOLZOOMOUT";
break;
case dullahan::CT_GRAB:
name = "UI_CURSOR_TOOLGRAB";
break;
//case dullahan::CT_GRABING:
//case dullahan::CT_CUSTOM:
default:
LL_WARNS() << "Unknown cursor ID: " << (int)type << LL_ENDL;

View File

@ -15673,6 +15673,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Backup</key>
<integer>0</integer>
</map>
<key>TextureFetchMinTimeToLog</key>
<map>
<key>Comment</key>
<string>If texture fetching time exceeds this value, texture fetch tester will log info</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>2.0</real>
</map>
<key>TextureFetchFakeFailureRate</key>
<map>
<key>Comment</key>
@ -15775,6 +15786,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Backup</key>
<integer>0</integer>
</map>
<key>TextureListFetchingThreshold</key>
<map>
<key>Comment</key>
<string>If the ratio between fetched and all textures in the list is greater than this threshold, which we assume that almost all textures are fetched</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.97</real>
</map>
<key>TextureLoadFullRes</key>
<map>
<key>Comment</key>

Binary file not shown.

Binary file not shown.

View File

@ -4681,16 +4681,6 @@ bool LLAgent::teleportCore(bool is_local)
// hide the Region/Estate floater
LLFloaterReg::hideInstance("region_info");
// minimize the Search floater (STORM-1474)
{
LLFloater* instance = LLFloaterReg::getInstance("search");
if (instance && instance->getVisible())
{
instance->setMinimized(TRUE);
}
}
LLViewerParcelMgr::getInstance()->deselectLand();
LLViewerMediaFocus::getInstance()->clearFocus();

View File

@ -2030,12 +2030,14 @@ bool LLAppViewer::cleanup()
// one because it happens just after mFastTimerLogThread is deleted. This
// comment is in case we guessed wrong, so we can move it here instead.
#if LL_LINUX
// remove any old breakpad minidump files from the log directory
if (! isError())
{
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp");
}
#endif
// Kill off LLLeap objects. We can find them all because LLLeap is derived
// from LLInstanceTracker.
@ -5569,6 +5571,10 @@ void LLAppViewer::idle()
//
// Special case idle if still starting up
//
if (LLStartUp::getStartupState() >= STATE_WORLD_INIT)
{
update_texture_time();
}
if (LLStartUp::getStartupState() < STATE_STARTED)
{
// Skip rest if idle startup returns false (essentially, no world yet)

View File

@ -40,7 +40,7 @@ LLBrowserNotification::LLBrowserNotification()
{
}
bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification)
bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification, bool should_log)
{
LLUUID media_id = notification->getPayload()["media_id"].asUUID();
LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(media_id);

View File

@ -911,6 +911,7 @@ protected:
static bool filterNotification(LLNotificationPtr notify);
// connect counter updaters to the corresponding signals
/*virtual*/ void onAdd(LLNotificationPtr p) { mChiclet->setCounter(++mChiclet->mUreadSystemNotifications); }
/*virtual*/ void onLoad(LLNotificationPtr p) { mChiclet->setCounter(++mChiclet->mUreadSystemNotifications); }
/*virtual*/ void onDelete(LLNotificationPtr p) { mChiclet->setCounter(--mChiclet->mUreadSystemNotifications); }
LLNotificationChiclet* const mChiclet;

View File

@ -386,13 +386,16 @@ void LLFloaterIMSessionTab::draw()
void LLFloaterIMSessionTab::enableDisableCallBtn()
{
mVoiceButton->setEnabled(
mSessionID.notNull()
&& mSession
&& mSession->mSessionInitialized
&& LLVoiceClient::getInstance()->voiceEnabled()
&& LLVoiceClient::getInstance()->isVoiceWorking()
&& mSession->mCallBackEnabled);
if (LLVoiceClient::instanceExists())
{
mVoiceButton->setEnabled(
mSessionID.notNull()
&& mSession
&& mSession->mSessionInitialized
&& LLVoiceClient::getInstance()->voiceEnabled()
&& LLVoiceClient::getInstance()->isVoiceWorking()
&& mSession->mCallBackEnabled);
}
}
void LLFloaterIMSessionTab::onFocusReceived()

View File

@ -2679,6 +2679,7 @@ BOOL LLPanelLandAccess::postBuild()
//mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
mListBanned->setContextMenu(&gFSNameListAvatarMenu);
// </FS:Ansariel>
mListBanned->setAlternateSort();
}
return TRUE;
@ -2781,11 +2782,12 @@ void LLPanelLandAccess::refresh()
{
const LLAccessEntry& entry = (*cit).second;
std::string duration;
S32 seconds = -1;
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
S32 now = time(NULL);
S32 seconds = entry.mTime - now;
seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
if (seconds >= 7200)
@ -2822,6 +2824,7 @@ void LLPanelLandAccess::refresh()
columns[0]["column"] = "name"; // to be populated later
columns[1]["column"] = "duration";
columns[1]["value"] = duration;
columns[1]["alt_value"] = entry.mTime != 0 ? std::to_string(seconds) : "Always";
mListBanned->addElement(item);
}
mListBanned->sortByName(TRUE);

View File

@ -108,6 +108,9 @@ LLFloaterLandHoldings::~LLFloaterLandHoldings()
void LLFloaterLandHoldings::onOpen(const LLSD& key)
{
LLScrollListCtrl *list = getChild<LLScrollListCtrl>("parcel list");
list->clearRows();
// query_id null is known to be us
const LLUUID& query_id = LLUUID::null;

View File

@ -391,7 +391,7 @@ void LLFloaterModelPreview::initModelPreview()
mModelPreview = new LLModelPreview(tex_width, tex_height, this);
mModelPreview->setPreviewTarget(PREVIEW_CAMERA_DISTANCE);
mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3));
mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::modelUpdated, this, _1));
}
@ -899,9 +899,6 @@ void LLFloaterModelPreview::draw()
}
}
childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));
childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size()));
if (!isMinimized() && mModelPreview->lodsReady())
{
draw3dPreview();
@ -1661,7 +1658,7 @@ void LLFloaterModelPreview::addStringToLogTab(const std::string& str, bool flash
}
}
void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)
void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z)
{
assert_main_thread();
childSetTextArg("import_dimensions", "[X]", llformat("%.3f", x));
@ -1834,9 +1831,20 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
void LLFloaterModelPreview::onLoDSourceCommit(S32 lod)
{
mModelPreview->updateLodControls(lod);
refresh();
LLComboBox* lod_source_combo = getChild<LLComboBox>("lod_source_" + lod_name[lod]);
if (lod_source_combo->getCurrentIndex() == LLModelPreview::LOD_FROM_FILE
&& mModelPreview->mLODFile[lod].empty())
{
// File wasn't selected, so nothing to do yet, refreshing
// hovewer will cause a small freeze with large meshes
// Might be good idea to open filepicker here
return;
}
refresh();
if (lod_source_combo->getCurrentIndex() == LLModelPreview::GENERATE)
{ //rebuild LoD to update triangle counts
onLODParamCommit(lod, true);

View File

@ -90,7 +90,7 @@ public:
void clearAvatarTab(); // clears table
void updateAvatarTab(bool highlight_overrides); // populates table and data as nessesary
void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
void setDetails(F32 x, F32 y, F32 z);
void setPreviewLOD(S32 lod);
void onBrowseLOD(S32 lod);

View File

@ -38,6 +38,7 @@
#include "llappviewer.h"
#include "lltexturefetch.h"
#include "llviewercontrol.h"
#include "llviewerassetstats.h" //gTextureTimer
LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
: LLFloater(key),
@ -50,6 +51,7 @@ LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
mCommitCallbackRegistrar.add("TexFetchDebugger.Start", boost::bind(&LLFloaterTextureFetchDebugger::onClickStart, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.Clear", boost::bind(&LLFloaterTextureFetchDebugger::onClickClear, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.Close", boost::bind(&LLFloaterTextureFetchDebugger::onClickClose, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.ResetFetchTime", boost::bind(&LLFloaterTextureFetchDebugger::onClickResetFetchTime, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.CacheRead", boost::bind(&LLFloaterTextureFetchDebugger::onClickCacheRead, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.CacheWrite", boost::bind(&LLFloaterTextureFetchDebugger::onClickCacheWrite, this));
@ -228,6 +230,12 @@ void LLFloaterTextureFetchDebugger::onClickClose()
delete this;
}
void LLFloaterTextureFetchDebugger::onClickResetFetchTime()
{
gTextureTimer.start();
gTextureTimer.pause();
}
void LLFloaterTextureFetchDebugger::onClickClear()
{
mButtonStateMap["start_btn"] = true;

View File

@ -44,6 +44,7 @@ public:
void onClickStart();
void onClickClear();
void onClickClose();
void onClickResetFetchTime();
void onClickCacheRead();
void onClickCacheWrite();

View File

@ -374,7 +374,7 @@ void LLHUDText::updateVisibility()
if (!mSourceObject)
{
//LL_WARNS() << "LLHUDText::updateScreenPos -- mSourceObject is NULL!" << LL_ENDL;
LL_WARNS() << "HUD text: mSourceObject is NULL, mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL;
mVisible = TRUE;
if (mOnHUDAttachment)
{

View File

@ -60,7 +60,7 @@ void LLIMHandler::initChannel()
}
//--------------------------------------------------------------------------
bool LLIMHandler::processNotification(const LLNotificationPtr& notification)
bool LLIMHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(notification->isDND())
{

View File

@ -1980,7 +1980,7 @@ LLUUID LLIMMgr::computeSessionID(
}
}
if (gAgent.isInGroup(session_id) && (session_id != other_participant_id))
if (gAgent.isInGroup(session_id, TRUE) && (session_id != other_participant_id))
{
LL_WARNS() << "Group session id different from group id: IM type = " << dialog << ", session id = " << session_id << ", group id = " << other_participant_id << LL_ENDL;
}

View File

@ -263,7 +263,7 @@ void update_marketplace_folder_hierarchy(const LLUUID cat_id)
return;
}
void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistency_enforcement)
void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistency_enforcement, bool skip_clear_listing)
{
// When changing the marketplace status of an item, we usually have to change the status of all
// folders in the same listing. This is because the display of each folder is affected by the
@ -335,7 +335,7 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
else
{
// If the folder is outside the marketplace listings root, clear its SLM data if needs be
if (perform_consistency_enforcement && LLMarketplaceData::instance().isListed(cur_uuid))
if (perform_consistency_enforcement && !skip_clear_listing && LLMarketplaceData::instance().isListed(cur_uuid))
{
LL_INFOS("SLM") << "Disassociate as the listing folder is not under the marketplace folder anymore!!" << LL_ENDL;
LLMarketplaceData::instance().clearListing(cur_uuid);
@ -1961,7 +1961,7 @@ bool validate_marketplacelistings(LLInventoryCategory* cat, validation_callback_
result &= validate_marketplacelistings(category, cb, fix_hierarchy, depth + 1);
}
update_marketplace_category(cat->getUUID());
update_marketplace_category(cat->getUUID(), true, true);
gInventory.notifyObservers();
return result && !has_bad_items;
}

View File

@ -72,7 +72,7 @@ void show_item_original(const LLUUID& item_uuid);
void reset_inventory_filter();
// Nudge the listing categories in the inventory to signal that their marketplace status changed
void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true);
void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true, bool skip_clear_listing = false);
// Nudge all listing categories to signal that their marketplace status changed
void update_all_marketplace_count();

View File

@ -1026,6 +1026,12 @@ void LLMarketplaceData::createSLMListingCoro(LLUUID folderId, LLUUID versionId,
log_SLM_infos("Post /listings", status.getType(), result);
if (!result.has("listings") || !result["listings"].isArray() || result["listings"].size() == 0)
{
LL_INFOS("SLM") << "Received an empty response for folder " << folderId << LL_ENDL;
return;
}
// Extract the info from the results
for (LLSD::array_iterator it = result["listings"].beginArray();
it != result["listings"].endArray(); ++it)
@ -1093,6 +1099,19 @@ void LLMarketplaceData::updateSLMListingCoro(LLUUID folderId, S32 listingId, LLU
log_SLM_infos("Put /listing", status.getType(), result);
if (!result.has("listings") || !result["listings"].isArray() || result["listings"].size() == 0)
{
LL_INFOS("SLM") << "Received an empty response for listing " << listingId << " folder " << folderId << LL_ENDL;
// Try to get listing more directly after a delay
const float FORCE_UPDATE_TIMEOUT = 5.0;
llcoro::suspendUntilTimeout(FORCE_UPDATE_TIMEOUT);
if (!LLApp::isExiting() && LLMarketplaceData::instanceExists())
{
getSLMListing(listingId);
}
return;
}
// Extract the info from the Json string
for (LLSD::array_iterator it = result["listings"].beginArray();
it != result["listings"].endArray(); ++it)

View File

@ -259,27 +259,14 @@ LLModelPreview::~LLModelPreview()
}
}
U32 LLModelPreview::calcResourceCost()
void LLModelPreview::updateDimentionsAndOffsets()
{
assert_main_thread();
rebuildUploadData();
//Upload skin is selected BUT check to see if the joints coming in from the asset were malformed.
if (mFMP && mFMP->childGetValue("upload_skin").asBoolean())
{
bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
if (uploadingJointPositions && !isRigValidForJointPositionUpload())
{
mFMP->childDisable("ok_btn");
}
}
std::set<LLModel*> accounted;
U32 num_points = 0;
U32 num_hulls = 0;
F32 debug_scale = mFMP ? mFMP->childGetValue("import_scale").asReal() : 1.f;
mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
if (mFMP && mFMP->childGetValue("upload_joints").asBoolean())
@ -291,8 +278,6 @@ U32 LLModelPreview::calcResourceCost()
getPreviewAvatar()->addPelvisFixup(mPelvisZOffset, fake_mesh_id);
}
F32 streaming_cost = 0.f;
F32 physics_cost = 0.f;
for (U32 i = 0; i < mUploadData.size(); ++i)
{
LLModelInstance& instance = mUploadData[i];
@ -301,11 +286,6 @@ U32 LLModelPreview::calcResourceCost()
{
accounted.insert(instance.mModel);
LLModel::Decomposition& decomp =
instance.mLOD[LLModel::LOD_PHYSICS] ?
instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
instance.mModel->mPhysics;
//update instance skin info for each lods pelvisZoffset
for (int j = 0; j<LLModel::NUM_LODS; ++j)
{
@ -314,58 +294,14 @@ U32 LLModelPreview::calcResourceCost()
instance.mLOD[j]->mSkinInfo.mPelvisOffset = mPelvisZOffset;
}
}
std::stringstream ostr;
LLSD ret = LLModel::writeModel(ostr,
instance.mLOD[4],
instance.mLOD[3],
instance.mLOD[2],
instance.mLOD[1],
instance.mLOD[0],
decomp,
mFMP->childGetValue("upload_skin").asBoolean(),
mFMP->childGetValue("upload_joints").asBoolean(),
mFMP->childGetValue("lock_scale_if_joint_position").asBoolean(),
TRUE,
FALSE,
instance.mModel->mSubmodelID);
num_hulls += decomp.mHull.size();
for (U32 i = 0; i < decomp.mHull.size(); ++i)
{
num_points += decomp.mHull[i].size();
}
//calculate streaming cost
LLMatrix4 transformation = instance.mTransform;
LLVector3 position = LLVector3(0, 0, 0) * transformation;
LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
F32 x_length = x_transformed.normalize();
F32 y_length = y_transformed.normalize();
F32 z_length = z_transformed.normalize();
LLVector3 scale = LLVector3(x_length, y_length, z_length);
F32 radius = scale.length()*0.5f*debug_scale;
LLMeshCostData costs;
if (gMeshRepo.getCostData(ret, costs))
{
streaming_cost += costs.getRadiusBasedStreamingCost(radius);
}
}
}
F32 scale = mFMP ? mFMP->childGetValue("import_scale").asReal()*2.f : 2.f;
mDetailsSignal(mPreviewScale[0] * scale, mPreviewScale[1] * scale, mPreviewScale[2] * scale, streaming_cost, physics_cost);
mDetailsSignal((F32)(mPreviewScale[0] * scale), (F32)(mPreviewScale[1] * scale), (F32)(mPreviewScale[2] * scale));
updateStatusMessages();
return (U32)streaming_cost;
}
// <FS:Beq> relocate from llmodel and rewrite so it does what it is meant to
@ -1942,8 +1878,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
}
}
mResourceCost = calcResourceCost();
LLVertexBuffer::unbind();
LLGLSLShader::sNoFixedFunction = no_ff;
if (shader)
@ -2913,9 +2847,8 @@ void LLModelPreview::update()
if (mDirty && mLodsQuery.empty())
{
mDirty = false;
mResourceCost = calcResourceCost();
updateDimentionsAndOffsets();
refresh();
updateStatusMessages();
}
}
@ -3248,8 +3181,6 @@ BOOL LLModelPreview::render()
// auto enable weight upload if weights are present
// (note: all these UI updates need to be somewhere that is not render)
// <FS:Beq> BUG-229632 auto enable weights slows manual workflow
// mViewOption["show_skin_weight"] = true;
// skin_weight = true;
// fmp->childSetValue("upload_skin", true);
LL_DEBUGS("MeshUpload") << "FSU auto_enable_weights_upload = " << auto_enable_weight_upload() << LL_ENDL;
LL_DEBUGS("MeshUpload") << "FSU auto_enable_show_weights = " << auto_enable_show_weights() << LL_ENDL;

View File

@ -115,7 +115,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
{
LOG_CLASS(LLModelPreview);
typedef boost::signals2::signal<void(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;
typedef boost::signals2::signal<void(F32 x, F32 y, F32 z)> details_signal_t;
typedef boost::signals2::signal<void(void)> model_loaded_signal_t;
typedef boost::signals2::signal<void(bool)> model_updated_signal_t;
@ -159,7 +159,7 @@ public:
void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
void generateNormals();
void restoreNormals();
U32 calcResourceCost();
void updateDimentionsAndOffsets();
void rebuildUploadData();
void saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
@ -241,7 +241,6 @@ protected:
LLVector3 mPreviewScale;
S32 mPreviewLOD;
S32 mPhysicsSearchLOD;
U32 mResourceCost;
std::string mLODFile[LLModel::NUM_LODS];
bool mLoading;
U32 mLoadState;

View File

@ -415,6 +415,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
if (cell)
{
cell->setValue(prefix + fullname);
cell->setAltValue(name_item.alt_value());
}
dirtyColumns();

View File

@ -73,7 +73,7 @@ void LLAlertHandler::initChannel()
}
//--------------------------------------------------------------------------
bool LLAlertHandler::processNotification(const LLNotificationPtr& notification)
bool LLAlertHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(mChannel.isDead())
{
@ -146,7 +146,7 @@ LLViewerAlertHandler::LLViewerAlertHandler(const std::string& name, const std::s
{
}
bool LLViewerAlertHandler::processNotification(const LLNotificationPtr& p)
bool LLViewerAlertHandler::processNotification(const LLNotificationPtr& p, bool should_log)
{
if (gHeadlessClient)
{

View File

@ -62,7 +62,7 @@ void LLGroupHandler::initChannel()
}
//--------------------------------------------------------------------------
bool LLGroupHandler::processNotification(const LLNotificationPtr& notification)
bool LLGroupHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(mChannel.isDead())
{

View File

@ -101,10 +101,10 @@ public:
// base interface functions
virtual void onAdd(LLNotificationPtr p) { processNotification(p); }
virtual void onChange(LLNotificationPtr p) { processNotification(p); }
virtual void onLoad(LLNotificationPtr p) { processNotification(p); }
virtual void onLoad(LLNotificationPtr p) { processNotification(p, false); }
virtual void onDelete(LLNotificationPtr p) { if (mChannel.get()) mChannel.get()->removeToastByNotificationID(p->getID());}
virtual bool processNotification(const LLNotificationPtr& notify) = 0;
virtual bool processNotification(const LLNotificationPtr& notify, bool should_log = true) = 0;
};
class LLSystemNotificationHandler : public LLNotificationHandler
@ -141,7 +141,7 @@ class LLIMHandler : public LLCommunicationNotificationHandler
public:
LLIMHandler();
virtual ~LLIMHandler();
bool processNotification(const LLNotificationPtr& p);
bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel();
@ -157,7 +157,7 @@ public:
LLTipHandler();
virtual ~LLTipHandler();
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel();
@ -175,7 +175,7 @@ public:
virtual void onDelete(LLNotificationPtr p);
virtual void onChange(LLNotificationPtr p);
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
virtual void addToastWithNotification(const LLNotificationPtr& p);
protected:
@ -193,7 +193,7 @@ public:
LLGroupHandler();
virtual ~LLGroupHandler();
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel();
@ -209,7 +209,7 @@ public:
virtual ~LLAlertHandler();
virtual void onChange(LLNotificationPtr p);
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel();
@ -225,7 +225,7 @@ public:
virtual ~LLViewerAlertHandler() {};
virtual void onDelete(LLNotificationPtr p) {};
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel() {};
@ -243,7 +243,7 @@ public:
virtual void onChange(LLNotificationPtr p);
virtual void onDelete(LLNotificationPtr notification);
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel();
@ -261,7 +261,7 @@ public:
virtual void onAdd(LLNotificationPtr p);
virtual void onLoad(LLNotificationPtr p);
virtual void onDelete(LLNotificationPtr p);
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel() {};
@ -276,7 +276,7 @@ public:
LLBrowserNotification();
virtual ~LLBrowserNotification() {}
virtual bool processNotification(const LLNotificationPtr& p);
virtual bool processNotification(const LLNotificationPtr& p, bool should_log = true);
protected:
virtual void initChannel() {};

View File

@ -53,7 +53,7 @@ void LLHintHandler::onDelete(LLNotificationPtr p)
LLHints::getInstance()->hide(p);
}
bool LLHintHandler::processNotification(const LLNotificationPtr& p)
bool LLHintHandler::processNotification(const LLNotificationPtr& p, bool should_log)
{
return false;
}

View File

@ -71,7 +71,7 @@ void LLOfferHandler::initChannel()
}
//--------------------------------------------------------------------------
bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)
bool LLOfferHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(mChannel.isDead())
{

View File

@ -96,7 +96,7 @@ void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notifica
}
//--------------------------------------------------------------------------
bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)
bool LLScriptHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(mChannel.isDead())
{
@ -109,7 +109,7 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)
initChannel();
}
if (notification->canLogToIM())
if (should_log && notification->canLogToIM())
{
LLHandlerUtil::logToIMP2P(notification);
}

View File

@ -69,7 +69,7 @@ void LLTipHandler::initChannel()
}
//--------------------------------------------------------------------------
bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
bool LLTipHandler::processNotification(const LLNotificationPtr& notification, bool should_log)
{
if(mChannel.isDead())
{

View File

@ -61,6 +61,8 @@ static LLPanelInjector<LLOutfitGallery> t_outfit_gallery("outfit_gallery");
#define MAX_OUTFIT_PHOTO_WIDTH 256
#define MAX_OUTFIT_PHOTO_HEIGHT 256
const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
: LLOutfitListBase(),
mTexturesObserver(NULL),
@ -95,7 +97,7 @@ LLOutfitGallery::Params::Params()
item_width("item_width", 150),
item_height("item_height", 175),
item_horizontal_gap("item_horizontal_gap", 16),
items_in_row("items_in_row", 3),
items_in_row("items_in_row", GALLERY_ITEMS_PER_ROW_MIN),
row_panel_width_factor("row_panel_width_factor", 166),
gallery_width_factor("gallery_width_factor", 163)
{
@ -153,10 +155,7 @@ void LLOutfitGallery::updateRowsIfNeeded()
{
reArrangeRows(1);
}
// <FS:Ansariel> Fix scroll bars if appearance floater at minimum width
//else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > 2)
else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > 2)
// </FS:Ansariel>
else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)
{
reArrangeRows(-1);
}

View File

@ -156,7 +156,7 @@ void LLPersistentNotificationStorage::loadNotifications()
// <FS:Ansariel> FIRE-11339: Persisted group notifications get logged to IM on each login
notification->setIsFromStorage(true);
instance.add(notification);
instance.load(notification);
// hide script floaters so they don't confuse the user and don't overlap startup toast
LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false);

View File

@ -72,8 +72,11 @@ LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > LLTextureFetch::sCacheH
LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sCacheReadLatency("texture_cache_read_latency");
LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sTexDecodeLatency("texture_decode_latency");
LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sCacheWriteLatency("texture_write_latency");
LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sTexFetchLatency("texture_fetch_latency");
LLTextureFetchTester* LLTextureFetch::sTesterp = NULL ;
const std::string sTesterName("TextureFetchTester");
//////////////////////////////////////////////////////////////////////////////
//
@ -441,6 +444,29 @@ public:
// Threads: Ttf
virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
enum e_state // mState
{
// *NOTE: Do not change the order/value of state variables, some code
// depends upon specific ordering/adjacency.
// NOTE: Affects LLTextureBar::draw in lltextureview.cpp (debug hack)
INVALID = 0,
INIT,
LOAD_FROM_TEXTURE_CACHE,
CACHE_POST,
LOAD_FROM_NETWORK,
LOAD_FROM_SIMULATOR,
WAIT_HTTP_RESOURCE, // Waiting for HTTP resources
WAIT_HTTP_RESOURCE2, // Waiting for HTTP resources
SEND_HTTP_REQ, // Commit to sending as HTTP
WAIT_HTTP_REQ, // Request sent, wait for completion
DECODE_IMAGE,
DECODE_IMAGE_UPDATE,
WRITE_TO_CACHE,
WAIT_ON_WRITE,
DONE
};
protected:
LLTextureFetchWorker(LLTextureFetch* fetcher, FTType f_type,
const std::string& url, const LLUUID& id, const LLHost& host,
@ -520,28 +546,6 @@ private:
}
private:
enum e_state // mState
{
// *NOTE: Do not change the order/value of state variables, some code
// depends upon specific ordering/adjacency.
// NOTE: Affects LLTextureBar::draw in lltextureview.cpp (debug hack)
INVALID = 0,
INIT,
LOAD_FROM_TEXTURE_CACHE,
CACHE_POST,
LOAD_FROM_NETWORK,
LOAD_FROM_SIMULATOR,
WAIT_HTTP_RESOURCE, // Waiting for HTTP resources
WAIT_HTTP_RESOURCE2, // Waiting for HTTP resources
SEND_HTTP_REQ, // Commit to sending as HTTP
WAIT_HTTP_REQ, // Request sent, wait for completion
DECODE_IMAGE,
DECODE_IMAGE_UPDATE,
WRITE_TO_CACHE,
WAIT_ON_WRITE,
DONE
};
enum e_request_state // mSentRequest
{
UNSENT = 0,
@ -554,7 +558,7 @@ private:
CAN_WRITE = 1,
SHOULD_WRITE = 2
};
static const char* sStateDescs[];
e_state mState;
void setState(e_state new_state);
@ -582,10 +586,15 @@ private:
LLFrameTimer mFetchDeltaTimer;
LLTimer mCacheReadTimer;
LLTimer mDecodeTimer;
LLTimer mCacheWriteTimer;
LLTimer mFetchTimer;
LLTimer mStateTimer;
F32 mCacheReadTime; // time for cache read only
F32 mDecodeTime; // time for decode only
F32 mCacheWriteTime;
F32 mFetchTime; // total time from req to finished fetch
std::map<S32, F32> mStateTimersMap;
F32 mSkippedStatesTime;
LLTextureCache::handle_t mCacheReadHandle,
mCacheWriteHandle;
S32 mRequestedSize,
@ -869,8 +878,7 @@ bool truncate_viewer_metrics(int max_regions, LLSD & metrics);
//////////////////////////////////////////////////////////////////////////////
//static
const char* LLTextureFetchWorker::sStateDescs[] = {
const char* sStateDescs[] = {
"INVALID",
"INIT",
"LOAD_FROM_TEXTURE_CACHE",
@ -888,6 +896,9 @@ const char* LLTextureFetchWorker::sStateDescs[] = {
"DONE"
};
const std::set<S32> LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK, LLTextureFetchWorker::LOAD_FROM_SIMULATOR,
LLTextureFetchWorker::WAIT_HTTP_REQ, LLTextureFetchWorker::DECODE_IMAGE_UPDATE, LLTextureFetchWorker::WAIT_ON_WRITE };
// static
volatile bool LLTextureFetch::svMetricsDataBreak(true); // Start with a data break
@ -919,6 +930,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mLoadedDiscard(-1),
mDecodedDiscard(-1),
mCacheReadTime(0.f),
mCacheWriteTime(0.f),
mDecodeTime(0.f),
mFetchTime(0.f),
mCacheReadHandle(LLTextureCache::nullHandle()),
@ -927,6 +939,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mRequestedOffset(0),
mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE),
mFileSize(0),
mSkippedStatesTime(0),
mCachedSize(0),
mLoaded(FALSE),
mSentRequest(UNSENT),
@ -1196,6 +1209,13 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
// </FS> Asset Blacklist
mStateTimer.reset();
mFetchTimer.reset();
for(auto i : LOGGED_STATES)
{
mStateTimersMap[i] = 0;
}
mSkippedStatesTime = 0;
mRawImage = NULL ;
mRequestedDiscard = -1;
mLoadedDiscard = -1;
@ -1253,9 +1273,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
++mCacheReadCount;
std::string filename = mUrl.substr(7, std::string::npos);
CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadTimer.reset();
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority,
offset, size, responder);
mCacheReadTimer.reset();
}
else if ((mUrl.empty() || mFTType==FTT_SERVER_BAKE) && mFetcher->canLoadFromCache())
{
@ -1263,9 +1284,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
++mCacheReadCount;
CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority,
offset, size, responder);
mCacheReadTimer.reset();
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority,
offset, size, responder);;
}
else if(!mUrl.empty() && mCanUseHTTP)
{
@ -1287,6 +1308,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mCacheReadHandle = LLTextureCache::nullHandle();
setState(CACHE_POST);
add(LLTextureFetch::sCacheHit, 1.0);
mCacheReadTime = mCacheReadTimer.getElapsedTimeF32();
// fall through
}
else
@ -1909,7 +1931,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << LL_ENDL;
return true;
}
mDecodeTimer.reset();
mRawImage = NULL;
mAuxImage = NULL;
llassert_always(mFormattedImage.notNull());
@ -2003,6 +2025,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
// be protected by work mutex and won't be safe to use here nor in cache worker.
// So make sure users of getRequestFinished() does not attempt to modify image while
// fetcher is working
mCacheWriteTimer.reset();
mCacheWriteHandle = mFetcher->mTextureCache->writeToCache(mID, cache_priority,
mFormattedImage->getData(), datasize,
mFileSize, mRawImage, mDecodedDiscard, responder);
@ -2013,6 +2036,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
if (writeToCacheComplete())
{
mCacheWriteTime = mCacheWriteTimer.getElapsedTimeF32();
setState(DONE);
// fall through
}
@ -2521,7 +2545,6 @@ void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImag
mDecoded = TRUE;
// LL_INFOS(LOG_TXT) << mID << " : DECODE COMPLETE " << LL_ENDL;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mCacheReadTime = mCacheReadTimer.getElapsedTimeF32();
} // -Mw
//////////////////////////////////////////////////////////////////////////////
@ -2649,6 +2672,17 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
}
mOriginFetchSource = mFetchSource;
}
// If that test log has ben requested but not yet created, create it
if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName))
{
sTesterp = new LLTextureFetchTester() ;
if (!sTesterp->isValid())
{
delete sTesterp;
sTesterp = NULL;
}
}
}
LLTextureFetch::~LLTextureFetch()
@ -2990,20 +3024,51 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
}
else if (worker->checkWork())
{
F32 decode_time;
F32 fetch_time;
F32 cache_read_time;
F32 cache_write_time;
S32 file_size;
std::map<S32, F32> logged_state_timers;
F32 skipped_states_time;
worker->lockWorkMutex(); // +Mw
last_http_get_status = worker->mGetStatus;
discard_level = worker->mDecodedDiscard;
raw = worker->mRawImage;
aux = worker->mAuxImage;
sample(sTexDecodeLatency, worker->mDecodeTime);
sample(sTexFetchLatency, worker->mFetchTime);
sample(sCacheReadLatency, worker->mCacheReadTime);
decode_time = worker->mDecodeTime;
fetch_time = worker->mFetchTime;
cache_read_time = worker->mCacheReadTime;
cache_write_time = worker->mCacheWriteTime;
file_size = worker->mFileSize;
worker->mCacheReadTimer.reset();
worker->mDecodeTimer.reset();
worker->mCacheWriteTimer.reset();
worker->mFetchTimer.reset();
logged_state_timers = worker->mStateTimersMap;
skipped_states_time = worker->mSkippedStatesTime;
worker->mStateTimer.reset();
res = true;
LL_DEBUGS(LOG_TXT) << id << ": Request Finished. State: " << worker->mState << " Discard: " << discard_level << LL_ENDL;
worker->unlockWorkMutex(); // -Mw
sample(sTexDecodeLatency, decode_time);
sample(sTexFetchLatency, fetch_time);
sample(sCacheReadLatency, cache_read_time);
sample(sCacheWriteLatency, cache_write_time);
static LLCachedControl<F32> min_time_to_log(gSavedSettings, "TextureFetchMinTimeToLog", 2.f);
if (fetch_time > min_time_to_log)
{
//LL_INFOS() << "fetch_time: " << fetch_time << " cache_read_time: " << cache_read_time << " decode_time: " << decode_time << " cache_write_time: " << cache_write_time << LL_ENDL;
LLTextureFetchTester* tester = (LLTextureFetchTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName);
if (tester)
{
tester->updateStats(logged_state_timers, fetch_time, skipped_states_time, file_size) ;
}
}
}
else
{
@ -3488,6 +3553,21 @@ void LLTextureFetchWorker::setState(e_state new_state)
// LL_INFOS(LOG_TXT) << "id: " << mID << " FTType: " << mFTType << " disc: " << mDesiredDiscard << " sz: " << mDesiredSize << " state: " << e_state_name[mState] << " => " << e_state_name[new_state] << LL_ENDL;
}
F32 d_time = mStateTimer.getElapsedTimeF32();
if (d_time >= 0.0001F)
{
if (LOGGED_STATES.count(mState))
{
mStateTimersMap[mState] = d_time;
}
else
{
mSkippedStatesTime += d_time;
}
}
mStateTimer.reset();
mState = new_state;
}
@ -3703,7 +3783,7 @@ void LLTextureFetch::dump()
LLTextureFetchWorker* worker = (LLTextureFetchWorker*)wreq->getWorkerClass();
LL_INFOS(LOG_TXT) << " ID: " << worker->mID
<< " PRI: " << llformat("0x%08x",wreq->getPriority())
<< " STATE: " << worker->sStateDescs[worker->mState]
<< " STATE: " << sStateDescs[worker->mState]
<< LL_ENDL;
}
@ -5151,4 +5231,40 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon
//End LLTextureFetchDebugger
///////////////////////////////////////////////////////////////////////////////////////////
LLTextureFetchTester::LLTextureFetchTester() : LLMetricPerformanceTesterBasic(sTesterName)
{
mTextureFetchTime = 0;
mSkippedStatesTime = 0;
mFileSize = 0;
}
LLTextureFetchTester::~LLTextureFetchTester()
{
outputTestResults();
LLTextureFetch::sTesterp = NULL;
}
//virtual
void LLTextureFetchTester::outputTestRecord(LLSD *sd)
{
std::string currentLabel = getCurrentLabelName();
(*sd)[currentLabel]["Texture Fetch Time"] = (LLSD::Real)mTextureFetchTime;
(*sd)[currentLabel]["File Size"] = (LLSD::Integer)mFileSize;
(*sd)[currentLabel]["Skipped States Time"] = (LLSD::String)llformat("%.6f", mSkippedStatesTime);
for(auto i : LOGGED_STATES)
{
(*sd)[currentLabel][sStateDescs[i]] = mStateTimersMap[i];
}
}
void LLTextureFetchTester::updateStats(const std::map<S32, F32> state_timers, const F32 fetch_time, const F32 skipped_states_time, const S32 file_size)
{
mTextureFetchTime = fetch_time;
mStateTimersMap = state_timers;
mFileSize = file_size;
mSkippedStatesTime = skipped_states_time;
outputTestResults();
}

View File

@ -50,6 +50,7 @@ class LLHost;
class LLViewerAssetStats;
class LLTextureFetchDebugger;
class LLTextureCache;
class LLTextureFetchTester;
// Interface class
@ -312,6 +313,7 @@ public:
static LLTrace::CountStatHandle<F64> sCacheAttempt;
static LLTrace::SampleStatHandle<F32Seconds> sCacheReadLatency;
static LLTrace::SampleStatHandle<F32Seconds> sTexDecodeLatency;
static LLTrace::SampleStatHandle<F32Seconds> sCacheWriteLatency;
static LLTrace::SampleStatHandle<F32Seconds> sTexFetchLatency;
static LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > sCacheHitRate;
@ -403,6 +405,9 @@ public:
FROM_HTTP_ONLY,
INVALID_SOURCE
};
static LLTextureFetchTester* sTesterp;
private:
//debug use
LLTextureFetchDebugger* mFetchDebugger;
@ -635,5 +640,26 @@ private:
public:
static bool isEnabled() {return sDebuggerEnabled;}
};
class LLTextureFetchTester : public LLMetricPerformanceTesterBasic
{
public:
LLTextureFetchTester();
~LLTextureFetchTester();
void updateStats(const std::map<S32, F32> states_timers, const F32 fetch_time, const F32 other_states_time, const S32 file_size);
protected:
/*virtual*/ void outputTestRecord(LLSD* sd);
private:
F32 mTextureFetchTime;
F32 mSkippedStatesTime;
S32 mFileSize;
std::map<S32, F32> mStateTimersMap;
};
#endif // LL_LLTEXTUREFETCH_H

View File

@ -55,6 +55,7 @@ class LLViewerJoystick : public LLSingleton<LLViewerJoystick>
{
LLSINGLETON(LLViewerJoystick);
virtual ~LLViewerJoystick();
LOG_CLASS(LLViewerJoystick);
public:
void init(bool autoenable);

View File

@ -3258,19 +3258,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << plugin->getCursorName() << LL_ENDL;
std::string cursor = plugin->getCursorName();
if(cursor == "arrow")
mLastSetCursor = UI_CURSOR_ARROW;
else if(cursor == "ibeam")
mLastSetCursor = UI_CURSOR_IBEAM;
else if(cursor == "splith")
mLastSetCursor = UI_CURSOR_SIZEWE;
else if(cursor == "splitv")
mLastSetCursor = UI_CURSOR_SIZENS;
else if(cursor == "hand")
mLastSetCursor = UI_CURSOR_HAND;
else // for anything else, default to the arrow
mLastSetCursor = UI_CURSOR_ARROW;
mLastSetCursor = getCursorFromString(cursor);
}
break;

View File

@ -7700,6 +7700,32 @@ class LLAvatarToggleMyProfile : public view_listener_t
}
};
class LLAvatarToggleSearch : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLFloater* instance = LLFloaterReg::findInstance("search");
if (LLFloater::isMinimized(instance))
{
instance->setMinimized(FALSE);
instance->setFocus(TRUE);
}
else if (!LLFloater::isShown(instance))
{
LLFloaterReg::showInstance("search");
}
else if (!instance->hasFocus() && !instance->getIsChrome())
{
instance->setFocus(TRUE);
}
else
{
instance->closeFloater();
}
return true;
}
};
class LLAvatarResetSkeleton: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -12025,6 +12051,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarTexRefresh(), "Avatar.TexRefresh"); // ## Zi: Texture Refresh
view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
view_listener_t::addMenu(new LLAvatarToggleSearch(), "Avatar.ToggleSearch");
view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton");
view_listener_t::addMenu(new LLAvatarEnableResetSkeleton(), "Avatar.EnableResetSkeleton");
view_listener_t::addMenu(new LLAvatarResetSkeletonAndAnimations(), "Avatar.ResetSkeletonAndAnimations");

View File

@ -1526,7 +1526,12 @@ void LLViewerRegion::clearCachedVisibleObjects()
for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin();
iter != mImpl->mActiveSet.end(); ++iter)
{
LLDrawable* drawablep = (LLDrawable*)(*iter)->getEntry()->getDrawable();
LLVOCacheEntry* vo_entry = *iter;
if (!vo_entry || !vo_entry->getEntry())
{
continue;
}
LLDrawable* drawablep = (LLDrawable*)vo_entry->getEntry()->getDrawable();
if(drawablep && !drawablep->getParent())
{

View File

@ -211,6 +211,7 @@ LLTrace::EventStatHandle<F64Seconds > AVATAR_EDIT_TIME("avataredittime", "Second
LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT_RATE("object_cache_hits");
LLTrace::EventStatHandle<F64Seconds > TEXTURE_FETCH_TIME("texture_fetch_time");
}
LLViewerStats::LLViewerStats()
@ -391,15 +392,6 @@ void update_statistics()
add(LLStatViewer::ASSET_UDP_DATA_RECEIVED, F64Bits(gTransferManager.getTransferBitsIn(LLTCT_ASSET)));
gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
gTextureTimer.pause();
}
else
{
gTextureTimer.unpause();
}
sample(LLStatViewer::VISIBLE_AVATARS, LLVOAvatar::sNumVisibleAvatars);
LLWorld::getInstance()->updateNetStats();
LLWorld::getInstance()->requestCacheMisses();
@ -421,6 +413,19 @@ void update_statistics()
}
}
void update_texture_time()
{
if (gTextureList.isPrioRequestsFetched())
{
gTextureTimer.pause();
}
else
{
gTextureTimer.unpause();
}
record(LLStatViewer::TEXTURE_FETCH_TIME, gTextureTimer.getElapsedTimeF32());
}
/*
* The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats.
*

View File

@ -299,6 +299,7 @@ static const F32 SEND_STATS_PERIOD = 300.0f;
// The following are from (older?) statistics code found in appviewer.
void update_statistics();
void send_viewer_stats(bool include_preferences);
void update_texture_time();
extern LLFrameTimer gTextureTimer;
extern U32Bytes gTotalTextureData;

View File

@ -454,6 +454,7 @@ public:
BOOL isFullyLoaded() const;
BOOL hasFetcher() const { return mHasFetcher;}
bool isFetching() const { return mIsFetching;}
void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
void forceToDeleteRequest();

View File

@ -206,6 +206,9 @@ static std::string get_texture_list_name()
void LLViewerTextureList::doPrefetchImages()
{
gTextureTimer.start();
gTextureTimer.pause();
if (LLAppViewer::instance()->getPurgeCache())
{
// cache was purged, no point
@ -1559,6 +1562,33 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl
return max_texmem;
}
bool LLViewerTextureList::isPrioRequestsFetched()
{
static LLCachedControl<F32> prio_threshold(gSavedSettings, "TextureFetchUpdatePriorityThreshold", 0.0f);
static LLCachedControl<F32> fetching_textures_threshold(gSavedSettings, "TextureListFetchingThreshold", 0.97f);
S32 fetching_tex_count = 0;
S32 tex_count_threshold = gTextureList.mImageList.size() * (1 - fetching_textures_threshold);
for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin();
iter != gTextureList.mImageList.end(); )
{
LLPointer<LLViewerFetchedTexture> imagep = *iter++;
if (imagep->getDecodePriority() > prio_threshold)
{
if (imagep->hasFetcher() || imagep->isFetching())
{
fetching_tex_count++;
if (fetching_tex_count >= tex_count_threshold)
{
return false;
}
}
}
}
return true;
}
const S32Megabytes VIDEO_CARD_FRAMEBUFFER_MEM(12);
const S32Megabytes MIN_MEM_FOR_NON_TEXTURE(512);
void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem)

View File

@ -145,6 +145,8 @@ public:
// <FS:Ansariel> Proper texture memory calculation
//static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier);
static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier, bool clamp_upper_limit = true);
static bool isPrioRequestsFetched();
private:
void updateImagesDecodePriorities();

View File

@ -3300,59 +3300,63 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
if (keyboard_focus
&& !gFocusMgr.getKeystrokesOnly())
{
#ifdef LL_WINDOWS
// On windows Alt Gr key generates additional Ctrl event, as result handling situations
// like 'AltGr + D' will result in 'Alt+Ctrl+D'. If it results in WM_CHAR, don't let it
// pass into menu or it will trigger 'develop' menu assigned to this combination on top
// of character handling.
// Alt Gr can be additionally modified by Shift
const MASK alt_gr = MASK_CONTROL | MASK_ALT;
LLWindowWin32 *window = static_cast<LLWindowWin32*>(mWindow);
U32 raw_key = window->getRawWParam();
if ((mask & alt_gr) != 0
&& ((raw_key >= 0x30 && raw_key <= 0x5A) //0-9, plus normal chartacters
|| (raw_key >= 0xBA && raw_key <= 0xE4)) // Misc/OEM characters that can be covered by AltGr, ex: -, =, ~
&& (GetKeyState(VK_RMENU) & 0x8000) != 0
&& (GetKeyState(VK_RCONTROL) & 0x8000) == 0) // ensure right control is not pressed, only left one
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(keyboard_focus);
if (cur_focus && cur_focus->acceptsTextInput())
{
// Alt Gr key is represented as right alt and left control.
// Any alt+ctrl combination is treated as Alt Gr by TranslateMessage() and
// will generate a WM_CHAR message, but here we only treat virtual Alt Graph
// key by checking if this specific combination has unicode char.
//
// I decided to handle only virtual RAlt+LCtrl==AltGr combination to minimize
// impact on menu, but the right way might be to handle all Alt+Ctrl calls.
BYTE keyboard_state[256];
if (GetKeyboardState(keyboard_state))
#ifdef LL_WINDOWS
// On windows Alt Gr key generates additional Ctrl event, as result handling situations
// like 'AltGr + D' will result in 'Alt+Ctrl+D'. If it results in WM_CHAR, don't let it
// pass into menu or it will trigger 'develop' menu assigned to this combination on top
// of character handling.
// Alt Gr can be additionally modified by Shift
const MASK alt_gr = MASK_CONTROL | MASK_ALT;
LLWindowWin32 *window = static_cast<LLWindowWin32*>(mWindow);
U32 raw_key = window->getRawWParam();
if ((mask & alt_gr) != 0
&& ((raw_key >= 0x30 && raw_key <= 0x5A) //0-9, plus normal chartacters
|| (raw_key >= 0xBA && raw_key <= 0xE4)) // Misc/OEM characters that can be covered by AltGr, ex: -, =, ~
&& (GetKeyState(VK_RMENU) & 0x8000) != 0
&& (GetKeyState(VK_RCONTROL) & 0x8000) == 0) // ensure right control is not pressed, only left one
{
const int char_count = 6;
wchar_t chars[char_count];
HKL layout = GetKeyboardLayout(0);
// ToUnicodeEx changes buffer state on OS below Win10, which is undesirable,
// but since we already did a TranslateMessage() in gatherInput(), this
// should have no negative effect
int res = ToUnicodeEx(key, 0, keyboard_state, chars, char_count, 1 << 2 /*do not modify buffer flag*/, layout);
if (res == 1 && chars[0] >= 0x20)
// Alt Gr key is represented as right alt and left control.
// Any alt+ctrl combination is treated as Alt Gr by TranslateMessage() and
// will generate a WM_CHAR message, but here we only treat virtual Alt Graph
// key by checking if this specific combination has unicode char.
//
// I decided to handle only virtual RAlt+LCtrl==AltGr combination to minimize
// impact on menu, but the right way might be to handle all Alt+Ctrl calls.
BYTE keyboard_state[256];
if (GetKeyboardState(keyboard_state))
{
// Let it fall through to character handler and get a WM_CHAR.
return TRUE;
const int char_count = 6;
wchar_t chars[char_count];
HKL layout = GetKeyboardLayout(0);
// ToUnicodeEx changes buffer state on OS below Win10, which is undesirable,
// but since we already did a TranslateMessage() in gatherInput(), this
// should have no negative effect
int res = ToUnicodeEx(key, 0, keyboard_state, chars, char_count, 1 << 2 /*do not modify buffer flag*/, layout);
if (res == 1 && chars[0] >= 0x20)
{
// Let it fall through to character handler and get a WM_CHAR.
return TRUE;
}
}
}
}
#endif
if (!(mask & (MASK_CONTROL | MASK_ALT)))
{
// We have keyboard focus, and it's not an accelerator
if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown())
if (!(mask & (MASK_CONTROL | MASK_ALT)))
{
return keyboard_focus->handleKey(key, mask, FALSE);
}
else if (key < 0x80)
{
// Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first.
return TRUE;
// We have keyboard focus, and it's not an accelerator
if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown())
{
return keyboard_focus->handleKey(key, mask, FALSE);
}
else if (key < 0x80)
{
// Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first.
return TRUE;
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 326 B

View File

@ -36,15 +36,13 @@
stat="FramePixelDifference"
bar_max="100"
tick_spacing="10"
unit_scale="100"
precision="0"/>
unit_scale="100"/>
<stat_bar name="bandwidth"
label="UDP Data Received"
orientation="horizontal"
stat="activemessagedatareceived"
bar_max="5000"
tick_spacing="500"
precision="0"/>
tick_spacing="500"/>
<stat_bar name="packet_loss"
label="Packet Loss"
orientation="horizontal"
@ -52,9 +50,7 @@
stat="packetslostpercentstat"
bar_max="5"
tick_spacing="0.5"
precision="3"
show_bar="false"
show_mean="true"/>
show_bar="false"/>
</stat_view>
<!--Advanced Section-->
<stat_view name="advanced"
@ -72,7 +68,6 @@
stat="numobjectsstat"
bar_max="50000"
tick_spacing="5000"
precision="0"
show_bar="false"/>
<stat_bar name="newobjs"
label="New Objects"
@ -108,12 +103,48 @@
<stat_bar name="texture_cache_read_latency"
label="Cache Read Latency"
orientation="horizontal"
unit_label="msec"
unit_label="sec"
stat="texture_cache_read_latency"
bar_max="1000.f"
tick_spacing="100"
show_history="true"
show_bar="false"/>
<stat_bar name="texture_decode_latency"
label="Cache Decode Latency"
orientation="horizontal"
unit_label="sec"
stat="texture_decode_latency"
bar_max="1000.f"
tick_spacing="100"
show_history="true"
show_bar="false"/>
<stat_bar name="texture_decode_latency"
label="Cache Write Latency"
orientation="horizontal"
unit_label="sec"
stat="texture_write_latency"
bar_max="1000.f"
tick_spacing="100"
show_history="true"
show_bar="false"/>
<stat_bar name="texture_fetch_latency"
label="Cache Fetch Latency"
orientation="horizontal"
unit_label="sec"
stat="texture_fetch_latency"
bar_max="1000.f"
tick_spacing="100"
show_history="true"
show_bar="false"/>
<stat_bar name="texture_fetch_time"
label="Cache Fetch Time"
orientation="horizontal"
unit_label="sec"
stat="texture_fetch_time"
bar_max="1000.f"
tick_spacing="100"
show_history="true"
show_bar="false"/>
<stat_bar name="numimagesstat"
label="Count"
orientation="horizontal"
@ -141,7 +172,6 @@
unit_label="/sec"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="packetsoutstat"
label="Packets Out"
@ -150,7 +180,6 @@
unit_label="/sec"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="objectdatareceived"
label="Objects"
@ -159,7 +188,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="texturedatareceived"
label="Texture"
@ -168,7 +196,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="assetudpdatareceived"
label="Asset"
@ -177,7 +204,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="layersdatareceived"
label="Layers"
@ -186,7 +212,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="messagedatain"
label="Actual In"
@ -195,7 +220,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="messagedataout"
label="Actual Out"
@ -204,7 +228,6 @@
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
</stat_view>
</stat_view>
@ -217,77 +240,61 @@
label="Objects"
orientation="horizontal"
stat="simobjects"
precision="0"
bar_max="30000.f"
tick_spacing="5000.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simactiveobjects"
label="Active Objects"
orientation="horizontal"
stat="simactiveobjects"
precision="0"
bar_max="5000.f"
tick_spacing="750.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simactivescripts"
label="Active Scripts"
orientation="horizontal"
stat="simactivescripts"
precision="0"
bar_max="15000.f"
tick_spacing="1875.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="siminpps"
label="Packets In"
orientation="horizontal"
stat="siminpps"
unit_label="pps"
precision="0"
bar_max="2000.f"
tick_spacing="250.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simoutpps"
label="Packets Out"
orientation="horizontal"
stat="simoutpps"
unit_label="pps"
precision="0"
bar_max="2000.f"
tick_spacing="250.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simpendingdownloads"
label="Pending Downloads"
orientation="horizontal"
stat="simpendingdownloads"
precision="0"
bar_max="800.f"
tick_spacing="100.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simpendinguploads"
label="Pending Uploads"
orientation="horizontal"
stat="simpendinguploads"
precision="0"
bar_max="100.f"
tick_spacing="25.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simtotalunackedbytes"
label="Total Unacked Bytes"
orientation="horizontal"
stat="simtotalunackedbytes"
unit_label="kb"
precision="1"
bar_max="100000.f"
tick_spacing="25000.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_view name="simperf"
label="Time (ms)"
show_label="true">
@ -296,81 +303,65 @@
orientation="horizontal"
stat="simframemsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simnetmsec"
label="Net Time"
orientation="horizontal"
stat="simnetmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsimphysicsmsec"
label="Physics Time"
orientation="horizontal"
stat="simsimphysicsmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsimothermsec"
label="Simulation Time"
orientation="horizontal"
stat="simsimothermsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simagentmsec"
label="Agent Time"
orientation="horizontal"
stat="simagentmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simimagesmsec"
label="Images Time"
orientation="horizontal"
stat="simimagesmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simscriptmsec"
label="Script Time"
orientation="horizontal"
stat="simscriptmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsparemsec"
label="Spare Time"
orientation="horizontal"
stat="simsparemsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<!--2nd level time blocks under 'Details' second-->
<stat_view name="timedetails"
label="Time Details (ms)"
@ -380,51 +371,41 @@
orientation="horizontal"
stat="simsimphysicsstepmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsimphysicsshapeupdatemsec"
label=" Update Phys Shapes"
orientation="horizontal"
stat="simsimphysicsshapeupdatemsec"
unit_label="ms"
precision="3"
bar_max="40.f"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsimphysicsothermsec"
label=" Physics Other"
orientation="horizontal"
stat="simsimphysicsothermsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simsleepmsec"
label=" Sleep Time"
orientation="horizontal"
stat="simsleepmsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
<stat_bar name="simpumpiomsec"
label=" Pump IO"
orientation="horizontal"
stat="simpumpiomsec"
unit_label="ms"
precision="3"
bar_max="40.f"
tick_spacing="10.f"
show_bar="false"
show_mean="false"/>
show_bar="false"/>
</stat_view>
</stat_view>
</stat_view>

View File

@ -317,6 +317,18 @@
<button.commit_callback
function="TexFetchDebugger.Close" />
</button>
<button
follows="left|top"
height="22"
label="Reset Fetching Time"
layout="topleft"
left_pad="175"
name="reset_time_btn"
top_delta="0"
width="120">
<button.commit_callback
function="TexFetchDebugger.ResetFetchTime" />
</button>
<button
follows="left|top"
height="20"

View File

@ -2228,8 +2228,7 @@
label="Search"
name="Search">
<menu_item_call.on_click
function="Floater.Show"
parameter="search"/>
function="Avatar.ToggleSearch"/>
</menu_item_call>
-->
<menu_item_check
@ -2240,8 +2239,7 @@
function="Floater.Visible"
parameter="search" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="search" />
function="Avatar.ToggleSearch"/>
</menu_item_check>
<menu_item_call

View File

@ -72,7 +72,7 @@
left_delta="50"
name="region_type"
top_delta="0"
width="225">
width="400">
unknown
</text>
<text

View File

@ -0,0 +1,55 @@
#!/usr/bin/python
"""\
@file slp_conv.py
@author Callum Prentice
@date 2021-01-26
@brief Convert a Second Life Performance (SLP) file generated
by the Viewer into an comma separated value (CSV) file
for import into spreadsheets and other data analytics tools.
$LicenseInfo:firstyear=2018&license=internal$
Copyright (c) 2018, Linden Research, Inc.
$/LicenseInfo$
"""
from llbase import llsd
import argparse
parser = argparse.ArgumentParser(
description="Converts Viewer SLP files into CSV for import into spreadsheets etc."
)
parser.add_argument(
"infilename",
help="Name of SLP file to read",
)
parser.add_argument(
"outfilename",
help="Name of CSV file to create",
)
args = parser.parse_args()
with open(args.infilename, "r") as slp_file:
slps = slp_file.readlines()
print "Reading from %s - %d items" % (args.infilename, len(slps))
with open(args.outfilename, "w") as csv_file:
print "Writing to %s" % args.outfilename
for index, each_slp in enumerate(slps):
slp_entry = llsd.parse(each_slp)
first_key = slp_entry.keys()[0]
# first entry so write column headers
if index == 0:
line = ""
for key, value in slp_entry[first_key].iteritems():
line += key
line += ", "
csv_file.write("entry, %s, \n" % line)
# write line of data
line = ""
for key, value in slp_entry[first_key].iteritems():
line += str(value)
line += ", "
csv_file.write("%s, %s, \n" % (first_key, str(line)))