diff options
Diffstat (limited to 'indra/newview')
58 files changed, 553 insertions, 369 deletions
| diff --git a/indra/newview/app_settings/key_bindings.xml b/indra/newview/app_settings/key_bindings.xml index 4f6deb1f98..2ec9a2586c 100644 --- a/indra/newview/app_settings/key_bindings.xml +++ b/indra/newview/app_settings/key_bindings.xml @@ -32,7 +32,7 @@      <binding key="ENTER" mask="NONE" command="start_chat"/>      <binding key="DIVIDE" mask="NONE" command="start_gesture"/> -    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> +    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>    </first_person>    <third_person>      <binding key="A" mask="NONE" command="turn_left"/> @@ -125,7 +125,7 @@      <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>      <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> -    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> +    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>      <binding key="" mask="NONE" mouse="LMB" command="walk_to"/>    </third_person>    <sitting> @@ -223,7 +223,7 @@      <binding key="ENTER" mask="NONE" command="start_chat"/>      <binding key="DIVIDE" mask="NONE" command="start_gesture"/> -    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> +    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>    </sitting>    <edit_avatar>      <!--Avatar editing camera controls--> @@ -250,6 +250,6 @@      <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>      <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> -    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> +    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>    </edit_avatar>  </keys> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index eeb7e6f0aa..6d93ba927f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8308,13 +8308,13 @@      <key>PushToTalkToggle</key>      <map>        <key>Comment</key> -      <string>Should the push-to-talk button behave as a toggle</string> +      <string>Should the push-to-talk toolbar button behave as a toggle</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>      <key>QAMode</key>      <map> @@ -12524,6 +12524,17 @@        <key>Value</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> @@ -12612,6 +12623,17 @@        <key>Value</key>        <integer>32</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> diff --git a/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tif b/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tifBinary files differ new file mode 100644 index 0000000000..85fec76fca --- /dev/null +++ b/indra/newview/cursors_mac/UI_CURSOR_SIZEALL.tif diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tifBinary files differ new file mode 100644 index 0000000000..d64a7f2b68 --- /dev/null +++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLZOOMOUT.tif diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 389448654a..91082e053b 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3911,16 +3911,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(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f668dc754d..5ca935518e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1755,12 +1755,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. @@ -4570,11 +4572,6 @@ void LLAppViewer::loadKeyBindings()  			LLKeyboard::keyFromString(key_string, &key);  		} -		value = gSavedSettings.getBOOL("PushToTalkToggle"); -		std::string control_name = value ? "toggle_voice" : "voice_follow_key"; -		third_person_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true); -		sitting_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true); -  		if (third_person_view.hasUnsavedChanges())  		{  			// calls loadBindingsXML() @@ -4586,25 +4583,6 @@ void LLAppViewer::loadKeyBindings()  			// calls loadBindingsXML()  			sitting_view.saveToSettings();  		} - -		// in case of voice we need to repeat this in other modes - -		for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i) -		{ -			// edit and first person modes; MODE_SAVED_SETTINGS not in use at the moment -			if (i != LLKeyConflictHandler::MODE_THIRD_PERSON && i != LLKeyConflictHandler::MODE_SITTING) -			{ -				LLKeyConflictHandler handler((LLKeyConflictHandler::ESourceMode)i); - -				handler.registerControl(control_name, 0, mouse, key, MASK_NONE, true); - -				if (handler.hasUnsavedChanges()) -				{ -					// calls loadBindingsXML() -					handler.saveToSettings(); -				} -			} -		}  	}  	// since something might have gone wrong or there might have been nothing to save  	// (and because otherwise following code will have to be encased in else{}), @@ -4924,6 +4902,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) diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp index 0460bff1b4..7614624306 100644 --- a/indra/newview/llbrowsernotification.cpp +++ b/indra/newview/llbrowsernotification.cpp @@ -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); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 9201c6bc00..aceedda07e 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -546,6 +546,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; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 687b13d2c8..61b357dd68 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -574,10 +574,9 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)  	}  	LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance();  	BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor(); -	if (oa == LLVOAvatar::AOA_INVISIBLE || -		(impostor && oa == LLVOAvatar::AOA_JELLYDOLL)) +	if (impostor || (oa == LLVOAvatar::AOA_INVISIBLE))  	{ -		// No shadows for jellydolled or invisible avs. +		// No shadows for impostored (including jellydolled) or invisible avs.  		return;  	} diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 4a802ad9aa..f1b64a5899 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1074,6 +1074,13 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to,  LLVector2* res_st_offs      F32 map_rot = 0.f, map_scaleS = 0.f, map_scaleT = 0.f, map_offsS = 0.f, map_offsT = 0.f; +    LLMaterial* mat = orig_tep->getMaterialParams(); +    if (!mat && map != LLRender::DIFFUSE_MAP) +    { +        LL_WARNS_ONCE("llface") << "Face is set to use specular or normal map but has no material, defaulting to diffuse" << LL_ENDL; +        map = LLRender::DIFFUSE_MAP; +    } +      switch (map)      {      case LLRender::DIFFUSE_MAP: @@ -1084,26 +1091,26 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to,  LLVector2* res_st_offs          map_offsT = orig_tep->mOffsetT;          break;      case LLRender::NORMAL_MAP: -        if (orig_tep->getMaterialParams()->getNormalID().isNull()) +        if (mat->getNormalID().isNull())          {              return false;          } -        map_rot = orig_tep->getMaterialParams()->getNormalRotation(); -        map_scaleS = orig_tep->getMaterialParams()->getNormalRepeatX(); -        map_scaleT = orig_tep->getMaterialParams()->getNormalRepeatY(); -        map_offsS = orig_tep->getMaterialParams()->getNormalOffsetX(); -        map_offsT = orig_tep->getMaterialParams()->getNormalOffsetY(); +        map_rot = mat->getNormalRotation(); +        map_scaleS = mat->getNormalRepeatX(); +        map_scaleT = mat->getNormalRepeatY(); +        map_offsS = mat->getNormalOffsetX(); +        map_offsT = mat->getNormalOffsetY();          break;      case LLRender::SPECULAR_MAP: -        if (orig_tep->getMaterialParams()->getSpecularID().isNull()) +        if (mat->getSpecularID().isNull())          {              return false;          } -        map_rot = orig_tep->getMaterialParams()->getSpecularRotation(); -        map_scaleS = orig_tep->getMaterialParams()->getSpecularRepeatX(); -        map_scaleT = orig_tep->getMaterialParams()->getSpecularRepeatY(); -        map_offsS = orig_tep->getMaterialParams()->getSpecularOffsetX(); -        map_offsT = orig_tep->getMaterialParams()->getSpecularOffsetY(); +        map_rot = mat->getSpecularRotation(); +        map_scaleS = mat->getSpecularRepeatX(); +        map_scaleT = mat->getSpecularRepeatY(); +        map_offsS = mat->getSpecularOffsetX(); +        map_offsT = mat->getSpecularOffsetY();          break;      default: /*make compiler happy*/          break; diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 441979389e..43dc304c10 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -384,13 +384,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() diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index af0e56e448..04133f2710 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2468,6 +2468,7 @@ BOOL LLPanelLandAccess::postBuild()  	{  		mListBanned->sortByColumnIndex(0, TRUE); // ascending  		mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR); +		mListBanned->setAlternateSort();  	}  	return TRUE; @@ -2570,11 +2571,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) @@ -2611,6 +2613,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); diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 749a3d2686..8633fe4e5e 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -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; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index d9edd4dc30..1dbf0d84cb 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -342,7 +342,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));  } @@ -803,9 +803,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(); @@ -1545,7 +1542,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)); @@ -1718,9 +1715,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); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 8a01b0c307..bb8cf1c587 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -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); diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp index 9a23d99802..cda4dc8bcc 100644 --- a/indra/newview/llfloatertexturefetchdebugger.cpp +++ b/indra/newview/llfloatertexturefetchdebugger.cpp @@ -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; diff --git a/indra/newview/llfloatertexturefetchdebugger.h b/indra/newview/llfloatertexturefetchdebugger.h index 096ad88e07..637f3b03e5 100644 --- a/indra/newview/llfloatertexturefetchdebugger.h +++ b/indra/newview/llfloatertexturefetchdebugger.h @@ -44,6 +44,7 @@ public:  	void onClickStart();  	void onClickClear();  	void onClickClose(); +	void onClickResetFetchTime();  	void onClickCacheRead();  	void onClickCacheWrite(); diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 63bce3d2eb..d5c2ad5f81 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -204,6 +204,7 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  	self->getChildView("ok_btn")->setEnabled(false);  	self->getChildView("cancel_btn")->setEnabled(false);  	self->getChildView("media_entry")->setEnabled(false); +    self->getChildView("clear_btn")->setEnabled(false);  }  // static diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 7c957ac712..598a8d4c05 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -333,7 +333,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)  		{ diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp index c2b29f36e8..0fa3dc1110 100644 --- a/indra/newview/llimhandler.cpp +++ b/indra/newview/llimhandler.cpp @@ -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())      { diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 1059324a16..3017d927e5 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -900,7 +900,7 @@ bool LLIMModel::LLIMSession::isOutgoingAdHoc() const  bool LLIMModel::LLIMSession::isAdHoc()  { -	return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID)); +	return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID, TRUE));  }  bool LLIMModel::LLIMSession::isP2P() @@ -910,7 +910,7 @@ bool LLIMModel::LLIMSession::isP2P()  bool LLIMModel::LLIMSession::isGroupChat()  { -	return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID)); +	return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID, TRUE));  }  bool LLIMModel::LLIMSession::isOtherParticipantAvaline() @@ -1701,7 +1701,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;  	} @@ -2035,7 +2035,7 @@ void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)  	// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them  	bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); -	bool is_group = participant_is_avatar && gAgent.isInGroup(session_id); +	bool is_group = participant_is_avatar && gAgent.isInGroup(session_id, TRUE);  	LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");  	LLGroupIconCtrl* group_icon = getChild<LLGroupIconCtrl>("group_icon"); @@ -2330,7 +2330,7 @@ BOOL LLIncomingCallDialog::postBuild()  	}  	std::string call_type; -	if (gAgent.isInGroup(session_id)) +	if (gAgent.isInGroup(session_id, TRUE))  	{  		LLStringUtil::format_map_t args;  		LLGroupData data; @@ -2507,8 +2507,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload  				switch(type){  				case IM_SESSION_CONFERENCE_START:  				case IM_SESSION_GROUP_START: -				case IM_SESSION_INVITE:		 -					if (gAgent.isInGroup(session_id)) +				case IM_SESSION_INVITE: +					if (gAgent.isInGroup(session_id, TRUE))  					{  						LLGroupData data;  						if (!gAgent.getGroupData(session_id, data)) break; @@ -3055,7 +3055,7 @@ void LLIMMgr::inviteToSession(  		notify_box_type = "VoiceInviteP2P";  		voice_invite = TRUE;  	} -	else if ( gAgent.isInGroup(session_id) ) +	else if ( gAgent.isInGroup(session_id, TRUE) )  	{  		//only really old school groups have voice invitations  		notify_box_type = "VoiceInviteGroup"; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 9cc67766ca..d239b23e83 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -255,7 +255,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 @@ -327,7 +327,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); @@ -1843,7 +1843,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;  } diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 2cb2b1e877..8915bfa1e0 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -68,7 +68,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(); diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp index b6107eeedf..52e14d48f7 100644 --- a/indra/newview/llkeyconflict.cpp +++ b/indra/newview/llkeyconflict.cpp @@ -644,7 +644,6 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)              data = getControl("voice_follow_key", 0);          } -        gSavedSettings.setBOOL("PushToTalkToggle", can_toggle);          if (data.isEmpty())          {              // legacy viewer has a bug that might crash it if NONE value is assigned. diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index aa0c7fb73b..044c76ce2c 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -1025,6 +1025,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) @@ -1092,6 +1098,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) diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index a9e80ab5da..6b50e1f800 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -253,27 +253,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()) @@ -285,8 +272,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]; @@ -295,11 +280,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)              { @@ -308,58 +288,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;  }  void LLModelPreview::rebuildUploadData() @@ -1694,8 +1630,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim          }      } -    mResourceCost = calcResourceCost(); -      LLVertexBuffer::unbind();      LLGLSLShader::sNoFixedFunction = no_ff;      if (shader) @@ -2533,9 +2467,8 @@ void LLModelPreview::update()      if (mDirty && mLodsQuery.empty())      {          mDirty = false; -        mResourceCost = calcResourceCost(); +        updateDimentionsAndOffsets();          refresh(); -        updateStatusMessages();      }  } @@ -2811,8 +2744,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) -                    mViewOption["show_skin_weight"] = true; -                    skin_weight = true;                      fmp->childSetValue("upload_skin", true);                      mFirstSkinUpdate = false;                  } diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 3664a27a72..8e59c71a55 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -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; @@ -158,7 +158,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); @@ -239,7 +239,6 @@ protected:      LLVector3	mPreviewScale;      S32			mPreviewLOD;      S32			mPhysicsSearchLOD; -    U32			mResourceCost;      std::string mLODFile[LLModel::NUM_LODS];      bool		mLoading;      U32			mLoadState; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 3209d23e43..5215126789 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -398,6 +398,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(  	if (cell)  	{  		cell->setValue(prefix + fullname); +		cell->setAltValue(name_item.alt_value());  	}  	dirtyColumns(); diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 58a9b01a45..90b9cdc133 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -69,7 +69,7 @@ void LLAlertHandler::initChannel()  }  //-------------------------------------------------------------------------- -bool LLAlertHandler::processNotification(const LLNotificationPtr& notification) +bool LLAlertHandler::processNotification(const LLNotificationPtr& notification, bool should_log)  {  	if(mChannel.isDead())  	{ @@ -131,7 +131,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)  	{ diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index 8fef102cf8..f87ebf219b 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -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())  	{ diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index ef4aced2c7..ddc957c941 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -96,10 +96,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 @@ -136,7 +136,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(); @@ -152,7 +152,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(); @@ -170,7 +170,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: @@ -188,7 +188,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(); @@ -204,7 +204,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(); @@ -220,7 +220,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() {}; @@ -238,7 +238,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(); @@ -256,7 +256,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() {}; @@ -271,7 +271,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() {}; diff --git a/indra/newview/llnotificationhinthandler.cpp b/indra/newview/llnotificationhinthandler.cpp index f1226c53ff..44ebc5ed47 100644 --- a/indra/newview/llnotificationhinthandler.cpp +++ b/indra/newview/llnotificationhinthandler.cpp @@ -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;  } diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index a9678b1e93..201eaeb9f8 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -68,7 +68,7 @@ void LLOfferHandler::initChannel()  }  //-------------------------------------------------------------------------- -bool LLOfferHandler::processNotification(const LLNotificationPtr& notification) +bool LLOfferHandler::processNotification(const LLNotificationPtr& notification, bool should_log)  {  	if(mChannel.isDead())  	{ diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index ba831ab2ed..43c3ee3ce2 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -92,7 +92,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())  	{ @@ -105,7 +105,7 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)  		initChannel();  	} -	if (notification->canLogToIM()) +	if (should_log && notification->canLogToIM())  	{  		LLHandlerUtil::logToIMP2P(notification);  	} diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index a6ef130cd0..91f93067de 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -66,7 +66,7 @@ void LLTipHandler::initChannel()  }  //-------------------------------------------------------------------------- -bool LLTipHandler::processNotification(const LLNotificationPtr& notification) +bool LLTipHandler::processNotification(const LLNotificationPtr& notification, bool should_log)  {  	if(mChannel.isDead())  	{ diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 6a1597fad5..718b67dbde 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -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,7 +155,7 @@ void LLOutfitGallery::updateRowsIfNeeded()      {          reArrangeRows(1);      } -    else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > 3) +    else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)      {          reArrangeRows(-1);      } diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index f95ab9928d..18888f2723 100644 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -150,7 +150,7 @@ void LLPersistentNotificationStorage::loadNotifications()  		LLNotificationResponderPtr responder(createResponder(notification_params["name"], notification_params["responder"]));  		notification->setResponseFunctor(responder); -		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); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index f64db7beb5..e7b756bf4a 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -70,8 +70,12 @@ 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"); +  //////////////////////////////////////////////////////////////////////////////  //  // Introduction @@ -438,6 +442,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, @@ -517,28 +544,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, @@ -551,7 +556,7 @@ private:  		CAN_WRITE = 1,  		SHOULD_WRITE = 2  	}; -	static const char* sStateDescs[]; +  	e_state mState;  	void setState(e_state new_state); @@ -579,10 +584,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, @@ -866,8 +876,7 @@ bool truncate_viewer_metrics(int max_regions, LLSD & metrics);  ////////////////////////////////////////////////////////////////////////////// -//static -const char* LLTextureFetchWorker::sStateDescs[] = { +const char* sStateDescs[] = {  	"INVALID",  	"INIT",  	"LOAD_FROM_TEXTURE_CACHE", @@ -885,6 +894,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 @@ -916,6 +928,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,  	  mLoadedDiscard(-1),  	  mDecodedDiscard(-1),  	  mCacheReadTime(0.f), +	  mCacheWriteTime(0.f),  	  mDecodeTime(0.f),        mFetchTime(0.f),  	  mCacheReadHandle(LLTextureCache::nullHandle()), @@ -924,6 +937,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,  	  mRequestedOffset(0),  	  mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE),  	  mFileSize(0), +	  mSkippedStatesTime(0),  	  mCachedSize(0),  	  mLoaded(FALSE),  	  mSentRequest(UNSENT), @@ -1184,6 +1198,13 @@ bool LLTextureFetchWorker::doWork(S32 param)  	if (mState == INIT)  	{		 +		mStateTimer.reset(); +		mFetchTimer.reset(); +		for(auto i : LOGGED_STATES)  +		{ +			mStateTimersMap[i] = 0; +		} +		mSkippedStatesTime = 0;  		mRawImage = NULL ;  		mRequestedDiscard = -1;  		mLoadedDiscard = -1; @@ -1241,9 +1262,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())  			{ @@ -1251,9 +1273,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)  			{ @@ -1275,6 +1297,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				mCacheReadHandle = LLTextureCache::nullHandle();  				setState(CACHE_POST);                  add(LLTextureFetch::sCacheHit, 1.0); +				mCacheReadTime = mCacheReadTimer.getElapsedTimeF32();  				// fall through  			}  			else @@ -1888,7 +1911,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()); @@ -1982,6 +2005,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); @@ -1992,6 +2016,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  	{  		if (writeToCacheComplete())  		{ +			mCacheWriteTime = mCacheWriteTimer.getElapsedTimeF32();  			setState(DONE);  			// fall through  		} @@ -2500,7 +2525,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  ////////////////////////////////////////////////////////////////////////////// @@ -2625,6 +2649,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() @@ -2966,20 +3001,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  		{ @@ -3464,6 +3530,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;  } @@ -3679,7 +3760,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;  	} @@ -5121,4 +5202,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(); +} diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 2aa194e141..bf6732963f 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -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 diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h index 782c523d4f..3b4f898710 100644 --- a/indra/newview/llviewerjoystick.h +++ b/indra/newview/llviewerjoystick.h @@ -47,6 +47,7 @@ class LLViewerJoystick : public LLSingleton<LLViewerJoystick>  {  	LLSINGLETON(LLViewerJoystick);  	virtual ~LLViewerJoystick(); +    LOG_CLASS(LLViewerJoystick);  public:  	void init(bool autoenable); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index d0cf8ea407..0c66cad9ab 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3201,19 +3201,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; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 635b731193..dfc43ab439 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6216,6 +6216,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) @@ -9362,6 +9388,7 @@ void initialize_menus()  	enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));  	view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");  	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"); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 198fe1563c..c8bb4901d3 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1451,7 +1451,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())  		{ diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 314c1a1f1e..98d13f8979 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -207,6 +207,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()  @@ -388,15 +389,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(); @@ -418,6 +410,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.   * diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 04870e0c26..64b4628daa 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -295,6 +295,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; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 69568cc825..7b4b3d940f 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -415,6 +415,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(); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 561319ca5d..82973d3278 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -205,6 +205,9 @@ static std::string get_texture_list_name()  void LLViewerTextureList::doPrefetchImages()  { +	gTextureTimer.start(); +	gTextureTimer.pause(); +  	if (LLAppViewer::instance()->getPurgeCache())  	{  		// cache was purged, no point @@ -1402,6 +1405,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) diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 281d23c671..fead2e52b2 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -138,6 +138,8 @@ public:  	static S32Megabytes getMinVideoRamSetting();  	static S32Megabytes getMaxVideoRamSetting(bool get_recommended, float mem_multiplier); + +	static bool isPrioRequestsFetched();  private:  	void updateImagesDecodePriorities(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c20021d4c7..9e0f554a0a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -215,6 +215,7 @@  #if LL_WINDOWS  #include <tchar.h> // For Unicode conversion methods +#include "llwindowwin32.h" // For AltGr handling  #endif  // @@ -2890,57 +2891,64 @@ 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; -        if ((mask & alt_gr) != 0 -            && key >= 0x30 -            && key <= 0x5A -            && (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 +                    // ToUnicodeEx works with virtual key codes +                    int res = ToUnicodeEx(raw_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()) -            { -                return keyboard_focus->handleKey(key, mask, FALSE); -            } -            else if (key < 0x80) +            if (!(mask & (MASK_CONTROL | MASK_ALT)))              { -                // 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; +                }              }          }      } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index cd1b9c7c69..d797b64731 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7154,6 +7154,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,  		{  			if ((j == LLViewerRegion::PARTITION_VOLUME) ||   				(j == LLViewerRegion::PARTITION_BRIDGE) || +                (j == LLViewerRegion::PARTITION_AVATAR) || // for attachments  				(j == LLViewerRegion::PARTITION_CONTROL_AV) ||  				(j == LLViewerRegion::PARTITION_TERRAIN) ||  				(j == LLViewerRegion::PARTITION_TREE) || diff --git a/indra/newview/res-sdl/lltoolzoomout.BMP b/indra/newview/res-sdl/lltoolzoomout.BMPBinary files differ index 7f958383ab..5bdf96f80d 100644 --- a/indra/newview/res-sdl/lltoolzoomout.BMP +++ b/indra/newview/res-sdl/lltoolzoomout.BMP diff --git a/indra/newview/res-sdl/sizeall.BMP b/indra/newview/res-sdl/sizeall.BMPBinary files differ new file mode 100644 index 0000000000..03d9bf4654 --- /dev/null +++ b/indra/newview/res-sdl/sizeall.BMP diff --git a/indra/newview/res/lltoolzoomout.cur b/indra/newview/res/lltoolzoomout.curBinary files differ index b33e68d1a6..21e0ee9702 100644 --- a/indra/newview/res/lltoolzoomout.cur +++ b/indra/newview/res/lltoolzoomout.cur diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index ff2d8b4943..4ee26a312a 100755 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -99,6 +99,7 @@ END  TOOLGRAB                CURSOR                  "lltoolgrab.cur"  TOOLLAND                CURSOR                  "lltoolland.cur"  TOOLZOOMIN              CURSOR                  "lltoolzoomin.cur" +TOOLZOOMOUT             CURSOR                  "lltoolzoomout.cur"  TOOLCREATE              CURSOR                  "lltoolcreate.cur"  ARROWDRAG               CURSOR                  "llarrowdrag.cur"  ARROW                   CURSOR                  "llarrow.cur" diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml index 62cce3a1e3..3f493192ff 100644 --- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml @@ -36,16 +36,14 @@                    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"                    unit_label="kbps"                    stat="activemessagedatareceived"                    bar_max="5000" -                  tick_spacing="500" -                  precision="0"/> +                  tick_spacing="500"/>  			  <stat_bar name="packet_loss"                    label="Packet Loss"                    orientation="horizontal" @@ -53,9 +51,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" @@ -73,7 +69,6 @@                      stat="numobjectsstat"                      bar_max="50000"                      tick_spacing="5000" -                    precision="0"                      show_bar="false"/>            <stat_bar name="newobjs"                      label="New Objects" @@ -109,12 +104,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" @@ -142,7 +173,6 @@                      unit_label="/sec"                       bar_max="1024.f"                       tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="packetsoutstat"                      label="Packets Out" @@ -151,7 +181,6 @@                      unit_label="/sec"                        bar_max="1024.f"                       tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="objectdatareceived"                      label="Objects" @@ -160,7 +189,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="texturedatareceived"                      label="Texture" @@ -169,7 +197,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="assetudpdatareceived"                      label="Asset" @@ -178,7 +205,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="layersdatareceived"                      label="Layers" @@ -187,7 +213,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="messagedatain"                      label="Actual In" @@ -196,7 +221,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="messagedataout"                      label="Actual Out" @@ -205,7 +229,6 @@                      unit_label="kbps"                      bar_max="1024.f"                      tick_spacing="128.f" -                    precision="1"                      show_bar="false"/>  			    <stat_bar name="vfspendingoperations"                      label="VFS Pending Operations" @@ -224,77 +247,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"> @@ -303,81 +310,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)" @@ -387,51 +378,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> diff --git a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml index 1ea256b8b3..9278a1a598 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml @@ -319,6 +319,18 @@    </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"     label="Cache Read"     layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 72cce2208f..4e174cc832 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -703,8 +703,7 @@               function="Floater.Visible"               parameter="search" />              <menu_item_check.on_click -             function="Floater.Toggle" -             parameter="search" /> +             function="Avatar.ToggleSearch"/>              </menu_item_check>          <menu_item_separator/>          <menu_item_call @@ -765,7 +764,7 @@               label="My land holdings..."               name="My Land">              <menu_item_call.on_click -             function="Floater.Show" +             function="Floater.ShowOrBringToFront"               parameter="land_holdings" />        </menu_item_call>          <menu_item_call diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 898e92e030..d1cfb8ead6 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -51,7 +51,7 @@       left_delta="50"       name="version_channel_text"       top_delta="0" -     width="225"> +     width="400">          unknown      </text>      <text | 
