Merge branch 'DRTVWR-530-maint' of https://bitbucket.org/lindenlab/viewer
commit
1536fdd1c3
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1102,6 +1102,7 @@ Nicky Dasmijn
|
|||
OPEN-187
|
||||
STORM-1937
|
||||
OPEN-187
|
||||
SL-15234
|
||||
STORM-2010
|
||||
STORM-2082
|
||||
MAINT-6665
|
||||
|
|
|
|||
|
|
@ -189,7 +189,6 @@ LLMetricPerformanceTesterBasic::~LLMetricPerformanceTesterBasic()
|
|||
void LLMetricPerformanceTesterBasic::preOutputTestResults(LLSD* sd)
|
||||
{
|
||||
incrementCurrentCount() ;
|
||||
(*sd)[getCurrentLabelName()]["Name"] = mName ;
|
||||
}
|
||||
|
||||
void LLMetricPerformanceTesterBasic::postOutputTestResults(LLSD* sd)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ public:
|
|||
void onClickStart();
|
||||
void onClickClear();
|
||||
void onClickClose();
|
||||
void onClickResetFetchTime();
|
||||
|
||||
void onClickCacheRead();
|
||||
void onClickCacheWrite();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -415,6 +415,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
|
|||
if (cell)
|
||||
{
|
||||
cell->setValue(prefix + fullname);
|
||||
cell->setAltValue(name_item.alt_value());
|
||||
}
|
||||
|
||||
dirtyColumns();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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() {};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ class LLViewerJoystick : public LLSingleton<LLViewerJoystick>
|
|||
{
|
||||
LLSINGLETON(LLViewerJoystick);
|
||||
virtual ~LLViewerJoystick();
|
||||
LOG_CLASS(LLViewerJoystick);
|
||||
|
||||
public:
|
||||
void init(bool autoenable);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@
|
|||
left_delta="50"
|
||||
name="region_type"
|
||||
top_delta="0"
|
||||
width="225">
|
||||
width="400">
|
||||
unknown
|
||||
</text>
|
||||
<text
|
||||
|
|
|
|||
|
|
@ -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)))
|
||||
Loading…
Reference in New Issue