diff options
114 files changed, 3586 insertions, 432 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 89390d9977..d27521f09b 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -183,6 +183,7 @@ Ansariel Hiller  	BUG-3764  	STORM-1984  	STORM-1979 +	MAINT-4036  Aralara Rajal  Arare Chantilly  	CHUIBUG-191 @@ -735,6 +736,7 @@ Kitty Barnett  	STORM-1905      VWR-24217  	STORM-1804 +	MAINT-4036  Kolor Fall  Komiko Okamoto  Korvel Noh diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index e400877b3b..b24e14c72b 100755 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -793,8 +793,6 @@ BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time)  		}  	} -    removeFromBanList(agent_id); -          LLAccessEntry new_entry;      new_entry.mID			 = agent_id;      new_entry.mTime	 = time; @@ -838,8 +836,6 @@ BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time)          }      } -    removeFromAccessList(agent_id); -          LLAccessEntry new_entry;      new_entry.mID			 = agent_id;      new_entry.mTime	 = time; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index b0456e3ccf..df098e612f 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -191,7 +191,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  	U32 tc_count     = tc_source   ? tc.getCount() : 0;  	U32 norm_count   = norm_source ? n.getCount()  : 0; -	if (vertex_count == 0) +	if ((vertex_count == 0) || (tc_count == 0))  	{  		llwarns << "Unable to process mesh with empty position array; invalid model." << llendl;  		return LLModel::BAD_ELEMENT; diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index cca26f335a..474b545f00 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1371,7 +1371,8 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const std::string &searc  			}  		} -		const std::string current_item_label(search_item->getViewModelItem()->getSearchableName()); +		std::string current_item_label(search_item->getViewModelItem()->getSearchableName()); +		LLStringUtil::toUpper(current_item_label);  		S32 search_string_length = llmin(upper_case_string.size(), current_item_label.size());  		if (!current_item_label.compare(0, search_string_length, upper_case_string))  		{ diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 83254c2840..7213569487 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -655,7 +655,7 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L  	//  	const S32 TOP_PAD = default_params.item_top_pad; -	if (hasVisibleChildren() || getViewModelItem()->hasChildren()) +	if (hasVisibleChildren())  	{  		LLUIImage* arrow_image = default_params.folder_arrow_image;  		gl_draw_scaled_rotated_image( diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index b09c927782..45f4272aa7 100755 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -254,6 +254,7 @@ void LLLineEditor::onCommit()  	setControlValue(getValue());  	LLUICtrl::onCommit(); +	resetDirty();  	// Selection on commit needs to be turned off when evaluating maths  	// expressions, to allow indication of the error position diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 8906a6e736..a08b53767e 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -225,7 +225,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mParseHighlights(p.parse_highlights),  	mBGVisible(p.bg_visible),  	mScroller(NULL), -	mStyleDirty(true) +	mStyleDirty(true), +	mDrawRightmostCursor(false)  {  	if(p.allow_scroll)  	{ @@ -1510,6 +1511,11 @@ void LLTextBase::reflow()  		// find and erase line info structs starting at start_index and going to end of document  		if (!mLineInfoList.empty())  		{ +			if (mDrawRightmostCursor) +			{ +				start_index--; +			} +  			// find first element whose end comes after start_index  			line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());  			line_start_index = iter->mDocIndexStart; @@ -1698,6 +1704,11 @@ S32 LLTextBase::getLineNumFromDocIndex( S32 doc_index, bool include_wordwrap) co  	}  	else  	{ +		if (mDrawRightmostCursor) +		{ +			doc_index--; +		} +  		line_list_t::const_iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_index, line_end_compare());  		if (include_wordwrap)  		{ @@ -1726,6 +1737,11 @@ S32 LLTextBase::getLineOffsetFromDocIndex( S32 startpos, bool include_wordwrap)  	}  	else  	{ +		if (mDrawRightmostCursor) +		{ +			startpos--; +		} +  		line_list_t::const_iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), startpos, line_end_compare());  		return startpos - iter->mDocIndexStart;  	} @@ -2446,7 +2462,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  		}  		else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd)  		{ -			if (getLineNumFromDocIndex(line_iter->mDocIndexEnd - 1) == line_iter->mLineNum) +			if (getLineNumFromDocIndex(line_iter->mDocIndexEnd - 1) == line_iter->mLineNum && !mDrawRightmostCursor)  			{  				// if segment wraps to the next line we should step one char back  				// to compensate for the space char between words @@ -2479,8 +2495,13 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const  	// clamp pos to valid values  	pos = llclamp(pos, 0, mLineInfoList.back().mDocIndexEnd - 1); -	// find line that contains cursor -	line_list_t::const_iterator line_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), pos, line_end_compare()); +	S32 corrected_pos = pos; +	if (mDrawRightmostCursor && pos > 0) +	{ +		corrected_pos--; +	} + +	line_list_t::const_iterator line_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), corrected_pos, line_end_compare());  	doc_rect.mLeft = line_iter->mRect.mLeft;   	doc_rect.mBottom = line_iter->mRect.mBottom; diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index ecbfdaf84c..3610511179 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -608,6 +608,7 @@ protected:  	// cursor  	S32							mCursorPos;			// I-beam is just after the mCursorPos-th character. +	bool						mDrawRightmostCursor;   // When cursor is on the rightmost position on the line  	S32							mDesiredXPixel;		// X pixel position where the user wants the cursor to be  	LLFrameTimer				mCursorBlinkTimer;  // timer that controls cursor blinking diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index edbdc34154..3a546d041a 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1135,8 +1135,14 @@ void LLTextEditor::addChar(llwchar wc)  			setCursorPos(new_cursor_pos);  		}  	} -} +	if (mCursorPos > 0) +	{ +		LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); +		LLRect prev_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1); +		mDrawRightmostCursor = current_cursor_rect.mBottom < prev_cursor_rect.mBottom; +	} +}  void LLTextEditor::addLineBreakChar(BOOL group_together)  { @@ -1282,6 +1288,12 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)  			break;  		case KEY_HOME: +			if(mDrawRightmostCursor && mCursorPos > 0) +			{ +				mCursorPos--; +				mDrawRightmostCursor = false; +			} +  			startOfLine();  			break; @@ -1296,6 +1308,14 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)  		case KEY_END:  			endOfLine(); +			if (!mDrawRightmostCursor) +			{ +				mDrawRightmostCursor = true; +				if (mCursorPos + 1 < getLength()) +				{ +					setCursorPos(mCursorPos + 1); +				} +			}  			break;  		case KEY_LEFT: @@ -1307,7 +1327,18 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)  			{  				if( 0 < mCursorPos )  				{ -					setCursorPos(mCursorPos - 1); +					LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); +					LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1); + +					if (current_cursor_rect.mBottom < next_cursor_rect.mBottom) +					{ +						mDrawRightmostCursor = true; +					} +					else +					{ +						mDrawRightmostCursor = false; +						setCursorPos(mCursorPos - 1); +					}  				}  				else  				{ @@ -1325,7 +1356,26 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)  			{  				if( mCursorPos < getLength() )  				{ -					setCursorPos(mCursorPos + 1); +					LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); +					LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos + 1); + +					if (current_cursor_rect.mBottom > next_cursor_rect.mBottom) +					{ +						if (mDrawRightmostCursor) +						{ +							mDrawRightmostCursor = false; +						} +						else +						{ +							mDrawRightmostCursor = true; +							setCursorPos(mCursorPos + 1); +						} +					} +					else +					{ +						mDrawRightmostCursor = false; +						setCursorPos(mCursorPos + 1); +					}  				}  				else  				{ diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 017ea3769c..f7031341eb 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -398,9 +398,35 @@ attributedStringInfo getSegments(NSAttributedString *str)      }  } -- (void)flagsChanged:(NSEvent *)theEvent { +- (void)flagsChanged:(NSEvent *)theEvent +{  	mModifiers = [theEvent modifierFlags];  	callModifier([theEvent modifierFlags]); +      +    NSInteger mask = 0; +    switch([theEvent keyCode]) +    {         +        case 56: +            mask = NSShiftKeyMask; +            break; +        case 58: +            mask = NSAlternateKeyMask; +            break; +        case 59: +            mask = NSControlKeyMask; +            break; +        default: +            return;             +    } +     +    if (mModifiers & mask) +    { +        callKeyDown([theEvent keyCode], 0); +    } +    else +    { +        callKeyUp([theEvent keyCode], 0); +    }    }  - (BOOL) acceptsFirstResponder diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 812850f6ff..a09f5e0ff3 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -245,6 +245,7 @@ set(viewer_SOURCE_FILES      llfloaterinspect.cpp      llfloaterinventory.cpp      llfloaterjoystick.cpp +    llfloaterlagmeter.cpp      llfloaterland.cpp      llfloaterlandholdings.cpp      llfloatermap.cpp @@ -840,6 +841,7 @@ set(viewer_HEADER_FILES      llfloaterinspect.h      llfloaterinventory.h      llfloaterjoystick.h +    llfloaterlagmeter.h      llfloaterland.h      llfloaterlandholdings.h      llfloatermap.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6081729687..2e49357d6f 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -14257,6 +14257,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>LeaveMouselook</key> +    <map> +      <key>Comment</key> +      <string>Exit Mouselook mode via S or Down Arrow keys while sitting </string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>TextureLoggingThreshold</key>      <map>        <key>Comment</key> @@ -15154,6 +15165,17 @@        <key>Value</key>        <string />      </map> +  <key>WearFolderLimit</key> +  <map> +    <key>Comment</key> +    <string>Limits number of items in the folder that can be replaced/added to current outfit</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>125</integer> +  </map>  </map>  </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 284b29199e..c9b9e072be 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3711,6 +3711,12 @@ bool LLAgent::teleportCore(bool is_local)  		return false;  	} +	// force stand up and stop a sitting animation (if any), see MAINT-3969 +	if (isAgentAvatarValid() && gAgentAvatarp->getParent() && gAgentAvatarp->isSitting()) +	{ +		gAgentAvatarp->getOffObject(); +	} +  #if 0  	// This should not exist. It has been added, removed, added, and now removed again.  	// This change needs to come from the simulator. Otherwise, the agent ends up out of @@ -3886,7 +3892,7 @@ void LLAgent::teleportRequest(  	bool look_at_from_camera)  {  	LLViewerRegion* regionp = getRegion(); -	bool is_local = (region_handle == to_region_handle(getPositionGlobal())); +	bool is_local = (region_handle == regionp->getHandle());  	if(regionp && teleportCore(is_local))  	{  		LL_INFOS("") << "TeleportLocationRequest: '" << region_handle << "':" diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index a4c430bada..11bb81d8ff 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1480,6 +1480,18 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id)  		uuids_to_remove.push_back(item->getUUID());  	}  	removeItemsFromAvatar(uuids_to_remove); + +	// now deactivating all gestures in that folder +	LLInventoryModel::item_array_t gest_items; +	getDescendentsOfAssetType(cat_id, gest_items, LLAssetType::AT_GESTURE); +	for (S32 i = 0; i < gest_items.size(); ++i) +	{ +		LLViewerInventoryItem *gest_item = gest_items[i]; +		if (LLGestureMgr::instance().isGestureActive(gest_item->getLinkedUUID())) +		{ +			LLGestureMgr::instance().deactivateGesture(gest_item->getLinkedUUID()); +		} +	}  }  // Create a copy of src_id + contents as a subfolder of dst_id. @@ -1695,8 +1707,23 @@ bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id)  		return false;  	} +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items;  	LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); -	return gInventory.hasMatchingDirectDescendent(outfit_cat_id, not_worn); +	gInventory.collectDescendentsIf(outfit_cat_id, +		cats, +		items, +		LLInventoryModel::EXCLUDE_TRASH, +		not_worn); + +	U32 max_items = gSavedSettings.getU32("WearFolderLimit"); +	if (items.size() > max_items) +	{ +		LL_WARNS() << "Folder contains more wearables than allowed to wear by WearFolderLimit setting" << LL_ENDL; +		return false; +	} + +	return items.size() > 0;  }  bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id) @@ -1714,8 +1741,23 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)  	}  	// Check whether the outfit contains any wearables we aren't wearing already (STORM-702). -	LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); -	return gInventory.hasMatchingDirectDescendent(outfit_cat_id, not_worn); +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	LLFindWearablesEx is_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); +	gInventory.collectDescendentsIf(outfit_cat_id, +		cats, +		items, +		LLInventoryModel::EXCLUDE_TRASH, +		is_worn); + +	U32 max_items = gSavedSettings.getU32("WearFolderLimit"); +	if (items.size() > max_items) +	{ +		LL_WARNS() << "Folder contains more wearables than allowed to wear by WearFolderLimit setting" << LL_ENDL; +		return false; +	} + +	return items.size() > 0;  }  void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> cb) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 35ec6a3c40..375f853652 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3368,11 +3368,11 @@ LLSD LLAppViewer::getViewerInfo() const  	// TODO: Implement media plugin version query  	info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; -	if (gPacketsIn > 0) +	S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); +	if (packets_in > 0)  	{ -		LLTrace::Recording& last_frame = LLTrace::get_frame_recording().getLastRecording(); -		info["PACKETS_LOST"] = last_frame.getSum(LLStatViewer::PACKETS_LOST); -		info["PACKETS_IN"] = last_frame.getSum(LLStatViewer::PACKETS_IN); +		info["PACKETS_LOST"] = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST); +		info["PACKETS_IN"] = packets_in;  		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();  	} diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index dad85a016c..8235b13118 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -143,7 +143,7 @@ void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids)  		LLAvatarName av_name;  		if(LLAvatarNameCache::get(agent_id, &av_name))  		{ -			args["NAME"] = av_name.getDisplayName(); +			args["NAME"] = av_name.getCompleteName();  		}  		msgType = "RemoveFromFriends"; @@ -381,7 +381,7 @@ void LLAvatarActions::showOnMap(const LLUUID& id)  	}  	gFloaterWorldMap->trackAvatar(id, av_name.getDisplayName()); -	LLFloaterReg::showInstance("world_map"); +	LLFloaterReg::showInstance("world_map", "center");  }  // static @@ -533,6 +533,14 @@ void LLAvatarActions::share(const LLUUID& id)  	{  		// we should always get here, but check to verify anyways  		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false); + +		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); +		if (session_floater && session_floater->isMinimized()) +		{ +			session_floater->setMinimized(false); +		} +		LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); +		im_container->selectConversationPair(session_id, true);  	}  } diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 746b541f9d..b89b0d9900 100755 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -247,7 +247,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)  	{  		LLAvatarPropertiesProcessor* app =  			LLAvatarPropertiesProcessor::getInstance(); -		if (mAvatarId.notNull()) +		if (mAvatarId.notNull() && mAvatarId != value.asUUID())  		{  			app->removeObserver(mAvatarId, this);  		} @@ -255,6 +255,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)  		if (mAvatarId != value.asUUID())  		{  			mAvatarId = value.asUUID(); +			app->addObserver(mAvatarId, this);  			// *BUG: This will return stale icons if a user changes their  			// profile picture. However, otherwise we send too many upstream @@ -270,7 +271,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)  				// People API, rather than sending AvatarPropertyRequest  				// messages.  People API already hits the user table.  				LLIconCtrl::setValue(mDefaultIconName); -				app->addObserver(mAvatarId, this); +				// duplicated requests are filtered later if there are any  				app->sendAvatarPropertiesRequest(mAvatarId);  			}  		} diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 1b3cfb5ebd..98f2ac614b 100755 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -327,6 +327,7 @@ public:  			gInventory.updateItem(item);  			gInventory.notifyObservers(); +			LLFavoritesOrderStorage::instance().saveOrder();  		}  		LLView::getWindow()->setCursor(UI_CURSOR_ARROW); @@ -1641,6 +1642,16 @@ void LLFavoritesOrderStorage::cleanup()  	mSortIndexes.swap(aTempMap);  } +void LLFavoritesOrderStorage::saveOrder() +{ +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	LLIsType is_type(LLAssetType::AT_LANDMARK); +	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +	gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); +	saveItemsOrder(items); +} +  void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array_t& items )  {  	int sortField = 0; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 211d3c4ce3..5ca1d3e8ed 100755 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -203,6 +203,8 @@ public:  	// Is used to save order for Favorites folder.  	void saveItemsOrder(const LLInventoryModel::item_array_t& items); +	void saveOrder(); +  	void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);  	/** diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp index bdc5b581a9..31adf5b61e 100755 --- a/indra/newview/llfloateravatar.cpp +++ b/indra/newview/llfloateravatar.cpp @@ -34,6 +34,7 @@  #include "llfloateravatar.h"  #include "lluictrlfactory.h" +#include "llmediactrl.h"  LLFloaterAvatar::LLFloaterAvatar(const LLSD& key) @@ -43,6 +44,13 @@ LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)  LLFloaterAvatar::~LLFloaterAvatar()  { +	LLMediaCtrl* avatar_picker = findChild<LLMediaCtrl>("avatar_picker_contents"); +	if (avatar_picker) +	{ +		avatar_picker->navigateStop(); +		avatar_picker->clearCache();          //images are reloading each time already +		avatar_picker->unloadMediaSource(); +	}  }  BOOL LLFloaterAvatar::postBuild() diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index ebb44561da..a4b91e47bb 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -229,7 +229,9 @@ BOOL LLFloaterIMContainer::postBuild()  	mStubCollapseBtn = getChild<LLButton>("stub_collapse_btn");  	mStubCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onStubCollapseButtonClicked, this));      mSpeakBtn = getChild<LLButton>("speak_btn"); -	mSpeakBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonClicked, this)); + +	mSpeakBtn->setMouseDownCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonPressed, this)); +	mSpeakBtn->setMouseUpCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonReleased, this));  	childSetAction("add_btn", boost::bind(&LLFloaterIMContainer::onAddButtonClicked, this)); @@ -352,11 +354,18 @@ void LLFloaterIMContainer::onStubCollapseButtonClicked()  	collapseMessagesPane(true);  } -void LLFloaterIMContainer::onSpeakButtonClicked() +void LLFloaterIMContainer::onSpeakButtonPressed() +{ +	LLVoiceClient::getInstance()->inputUserControlState(true); +	updateSpeakBtnState(); +} + +void LLFloaterIMContainer::onSpeakButtonReleased()  { -	LLAgent::toggleMicrophone("speak"); +	LLVoiceClient::getInstance()->inputUserControlState(false);  	updateSpeakBtnState();  } +  void LLFloaterIMContainer::onExpandCollapseButtonClicked()  {  	if (mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed() @@ -1271,6 +1280,22 @@ bool LLFloaterIMContainer::enableContextMenuItem(const LLSD& userdata)  	uuid_vec_t uuids;  	getParticipantUUIDs(uuids); + +	//If there is group or ad-hoc chat in multiselection, everything needs to be disabled +	if(uuids.size() > 1) +	{ +		const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList(); +		LLConversationItem * conversationItem; +		for(std::set<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it) +		{ +			conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem()); +			if((conversationItem->getType() == LLConversationItem::CONV_SESSION_GROUP) || (conversationItem->getType() == LLConversationItem::CONV_SESSION_AD_HOC)) +			{ +				return false; +			} +		} +	} +  	if ("conversation_log" == item)  	{  		return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0; @@ -1376,6 +1401,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v      {          return LLAvatarActions::canCall();      } +    else if ("can_open_voice_conversation" == item) +    { +    	return is_single_select && LLAvatarActions::canCall(); +    }  	else if ("can_zoom_in" == item)  	{  		return is_single_select && gObjectList.findObject(single_id); diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index f6d973b9b3..a3e10dc236 100755 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -135,7 +135,8 @@ private:  	void onExpandCollapseButtonClicked();  	void onStubCollapseButtonClicked();  	void processParticipantsStyleUpdate(); -	void onSpeakButtonClicked(); +	void onSpeakButtonPressed(); +	void onSpeakButtonReleased();  	/*virtual*/ void onClickCloseBtn(bool app_quitting = false);  	/*virtual*/ void closeHostedFloater(); diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 7852a1f7b3..9def253ba5 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -927,8 +927,7 @@ void LLFloaterIMSession::onInputEditorFocusReceived( LLFocusableElement* caller,  	// Allow enabling the LLFloaterIMSession input editor only if session can accept text  	LLIMModel::LLIMSession* im_session =  		LLIMModel::instance().findIMSession(self->mSessionID); -	//TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK) -	if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled()) +	if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getReadOnly())  	{  		//in disconnected state IM input editor should be disabled  		self->mInputEditor->setEnabled(!gDisconnected); diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp new file mode 100644 index 0000000000..f72f2631a1 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.cpp @@ -0,0 +1,378 @@ +/**  + * @file llfloaterlagmeter.cpp + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterlagmeter.h" + +#include "lluictrlfactory.h" +#include "llviewerstats.h" +#include "llviewertexture.h" +#include "llviewercontrol.h" +#include "llappviewer.h" + +#include "lltexturefetch.h" + +#include "llbutton.h" +#include "llfocusmgr.h" +#include "lltextbox.h" + +const std::string LAG_CRITICAL_IMAGE_NAME = "lag_status_critical.tga"; +const std::string LAG_WARNING_IMAGE_NAME  = "lag_status_warning.tga"; +const std::string LAG_GOOD_IMAGE_NAME     = "lag_status_good.tga"; + +LLFloaterLagMeter::LLFloaterLagMeter(const LLSD& key) +	:	LLFloater(key) +{ +	mCommitCallbackRegistrar.add("LagMeter.ClickShrink",  boost::bind(&LLFloaterLagMeter::onClickShrink, this));	 +} + +BOOL LLFloaterLagMeter::postBuild() +{ +	// Don't let this window take keyboard focus -- it's confusing to +	// lose arrow-key driving when testing lag. +	setIsChrome(TRUE); +	 +	// were we shrunk last time? +	if (isShrunk()) +	{ +		onClickShrink(); +	} +	 +	mClientButton = getChild<LLButton>("client_lagmeter"); +	mClientText = getChild<LLTextBox>("client_text"); +	mClientCause = getChild<LLTextBox>("client_lag_cause"); + +	mNetworkButton = getChild<LLButton>("network_lagmeter"); +	mNetworkText = getChild<LLTextBox>("network_text"); +	mNetworkCause = getChild<LLTextBox>("network_lag_cause"); + +	mServerButton = getChild<LLButton>("server_lagmeter"); +	mServerText = getChild<LLTextBox>("server_text"); +	mServerCause = getChild<LLTextBox>("server_lag_cause"); + +	std::string config_string = getString("client_frame_rate_critical_fps", mStringArgs); +	mClientFrameTimeCritical = F32Seconds(1.0f / (float)atof( config_string.c_str() )); +	config_string = getString("client_frame_rate_warning_fps", mStringArgs); +	mClientFrameTimeWarning = F32Seconds(1.0f / (float)atof( config_string.c_str() )); + +	config_string = getString("network_packet_loss_critical_pct", mStringArgs); +	mNetworkPacketLossCritical = F32Percent((float)atof( config_string.c_str() )); +	config_string = getString("network_packet_loss_warning_pct", mStringArgs); +	mNetworkPacketLossWarning = F32Percent((float)atof( config_string.c_str() )); + +	config_string = getString("network_ping_critical_ms", mStringArgs); +	mNetworkPingCritical = F32Milliseconds((float)atof( config_string.c_str() )); +	config_string = getString("network_ping_warning_ms", mStringArgs); +	mNetworkPingWarning = F32Milliseconds((float)atof( config_string.c_str() )); +	config_string = getString("server_frame_rate_critical_fps", mStringArgs); + +	mServerFrameTimeCritical = F32Seconds(1.0f / (float)atof( config_string.c_str() )); +	config_string = getString("server_frame_rate_warning_fps", mStringArgs); +	mServerFrameTimeWarning = F32Seconds(1.0f / (float)atof( config_string.c_str() )); +	config_string = getString("server_single_process_max_time_ms", mStringArgs); +	mServerSingleProcessMaxTime = F32Seconds((float)atof( config_string.c_str() )); + +//	mShrunk = false; +	config_string = getString("max_width_px", mStringArgs); +	mMaxWidth = atoi( config_string.c_str() ); +	config_string = getString("min_width_px", mStringArgs); +	mMinWidth = atoi( config_string.c_str() ); + +	mStringArgs["[CLIENT_FRAME_RATE_CRITICAL]"] = getString("client_frame_rate_critical_fps"); +	mStringArgs["[CLIENT_FRAME_RATE_WARNING]"] = getString("client_frame_rate_warning_fps"); + +	mStringArgs["[NETWORK_PACKET_LOSS_CRITICAL]"] = getString("network_packet_loss_critical_pct"); +	mStringArgs["[NETWORK_PACKET_LOSS_WARNING]"] = getString("network_packet_loss_warning_pct"); + +	mStringArgs["[NETWORK_PING_CRITICAL]"] = getString("network_ping_critical_ms"); +	mStringArgs["[NETWORK_PING_WARNING]"] = getString("network_ping_warning_ms"); + +	mStringArgs["[SERVER_FRAME_RATE_CRITICAL]"] = getString("server_frame_rate_critical_fps"); +	mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps"); + +//	childSetAction("minimize", onClickShrink, this); +	updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079) + +	return TRUE; +} +LLFloaterLagMeter::~LLFloaterLagMeter() +{ +	// save shrunk status for next time +//	gSavedSettings.setBOOL("LagMeterShrunk", mShrunk); +	// expand so we save the large window rectangle +	if (isShrunk()) +	{ +		onClickShrink(); +	} +} + +void LLFloaterLagMeter::draw() +{ +	determineClient(); +	determineNetwork(); +	determineServer(); + +	LLFloater::draw(); +} + +void LLFloaterLagMeter::determineClient() +{ +	F32Milliseconds client_frame_time = LLTrace::get_frame_recording().getPeriodMean(LLStatViewer::FRAME_STACKTIME); +	bool find_cause = false; + +	if (!gFocusMgr.getAppHasFocus()) +	{ +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); +		mClientText->setText( getString("client_frame_time_window_bg_msg", mStringArgs) ); +		mClientCause->setText( LLStringUtil::null ); +	} +	else if(client_frame_time >= mClientFrameTimeCritical) +	{ +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); +		mClientText->setText( getString("client_frame_time_critical_msg", mStringArgs) ); +		find_cause = true; +	} +	else if(client_frame_time >= mClientFrameTimeWarning) +	{ +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); +		mClientText->setText( getString("client_frame_time_warning_msg", mStringArgs) ); +		find_cause = true; +	} +	else +	{ +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); +		mClientText->setText( getString("client_frame_time_normal_msg", mStringArgs) ); +		mClientCause->setText( LLStringUtil::null ); +	}	 + +	if(find_cause) +	{ +		if(gSavedSettings.getF32("RenderFarClip") > 128) +		{ +			mClientCause->setText( getString("client_draw_distance_cause_msg", mStringArgs) ); +		} +		else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2) +		{ +			mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) ); +		} +		else if(LLViewerTexture::sBoundTextureMemory > LLViewerTexture::sMaxBoundTextureMemory) +		{ +			mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) ); +		} +		else  +		{ +			mClientCause->setText( getString("client_complex_objects_cause_msg", mStringArgs) ); +		} +	} +} + +void LLFloaterLagMeter::determineNetwork() +{ +	LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording(); +	F32Percent packet_loss = frame_recording.getPeriodMean(LLStatViewer::PACKETS_LOST_PERCENT); +	F32Milliseconds ping_time = frame_recording.getPeriodMean(LLStatViewer::SIM_PING); +	bool find_cause_loss = false; +	bool find_cause_ping = false; + +	// *FIXME: We can't blame a large ping time on anything in +	// particular if the frame rate is low, because a low frame +	// rate is a sure recipe for bad ping times right now until +	// the network handlers are de-synched from the rendering. +	F32Milliseconds client_frame_time = frame_recording.getPeriodMean(LLStatViewer::FRAME_STACKTIME); +	 +	if(packet_loss >= mNetworkPacketLossCritical) +	{ +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); +		mNetworkText->setText( getString("network_packet_loss_critical_msg", mStringArgs) ); +		find_cause_loss = true; +	} +	else if(ping_time >= mNetworkPingCritical) +	{ +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); +		if (client_frame_time < mNetworkPingCritical) +		{ +			mNetworkText->setText( getString("network_ping_critical_msg", mStringArgs) ); +			find_cause_ping = true; +		} +	} +	else if(packet_loss >= mNetworkPacketLossWarning) +	{ +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); +		mNetworkText->setText( getString("network_packet_loss_warning_msg", mStringArgs) ); +		find_cause_loss = true; +	} +	else if(ping_time >= mNetworkPingWarning) +	{ +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); +		if (client_frame_time < mNetworkPingWarning) +		{ +			mNetworkText->setText( getString("network_ping_warning_msg", mStringArgs) ); +			find_cause_ping = true; +		} +	} +	else +	{ +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); +		mNetworkText->setText( getString("network_performance_normal_msg", mStringArgs) ); +	} + +	if(find_cause_loss) + 	{ +		mNetworkCause->setText( getString("network_packet_loss_cause_msg", mStringArgs) ); + 	} +	else if(find_cause_ping) +	{ +		mNetworkCause->setText( getString("network_ping_cause_msg", mStringArgs) ); +	} +	else +	{ +		mNetworkCause->setText( LLStringUtil::null ); +	} +} + +void LLFloaterLagMeter::determineServer() +{ +	F32Milliseconds sim_frame_time = LLTrace::get_frame_recording().getLastRecording().getLastValue(LLStatViewer::SIM_FRAME_TIME); +	bool find_cause = false; + +	if(sim_frame_time >= mServerFrameTimeCritical) +	{ +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); +		mServerText->setText( getString("server_frame_time_critical_msg", mStringArgs) ); +		find_cause = true; +	} +	else if(sim_frame_time >= mServerFrameTimeWarning) +	{ +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); +		mServerText->setText( getString("server_frame_time_warning_msg", mStringArgs) ); +		find_cause = true; +	} +	else +	{ +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); +		mServerText->setText( getString("server_frame_time_normal_msg", mStringArgs) ); +		mServerCause->setText( LLStringUtil::null ); +	}	 + +	if(find_cause) +	{ +		LLTrace::Recording& last_recording = LLTrace::get_frame_recording().getLastRecording(); + +		if(last_recording.getLastValue(LLStatViewer::SIM_PHYSICS_TIME) > mServerSingleProcessMaxTime) +		{ +			mServerCause->setText( getString("server_physics_cause_msg", mStringArgs) ); +		} +		else if(last_recording.getLastValue(LLStatViewer::SIM_SCRIPTS_TIME) > mServerSingleProcessMaxTime) +		{ +			mServerCause->setText( getString("server_scripts_cause_msg", mStringArgs) ); +		} +		else if(last_recording.getLastValue(LLStatViewer::SIM_NET_TIME) > mServerSingleProcessMaxTime) +		{ +			mServerCause->setText( getString("server_net_cause_msg", mStringArgs) ); +		} +		else if(last_recording.getLastValue(LLStatViewer::SIM_AGENTS_TIME) > mServerSingleProcessMaxTime) +		{ +			mServerCause->setText( getString("server_agent_cause_msg", mStringArgs) ); +		} +		else if(last_recording.getLastValue(LLStatViewer::SIM_IMAGES_TIME) > mServerSingleProcessMaxTime) +		{ +			mServerCause->setText( getString("server_images_cause_msg", mStringArgs) ); +		} +		else +		{ +			mServerCause->setText( getString("server_generic_cause_msg", mStringArgs) ); +		} +	} +} + +void LLFloaterLagMeter::updateControls(bool shrink) +{ +//	LLFloaterLagMeter * self = (LLFloaterLagMeter*)data; + +	LLButton * button = getChild<LLButton>("minimize"); +	S32 delta_width = mMaxWidth -mMinWidth; +	LLRect r = getRect(); + +	if(!shrink) +	{ +		setTitle(getString("max_title_msg", mStringArgs) ); +		// make left edge appear to expand +		r.translate(-delta_width, 0); +		setRect(r); +		reshape(mMaxWidth, getRect().getHeight()); +		 +		getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) + ":"); +		getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) + ":"); +		getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) + ":"); + +		// usually "<<" +		button->setLabel( getString("smaller_label", mStringArgs) ); +	} +	else +	{ +		setTitle( getString("min_title_msg", mStringArgs) ); +		// make left edge appear to collapse +		r.translate(delta_width, 0); +		setRect(r); +		reshape(mMinWidth, getRect().getHeight()); +		 +		getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) ); +		getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) ); +		getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) ); + +		// usually ">>" +		button->setLabel( getString("bigger_label", mStringArgs) ); +	} +	// Don't put keyboard focus on the button +	button->setFocus(FALSE); + +//	self->mClientText->setVisible(self->mShrunk); +//	self->mClientCause->setVisible(self->mShrunk); +//	self->getChildView("client_help")->setVisible( self->mShrunk); + +//	self->mNetworkText->setVisible(self->mShrunk); +//	self->mNetworkCause->setVisible(self->mShrunk); +//	self->getChildView("network_help")->setVisible( self->mShrunk); + +//	self->mServerText->setVisible(self->mShrunk); +//	self->mServerCause->setVisible(self->mShrunk); +//	self->getChildView("server_help")->setVisible( self->mShrunk); + +//	self->mShrunk = !self->mShrunk; +} + +BOOL LLFloaterLagMeter::isShrunk() +{ +	return gSavedSettings.getBOOL("LagMeterShrunk"); +} + +void LLFloaterLagMeter::onClickShrink()  // toggle "LagMeterShrunk" +{ +	bool shrunk = isShrunk(); +	updateControls(!shrunk); +	gSavedSettings.setBOOL("LagMeterShrunk", !shrunk); +} diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h new file mode 100644 index 0000000000..929ea40629 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.h @@ -0,0 +1,80 @@ +/**  + * @file llfloaterlagmeter.h + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LLFLOATERLAGMETER_H +#define LLFLOATERLAGMETER_H + +#include "llfloater.h" + +class LLTextBox; + +class LLFloaterLagMeter : public LLFloater +{ +	friend class LLFloaterReg; +	 +public: +	/*virtual*/ void draw(); +	/*virtual*/ BOOL postBuild();	 +private: +	 +	LLFloaterLagMeter(const LLSD& key); +	/*virtual*/ ~LLFloaterLagMeter(); +	void determineClient(); +	void determineNetwork(); +	void determineServer(); +	void updateControls(bool shrink); +	BOOL isShrunk(); + +	void onClickShrink(); + +	bool mShrunk; +	S32 mMaxWidth, mMinWidth; + +	F32Milliseconds mClientFrameTimeCritical; +	F32Milliseconds mClientFrameTimeWarning; +	LLButton*		mClientButton; +	LLTextBox*		mClientText; +	LLTextBox*		mClientCause; + +	F32Percent		mNetworkPacketLossCritical; +	F32Percent		mNetworkPacketLossWarning; +	F32Milliseconds mNetworkPingCritical; +	F32Milliseconds mNetworkPingWarning; +	LLButton*       mNetworkButton; +	LLTextBox*      mNetworkText; +	LLTextBox*      mNetworkCause; + +	F32Milliseconds mServerFrameTimeCritical; +	F32Milliseconds mServerFrameTimeWarning; +	F32Milliseconds mServerSingleProcessMaxTime; +	LLButton*       mServerButton; +	LLTextBox*      mServerText; +	LLTextBox*      mServerCause; + +	LLStringUtil::format_map_t mStringArgs; +}; + +#endif diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7213064746..c094eb3180 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2776,10 +2776,16 @@ void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids)  	{  		LLUUID id = ids[0];  		LLParcel* parcel = mParcel->getParcel(); -		if (parcel) +		if (parcel && parcel->addToAccessList(id, 0))  		{ -			parcel->addToAccessList(id, 0); -			LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS); +			U32 lists_to_update = AL_ACCESS; +			// agent was successfully added to access list +			// but we also need to check ban list to ensure that agent will not be in two lists simultaneously +			if(parcel->removeFromBanList(id)) +			{ +				lists_to_update |= AL_BAN; +			} +			LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update);  			refresh();  		}  	} @@ -2828,10 +2834,16 @@ void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids)  	{  		LLUUID id = ids[0];  		LLParcel* parcel = mParcel->getParcel(); -		if (parcel) +		if (parcel && parcel->addToBanList(id, 0))  		{ -			parcel->addToBanList(id, 0); -			LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN); +			U32 lists_to_update = AL_BAN; +			// agent was successfully added to ban list +			// but we also need to check access list to ensure that agent will not be in two lists simultaneously +			if (parcel->removeFromAccessList(id)) +			{ +				lists_to_update |= AL_ACCESS; +			} +			LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update);  			refresh();  		}  	} diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index c21e4ff7e8..fd03efa061 100755 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -41,6 +41,7 @@ class LLNotificationChannelPanel : public LLLayoutPanel  {  public:  	LLNotificationChannelPanel(const Params& p); +	~LLNotificationChannelPanel();  	BOOL postBuild();  private: @@ -57,6 +58,20 @@ LLNotificationChannelPanel::LLNotificationChannelPanel(const LLNotificationChann  	buildFromFile( "panel_notifications_channel.xml");  } +LLNotificationChannelPanel::~LLNotificationChannelPanel() +{ +	// Userdata for all records is a LLNotification* we need to clean up +	std::vector<LLScrollListItem*> data_list = getChild<LLScrollListCtrl>("notifications_list")->getAllData(); +	std::vector<LLScrollListItem*>::iterator data_itor; +	for (data_itor = data_list.begin(); data_itor != data_list.end(); ++data_itor) +	{ +		LLScrollListItem* item = *data_itor; +		LLNotification* notification = (LLNotification*)item->getUserdata(); +		delete notification; +		notification = NULL; +	} +} +  BOOL LLNotificationChannelPanel::postBuild()  {  	LLButton* header_button = getChild<LLButton>("header"); @@ -124,7 +139,7 @@ bool LLNotificationChannelPanel::update(const LLSD& payload)  		row["columns"][2]["type"] = "date";  		LLScrollListItem* sli = getChild<LLScrollListCtrl>("notifications_list")->addElement(row); -		sli->setUserdata(&(*notification)); +		sli->setUserdata(new LLNotification(notification->asLLSD()));  	}  	return false; diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index c5248719e9..aee20ff706 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -57,7 +57,7 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key)  	getChild<LLPanel>(sMainPanelName)->onOpen(key);  } -void LLFloaterSidePanelContainer::onClickCloseBtn(bool) +void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)  {  	LLPanelOutfitEdit* panel_outfit_edit =  		dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); @@ -75,7 +75,7 @@ void LLFloaterSidePanelContainer::onClickCloseBtn(bool)  		}  	} -	LLFloater::onClickCloseBtn(); +	LLFloater::closeFloater(app_quitting);  }  LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 13b17e8867..d7ecd52e57 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,7 +51,7 @@ public:  	/*virtual*/ void onOpen(const LLSD& key); -	/*virtual*/ void onClickCloseBtn(bool app_quitting = false); +	/*virtual*/ void closeFloater(bool app_quitting = false);  	LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index bd5d2207b4..7477b02867 100755 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -888,6 +888,9 @@ void LLFloaterTools::onClose(bool app_quitting)  	// hide the advanced object weights floater  	LLFloaterReg::hideInstance("object_weights"); + +	// prepare content for next call +	mPanelContents->clearContents();  }  void click_popup_info(void*) diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index e26f1e9ea5..e02e8eeb5a 100755 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -204,6 +204,10 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  		LLURLHistory::addURL("parcel", media_url);  	} +	// show progress bar here? +	getWindow()->incBusyCount(); +	self->getChildView("loading_label")->setVisible( true); +  	// leading whitespace causes problems with the MIME-type detection so strip it  	LLStringUtil::trim( media_url ); @@ -233,10 +237,6 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  	self->getChildView("ok_btn")->setEnabled(false);  	self->getChildView("cancel_btn")->setEnabled(false);  	self->getChildView("media_entry")->setEnabled(false); - -	// show progress bar here? -	getWindow()->incBusyCount(); -	self->getChildView("loading_label")->setVisible( true);  }  // static diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index fa68c7b7c1..6c5dcf46a6 100755 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -295,7 +295,7 @@ void LLFloaterWebContent::onOpen(const LLSD& key)  void LLFloaterWebContent::onClose(bool app_quitting)  {      // If we close the web browsing window showing the facebook login, we need to signal to this object that the connection will not happen -    LLFloater* fbc_web = LLFloaterReg::getInstance("fbc_web"); +    LLFloater* fbc_web = LLFloaterReg::findInstance("fbc_web");      if (fbc_web == this)      {          if (!LLFacebookConnect::instance().isConnected()) diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index b15556d73d..119872ec29 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1406,7 +1406,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  				}  				if (rest_of_match.compare("") == 0)  				{ -					return FALSE; +					return TRUE;  				}  				if (buf.compare("") != 0)  				{ diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 813d2081ce..b2fc41526e 100755 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -328,8 +328,10 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im  		{  			// Build a new format username or firstname_lastname for legacy names  			// to use it for a history log filename. -			full_name = LLCacheName::buildUsername(full_name); -			LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); +			if (LLLogChat::buildIMP2PLogFilename(to_agent, LLStringUtil::null, full_name)) +			{ +				LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); +			}  		}  	}  } diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index f514729aa1..913efd6434 100755 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -149,7 +149,7 @@ public:  	void changed(LLGroupChange gc)  	{ -		if (gc == GC_MEMBER_DATA && !mRequestProcessed) +		if (gc == GC_PROPERTIES && !mRequestProcessed)  		{  			LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupId);  			if (!gdatap) @@ -159,9 +159,6 @@ public:  			else if (!gdatap->isMemberDataComplete())  			{  				LL_WARNS() << "LLGroupMgr::getInstance()->getGroupData()->isMemberDataComplete() was FALSE" << LL_ENDL; -			} -			else -			{  				processGroupData();  				mRequestProcessed = true;  			} diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 87335cd5e6..3b9d5e0c3d 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -103,6 +103,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response  bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id);  static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +static BOOL can_move_to_landmarks(LLInventoryItem* inv_item);  static bool check_category(LLInventoryModel* model,  						   const LLUUID& cat_id,  						   LLInventoryPanel* active_panel, @@ -2216,13 +2217,18 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		&& (LLToolDragAndDrop::SOURCE_AGENT == source);  	BOOL accept = FALSE; +	U64 filter_types = filter->getFilterTypes(); +	BOOL use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0); +  	if (is_agent_inventory)  	{  		const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);  		const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); +		const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);  		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); -		const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT); +		const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); +		const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);  		//-------------------------------------------------------------------------------- @@ -2414,7 +2420,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  					is_movable = active_folder_view != NULL;  				} -				if (is_movable) +				if (is_movable && use_filter)  				{  					// Check whether the folder being dragged from active inventory panel  					// passes the filter of the destination panel. @@ -2552,6 +2558,12 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  	BOOL accept = FALSE;  	BOOL is_move = FALSE; +	BOOL use_filter = FALSE; +	if (filter) +	{ +		U64 filter_types = filter->getFilterTypes(); +		use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0); +	}  	// coming from a task. Need to figure out if the person can  	// move/copy this item. @@ -2584,7 +2596,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  			accept = TRUE;  		} -		if (filter && accept) +		if (accept && use_filter)  		{  			accept = filter->check(item);  		} @@ -2815,7 +2827,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder   *>(mInventoryPanel.get()->getItemByID(mUUID));  		if (f)  		{ -			f->setOpen(TRUE); +			f->toggleOpen();  		}  		return; @@ -3097,10 +3109,14 @@ void LLFolderBridge::pasteFromClipboard()  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +		const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); +		const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); -		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); +		const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); +		const BOOL move_is_into_favorites = (mUUID == favorites_id);  		std::vector<LLUUID> objects;  		LLClipboard::instance().pasteFromClipboard(objects); @@ -3158,11 +3174,18 @@ void LLFolderBridge::pasteFromClipboard()  			{  				if (move_is_into_current_outfit || move_is_into_outfit)  				{ -					if (can_move_to_outfit(item, move_is_into_current_outfit)) +					if (item && can_move_to_outfit(item, move_is_into_current_outfit))  					{  						dropToOutfit(item, move_is_into_current_outfit);  					}  				} +				else if (move_is_into_favorites) +				{ +					if (item && can_move_to_landmarks(item)) +					{ +						dropToFavorites(item); +					} +				}  				else if (LLClipboard::instance().isCutMode())  				{  					// Do a move to "paste" a "cut" @@ -3225,9 +3248,11 @@ void LLFolderBridge::pasteLinkFromClipboard()  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +		const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); -		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); +		const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  		if (move_is_into_outbox) @@ -3783,6 +3808,12 @@ static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_curr  		return FALSE;  	} +	U32 flags = inv_item->getFlags(); +	if(flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) +	{ +		return FALSE; +	} +  	if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID()))  	{  		return FALSE; @@ -3868,16 +3899,22 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);  	const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  	const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +	const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);  	const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  	const BOOL move_is_into_favorites = (mUUID == favorites_id); -	const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +	const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); +	const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  	const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);  	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  	const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);  	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();  	BOOL accept = FALSE; +	U64 filter_types = filter->getFilterTypes(); +	// We shouldn't allow to drop non recent items into recent tab (or some similar transactions) +	// while we are allowing to interact with regular filtered inventory +	BOOL use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0);  	LLViewerObject* object = NULL;  	if(LLToolDragAndDrop::SOURCE_AGENT == source)  	{ @@ -3976,7 +4013,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		// Check whether the item being dragged from active inventory panel  		// passes the filter of the destination panel. -		if (accept && active_panel) +		if (accept && active_panel && use_filter)  		{  			LLFolderViewItem* fv_item =   active_panel->getItemByID(inv_item->getUUID());  			if (!fv_item) return false; @@ -4114,7 +4151,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		// Check whether the item being dragged from in world  		// passes the filter of the destination panel. -		if (accept) +		if (accept && use_filter)  		{  			accept = filter->check(inv_item);  		} @@ -4158,7 +4195,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		// Check whether the item being dragged from notecard  		// passes the filter of the destination panel. -		if (accept) +		if (accept && use_filter)  		{  			accept = filter->check(inv_item);  		} @@ -4198,7 +4235,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// Check whether the item being dragged from the library  			// passes the filter of the destination panel. -			if (accept && active_panel) +			if (accept && active_panel && use_filter)  			{  				LLFolderViewItem* fv_item =   active_panel->getItemByID(inv_item->getUUID());  				if (!fv_item) return false; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 000eee3317..370392b2f2 100755 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -177,6 +177,7 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent  	// Pass if this item's type is of the correct filter type  	if (filterTypes & FILTERTYPE_OBJECT)  	{ +  		// If it has no type, pass it, unless it's a link.  		if (object_type == LLInventoryType::IT_NONE)  		{ @@ -244,13 +245,25 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent  			bool is_hidden_if_empty = LLViewerFolderType::lookupIsHiddenIfEmpty(listener->getPreferredType());  			if (is_hidden_if_empty)  			{ -				// Force the fetching of those folders so they are hidden iff they really are empty... +				// Force the fetching of those folders so they are hidden if they really are empty...  				gInventory.fetchDescendentsOf(object_id); -				return FALSE; + +				LLInventoryModel::cat_array_t* cat_array = NULL; +				LLInventoryModel::item_array_t* item_array = NULL; +				gInventory.getDirectDescendentsOf(object_id,cat_array,item_array); +				S32 descendents_actual = 0; +				if(cat_array && item_array) +				{ +					descendents_actual = cat_array->size() + item_array->size(); +				} +				if (descendents_actual == 0) +				{ +					return FALSE; +				}  			}  		}  	} -	 +  	return TRUE;  } @@ -972,6 +985,11 @@ void LLInventoryFilter::fromParams(const Params& params)  	setDateRangeLastLogoff(params.since_logoff);  } +U64 LLInventoryFilter::getFilterTypes() const +{ +	return mFilterOps.mFilterTypes; +} +  U64 LLInventoryFilter::getFilterObjectTypes() const  {  	return mFilterOps.mFilterObjectTypes; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index ce516af0b9..094fda7707 100755 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -151,6 +151,7 @@ public:  	// +-------------------------------------------------------------------+  	// + Parameters  	// +-------------------------------------------------------------------+ +	U64 				getFilterTypes() const;  	U64 				getFilterObjectTypes() const;  	U64					getFilterCategoryTypes() const;  	U64					getFilterWearableTypes() const; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 1e7825a13e..1abc09bf3b 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -881,7 +881,7 @@ bool LLFindWearablesEx::operator()(LLInventoryCategory* cat, LLInventoryItem* it  	if (!vitem) return false;  	// Skip non-wearables. -	if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT) +	if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT && vitem->getType() != LLAssetType::AT_GESTURE)  	{  		return false;  	} diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index a4a85e2e8d..4cb724e9c4 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -336,7 +336,15 @@ LLInventoryFilter& LLInventoryPanel::getFilter()  void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)  {  	if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT) +	{ +		//Don't show folder without recent item in it +		if ("Recent Items" == getName()) +		{ +			types &= ~(0x1 << LLInventoryType::IT_CATEGORY); +		} +  		getFilter().setFilterObjectTypes(types); +	}  	if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY)  		getFilter().setFilterCategoryTypes(types);  } @@ -581,6 +589,11 @@ void LLInventoryPanel::modelChanged(U32 mask)  			}  		}  	} + +	if ("Recent Items" == getName()) +	{ +		getFilter().setModified(); +	}  }  LLUUID LLInventoryPanel::getRootFolderID() @@ -1457,6 +1470,8 @@ public:  		getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));  	} +	/*virtual*/ void onVisibilityChange(BOOL new_visibility); +  protected:  	LLInventoryRecentItemsPanel (const Params&);  	friend class LLUICtrlFactory; @@ -1469,6 +1484,13 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)  	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;  } +void LLInventoryRecentItemsPanel::onVisibilityChange(BOOL new_visibility) +{ +	if(new_visibility) +	{ +		getFilter().setModified(); +	} +}  namespace LLInitParam  {  	void TypeValues<LLFolderType::EType>::declareValues() diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index b91e37d596..897ee8429a 100755 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -61,7 +61,9 @@  #include "llnotificationsutil.h"  #include "pipeline.h"  #include "llmaterialmgr.h" - +#include "llimagedimensionsinfo.h" +#include "llviewercontrol.h" +#include "lltrans.h"  /*=======================================*/  /*  Formal declarations, constants, etc. */  /*=======================================*/  @@ -845,6 +847,12 @@ bool LLLocalBitmapMgr::addUnit()  		std::string filename = picker.getFirstFile();  		while(!filename.empty())  		{ +			if(!checkTextureDimensions(filename)) +			{ +				filename = picker.getNextFile(); +				continue; +			} +  			LLLocalBitmap* unit = new LLLocalBitmap(filename);  			if (unit->getValid()) @@ -874,6 +882,37 @@ bool LLLocalBitmapMgr::addUnit()  	return add_successful;  } +bool LLLocalBitmapMgr::checkTextureDimensions(std::string filename) +{ +	std::string exten = gDirUtilp->getExtension(filename); +	U32 codec = LLImageBase::getCodecFromExtension(exten); +	std::string mImageLoadError; +	LLImageDimensionsInfo image_info; +	if (!image_info.load(filename,codec)) +	{ +		return false; +	} + +	S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); +	S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); + +	if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) +	{ +		LLStringUtil::format_map_t args; +		args["WIDTH"] = llformat("%d", max_width); +		args["HEIGHT"] = llformat("%d", max_height); +		mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); + +		LLSD notif_args; +		notif_args["REASON"] = mImageLoadError; +		LLNotificationsUtil::add("CannotUploadTexture", notif_args); + +		return false; +	} + +	return true; +} +  void LLLocalBitmapMgr::delUnit(LLUUID tracking_id)  {  	if (!sBitmapList.empty()) diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index a15ea10801..59467922b4 100755 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -120,6 +120,7 @@ class LLLocalBitmapMgr  		static void			cleanupClass();  		static bool         addUnit();  		static void         delUnit(LLUUID tracking_id); +		static bool 		checkTextureDimensions(std::string filename);  		static LLUUID       getWorldID(LLUUID tracking_id);  		static std::string  getFilename(LLUUID tracking_id); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 06e517a861..743bb8973b 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -261,6 +261,46 @@ std::string LLLogChat::cleanFileName(std::string filename)  	return filename;  } +bool LLLogChat::buildIMP2PLogFilename(const LLUUID& idAgent, const std::string& strName, std::string& strFilename) +{ +	static LLCachedControl<bool> fLegacyFilenames(gSavedSettings, "UseLegacyIMLogNames", true); + +	// If we have the name cached then we can simply return the username +	LLAvatarName avName; +	if (LLAvatarNameCache::get(idAgent, &avName)) +	{ +		if (!fLegacyFilenames) +		{ +			strFilename = avName.getUserName(); +		} +		else +		{ +			strFilename = LLCacheName::cleanFullName(avName.getLegacyName()); +		} +		return true; +	} +	else +	{ +		// Try and get it from the legacy cache if we can +		std::string strLegacyName; +		if (gCacheName->getFullName(idAgent, strLegacyName)) +			strLegacyName = strName; + +		if (!fLegacyFilenames) +		{ +			// If we don't have it cached 'strName' *should* be a legacy name (or a complete name) and we can construct a username from that +			strFilename = LLCacheName::buildUsername(strName); +			return strName != strFilename;	// If the assumption above was wrong then the two will match which signals failure +		} +		else +		{ +			// Strip any possible mention of a username +			strFilename = LLCacheName::buildLegacyName(strName); +			return (!strFilename.empty());	// Assume success as long as the filename isn't an empty string +		} +	} +} +  std::string LLLogChat::timestamp(bool withdate)  {  	std::string timeStr; @@ -570,13 +610,6 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string  		LLFILE * filep = LLFile::fopen(fullname, "rb");  		if (NULL != filep)  		{ -			if(makeLogFileName("chat")== fullname) -			{ -				//Add Nearby chat history to the list of transcriptions -				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); -				LLFile::close(filep); -				continue; -			}  			char buffer[LOG_RECALL_SIZE];  			fseek(filep, 0, SEEK_END);			// seek to end of file @@ -749,59 +782,34 @@ void LLLogChat::deleteTranscripts()  // static  bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)  { -	std::vector<std::string> list_of_transcriptions; -	LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); +	std::string strFileName; +	if (!is_group) +		buildIMP2PLogFilename(avatar_id, LLStringUtil::null, strFileName); +	else +		gCacheName->getGroupName(avatar_id, strFileName); -	if (list_of_transcriptions.size() > 0) +	std::string strFilePath = makeLogFileName(strFileName); +	if ( (!strFilePath.empty()) && (LLFile::isfile(strFilePath)) )  	{ -		LLAvatarName avatar_name; -		LLAvatarNameCache::get(avatar_id, &avatar_name); -		std::string avatar_user_name = avatar_name.getAccountName(); -		if(!is_group) -		{ -			std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); -			BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) -			{ -				if (std::string::npos != transcript_file_name.find(avatar_user_name)) -				{ -					return true; -				} -			} -		} -		else -		{ -			std::string file_name; -			gCacheName->getGroupName(avatar_id, file_name); -			file_name = makeLogFileName(file_name); -			BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) -			{ -				if (transcript_file_name == file_name) -				{ -					return true; -				} -			} -		} - +		return true;  	} -	return false; +	// If a dated file existed it'll return a valid path; otherwise, it returns the undated unverified path so we do need to check it +	strFilePath = oldLogFileName(strFileName); +	return (!strFilePath.empty()) && (LLFile::isfile(strFilePath));  }  bool LLLogChat::isNearbyTranscriptExist()  { -	std::vector<std::string> list_of_transcriptions; -	LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - -	std::string file_name; -	file_name = makeLogFileName("chat"); -	BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) +	std::string strFilePath = makeLogFileName("chat"); +	if ( (!strFilePath.empty()) && (LLFile::isfile(strFilePath)) )  	{ -	   	if (transcript_file_name == file_name) -	   	{ -			return true; -		 } +		return true;  	} -	return false; + +	// If a dated file existed it'll return a valid path; otherwise, it returns the undated unverified path so we do need to check it +	strFilePath = oldLogFileName("chat"); +	return (!strFilePath.empty()) && (LLFile::isfile(strFilePath));  }  //*TODO mark object's names in a special way so that they will be distinguishable form avatar name  diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index ca597599dd..d1dbf2d119 100755 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -92,6 +92,12 @@ public:  	static std::string timestamp(bool withdate = false);  	static std::string makeLogFileName(std::string(filename)); + +	/** +	 * Attempts to build the correct IM P2P log filename for the specified agent UUID and agent name +	 */ +	static bool buildIMP2PLogFilename(const LLUUID& idAgent, const std::string& strName, std::string& strFilename); +  	/**  	*Add functions to get old and non date stamped file names when needed  	*/ diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index bbcdcb126d..0935691ebc 100755 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -62,7 +62,7 @@ F32		LLManip::sHelpTextFadeTime = 2.f;  S32		LLManip::sNumTimesHelpTextShown = 0;  S32		LLManip::sMaxTimesShowHelpText = 5;  F32		LLManip::sGridMaxSubdivisionLevel = 32.f; -F32		LLManip::sGridMinSubdivisionLevel = 1.f; +F32		LLManip::sGridMinSubdivisionLevel = 1.f / 32.f;  LLVector2 LLManip::sTickLabelSpacing(60.f, 25.f); @@ -176,7 +176,7 @@ BOOL LLManip::getManipAxis(LLViewerObject* object, EManipPart manip, LLVector3 &  	return TRUE;  } -F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing) +F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing, F32 min_subdivisions, F32 max_subdivisions)  {  	//update current snap subdivision level  	LLVector3 cam_to_reference; @@ -192,7 +192,8 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto  	F32 projected_translation_axis_length = (translate_axis % cam_to_reference).magVec();  	F32 subdivisions = llmax(projected_translation_axis_length * grid_scale / (current_range / LLViewerCamera::getInstance()->getPixelMeterRatio() * min_pixel_spacing), 0.f); -	subdivisions = llclamp((F32)pow(2.f, llfloor(log(subdivisions) / log(2.f))), 1.f / 32.f, 32.f); +	// figure out nearest power of 2 that subdivides grid_scale with result > min_pixel_spacing +	subdivisions = llclamp((F32)pow(2.f, llfloor(log(subdivisions) / log(2.f))), min_subdivisions, max_subdivisions);  	return subdivisions;  } @@ -548,37 +549,31 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string  	BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD;  	gGL.matrixMode(LLRender::MM_MODELVIEW);  	gGL.pushMatrix(); -	LLVector3 render_pos = pos; -	if (hud_selection)  	{ -		F32 zoom_amt = gAgentCamera.mHUDCurZoom; -		F32 inv_zoom_amt = 1.f / zoom_amt; -		// scale text back up to counter-act zoom level -		render_pos = pos * zoom_amt; -		gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt); -	} - -	LLColor4 shadow_color = LLColor4::black; -	shadow_color.mV[VALPHA] = color.mV[VALPHA] * 0.5f; +		LLVector3 render_pos = pos; +		if (hud_selection) +		{ +			F32 zoom_amt = gAgentCamera.mHUDCurZoom; +			F32 inv_zoom_amt = 1.f / zoom_amt; +			// scale text back up to counter-act zoom level +			render_pos = pos * zoom_amt; +			gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt); +		} -	if (fractional_portion != 0) -	{ -		fraction_string = llformat("%c%02d%s", LLResMgr::getInstance()->getDecimalPoint(), fractional_portion, suffix.c_str()); +		LLColor4 shadow_color = LLColor4::black; +		shadow_color.mV[VALPHA] = color.mV[VALPHA] * 0.5f; -		gViewerWindow->setup3DViewport(1, -1); -		hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, shadow_color, hud_selection); -		hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 1.f, 3.f, shadow_color, hud_selection); +		if (fractional_portion != 0) +		{ +			fraction_string = llformat("%c%02d%s", LLResMgr::getInstance()->getDecimalPoint(), fractional_portion, suffix.c_str()); -		gViewerWindow->setup3DViewport(); -		hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); -		hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 1.f, 3.f, color, hud_selection); -	} -	else -	{ -		gViewerWindow->setup3DViewport(1, -1); -		hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, shadow_color, hud_selection); -		gViewerWindow->setup3DViewport(); -		hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); +			hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); +			hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, 1.f, 3.f, color, hud_selection); +		} +		else +		{ +			hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); +		}  	}  	gGL.popMatrix();  } diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h index 6263e4244f..1fb05e047a 100755 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -137,7 +137,7 @@ protected:  	LLVector3			getPivotPoint();  	void				getManipNormal(LLViewerObject* object, EManipPart manip, LLVector3 &normal);  	BOOL				getManipAxis(LLViewerObject* object, EManipPart manip, LLVector3 &axis); -	F32					getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing = MIN_DIVISION_PIXEL_WIDTH); +	F32					getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing = MIN_DIVISION_PIXEL_WIDTH, F32 min_subdivisions = sGridMinSubdivisionLevel, F32 max_subdivisions = sGridMaxSubdivisionLevel);  	void				renderTickValue(const LLVector3& pos, F32 value, const std::string& suffix, const LLColor4 &color);  	void				renderTickText(const LLVector3& pos, const std::string& suffix, const LLColor4 &color);  	void				updateGridSettings(); diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 506366aba6..1f0546c84b 100755 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -185,12 +185,15 @@ LLManipScale::LLManipScale( LLToolComposite* composite )  	mLastUpdateFlags( 0 ),  	mScaleSnapUnit1(1.f),  	mScaleSnapUnit2(1.f), +	mGridScale1(1.f), +	mGridScale2(1.f),  	mSnapRegimeOffset(0.f),  	mTickPixelSpacing1(0.f),  	mTickPixelSpacing2(0.f),  	mSnapGuideLength(0.f),  	mInSnapRegime(FALSE), -	mScaleSnappedValue(0.f) +	mScaleSnappedValue1(0.f), +	mScaleSnappedValue2(0.f)  {   	for (S32 i = 0; i < NUM_MANIPULATORS; i++)  	{ @@ -291,19 +294,16 @@ void LLManipScale::render()  			{  				LLGLEnable poly_offset(GL_POLYGON_OFFSET_FILL);  				glPolygonOffset( -2.f, -2.f); +				{ -				// JC - Band-aid until edge stretch working similar to side stretch -				// in non-uniform. -				// renderEdges( bbox ); - -				renderCorners( bbox ); -				renderFaces( bbox ); +					renderCorners( bbox ); +					renderFaces( bbox ); -				if (mManipPart != LL_NO_PART) -				{ -					renderGuidelinesPart( bbox ); +					if (mManipPart != LL_NO_PART) +					{ +						//renderGuidelinesPart( bbox ); +					}  				} -  				glPolygonOffset( 0.f, 0.f);  			}  		} @@ -311,6 +311,7 @@ void LLManipScale::render()  		if (mManipPart != LL_NO_PART)  		{ +			renderGuideline( bbox );  			renderSnapGuides(bbox);  		}  		gGL.popMatrix(); @@ -348,7 +349,9 @@ BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  	LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();  	LLVector3 box_center_agent = bbox.getCenterAgent(); -	LLVector3 box_corner_agent = bbox.localToAgent( unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ) ); +	LLVector3 unit_vector = partToUnitVector( mManipPart ); +	LLVector3 extent_vector = unitVectorToLocalBBoxExtent( unit_vector, bbox ); +	LLVector3 box_corner_agent = bbox.localToAgent( extent_vector );  	updateSnapGuides(bbox); @@ -876,8 +879,8 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	LLBBox bbox	     = LLSelectMgr::getInstance()->getBBoxOfSelection();  	F32 scale_factor = 1.f; -	F32 max_scale    = partToMaxScale(mManipPart, bbox); -	F32 min_scale    = partToMinScale(mManipPart, bbox); +	//F32 max_scale    = partToMaxScale(mManipPart, bbox); +	//F32 min_scale    = partToMinScale(mManipPart, bbox);  	BOOL uniform     = LLManipScale::getUniform();  	// check for snapping @@ -892,54 +895,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	LLVector3 projected_drag_pos1 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane1, mSnapGuideDir1));  	LLVector3 projected_drag_pos2 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane2, mSnapGuideDir2)); -	BOOL snap_enabled = gSavedSettings.getBOOL("SnapEnabled"); -	if (snap_enabled && (mouse_on_plane1 - projected_drag_pos1) * mSnapGuideDir1 > mSnapRegimeOffset) -	{ -		F32 drag_dist = projected_drag_pos1.length(); - -		F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos1, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); -		F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions); -		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions); - -		mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); -		scale_factor  =  mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent); -		mScaleSnappedValue /= mScaleSnapUnit1 * 2.f; -		mInSnapRegime = TRUE; - -		if (!uniform) -		{ -			scale_factor *= 0.5f; -		} -	} -	else if (snap_enabled && (mouse_on_plane2 - projected_drag_pos2) * mSnapGuideDir2 > mSnapRegimeOffset ) -	{ -		F32 drag_dist = projected_drag_pos2.length(); - -		F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos2, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); -		F32 snap_dist = mScaleSnapUnit2 / (2.f * cur_subdivisions); -		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit2 / cur_subdivisions); - -		mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); -		scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent); -		mScaleSnappedValue /= mScaleSnapUnit2 * 2.f; -		mInSnapRegime = TRUE; - -		if (!uniform) -		{ -			scale_factor *= 0.5f; -		} -	} -	else  -	{ -		mInSnapRegime = FALSE; -		scale_factor = t; -		if (!uniform) -		{ -			scale_factor = 0.5f + (scale_factor * 0.5f); -		} -	} - -  	F32 max_scale_factor = get_default_max_prim_scale() / MIN_PRIM_SCALE;  	F32 min_scale_factor = MIN_PRIM_SCALE / get_default_max_prim_scale(); @@ -964,7 +919,65 @@ void LLManipScale::dragCorner( S32 x, S32 y )  		}  	} -	scale_factor = llclamp( scale_factor, min_scale_factor, max_scale_factor ); +	BOOL snap_enabled = gSavedSettings.getBOOL("SnapEnabled"); +	if (snap_enabled && (mouse_on_plane1 - projected_drag_pos1) * mSnapGuideDir1 > mSnapRegimeOffset) +	{ +		mInSnapRegime = TRUE; + +		F32 drag_dist = projected_drag_pos1 * mScaleDir; + +		F32 cur_subdivisions = getSubdivisionLevel(mScaleCenter + projected_drag_pos1,  +													mScaleDir,  +													mScaleSnapUnit1,  +													mTickPixelSpacing1,  +													1.f, //always snap to at least the base grid unit +													LLManip::sGridMaxSubdivisionLevel); +		mScaleSnappedValue1 = mGridScale1 / cur_subdivisions * llround(drag_dist * (cur_subdivisions / mScaleSnapUnit1)); + +		scale_factor = mScaleSnappedValue1 / ((drag_start_point_agent - drag_start_center_agent) * mSnapDir1); +		scale_factor = llclamp( scale_factor, min_scale_factor, max_scale_factor ); + +		mScaleSnappedValue2 = scale_factor * ((drag_start_point_agent - drag_start_center_agent) * mSnapDir2); + +		scale_factor *= 0.5f; +	} +	else if (snap_enabled && (mouse_on_plane2 - projected_drag_pos2) * mSnapGuideDir2 > mSnapRegimeOffset ) +	{ +		mInSnapRegime = TRUE; + +		F32 drag_dist = projected_drag_pos2 * mScaleDir; +		 +		F32 cur_subdivisions = getSubdivisionLevel(mScaleCenter + projected_drag_pos2,  +													mScaleDir,  +													mScaleSnapUnit2,  +													mTickPixelSpacing2,  +													1.f, //always snap to at least the base grid unit +													LLManip::sGridMaxSubdivisionLevel); +		mScaleSnappedValue2 = mGridScale2  / cur_subdivisions * llround(drag_dist * (cur_subdivisions / mScaleSnapUnit2)); + +		scale_factor = mScaleSnappedValue2 / ((drag_start_point_agent - drag_start_center_agent) * mSnapDir2); +		scale_factor = llclamp( scale_factor, min_scale_factor, max_scale_factor ); + +		mScaleSnappedValue1 = scale_factor * ((drag_start_point_agent - drag_start_center_agent) * mSnapDir1); + +		scale_factor *= 0.5f; +	} +	else  +	{ +		mInSnapRegime = FALSE; +		scale_factor = llclamp( t, min_scale_factor, max_scale_factor ); + +		if (!uniform) +		{ +			scale_factor = 0.5f + (scale_factor * 0.5f); +		} +	} + +	if (LLSelectMgr::getInstance()->getGridMode() != GRID_MODE_WORLD) +	{ +		mScaleSnappedValue1 /= mGridScale1 * 2.f; +		mScaleSnappedValue2 /= mGridScale2 * 2.f; +	}  	LLVector3d drag_global = uniform ? mDragStartCenterGlobal : mDragFarHitGlobal; @@ -1112,14 +1125,14 @@ void LLManipScale::dragFace( S32 x, S32 y )  		if (dist_along_scale_line > max_drag_dist)  		{ -			mScaleSnappedValue = max_drag_dist; +			mScaleSnappedValue1 = max_drag_dist;  			LLVector3 clamp_point = mScaleCenter + max_drag_dist * mScaleDir;  			drag_delta.setVec(clamp_point - drag_start_point_agent);  		}  		else if (dist_along_scale_line < min_drag_dist)  		{ -			mScaleSnappedValue = min_drag_dist; +			mScaleSnappedValue1 = min_drag_dist;  			LLVector3 clamp_point = mScaleCenter + min_drag_dist * mScaleDir;  			drag_delta.setVec(clamp_point - drag_start_point_agent); @@ -1127,7 +1140,7 @@ void LLManipScale::dragFace( S32 x, S32 y )  		else  		{  			F32 drag_dist = scale_center_to_mouse * mScaleDir; -			F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +			F32 cur_subdivisions = getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1, 1.f, LLManip::sGridMaxSubdivisionLevel);  			F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);  			F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);  			relative_snap_dist -= snap_dist; @@ -1141,7 +1154,7 @@ void LLManipScale::dragFace( S32 x, S32 y )  										 drag_dist - max_drag_dist,  										 drag_dist - min_drag_dist); -			mScaleSnappedValue = drag_dist - relative_snap_dist; +			mScaleSnappedValue1 = drag_dist - relative_snap_dist;  			if (llabs(relative_snap_dist) < snap_dist)  			{ @@ -1154,6 +1167,10 @@ void LLManipScale::dragFace( S32 x, S32 y )  				drag_delta -= drag_correction;  			}  		} +		if (uniform) +		{ +			mScaleSnappedValue1 *= 2.f; +		}  	}  	else   	{ @@ -1312,29 +1329,30 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto  } -void LLManipScale::renderGuidelinesPart( const LLBBox& bbox ) +void LLManipScale::renderGuideline( const LLBBox& bbox )  { -	LLVector3 guideline_start = bbox.getCenterLocal(); -	 -	LLVector3 guideline_end = unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ); +	F32 max_point_on_scale_line = partToMaxScale(mManipPart, bbox); -	if (!getUniform()) +	S32 pass; +	for (pass = 0; pass < 3; pass++)  	{ -		guideline_start = unitVectorToLocalBBoxExtent( -partToUnitVector( mManipPart ), bbox ); -	} +		LLColor4 tick_color = setupSnapGuideRenderPass(pass); +		LLGLDepthTest gls_depth(pass != 1); -	guideline_end -= guideline_start; -	guideline_end.normVec(); -	guideline_end *= LLWorld::getInstance()->getRegionWidthInMeters(); -	guideline_end += guideline_start; +		glLineWidth(2.5f); -	{ -		LLGLDepthTest gls_depth(GL_TRUE); -		gl_stippled_line_3d( guideline_start, guideline_end, LLColor4(1.f, 1.f, 1.f, 0.5f) ); -	} -	{ -		LLGLDepthTest gls_depth(GL_FALSE); -		gl_stippled_line_3d( guideline_start, guideline_end, LLColor4(1.f, 1.f, 1.f, 0.25f) ); +		gGL.begin(LLRender::LINES); +		{ +			LLVector3 line_start = mScaleCenter; +			LLVector3 line_end = line_start + (mScaleDir * max_point_on_scale_line); +		 +			gGL.color4fv(tick_color.mV); +			gGL.vertex3fv(line_start.mV); +			gGL.vertex3fv(line_end.mV); +		} +		gGL.end(); + +		LLRender2D::setLineWidth(1.f);  	}  } @@ -1399,8 +1417,11 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  		}  		LLVector3 scale_snap = grid_scale; -		mScaleSnapUnit1 = scale_snap.scaleVec(partToUnitVector( mManipPart )).magVec(); +		LLVector3 scale_dir = partToUnitVector( mManipPart ); +		mScaleSnapUnit1 = scale_snap.scaleVec(scale_dir).magVec();  		mScaleSnapUnit2 = mScaleSnapUnit1; +		mGridScale1 = mScaleSnapUnit1; +		mGridScale2 = mScaleSnapUnit1;  		mSnapGuideDir1 *= mSnapGuideDir1 * LLViewerCamera::getInstance()->getUpAxis() > 0.f ? 1.f : -1.f;  		mSnapGuideDir2 = mSnapGuideDir1 * -1.f;  		mSnapDir1 = mScaleDir; @@ -1515,30 +1536,30 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  		case VX:  			// x axis face being scaled, use y and z for snap guides  			mSnapGuideDir1 = LLVector3::y_axis.scaledVec(axis_flip); -			mScaleSnapUnit1 = grid_scale.mV[VZ]; +			mGridScale1 = grid_scale.mV[VZ];  			mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip); -			mScaleSnapUnit2 = grid_scale.mV[VY];			 +			mGridScale2 = grid_scale.mV[VY];			  			break;  		case VY:  			// y axis facing being scaled, use x and z for snap guides  			mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip); -			mScaleSnapUnit1 = grid_scale.mV[VZ]; +			mGridScale1 = grid_scale.mV[VZ];  			mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip); -			mScaleSnapUnit2 = grid_scale.mV[VX]; +			mGridScale2 = grid_scale.mV[VX];  			break;  		case VZ:  			// z axis facing being scaled, use x and y for snap guides  			mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip); -			mScaleSnapUnit1 = grid_scale.mV[VY]; +			mGridScale1 = grid_scale.mV[VY];  			mSnapGuideDir2 = LLVector3::y_axis.scaledVec(axis_flip); -			mScaleSnapUnit2 = grid_scale.mV[VX]; +			mGridScale2 = grid_scale.mV[VX];  			break;  		default:  			mSnapGuideDir1.zeroVec(); -			mScaleSnapUnit1 = 0.f; +			mGridScale1 = 0.f;  			mSnapGuideDir2.zeroVec(); -			mScaleSnapUnit2 = 0.f; +			mGridScale2 = 0.f;  			break;  		} @@ -1554,11 +1575,18 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	mScalePlaneNormal2 = mSnapGuideDir2 % mScaleDir;  	mScalePlaneNormal2.normVec();	 -	mScaleSnapUnit1 = mScaleSnapUnit1 / (mSnapDir1 * mScaleDir); -	mScaleSnapUnit2 = mScaleSnapUnit2 / (mSnapDir2 * mScaleDir); +	mScaleSnapUnit1 = mGridScale1 / (mSnapDir1 * mScaleDir); +	mScaleSnapUnit2 = mGridScale2 / (mSnapDir2 * mScaleDir); -	mTickPixelSpacing1 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir1).length()); -	mTickPixelSpacing2 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir2).length()); +	LLVector3 scale_dir_screen = orthogonal_component(mScaleDir, cam_at_axis); +	scale_dir_screen.normalize(); +	LLVector3 snap_guide_dir_1_screen = orthogonal_component(mSnapGuideDir1, cam_at_axis); +	snap_guide_dir_1_screen.normalize(); +	LLVector3 snap_guide_dir_2_screen = orthogonal_component(mSnapGuideDir2, cam_at_axis); +	snap_guide_dir_2_screen.normalize(); + +	mTickPixelSpacing1 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (scale_dir_screen % snap_guide_dir_1_screen).length()); +	mTickPixelSpacing2 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (scale_dir_screen % snap_guide_dir_2_screen).length());  	if (uniform)  	{ @@ -1574,74 +1602,47 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		return;  	} -	F32 max_subdivisions = sGridMaxSubdivisionLevel; +	F32 max_point_on_scale_line = partToMaxScale(mManipPart, bbox);  	F32 grid_alpha = gSavedSettings.getF32("GridOpacity"); -	F32 max_point_on_scale_line = partToMaxScale(mManipPart, bbox);  	LLVector3 drag_point = gAgent.getPosAgentFromGlobal(mDragPointGlobal);  	updateGridSettings(); +	// render tick ruler baselines  	S32 pass;  	for (pass = 0; pass < 3; pass++)  	{  		LLColor4 tick_color = setupSnapGuideRenderPass(pass); +		LLGLDepthTest gls_depth(pass != 1);  		gGL.begin(LLRender::LINES); -		LLVector3 line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset); -		LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f))); -		LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f)); +		{ +			LLVector3 line_start = mScaleCenter + (mSnapGuideDir1 * mSnapRegimeOffset); +			LLVector3 line_end = line_start + (mScaleDir * max_point_on_scale_line); -		gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f); -		gGL.vertex3fv(line_start.mV); -		gGL.color4fv(tick_color.mV); -		gGL.vertex3fv(line_mid.mV); -		gGL.vertex3fv(line_mid.mV); -		gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f); -		gGL.vertex3fv(line_end.mV); - -		line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir2 * mSnapRegimeOffset); -		line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f))); -		line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f)); -		gGL.vertex3fv(line_start.mV); -		gGL.color4fv(tick_color.mV); -		gGL.vertex3fv(line_mid.mV); -		gGL.vertex3fv(line_mid.mV); -		gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f); -		gGL.vertex3fv(line_end.mV); +			gGL.color4fv(tick_color.mV); +			gGL.vertex3fv(line_start.mV); +			gGL.vertex3fv(line_end.mV); + +			line_start = mScaleCenter + (mSnapGuideDir2 * mSnapRegimeOffset); +			line_end = line_start + (mScaleDir * max_point_on_scale_line); +			gGL.vertex3fv(line_start.mV); +			gGL.vertex3fv(line_end.mV); +		}  		gGL.end();  	}  	{  		LLGLDepthTest gls_depth(GL_FALSE); -		F32 dist_grid_axis = (drag_point - mScaleCenter) * mScaleDir; -		// find distance to nearest smallest grid unit -		F32 grid_multiple1 = llfloor(llmax(0.f, dist_grid_axis) / (mScaleSnapUnit1 / max_subdivisions)); -		F32 grid_multiple2 = llfloor(llmax(0.f, dist_grid_axis) / (mScaleSnapUnit2 / max_subdivisions)); -		F32 grid_offset1 = fmodf(dist_grid_axis, mScaleSnapUnit1 / max_subdivisions); -		F32 grid_offset2 = fmodf(dist_grid_axis, mScaleSnapUnit2 / max_subdivisions); - -		// how many smallest grid units are we away from largest grid scale? -		S32 sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 / sGridMinSubdivisionLevel) / (mScaleSnapUnit1 / max_subdivisions)); -		S32 sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 / sGridMinSubdivisionLevel) / (mScaleSnapUnit2 / max_subdivisions)); - -		S32 num_ticks_per_side1 = llmax(1, lltrunc(0.5f * mSnapGuideLength / (mScaleSnapUnit1 / max_subdivisions))); -		S32 num_ticks_per_side2 = llmax(1, lltrunc(0.5f * mSnapGuideLength / (mScaleSnapUnit2 / max_subdivisions))); -		F32 dist_scale_units_1 = dist_grid_axis / (mScaleSnapUnit1 / max_subdivisions); -		F32 dist_scale_units_2 = dist_grid_axis / (mScaleSnapUnit2 / max_subdivisions); -		S32 ticks_from_scale_center_1 = lltrunc(dist_scale_units_1); -		S32 ticks_from_scale_center_2 = lltrunc(dist_scale_units_2); -		S32 max_ticks1 = llceil(max_point_on_scale_line / (mScaleSnapUnit1 / max_subdivisions) - dist_scale_units_1); -		S32 max_ticks2 = llceil(max_point_on_scale_line / (mScaleSnapUnit2 / max_subdivisions) - dist_scale_units_2); -		S32 start_tick = 0; -		S32 stop_tick = 0; +		S32 num_ticks_per_side1 = llmax(1, lltrunc(max_point_on_scale_line / (mScaleSnapUnit1 / sGridMaxSubdivisionLevel))); +		S32 num_ticks_per_side2 = llmax(1, lltrunc(max_point_on_scale_line / (mScaleSnapUnit2 / sGridMaxSubdivisionLevel)));  		if (mInSnapRegime)  		{  			// draw snap guide line  			gGL.begin(LLRender::LINES); -			//LLVector3 snap_line_center = mScaleCenter + (mScaleSnappedValue * mScaleDir);  			LLVector3 snap_line_center = bbox.localToAgent(unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ));  			LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset); @@ -1654,6 +1655,17 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			gGL.vertex3fv(snap_line_end.mV);  			gGL.end(); +			F32 arrow_size; +			if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) +			{ +				arrow_size = 0.02f; +			} +			else +			{ +				arrow_size = 0.01f * dist_vec(snap_line_center, LLViewerCamera::getInstance()->getOrigin()); +			} + +  			// draw snap guide arrow  			gGL.begin(LLRender::TRIANGLES);  			{ @@ -1665,15 +1677,15 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  				arrow_dir = snap_line_start - snap_line_center;  				arrow_dir.normVec(); -				gGL.vertex3fv((snap_line_start + arrow_dir * mSnapRegimeOffset * 0.1f).mV); -				gGL.vertex3fv((snap_line_start + arrow_span * mSnapRegimeOffset * 0.1f).mV); -				gGL.vertex3fv((snap_line_start - arrow_span * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_start + arrow_dir * arrow_size).mV); +				gGL.vertex3fv((snap_line_start + arrow_span * arrow_size).mV); +				gGL.vertex3fv((snap_line_start - arrow_span * arrow_size).mV);  				arrow_dir = snap_line_end - snap_line_center;  				arrow_dir.normVec(); -				gGL.vertex3fv((snap_line_end + arrow_dir * mSnapRegimeOffset * 0.1f).mV); -				gGL.vertex3fv((snap_line_end + arrow_span * mSnapRegimeOffset * 0.1f).mV); -				gGL.vertex3fv((snap_line_end - arrow_span * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_end + arrow_dir * arrow_size).mV); +				gGL.vertex3fv((snap_line_end + arrow_span * arrow_size).mV); +				gGL.vertex3fv((snap_line_end - arrow_span * arrow_size).mV);  			}  			gGL.end();  		} @@ -1686,35 +1698,32 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		for (pass = 0; pass < 3; pass++)  		{  			LLColor4 tick_color = setupSnapGuideRenderPass(pass); - -			start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1)); -			stop_tick = llmin(max_ticks1, num_ticks_per_side1); +			LLGLDepthTest gls_depth(pass != 1);  			gGL.begin(LLRender::LINES);  			// draw first row of ticks -			for (S32 i = start_tick; i <= stop_tick; i++) +			for (S32 i = 0; i <= num_ticks_per_side1; i++)  			{ -				F32 alpha = (1.f - (1.f *  ((F32)llabs(i) / (F32)num_ticks_per_side1))); -				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * (mScaleSnapUnit1 / max_subdivisions)); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * i * (mScaleSnapUnit1 / sGridMaxSubdivisionLevel)); -				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +				F32 cur_subdivisions = getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1); -				if (fmodf((F32)(i + sub_div_offset_1), (max_subdivisions / cur_subdivisions)) != 0.f) +				if (i != num_ticks_per_side1 && fmodf((F32)i, (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)  				{  					continue;  				}  				F32 tick_scale = 1.f; -				for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f) +				for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  				{ -					if (fmodf((F32)(i + sub_div_offset_1), division_level) == 0.f) +					if (fmodf((F32)i, division_level) == 0.f)  					{  						break;  					}  					tick_scale *= 0.7f;  				} -				gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * alpha); +				gGL.color4fv(tick_color.mV);  				LLVector3 tick_start = tick_pos + (mSnapGuideDir1 * mSnapRegimeOffset);  				LLVector3 tick_end = tick_start + (mSnapGuideDir1 * mSnapRegimeOffset * tick_scale);  				gGL.vertex3fv(tick_start.mV); @@ -1722,32 +1731,28 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			}  			// draw opposite row of ticks -			start_tick = -(llmin(ticks_from_scale_center_2, num_ticks_per_side2)); -			stop_tick = llmin(max_ticks2, num_ticks_per_side2); - -			for (S32 i = start_tick; i <= stop_tick; i++) +			for (S32 i = 0; i <= num_ticks_per_side2; i++)  			{ -				F32 alpha = (1.f - (1.f *  ((F32)llabs(i) / (F32)num_ticks_per_side2))); -				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * (mScaleSnapUnit2 / max_subdivisions)); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * i * (mScaleSnapUnit2 / sGridMaxSubdivisionLevel)); -				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +				F32 cur_subdivisions = getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2); -				if (fmodf((F32)(i + sub_div_offset_2), (max_subdivisions / cur_subdivisions)) != 0.f) +				if (i != num_ticks_per_side1 && fmodf((F32)i, (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)  				{  					continue;  				}  				F32 tick_scale = 1.f; -				for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f) +				for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  				{ -					if (fmodf((F32)(i + sub_div_offset_2), division_level) == 0.f) +					if (fmodf((F32)i, division_level) == 0.f)  					{  						break;  					}  					tick_scale *= 0.7f;  				} -				gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * alpha); +				gGL.color4fv(tick_color.mV);  				LLVector3 tick_start = tick_pos + (mSnapGuideDir2 * mSnapRegimeOffset);  				LLVector3 tick_end = tick_start + (mSnapGuideDir2 * mSnapRegimeOffset * tick_scale);  				gGL.vertex3fv(tick_start.mV); @@ -1757,31 +1762,23 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		}  		// render tick labels -		start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1)); -		stop_tick = llmin(max_ticks1, num_ticks_per_side1); -  		F32 grid_resolution = mObjectSelection->getSelectType() == SELECT_TYPE_HUD ? 0.25f : llmax(gSavedSettings.getF32("GridResolution"), 0.001f); -		S32 label_sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1  * 32.f) / (mScaleSnapUnit1 / max_subdivisions)); -		S32 label_sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2  * 32.f) / (mScaleSnapUnit2 / max_subdivisions)); -		for (S32 i = start_tick; i <= stop_tick; i++) +		for (S32 i = 0; i <= num_ticks_per_side1; i++)  		{  			F32 tick_scale = 1.f; -			F32 alpha = grid_alpha * (1.f - (0.5f *  ((F32)llabs(i) / (F32)num_ticks_per_side1))); -			F32 distance = (drag_point - mScaleCenter) * mScaleDir; -			(void) distance; -			LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * (mScaleSnapUnit1 / max_subdivisions)); +			LLVector3 tick_pos = mScaleCenter + (mScaleDir * i * (mScaleSnapUnit1 / sGridMaxSubdivisionLevel)); -			for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f) +			for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  			{ -				if (fmodf((F32)(i + label_sub_div_offset_1), division_level) == 0.f) +				if (fmodf((F32)i, division_level) == 0.f)  				{  					break;  				}  				tick_scale *= 0.7f;  			} -			if (fmodf((F32)(i + label_sub_div_offset_1), (max_subdivisions / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, tick_label_spacing)))) == 0.f) +			if (i == num_ticks_per_side1 || fmodf((F32)i, (sGridMaxSubdivisionLevel / getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, tick_label_spacing))) == 0.f)  			{  				LLVector3 text_origin = tick_pos +   					(mSnapGuideDir1 * mSnapRegimeOffset * (1.f + tick_scale)); @@ -1790,45 +1787,42 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  				F32 tick_value;  				if (grid_mode == GRID_MODE_WORLD)  				{ -					tick_value = (grid_multiple1 + i) / (max_subdivisions / grid_resolution); +					tick_value = i / (sGridMaxSubdivisionLevel / grid_resolution);  				}  				else  				{ -					tick_value = (grid_multiple1 + i) / (2.f * max_subdivisions); +					tick_value = i / (2.f * sGridMaxSubdivisionLevel);  				}  				F32 text_highlight = 0.8f; -				if (is_approx_equal(tick_value, mScaleSnappedValue) && mInSnapRegime) +				if (is_approx_equal(tick_value, mScaleSnappedValue1) && mInSnapRegime)  				{  					text_highlight = 1.f;  				} -				renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha)); +				renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? "m" : "x", LLColor4(text_highlight, text_highlight, text_highlight, grid_alpha));  			}  		}  		// label ticks on opposite side  		if (mScaleSnapUnit2 != mScaleSnapUnit1)  		{ -			start_tick = -(llmin(ticks_from_scale_center_2, num_ticks_per_side2)); -			stop_tick = llmin(max_ticks2, num_ticks_per_side2); -			for (S32 i = start_tick; i <= stop_tick; i++) +			for (S32 i = 0; i <= num_ticks_per_side2; i++)  			{  				F32 tick_scale = 1.f; -				F32 alpha = grid_alpha * (1.f - (0.5f *  ((F32)llabs(i) / (F32)num_ticks_per_side2))); -				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * (mScaleSnapUnit2 / max_subdivisions)); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * i * (mScaleSnapUnit2 / sGridMaxSubdivisionLevel)); -				for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f) +				for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  				{ -					if (fmodf((F32)(i + label_sub_div_offset_2), division_level) == 0.f) +					if (fmodf(i, division_level) == 0.f)  					{  						break;  					}  					tick_scale *= 0.7f;  				} -				if (fmodf((F32)(i + label_sub_div_offset_2), (max_subdivisions / llmin(max_subdivisions, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, tick_label_spacing)))) == 0.f) +				if (i == num_ticks_per_side2 || fmodf((F32)i, (sGridMaxSubdivisionLevel / getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, tick_label_spacing))) == 0.f)  				{  					LLVector3 text_origin = tick_pos +   						(mSnapGuideDir2 * mSnapRegimeOffset * (1.f + tick_scale)); @@ -1837,21 +1831,21 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  					F32 tick_value;  					if (grid_mode == GRID_MODE_WORLD)  					{ -						tick_value = (grid_multiple2 + i) / (max_subdivisions / grid_resolution); +						tick_value = i / (sGridMaxSubdivisionLevel / grid_resolution);  					}  					else  					{ -						tick_value = (grid_multiple2 + i) / (2.f * max_subdivisions); +						tick_value = i / (2.f * sGridMaxSubdivisionLevel);  					}  					F32 text_highlight = 0.8f; -					if (is_approx_equal(tick_value, mScaleSnappedValue) && mInSnapRegime) +					if (is_approx_equal(tick_value, mScaleSnappedValue2) && mInSnapRegime)  					{  						text_highlight = 1.f;  					} -					renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha)); +					renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? "m" : "x", LLColor4(text_highlight, text_highlight, text_highlight, grid_alpha));  				}  			}  		} diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h index 079fda76ce..916213ea0d 100755 --- a/indra/newview/llmanipscale.h +++ b/indra/newview/llmanipscale.h @@ -92,7 +92,7 @@ private:  	void			renderEdges( const LLBBox& local_bbox );  	void			renderBoxHandle( F32 x, F32 y, F32 z );  	void			renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end ); -	void			renderGuidelinesPart( const LLBBox& local_bbox ); +	void			renderGuideline( const LLBBox& local_bbox );  	void			renderSnapGuides( const LLBBox& local_bbox );  	void			revert(); @@ -149,6 +149,8 @@ private:  	LLVector4		mManipulatorVertices[14];  	F32				mScaleSnapUnit1;  // size of snap multiples for axis 1  	F32				mScaleSnapUnit2;  // size of snap multiples for axis 2 +	F32				mGridScale1; +	F32				mGridScale2;  	LLVector3		mScalePlaneNormal1; // normal of plane in which scale occurs that most faces camera  	LLVector3		mScalePlaneNormal2; // normal of plane in which scale occurs that most faces camera  	LLVector3		mSnapGuideDir1; @@ -161,7 +163,8 @@ private:  	F32				mSnapGuideLength;  	LLVector3		mScaleCenter;  	LLVector3		mScaleDir; -	F32				mScaleSnappedValue; +	F32				mScaleSnappedValue1, +					mScaleSnappedValue2;  	BOOL			mInSnapRegime;  	F32				mManipulatorScales[NUM_MANIPULATORS];  	F32				mBoxHandleSize[NUM_MANIPULATORS];		// The size of the handles at the corners of the bounding box diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 0518ddf88d..e5d63e6957 100755 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -375,7 +375,7 @@ BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  	//LLVector3 select_center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal());  	// TomY: The above should (?) be identical to the below  	LLVector3 select_center_agent = getPivotPoint(); -	mSubdivisions = llclamp(getSubdivisionLevel(select_center_agent, axis_exists ? axis : LLVector3::z_axis, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +	mSubdivisions = getSubdivisionLevel(select_center_agent, axis_exists ? axis : LLVector3::z_axis, getMinGridScale());  	// if we clicked on a planar manipulator, recenter mouse cursor  	if (mManipPart >= LL_YZ_PLANE && mManipPart <= LL_XY_PLANE) @@ -517,7 +517,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  	LLSelectMgr::getInstance()->updateSelectionCenter();  	LLVector3d current_pos_global = gAgent.getPosGlobalFromAgent(getPivotPoint()); -	mSubdivisions = llclamp(getSubdivisionLevel(getPivotPoint(), axis_f, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +	mSubdivisions = getSubdivisionLevel(getPivotPoint(), axis_f, getMinGridScale());  	// Project the cursor onto that plane  	LLVector3d relative_move; @@ -607,7 +607,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  				max_grid_scale = mGridScale.mV[VZ];  			} -			F32 num_subdivisions = llclamp(getSubdivisionLevel(getPivotPoint(), camera_projected_dir, max_grid_scale), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +			F32 num_subdivisions = getSubdivisionLevel(getPivotPoint(), camera_projected_dir, max_grid_scale);  			F32 grid_scale_a;  			F32 grid_scale_b; @@ -1255,6 +1255,7 @@ void LLManipTranslate::renderSnapGuides()  		for (S32 pass = 0; pass < 3; pass++)  		{  			LLColor4 line_color = setupSnapGuideRenderPass(pass); +			LLGLDepthTest gls_depth(pass != 1);  			gGL.begin(LLRender::LINES);  			{ @@ -1286,7 +1287,7 @@ void LLManipTranslate::renderSnapGuides()  				{  					tick_start = selection_center + (translate_axis * (smallest_grid_unit_scale * (F32)i - offset_nearest_grid_unit)); -					F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_start, translate_axis, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +					F32 cur_subdivisions = getSubdivisionLevel(tick_start, translate_axis, getMinGridScale());  					if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / cur_subdivisions)) != 0.f)  					{ @@ -1384,7 +1385,7 @@ void LLManipTranslate::renderSnapGuides()  				tick_scale *= 0.7f;  			} -			if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, translate_axis, getMinGridScale(), tick_label_spacing)))) == 0.f) +			if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / getSubdivisionLevel(tick_pos, translate_axis, getMinGridScale(), tick_label_spacing))) == 0.f)  			{  				F32 snap_offset_meters; diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 0178512cb5..21e5e160e0 100755 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -509,6 +509,16 @@ void LLMediaCtrl::navigateForward()  ////////////////////////////////////////////////////////////////////////////////  // +void LLMediaCtrl::navigateStop() +{ +	if (mMediaSource && mMediaSource->hasMedia()) +	{ +		mMediaSource->getMediaPlugin()->browse_stop(); +	} +} + +//////////////////////////////////////////////////////////////////////////////// +//  bool LLMediaCtrl::canNavigateBack()  {  	if (mMediaSource) diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index b07eb356ae..a726f7a9ba 100755 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -99,6 +99,7 @@ public:  		void navigateBack();  		void navigateHome();  		void navigateForward();	 +		void navigateStop();  		void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );  		bool canNavigateBack();  		bool canNavigateForward(); diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 1a427338e5..13ab7d7f27 100755 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -141,6 +141,13 @@ void LLPanelContents::refresh()  	}	  } +void LLPanelContents::clearContents() +{ +	if (mPanelInventoryObject) +	{ +		mPanelInventoryObject->clearInventoryTask(); +	} +}  // diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index ad62e13bc2..6ecc78afa0 100755 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -48,6 +48,7 @@ public:  	virtual ~LLPanelContents();  	void			refresh(); +	void			clearContents();  	static void		onClickNewScript(void*); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index ac00c5d986..19a86cdcea 100755 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -860,10 +860,8 @@ void LLPanelEditWearable::draw()  void LLPanelEditWearable::onClose()  { -	if ( isDirty() ) -	{ -		revertChanges(); -	} +	// any unsaved changes should be reverted at this point +	revertChanges();  }  void LLPanelEditWearable::setVisible(BOOL visible) @@ -951,7 +949,7 @@ void LLPanelEditWearable::onCommitSexChange()          gAgentAvatarp->updateSexDependentLayerSets();          gAgentAvatarp->updateVisualParams(); - +        showWearable(mWearablePtr, TRUE, TRUE);          updateScrollingPanelUI();  } diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index dd13e8abf4..7b8ed9c631 100755 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -260,7 +260,7 @@ void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap)  			//else if they have the limited add to roles power  			//we add every role the user is in  			//else we just add to everyone -			bool is_owner   = member_data->isInRole(gdatap->mOwnerRole); +			bool is_owner   = member_data->isOwner();  			bool can_assign_any = gAgent.hasPowerInGroup(mGroupID,  												 GP_ROLE_ASSIGN_MEMBER);  			bool can_assign_limited = gAgent.hasPowerInGroup(mGroupID, @@ -579,7 +579,7 @@ void LLPanelGroupInvite::updateLists()  		{  			waiting = true;  		} -		if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete())  +		if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && gdatap->isRoleMemberDataComplete())   		{  			if ( mImplementation->mRoleNames )  			{ @@ -607,6 +607,7 @@ void LLPanelGroupInvite::updateLists()  		{  			LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);  			LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); +			LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID);  			LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);  		}  		mPendingUpdate = TRUE; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 61fa4ea959..d12c6bccb6 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1768,7 +1768,7 @@ LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab()  	mMemberVisibleCheck(NULL),  	mDeleteRoleButton(NULL),  	mCreateRoleButton(NULL), - +	mFirstOpen(TRUE),  	mHasRoleChange(FALSE)  {  } @@ -1870,6 +1870,7 @@ void LLPanelGroupRolesSubTab::deactivate()  	LL_DEBUGS() << "LLPanelGroupRolesSubTab::deactivate()" << LL_ENDL;  	LLPanelGroupSubTab::deactivate(); +	mFirstOpen = FALSE;  }  bool LLPanelGroupRolesSubTab::needsApply(std::string& mesg) @@ -1887,7 +1888,7 @@ bool LLPanelGroupRolesSubTab::apply(std::string& mesg)  	LL_DEBUGS() << "LLPanelGroupRolesSubTab::apply()" << LL_ENDL;  	saveRoleChanges(true); - +	mFirstOpen = FALSE;  	LLGroupMgr::getInstance()->sendGroupRoleChanges(mGroupID);  	notifyObservers(); @@ -2024,14 +2025,17 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)  		}  	} -	if (!gdatap || !gdatap->isMemberDataComplete()) +	if(!mFirstOpen)  	{ -		LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); -	} -	 -	if (!gdatap || !gdatap->isRoleMemberDataComplete()) -	{ -		LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID); +		if (!gdatap || !gdatap->isMemberDataComplete()) +		{ +			LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); +		} + +		if (!gdatap || !gdatap->isRoleMemberDataComplete()) +		{ +			LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID); +		}  	}  	if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) @@ -2662,7 +2666,7 @@ void LLPanelGroupRoles::setGroupID(const LLUUID& id)  	if(mSubTabContainer)  		mSubTabContainer->selectTab(1); - +	group_roles_tab->mFirstOpen = TRUE;  	activate();  } diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 0cf272f3ee..71b1db5079 100755 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -259,6 +259,9 @@ public:  	void saveRoleChanges(bool select_saved_role);  	virtual void setGroupID(const LLUUID& id); + +	BOOL	mFirstOpen; +  protected:  	void handleActionCheck(LLUICtrl* ctrl, bool force);  	LLSD createRoleItem(const LLUUID& role_id, std::string name, std::string title, S32 members); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 088eaa8e0d..5869855918 100755 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -251,6 +251,7 @@ void LLPanelLogin::addFavoritesToStartLocation()  	// Load favorites into the combo.  	std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); +	std::replace(user_defined_name.begin(), user_defined_name.end(), '.', ' ');  	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");  	LLSD fav_llsd;  	llifstream file; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index b02298090a..90dfb24377 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -382,9 +382,11 @@ BOOL LLPanelMainInventory::filtersVisible(void* user_data)  void LLPanelMainInventory::onClearSearch()  { +	BOOL initially_active = FALSE;  	LLFloater *finder = getFinder();  	if (mActivePanel)  	{ +		initially_active = mActivePanel->getFilter().isNotDefault();  		mActivePanel->setFilterSubString(LLStringUtil::null);  		mActivePanel->setFilterTypes(0xffffffffffffffffULL);  		mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS); @@ -395,8 +397,8 @@ void LLPanelMainInventory::onClearSearch()  		LLFloaterInventoryFinder::selectAllTypes(finder);  	} -	// re-open folders that were initially open -	if (mActivePanel) +	// re-open folders that were initially open in case filter was active +	if (mActivePanel && (mFilterSubString.size() || initially_active))  	{  		mSavedFolderState->setApply(TRUE);  		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 665b9ab294..6b74d90708 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1862,14 +1862,19 @@ void LLPanelObjectInventory::refresh()  	}  	if(!has_inventory)  	{ -		mTaskUUID = LLUUID::null; -		removeVOInventoryListener(); -		clearContents(); +		clearInventoryTask();  	}  	mInventoryViewModel.setTaskID(mTaskUUID);  	//LL_INFOS() << "LLPanelObjectInventory::refresh() " << mTaskUUID << LL_ENDL;  } +void LLPanelObjectInventory::clearInventoryTask() +{ +	mTaskUUID = LLUUID::null; +	removeVOInventoryListener(); +	clearContents(); +} +  void LLPanelObjectInventory::removeSelectedItem()  {  	if(mFolders) diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index 9559f7e886..3de49242ac 100755 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -62,6 +62,7 @@ public:  	void refresh();  	const LLUUID& getTaskUUID() { return mTaskUUID;} +	void clearInventoryTask();  	void removeSelectedItem();  	void startRenamingSelectedItem(); diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 6979ae06e0..a5f59dbf4a 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -90,7 +90,7 @@ LLContextMenu* PeopleContextMenu::createMenu()  		// Set up for multi-selected People  		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented -		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null)); +		registrar.add("Avatar.IM",				boost::bind(&PeopleContextMenu::startConference,		this));  		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null));  		registrar.add("Avatar.OfferTeleport",	boost::bind(&PeopleContextMenu::offerTeleport,			this));  		registrar.add("Avatar.RemoveFriend",	boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs)); @@ -272,6 +272,19 @@ void PeopleContextMenu::offerTeleport()  	LLAvatarActions::offerTeleport(mUUIDs);  } +void PeopleContextMenu::startConference() +{ +	uuid_vec_t uuids; +	for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it) +	{ +		if(*it != gAgentID) +		{ +			uuids.push_back(*it); +		} +	} +	LLAvatarActions::startConference(uuids); +} +  //== NearbyPeopleContextMenu ===============================================================  void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 945382ebc5..9767bab89f 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -47,6 +47,7 @@ private:  	bool enableContextMenuItem(const LLSD& userdata);  	bool checkContextMenuItem(const LLSD& userdata);  	void offerTeleport(); +	void startConference();  	void requestTeleport();  }; diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 0817b677bc..ed91d277dd 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -488,8 +488,9 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  				gCacheName->getGroup(parcel->getGroupID(),  								boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2)); -				gCacheName->getGroup(parcel->getGroupID(), -								boost::bind(&LLPanelPlaceInfo::onNameCache, mParcelOwner, _2)); +				std::string owner = +					LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString(); +				mParcelOwner->setText(owner);  			}  			else  			{ diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index c4858e241e..337a63e627 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -474,12 +474,17 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)  												&onSaveComplete,  												(void*)info,  												FALSE); +				return true;  			}  			else // !gAssetStorage  			{  				LL_WARNS() << "Not connected to an asset storage system." << LL_ENDL;  				return false;  			} +			if(mCloseAfterSave) +			{ +				closeFloater(); +			}  		}  	}  	return true; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 6770db8140..b22e77cba8 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1190,7 +1190,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata )  	if( self->mSaveCallback )  	{  		LLFilePicker& file_picker = LLFilePicker::instance(); -		if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT ) ) +		if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT, self->mScriptName ) )  		{  			std::string filename = file_picker.getFirstFile();  			std::string scriptText=self->mEditor->getText(); @@ -1973,6 +1973,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType  	mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE);  	mScriptEd->mEditor->makePristine(); +	mScriptEd->setScriptName(getItem()->getName());  } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index cb53d1df07..a343814221 100755 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -109,6 +109,8 @@ public:  	virtual bool	hasAccelerators() const { return true; } +	void 			setScriptName(const std::string& name){mScriptName = name;}; +  private:  	void		onBtnHelp();  	void		onBtnDynamicHelp(); @@ -131,6 +133,7 @@ protected:  private:  	std::string		mSampleText; +	std::string		mScriptName;  	LLTextEditor*	mEditor;  	void			(*mLoadCallback)(void* userdata);  	void			(*mSaveCallback)(void* userdata, BOOL close_after_save); diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 11b81a58fc..105c5e8cbe 100755 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -95,7 +95,6 @@ void LLPreviewSound::auditionSound( void *userdata )  	if(item && gAudiop)  	{ -		LLVector3d lpos_global = gAgent.getPositionGlobal(); -		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global); +		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX);  	}  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 0c282a19a5..74df18810c 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2226,7 +2226,6 @@ bool idle_startup()  		return TRUE;  	} -	LL_WARNS("AppInit") << "Reached end of idle_startup for state " << LLStartUp::getStartupState() << LL_ENDL;  	return TRUE;  } diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index aa1f680a1e..edc2139527 100755 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -501,7 +501,7 @@ private:  void LLGLTexMemBar::draw()  {  	S32Megabytes bound_mem = LLViewerTexture::sBoundTextureMemory; - 	S32Megabytes max_bound_mem = LLViewerTexture::sMaxBoundTextureMem; + 	S32Megabytes max_bound_mem = LLViewerTexture::sMaxBoundTextureMemory;  	S32Megabytes total_mem = LLViewerTexture::sTotalTextureMemory;  	S32Megabytes max_total_mem = LLViewerTexture::sMaxTotalTextureMem;  	F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 8fd0eb5931..c82894a5cc 100755 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -266,6 +266,11 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  			mLineEditor->setMaxTextChars(edit_text_max_chars);  			mLineEditor->setText(edit_text_contents); +			if("SaveOutfitAs"  == mNotification->getName()) +			{ +				mLineEditor->setPrevalidate(&LLTextValidate::validateASCII); +			} +  			// decrease limit of line editor of teleport offer dialog to avoid truncation of  			// location URL in invitation message, see EXT-6891  			if ("OfferTeleport" == mNotification->getName()) diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index ee4ec112f8..58073d1186 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -53,6 +53,7 @@  #include "llmorphview.h"  #include "llfloaterreg.h"  #include "llfloatercamera.h" +#include "llmenugl.h"  // Globals  BOOL gCameraBtnZoom = TRUE; @@ -75,6 +76,7 @@ LLToolCamera::LLToolCamera()  	mOutsideSlopX(FALSE),  	mOutsideSlopY(FALSE),  	mValidClickPoint(FALSE), +	mValidSelection(FALSE),  	mMouseSteering(FALSE),  	mMouseUpX(0),  	mMouseUpY(0), @@ -91,6 +93,8 @@ void LLToolCamera::handleSelect()  	if (gFloaterTools)  	{  		gFloaterTools->setStatusText("camera"); +		// in case we start from tools floater, we count any selection as valid +		mValidSelection = gFloaterTools->getVisible();  	}  } @@ -98,6 +102,14 @@ void LLToolCamera::handleSelect()  void LLToolCamera::handleDeselect()  {  //	gAgent.setLookingAtAvatar(FALSE); + +	// Make sure that temporary selection won't pass anywhere except pie tool. +	MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; +	if (!mValidSelection && (override_mask != MASK_NONE || (gFloaterTools && gFloaterTools->getVisible()))) +	{ +		LLMenuGL::sMenuContainer->hideMenus(); +		LLSelectMgr::getInstance()->validateSelection(); +	}  }  BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index b1ac42e33f..d23eb2cce6 100755 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -65,6 +65,7 @@ protected:  	BOOL	mOutsideSlopX;  	BOOL	mOutsideSlopY;  	BOOL	mValidClickPoint; +	BOOL	mValidSelection;  	BOOL	mMouseSteering;  	S32		mMouseUpX;	// needed for releaseMouse()  	S32		mMouseUpY; diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index 493c970141..fa6694b93b 100755 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -56,6 +56,7 @@  #include "llviewerregion.h"  #include "llvoavatarself.h"  #include "llworld.h" +#include "llmenugl.h"  const S32 SLOP_DIST_SQ = 4; @@ -83,6 +84,7 @@ LLToolGrab::LLToolGrab( LLToolComposite* composite )  	mLastFace(0),  	mSpinGrabbing( FALSE ),  	mSpinRotation(), +	mClickedInMouselook( FALSE ),  	mHideBuildHighlight(FALSE)  { } @@ -97,6 +99,8 @@ void LLToolGrab::handleSelect()  	{  		// viewer can crash during startup if we don't check.  		gFloaterTools->setStatusText("grab"); +		// in case we start from tools floater, we count any selection as valid +		mValidSelection = gFloaterTools->getVisible();  	}  	gGrabBtnVertical = FALSE;  	gGrabBtnSpin = FALSE; @@ -109,6 +113,14 @@ void LLToolGrab::handleDeselect()  		setMouseCapture( FALSE );  	} +	// Make sure that temporary(invalid) selection won't pass anywhere except pie tool. +	MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; +	if (!mValidSelection && (override_mask != MASK_NONE || (gFloaterTools && gFloaterTools->getVisible()))) +	{ +		LLMenuGL::sMenuContainer->hideMenus(); +		LLSelectMgr::getInstance()->validateSelection(); +	} +  }  BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask) @@ -136,6 +148,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)  		// can grab transparent objects (how touch event propagates, scripters rely on this)  		gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE);  	} +	mClickedInMouselook = gAgentCamera.cameraMouselook();  	return TRUE;  } @@ -926,13 +939,21 @@ BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask)  	{  		setMouseCapture( FALSE );  	} +  	mMode = GRAB_INACTIVE; -	// HACK: Make some grabs temporary -	if (gGrabTransientTool) +	if(mClickedInMouselook && !gAgentCamera.cameraMouselook())  	{ -		gBasicToolset->selectTool( gGrabTransientTool ); -		gGrabTransientTool = NULL; +		mClickedInMouselook = FALSE; +	} +	else +	{ +		// HACK: Make some grabs temporary +		if (gGrabTransientTool) +		{ +			gBasicToolset->selectTool( gGrabTransientTool ); +			gGrabTransientTool = NULL; +		}  	}  	//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject")); diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h index 06a3b662c8..4e22732124 100755 --- a/indra/newview/lltoolgrab.h +++ b/indra/newview/lltoolgrab.h @@ -119,6 +119,7 @@ private:  	BOOL			mHasMoved;		// has mouse moved off center at all?  	BOOL			mOutsideSlop;	// has mouse moved outside center 5 pixels?  	BOOL			mDeselectedThisClick; +	BOOL			mValidSelection;  	S32             mLastFace;  	LLVector2       mLastUVCoords; @@ -133,6 +134,8 @@ private:  	LLQuaternion	mSpinRotation;  	BOOL			mHideBuildHighlight; + +	BOOL			mClickedInMouselook;  };  extern BOOL gGrabBtnVertical; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 6881ec4563..8191958dd4 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -439,8 +439,12 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)  		break;  	case CLICK_ACTION_BUY:  		if ( mClickActionBuyEnabled ) -		{ -			cursor = UI_CURSOR_TOOLBUY; +		{  +			LLSelectNode* node = LLSelectMgr::getInstance()->getHoverNode(); +			if (!node || node->mSaleInfo.isForSale()) +			{ +				cursor = UI_CURSOR_TOOLBUY; +			}  		}  		break;  	case CLICK_ACTION_OPEN: @@ -544,6 +548,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  	mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);  	LLViewerObject *parent = NULL;  	LLViewerObject *object = mHoverPick.getObject(); +	LLSelectMgr::getInstance()->setHoverObject(object, mHoverPick.mObjectFace);  	if (object)  	{  		parent = object->getRootEdit(); @@ -1306,7 +1311,16 @@ void LLToolPie::handleDeselect()  	}  	// remove temporary selection for pie menu  	LLSelectMgr::getInstance()->setHoverObject(NULL); -	LLSelectMgr::getInstance()->validateSelection(); + +	// Menu may be still up during transfer to different tool. +	// toolfocus and toolgrab should retain menu, they will clear it if needed +	MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; +	if (!gMenuHolder->getVisible() || (override_mask & (MASK_ALT | MASK_CONTROL)) == 0) +	{ +		// in most cases menu is useless without correct selection, so either keep both or discard both +		gMenuHolder->hideMenus(); +		LLSelectMgr::getInstance()->validateSelection(); +	}  }  LLTool* LLToolPie::getOverrideTool(MASK mask) diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index 0a9153eecb..812abe9dbd 100755 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -36,6 +36,7 @@  #include "llmanip.h"  #include "llmenugl.h"  #include "llselectmgr.h" +#include "llviewermediafocus.h"  #include "lltoolmgr.h"  #include "llfloaterscriptdebug.h"  #include "llviewercamera.h" @@ -110,6 +111,21 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi  	{  		BOOL already_selected = object->isSelected(); +		if (already_selected && +			object->getNumTEs() > 0 && +			!LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES)) +		{ +			const LLTextureEntry* tep = object->getTE(pick.mObjectFace); +			if (tep && !tep->isSelected() && !LLViewerMediaFocus::getInstance()->getFocusedObjectID().isNull()) +			{ +				// we were interacting with media and clicked on non selected face, drop media focus +				LLViewerMediaFocus::getInstance()->clearFocus(); +				// selection was removed and zoom preserved by clearFocus(), continue with regular selection +				already_selected = false; +				extend_select = true; +			} +		} +  		if ( extend_select )  		{  			if ( already_selected ) diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 615064c782..78268944fc 100755 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -278,13 +278,13 @@ public:  							   tokens[2].asReal(),   							   tokens[3].asReal());  		} -		 -		LLSD args; -		args["LOCATION"] = tokens[0];  		// Region names may be %20 escaped.  		std::string region_name = LLURI::unescape(tokens[0]); +		LLSD args; +		args["LOCATION"] = region_name; +  		LLSD payload;  		payload["region_name"] = region_name;  		payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index e427bb1735..55aeed68cc 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -73,6 +73,7 @@  #include "llfloaterinspect.h"  #include "llfloaterinventory.h"  #include "llfloaterjoystick.h" +#include "llfloaterlagmeter.h"  #include "llfloaterland.h"  #include "llfloaterlandholdings.h"  #include "llfloatermap.h" @@ -233,6 +234,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLNotificationsUI::registerFloater();  	LLFloaterDisplayNameUtil::registerFloater(); +	LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);  	LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);  	LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 160478788c..b0f4802e20 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -162,7 +162,7 @@ void agent_push_backward( EKeystate s )  	{  		camera_move_backward(s);  	} -	else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting()) +	else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting() && gSavedSettings.getBOOL("LeaveMouselook"))  	{  		gAgentCamera.changeCameraToThirdPerson();  	} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8c9429c05d..8b9b9ed172 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -64,6 +64,7 @@  #include "llfloaterinventory.h"  #include "llfloaterimcontainer.h"  #include "llfloaterland.h" +#include "llfloaterimnearbychat.h"  #include "llfloaterpathfindingcharacters.h"  #include "llfloaterpathfindinglinksets.h"  #include "llfloaterpay.h" @@ -5660,6 +5661,25 @@ void toggle_debug_menus(void*)  // 	gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects...");  // }  // + +class LLCommunicateNearbyChat : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLFloaterIMContainer* im_box = LLFloaterIMContainer::getInstance(); +		bool nearby_visible	= LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")->isInVisibleChain(); +		if(nearby_visible && im_box->getSelectedSession() == LLUUID() && im_box->getConversationListItemSize() > 1) +		{ +			im_box->selectNextorPreviousConversation(false); +		} +		else +		{ +			LLFloaterReg::toggleInstanceOrBringToFront("nearby_chat"); +		} +		return true; +	} +}; +  class LLWorldSetHomeLocation : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8233,9 +8253,9 @@ class LLWorldEnableEnvSettings : public view_listener_t  		bool result = false;  		std::string tod = userdata.asString(); -		if (tod == "region") +		if (LLEnvManagerNew::instance().getUseRegionSettings())  		{ -			return LLEnvManagerNew::instance().getUseRegionSettings(); +			return (tod == "region");  		}  		if (LLEnvManagerNew::instance().getUseFixedSky()) @@ -8578,6 +8598,9 @@ void initialize_menus()  	// Me > Movement  	view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); +	//Communicate Nearby chat +	view_listener_t::addMenu(new LLCommunicateNearbyChat(), "Communicate.NearbyChat"); +  	// Communicate > Voice morphing > Subscribe...  	commit.add("Communicate.VoiceMorphing.Subscribe", boost::bind(&handle_voice_morphing_subscribe));  	LLVivoxVoiceClient * voice_clientp = LLVivoxVoiceClient::getInstance(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 04697f3472..9880ebf2db 100755 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -476,8 +476,10 @@ class LLFileEnableCloseWindow : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		bool new_value = NULL != gFloaterView->getFrontmostClosableFloater(); -		return new_value; +		bool frontmost_fl_exists = (NULL != gFloaterView->getFrontmostClosableFloater()); +		bool frontmost_snapshot_fl_exists = (NULL != gSnapshotFloaterView->getFrontmostClosableFloater()); + +		return frontmost_fl_exists || frontmost_snapshot_fl_exists;  	}  }; @@ -485,7 +487,21 @@ class LLFileCloseWindow : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLFloater::closeFrontmostFloater(); +		bool frontmost_fl_exists = (NULL != gFloaterView->getFrontmostClosableFloater()); +		LLFloater* snapshot_floater = gSnapshotFloaterView->getFrontmostClosableFloater(); + +		if(snapshot_floater && (!frontmost_fl_exists || snapshot_floater->hasFocus())) +		{ +			snapshot_floater->closeFloater(); +			if (gFocusMgr.getKeyboardFocus() == NULL) +			{ +				gFloaterView->focusFrontFloater(); +			} +		} +		else +		{ +			LLFloater::closeFrontmostFloater(); +		}  		return true;  	}  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 18e88f7073..553543a60f 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3730,6 +3730,15 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  			LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);  		} +		// don't call notification for debug messages from not owned objects +		if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) +		{ +			if (gAgentID != chat.mOwnerID) +			{ +				return; +			} +		} +  		LLSD msg_notify = LLSD(LLSD::emptyMap());  		msg_notify["session_id"] = LLUUID();          msg_notify["from_id"] = chat.mFromID; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 7c60be7046..e84d62b6ee 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2790,8 +2790,8 @@ void LLViewerObject::dirtyInventory()  		mInventory->clear(); // will deref and delete entries  		delete mInventory;  		mInventory = NULL; -		mInventoryDirty = TRUE;  	} +	mInventoryDirty = TRUE;  }  void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data) @@ -2828,12 +2828,15 @@ void LLViewerObject::clearInventoryListeners()  void LLViewerObject::requestInventory()  { -	mInventoryDirty = FALSE; +	if(mInventoryDirty && mInventory && !mInventoryCallbacks.empty()) +	{ +		mInventory->clear(); // will deref and delete entries +		delete mInventory; +		mInventory = NULL; +		mInventoryDirty = FALSE; //since we are going to request it now +	}  	if(mInventory)  	{ -		//mInventory->clear() // will deref and delete it -		//delete mInventory; -		//mInventory = NULL;  		doInventoryCallback();  	}  	// throw away duplicate requests diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index cdb08f4707..0e5cffb1e5 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -117,6 +117,7 @@ LLViewerParcelMgr::LLViewerParcelMgr()  	mHoverRequestResult(0),  	mHoverWestSouth(),  	mHoverEastNorth(), +	mTeleportInProgressPosition(),  	mRenderCollision(FALSE),  	mRenderSelection(TRUE),  	mCollisionBanned(0), @@ -1585,7 +1586,15 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  			if (instance->mTeleportInProgress)  			{  				instance->mTeleportInProgress = FALSE; -				instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false); +				if(instance->mTeleportInProgressPosition.isNull()) +				{ +					//initial update +					instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false); +				} +				else +				{ +					instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false); +				}  			}  		}  	} @@ -2494,6 +2503,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos  		// Non-local teleport (inter-region or between different parcels of the same region).  		// The agent parcel data has not been updated yet.  		// Let's wait for the update and then emit the signal. +		mTeleportInProgressPosition = new_pos;  		mTeleportInProgress = TRUE;  	}  } diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 58d398e141..b5b269abdf 100755 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -335,6 +335,7 @@ private:  	std::vector<LLParcelObserver*> mObservers;  	BOOL						mTeleportInProgress; +	LLVector3d					mTeleportInProgressPosition;  	teleport_finished_signal_t	mTeleportFinishedSignal;  	teleport_failed_signal_t	mTeleportFailedSignal; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index ba89aafc84..3f6d244af1 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -88,7 +88,7 @@ F32 LLViewerTexture::sDesiredDiscardBias = 0.f;  F32 LLViewerTexture::sDesiredDiscardScale = 1.1f;  S32Bytes LLViewerTexture::sBoundTextureMemory;  S32Bytes LLViewerTexture::sTotalTextureMemory; -S32Megabytes LLViewerTexture::sMaxBoundTextureMem; +S32Megabytes LLViewerTexture::sMaxBoundTextureMemory;  S32Megabytes LLViewerTexture::sMaxTotalTextureMem;  S32Bytes LLViewerTexture::sMaxDesiredTextureMem;  S8  LLViewerTexture::sCameraMovingDiscardBias = 0; @@ -534,11 +534,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  	sBoundTextureMemory = LLImageGL::sBoundTextureMemory;  	sTotalTextureMemory = LLImageGL::sGlobalTextureMemory; -	sMaxBoundTextureMem = gTextureList.getMaxResidentTexMem(); +	sMaxBoundTextureMemory = gTextureList.getMaxResidentTexMem();  	sMaxTotalTextureMem = gTextureList.getMaxTotalTextureMem();  	sMaxDesiredTextureMem = sMaxTotalTextureMem; //in Bytes, by default and when total used texture memory is small. -	if (sBoundTextureMemory >= sMaxBoundTextureMem || +	if (sBoundTextureMemory >= sMaxBoundTextureMemory ||  		sTotalTextureMemory >= sMaxTotalTextureMem)  	{  		//when texture memory overflows, lower down the threshold to release the textures more aggressively. @@ -558,7 +558,7 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  		sEvaluationTimer.reset();  	}  	else if (sDesiredDiscardBias > 0.0f && -			 sBoundTextureMemory < sMaxBoundTextureMem * texmem_lower_bound_scale && +			 sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale &&  			 sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale)  	{			   		// If we are using less texture memory than we should, @@ -576,7 +576,7 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity  	sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1);  	sCameraMovingDiscardBias = (S8)(sCameraMovingBias); -	LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMem * texmem_middle_bound_scale) && +	LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMemory * texmem_middle_bound_scale) &&  				(sTotalTextureMemory < 0.75f * sMaxTotalTextureMem * texmem_middle_bound_scale);  } @@ -1480,6 +1480,17 @@ void LLViewerFetchedTexture::processTextureStats()  		{  			mDesiredDiscardLevel = 0;  		} +		else if (mDontDiscard && (mBoostLevel == LLGLTexture::BOOST_UI || mBoostLevel == LLGLTexture::BOOST_ICON)) +		{ +			if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) +			{ +				mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 +			} +			else +			{ +				mDesiredDiscardLevel = 0; +			} +		}  		else if(!mFullWidth || !mFullHeight)  		{  			mDesiredDiscardLevel = 	llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel); @@ -3074,7 +3085,7 @@ void LLViewerLODTexture::processTextureStats()  				scaleDown();  			}  			// Limit the amount of GL memory bound each frame -			else if ( sBoundTextureMemory > sMaxBoundTextureMem * texmem_middle_bound_scale && +			else if ( sBoundTextureMemory > sMaxBoundTextureMemory * texmem_middle_bound_scale &&  				(!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))  			{  				scaleDown(); diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 307204da60..05912404e4 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -210,7 +210,7 @@ public:  	static F32 sDesiredDiscardScale;  	static S32Bytes sBoundTextureMemory;  	static S32Bytes sTotalTextureMemory; -	static S32Megabytes sMaxBoundTextureMem; +	static S32Megabytes sMaxBoundTextureMemory;  	static S32Megabytes sMaxTotalTextureMem;  	static S32Bytes sMaxDesiredTextureMem ;  	static S8  sCameraMovingDiscardBias; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4d263c118b..81978e058c 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3216,6 +3216,8 @@ void LLViewerWindow::updateUI()  				}  				append_xui_tooltip(tooltip_view, params); +				params.styled_message.add().text("\n"); +  				screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());  				params.sticky_rect = screen_sticky_rect; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9f42776d78..22b979aa09 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2068,7 +2068,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)  	}	  	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)) -		&& !(gSavedSettings.getBOOL("DisableAllRenderTypes"))) +		&& !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf())  	{  		return;  	} diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 3c3dc33772..9a84cae403 100755 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -280,14 +280,14 @@ void LLVoiceChannel::deactivate()  	if (callStarted())  	{  		setState(STATE_HUNG_UP); -		 +  		//Default mic is OFF when leaving voice calls -		if (gSavedSettings.getBOOL("AutoDisengageMic") &&  +		if (gSavedSettings.getBOOL("AutoDisengageMic") &&  			sCurrentVoiceChannel == this &&  			LLVoiceClient::getInstance()->getUserPTTState())  		{  			gSavedSettings.setBOOL("PTTCurrentlyEnabled", true); -			LLVoiceClient::getInstance()->inputUserControlState(true); +			LLVoiceClient::getInstance()->setUserPTTState(false);  		}  	}  	LLVoiceClient::getInstance()->removeObserver(this); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index a770352f86..7cb53a0706 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1694,6 +1694,8 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )  			sPanY += delta_y;  			sTargetPanX = sPanX;  			sTargetPanY = sPanY; + +			gViewerWindow->moveCursorToCenter();  		}  		// doesn't matter, cursor should be hidden diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml new file mode 100644 index 0000000000..149d174c34 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG METER"> +	<floater.string name="max_title_msg"> +		Lag måler +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Klient +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, vindue i baggrund +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Klients billeder/sek under [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Klients billeder/sek mellem [CLIENT_FRAME_RATE_CRITICAL] og [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Mulig årsag: 'Vis afstand' sat for højt i grafik indstillinger +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Mulig årsag: Billeder hentes +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Mulig årsag: For mange billeder i hukommelse +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Mulig årsag: For mange komplekse objekter i scenariet +	</floater.string> +	<floater.string name="network_text_msg"> +		Netværk +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Forbindelsen mister over [NETWORK_PACKET_LOSS_CRITICAL]% pakker +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Forbindelsen mister [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% pakker +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Forbindelsens ping tider er over [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Forbindelsens ping tider er [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Muligvis dårlig forbindelse eller 'båndbredde' sat for højt i netværksopsætning. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Muligvis dårlig forbindelse eller fil delings program. +	</floater.string> +	<floater.string name="server_text_msg"> +		Server +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Simulator framerate er under [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Simulator framerate er mellem [SERVER_FRAME_RATE_CRITICAL] og [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Mulig årsag: For mange fysiske objekter +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Mulig årsag: For mange objekter med script +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Mulig årsag: For meget netværks trafik +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Mulig årsag: For mange avatarer i bevægelse i regionen +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Mulig årsag: For mange billed udregninger +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Mulig årsag: Simulator belastning for stor +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/> +	<text name="client"> +		Klient +	</text> +	<text name="client_text"> +		Normal +	</text> +	<button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> +	<text name="network"> +		Netværk +	</text> +	<text name="network_text"> +		Normal +	</text> +	<button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/> +	<text name="server"> +		Server +	</text> +	<text name="server_text"> +		Normal +	</text> +	<button label=">>" name="minimize" tool_tip="Ændre størrelse"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml new file mode 100644 index 0000000000..45ff37c147 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG METER"> +	<floater.string name="max_title_msg"> +		Lag-Anzeige +	</floater.string> +	<floater.string name="max_width_px"> +		350 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Client +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, Fenster im Hintergrund +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Client-Frame-Rate unter [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Client-Frame-Rate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Mögliche Ursache: Sichtweite zu groß +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Mögliche Ursache: Bilder werden geladen +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Mögliche Ursache: Zu viele Bilder im Speicher +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Mögliche Ursache: Zu viele komplexe Objekte in der Szene +	</floater.string> +	<floater.string name="network_text_msg"> +		Netzwerk +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL]% +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Ping-Zeit der Verbindung übersteigt [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Ping-Zeit der Verbindung liegt bei [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Möglicherweise schlechte Verbindung oder zu hoher Wert für „Bandbreite“. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Möglicherweise schlechte Verbindung oder File-Sharing-Anwendung. +	</floater.string> +	<floater.string name="server_text_msg"> +		Server +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Simulator-Frame-Rate liegt unter [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Simulator-Frame-Rate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Mögliche Ursache: Zu viele physische Objekte +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Mögliche Ursache: Zu viele geskriptete Objekte +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Mögliche Ursache: Zu viel Netzwerktraffic +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Mögliche Ursache: Zu viele Personen in Bewegung in der Region +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Mögliche Ursache: Zu viele Bildberechnungen +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Mögliche Ursache: Zu hohe Simulator-Last +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="Client-Lag-Status"/> +	<text name="client"> +		Client +	</text> +	<text name="client_text"> +		Normal +	</text> +	<button name="network_lagmeter" tool_tip="Netzwerk-Lag-Status"/> +	<text name="network"> +		Netzwerk +	</text> +	<text name="network_text"> +		Normal +	</text> +	<button name="server_lagmeter" tool_tip="Server-Lag-Status"/> +	<text name="server"> +		Server +	</text> +	<text name="server_text"> +		Normal +	</text> +	<button label=">> " name="minimize" tool_tip="Fenstergröße ändern"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index dad81aca4f..c64ee5565a 100755 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -209,7 +209,7 @@                       default_tab_group="3"                       tab_group="2"                       name="right_part_holder" -                     min_width="230"> +                     min_width="207">                          <layout_stack                           animate="true"                            follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml new file mode 100644 index 0000000000..b24c745bdd --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -0,0 +1,336 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="170" + layout="topleft" + name="floater_lagmeter" + help_topic="floater_lagmeter" + save_rect="true" + title="LAG METER" + width="350"> +    <floater.string +     name="max_title_msg"> +        Lag Meter +    </floater.string> +    <floater.string +     name="max_width_px"> +        360 +    </floater.string> +    <floater.string +     name="min_title_msg"> +        Lag +    </floater.string> +    <floater.string +     name="min_width_px"> +        90 +    </floater.string> +    <floater.string +     name="client_text_msg"> +        Client +    </floater.string> +    <floater.string +     name="client_frame_rate_critical_fps"> +        10 +    </floater.string> +    <floater.string +     name="client_frame_rate_warning_fps"> +        15 +    </floater.string> +    <floater.string +     name="client_frame_time_window_bg_msg"> +        Normal, window in background +    </floater.string> +    <floater.string +     name="client_frame_time_critical_msg"> +        Client frame rate below [CLIENT_FRAME_RATE_CRITICAL] +    </floater.string> +    <floater.string +     name="client_frame_time_warning_msg"> +        Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING] +    </floater.string> +    <floater.string +     name="client_frame_time_normal_msg"> +        Normal +    </floater.string> +    <floater.string +     name="client_draw_distance_cause_msg"> +        Possible cause: Draw distance set too high +    </floater.string> +    <floater.string +     name="client_texture_loading_cause_msg"> +        Possible cause: Images loading +    </floater.string> +    <floater.string +     name="client_texture_memory_cause_msg"> +        Possible cause: Too many images in memory +    </floater.string> +    <floater.string +     name="client_complex_objects_cause_msg"> +        Possible cause: Too many complex objects in scene +    </floater.string> +    <floater.string +     name="network_text_msg"> +        Network +    </floater.string> +    <floater.string +     name="network_packet_loss_critical_pct"> +        10 +    </floater.string> +    <floater.string +     name="network_packet_loss_warning_pct"> +        5 +    </floater.string> +    <floater.string +     name="network_packet_loss_critical_msg"> +        Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets +    </floater.string> +    <floater.string +     name="network_packet_loss_warning_msg"> +        Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets +    </floater.string> +    <floater.string +     name="network_performance_normal_msg"> +        Normal +    </floater.string> +    <floater.string +     name="network_ping_critical_ms"> +        600 +    </floater.string> +    <floater.string +     name="network_ping_warning_ms"> +        300 +    </floater.string> +    <floater.string +     name="network_ping_critical_msg"> +        Connection ping time is over [NETWORK_PING_CRITICAL] ms +    </floater.string> +    <floater.string +     name="network_ping_warning_msg"> +        Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +    </floater.string> +    <floater.string +     name="network_packet_loss_cause_msg"> +        Possible bad connection or 'Bandwidth' pref too high. +    </floater.string> +    <floater.string +     name="network_ping_cause_msg"> +        Possible bad connection or file-sharing app. +    </floater.string> +    <floater.string +     name="server_text_msg"> +        Server +    </floater.string> +    <floater.string +     name="server_frame_rate_critical_fps"> +        20 +    </floater.string> +    <floater.string +     name="server_frame_rate_warning_fps"> +        30 +    </floater.string> +    <floater.string +     name="server_single_process_max_time_ms"> +        20 +    </floater.string> +    <floater.string +     name="server_frame_time_critical_msg"> +        Simulator framerate below [SERVER_FRAME_RATE_CRITICAL] +    </floater.string> +    <floater.string +     name="server_frame_time_warning_msg"> +        Simulator framerate between [SERVER_FRAME_RATE_CRITICAL] and [SERVER_FRAME_RATE_WARNING] +    </floater.string> +    <floater.string +     name="server_frame_time_normal_msg"> +        Normal +    </floater.string> +    <floater.string +     name="server_physics_cause_msg"> +        Possible Cause: Too many physical objects +    </floater.string> +    <floater.string +     name="server_scripts_cause_msg"> +        Possible Cause: Too many scripted objects +    </floater.string> +    <floater.string +     name="server_net_cause_msg"> +        Possible Cause: Too much network traffic +    </floater.string> +    <floater.string +     name="server_agent_cause_msg"> +        Possible Cause: Too many moving people in region +    </floater.string> +    <floater.string +     name="server_images_cause_msg"> +        Possible Cause: Too many image calculations +    </floater.string> +    <floater.string +     name="server_generic_cause_msg"> +        Possible Cause: Simulator load too heavy +    </floater.string> +    <floater.string +     name="smaller_label"> +        >> +    </floater.string> +    <floater.string +     name="bigger_label"> +        << +    </floater.string> +    <button +     follows="top|left" +     height="16" +     image_selected="lag_status_good.tga" +     image_unselected="lag_status_good.tga" +     layout="topleft" +     left="8" +     name="client_lagmeter" +     tab_stop="false" +     tool_tip="Client lag status" +     top="24" +     width="16" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left_pad="3" +     name="client" +     top_delta="0" +     width="128"> +        Client +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     type="string" +     length="1" +     bottom="40" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left="110" +     name="client_text" +     right="-10"> +        Normal +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     bottom="56" +     follows="left|top" +     height="16" +     layout="topleft" +     left="40" +     name="client_lag_cause" +     right="-32" /> +    <button +     follows="top|left" +     height="16" +     image_selected="lag_status_good.tga" +     image_unselected="lag_status_good.tga" +     layout="topleft" +     left="8" +     name="network_lagmeter" +     tab_stop="false" +     tool_tip="Network lag status" +     top="64" +     width="16" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left_pad="3" +     name="network" +     top_delta="0" +     width="128"> +        Network +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     type="string" +     length="1" +     bottom="80" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left="110" +     name="network_text" +     right="-10"> +        Normal +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     bottom="96" +     follows="left|top" +     height="16" +     layout="topleft" +     left="40" +     name="network_lag_cause" +     right="-32" /> +    <button +     follows="top|left" +     height="16" +     image_selected="lag_status_good.tga" +     image_unselected="lag_status_good.tga" +     layout="topleft" +     left="8" +     name="server_lagmeter" +     tab_stop="false" +     tool_tip="Server lag status" +     top="104" +     width="16" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left_pad="3" +     name="server" +     top_delta="0" +     width="60"> +        Server +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     type="string" +     length="1" +     bottom="120" +     follows="left|top" +     font="SansSerif" +     height="16" +     layout="topleft" +     left="110" +     name="server_text" +     right="-10"> +        Normal +    </text> +    <text +     invisiblity_control="LagMeterShrunk" +     bottom="136" +     follows="left|top" +     height="16" +     layout="topleft" +     left="40" +     name="server_lag_cause" +     right="-32" /> +    <button +     follows="left|top" +     height="20" +     label=">>" +     layout="topleft" +     left="10" +     name="minimize" +	 tool_tip="Toggle floater size" +     top_delta="24" +     width="40"> +        <button.commit_callback +         function="LagMeter.ClickShrink" /> +    </button> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 853c209bca..c0089a30d8 100755 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -7,6 +7,7 @@   height="500"   layout="topleft"   name="Snapshot" + single_instance="true"   help_topic="snapshot"   save_rect="true"   save_visibility="false" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index bee570d5d0..c9a6e1c9c3 100755 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -267,7 +267,9 @@                      stat="simsimskippedsilhouettesteps"                      unit_label="/sec"/>            <stat_bar name="simsimpctsteppedcharacters" +          			label="Characters Updated"                      stat="simsimpctsteppedcharacters" +          			unit_label="%"                      decimal_digits="1"/>          </stat_view>          <stat_bar name="siminpps" diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index 31b1d091ee..f5a493c064 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -17,6 +17,7 @@       layout="topleft"       name="open_voice_conversation">          <on_click function="Avatar.DoToSelected" parameter="open_voice_conversation"/> +        <on_enable function="Avatar.EnableItem" parameter="can_open_voice_conversation"/>       </menu_item_call>	       <menu_item_call       label="Disconnect from voice" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index ec20c25f14..acec017622 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -259,8 +259,7 @@               function="Floater.Visible"               parameter="nearby_chat" />              <menu_item_check.on_click -             function="Floater.ToggleOrBringToFront" -             parameter="nearby_chat" /> +             function="Communicate.NearbyChat"/>          </menu_item_check>          <menu_item_check           label="Speak" @@ -363,13 +362,16 @@                function="SideTray.PanelPeopleTab"                parameter="nearby_panel" />          </menu_item_check> -        <menu_item_call +        <menu_item_check           label="Block List"           name="Block List"> -            <menu_item_call.on_click +            <menu_item_check.on_check +             function="SideTray.CheckPanelPeopleTab" +             parameter="blocked_panel" /> +            <menu_item_check.on_click                function="SideTray.PanelPeopleTab"                parameter="blocked_panel" /> -        </menu_item_call> +        </menu_item_check>        <menu_item_separator/>        <menu_item_check         name="Do Not Disturb" @@ -1207,7 +1209,7 @@                   name="Grid Options"                   shortcut="control|shift|B">                      <menu_item_call.on_click -                     function="Floater.Show" +                     function="Floater.Toggle"                       parameter="build_options" />                      <menu_item_call.on_enable                       function="Tools.EnableToolNotPie" /> diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index a585069faa..f5f2223330 100755 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -101,6 +101,27 @@  			true  		</allow_looping>  	</widgetset> +	<widgetset name="none"> +		<label name="none_label"> +			No Content +		</label> +		<default_type> +			none/none +		</default_type> +		<icon> +			icn_media_web.tga +		</icon> +		<tooltip name="none_tooltip"> +			No media here +		</tooltip> +		<playtip name="none_playtip" /> +		<allow_resize> +			false +		</allow_resize> +		<allow_looping> +			false +		</allow_looping> +	</widgetset>  	<scheme name="rtsp">  		<label name="rtsp_label">  			Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index e95b371d00..84aeaf3b54 100755 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -101,6 +101,27 @@  			true  		</allow_looping>  	</widgetset> +	<widgetset name="none"> +		<label name="none_label"> +			No Content +		</label> +		<default_type> +			none/none +		</default_type> +		<icon> +			icn_media_web.tga +		</icon> +		<tooltip name="none_tooltip"> +			No media here +		</tooltip> +		<playtip name="none_playtip" /> +		<allow_resize> +			false +		</allow_resize> +		<allow_looping> +			false +		</allow_looping> +	</widgetset>  	<scheme name="rtsp">  		<label name="rtsp_label">  			Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 7931e55c0a..90230f12dd 100755 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -101,6 +101,27 @@  			true  		</allow_looping>  	</widgetset> +	<widgetset name="none"> +		<label name="none_label"> +			No Content +		</label> +		<default_type> +			none/none +		</default_type> +		<icon> +			icn_media_web.tga +		</icon> +		<tooltip name="none_tooltip"> +			No media here +		</tooltip> +		<playtip name="none_playtip" /> +		<allow_resize> +			false +		</allow_resize> +		<allow_looping> +			false +		</allow_looping> +	</widgetset>  	<scheme name="rtsp">  		<label name="rtsp_label">  			Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 7297ba4fc0..0230019eb2 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3747,6 +3747,28 @@ Leave Group?    </notification>    <notification +   icon="aler.tga" +   name="GroupDepartError" +   type="alert"> +Unable to leave group: [reason]. +      <tag>reason</tag> +      <usetemplate +       name="okbutton" +       yestext="OK"/> +  </notification> + +  <notification +   icon="alert.tga" +   name="GroupDepart" +   type="alert"> +You have left the group [group_name]. +      <tag>group_name</tag> +      <usetemplate +       name="okbutton" +       yestext="OK"/> +  </notification> + +  <notification     icon="alert.tga"     name="ConfirmKick"     type="alert"> @@ -7836,7 +7858,16 @@ You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] second  ( [EXISTENCE] seconds alive )  You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds.    </notification> - +	 +  <notification +   icon="alertmodal.tga" +   name="CannotUploadTexture" +   type="alertmodal"> +Unable to upload texture. +[REASON]    +  <tag>fail</tag>   +  </notification> +      <notification     icon="alertmodal.tga"     name="LivePreviewUnavailable" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 30239d6d01..0dd75b1b55 100755 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -295,14 +295,14 @@               value="SampleParcel, Name Long (145, 228, 26)"               width="285" />              <expandable_text -             follows="left|top|right" +             follows="left|top"               height="50"               layout="topleft"               left="5"               name="description"               top_pad="10"               value="Du waltz die spritz" -             width="300" /> +             width="285" />              <text               follows="left|top"               height="14" diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml new file mode 100644 index 0000000000..227689a194 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MEDIDOR DEL LAG"> +	<floater.string name="max_title_msg"> +		Medidor del lag +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Cliente +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, ventana en segundo plano +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Posible causa: distancia de dibujo fijada muy alta +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Posible causa: imágenes cargándose +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Posible causa: demasiadas imágenes en la memoria +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Posible causa: demasiados objetos complejos en la escena +	</floater.string> +	<floater.string name="network_text_msg"> +		Red +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Quizá una mala conexión o un ancho de banda fijado demasiado alto. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Quizá una mala conexión o una aplicación de archivos compartidos. +	</floater.string> +	<floater.string name="server_text_msg"> +		Servidor +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Posible causa: demasiados objetos físicos +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Posible causa: demasiados objetos con script +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Posible causa: demasiado tráfico en la red +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Posible causa: demasiada gente moviéndose en la región +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Posible causa: demasiados cálculos de imáganes +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Posible causa: carga del simulador muy pesada +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/> +	<text name="client"> +		Cliente +	</text> +	<text font="SansSerifSmall" name="client_text"> +		Normal +	</text> +	<text left="30" name="client_lag_cause" right="-10"/> +	<button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/> +	<text name="network"> +		Red +	</text> +	<text font="SansSerifSmall" name="network_text"> +		Normal +	</text> +	<text left="30" name="network_lag_cause" right="-10"/> +	<button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/> +	<text name="server"> +		Servidor +	</text> +	<text font="SansSerifSmall" name="server_text"> +		Normal +	</text> +	<text left="30" name="server_lag_cause" right="-32"/> +	<button label=">>" name="minimize" tool_tip="Cambia el tamaño de la ventana"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml new file mode 100644 index 0000000000..39a861d8bd --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MESURE DU LAG"> +	<floater.string name="max_title_msg"> +		Mesure du lag +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Client +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, fenêtre en arrière-plan +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Taux de défilement [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Cause possible : limite d'affichage trop élevée +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Cause possible : images en cours de chargement +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Cause possible : trop d'images en mémoire +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Cause possible : trop d'objets complexes +	</floater.string> +	<floater.string name="network_text_msg"> +		Réseau +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Connexion ping > [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Mauvaise connexion possible ou réglage de la bande passante trop élevé. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Mauvaise connexion possible ou app. de partage des fichiers +	</floater.string> +	<floater.string name="server_text_msg"> +		Serveur +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Défilement du simulateur < [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Cause possible : trop d'objets physiques +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Cause possible : trop d'objets scriptés +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Cause possible : trop de trafic réseau +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Cause possible : trop de personnes en mouvement +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Cause possible : trop de calculs d'images +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Cause possible : charge simulateur trop lourde +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="Statut du lag client"/> +	<text name="client"> +		Client +	</text> +	<text name="client_text"> +		Normal +	</text> +	<button name="network_lagmeter" tool_tip="Statut du lag réseau"/> +	<text name="network"> +		Réseau +	</text> +	<text name="network_text"> +		Normal +	</text> +	<button name="server_lagmeter" tool_tip="Statut du lag serveur"/> +	<text name="server"> +		Serveur +	</text> +	<text name="server_text"> +		Normal +	</text> +	<button label=">>" name="minimize" tool_tip="Activer/désactiver la taille du floater"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml new file mode 100644 index 0000000000..f7b2b1ab4a --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MISURATORE LAG"> +	<floater.string name="max_title_msg"> +		Misuratore del lag +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Programma in locale +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normale, finestra sullo sfondo +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Velocità dei frame al di sotto di [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Velocità dei frame tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normale +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Possibile causa: Campo visivo impostato troppo alto +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Possibile causa: Caricamento immagini +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Possibile causa: Troppe immagini in memoria +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Possibile causa: Troppi oggetti complessi intorno +	</floater.string> +	<floater.string name="network_text_msg"> +		Network +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		La connessione sta calando al di sotto del [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		La connessione sta calando tra il [NETWORK_PACKET_LOSS_WARNING]% e il [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normale +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Il tempo di ping della connessione è al di sopra di [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Il tempo di ping della connessione è tra [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Possibile cattiva connessione o la larghezza di banda impostata nelle preferenze troppo alta. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Possibile cattiva connessione o l'apertura di un programma di scambio files. +	</floater.string> +	<floater.string name="server_text_msg"> +		Server +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Velocità dei frame al di sotto di [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Velocità dei frame tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normale +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Possibile causa: troppi oggetti fisici +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Possibile causa: troppi oggetti scriptati +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Possibile causa: eccessivo traffico sulla rete +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Possibile causa: troppi residenti in movimento nella regione +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Possibile causa: troppe elaborazioni di immagini +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Possibile causa: carico eccessivo del simulatore +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/> +	<text name="client"> +		Client +	</text> +	<text font="SansSerifSmall" left="145" name="client_text"> +		Normale +	</text> +	<text left="30" name="client_lag_cause" right="-10"/> +	<button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/> +	<text name="network"> +		Rete +	</text> +	<text font="SansSerifSmall" name="network_text"> +		Normale +	</text> +	<text left="30" name="network_lag_cause" right="-10"/> +	<button label="" label_selected="" name="server_lagmeter" tool_tip="Stato del lag del server"/> +	<text name="server"> +		Server +	</text> +	<text font="SansSerifSmall" name="server_text"> +		Normale +	</text> +	<text left="30" name="server_lag_cause" right="-32"/> +	<button label=">>" name="minimize" tool_tip="Cambia dimensioni floater"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml new file mode 100644 index 0000000000..e3546cd837 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="ラグメーター"> +	<floater.string name="max_title_msg"> +		ラグ メーター +	</floater.string> +	<floater.string name="max_width_px"> +		350 +	</floater.string> +	<floater.string name="min_title_msg"> +		ラグ +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		クライアント +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		ノーマル、ウィンドウは背景に +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		クライアント フレームレート < [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		クライアント フレームレート: [CLIENT_FRAME_RATE_CRITICAL] ~ [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		ノーマル +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		考えられる原因: 描画距離の設定が大きすぎる +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		考えられる原因: 画像のロード中 +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		考えられる原因: メモリ内の画像数が多すぎる +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		考えられる原因: 画面に含まれる複雑なオブジェクトが多すぎる +	</floater.string> +	<floater.string name="network_text_msg"> +		ネットワーク +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		接続でドロップされるパケットの割合: > [NETWORK_PACKET_LOSS_CRITICAL] +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		接続でドロップされるパケットの割合:[NETWORK_PACKET_LOSS_WARNING] ~ [NETWORK_PACKET_LOSS_CRITICAL] +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		ノーマル +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		接続の ping 時間: > [NETWORK_PING_CRITICAL] ミリ秒 +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		接続の ping 時間: [NETWORK_PING_WARNING] ~ [NETWORK_PING_CRITICAL] ミリ秒 +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		接続不良になっているか、帯域幅設定が高すぎます。 +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		接続不良になっているか、ファイル共有アプリケーションに問題があります。 +	</floater.string> +	<floater.string name="server_text_msg"> +		サーバー +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		シミュレーターのフレームレート: < [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		シミュレーターのフレームレート: [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		ノーマル +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		考えられる原因: 物理的オブジェクトが多すぎる +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		考えられる原因: スクリプトを含むオブジェクトが多すぎる +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		考えられる原因: ネットワーク トラフィック過大 +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		考えられる原因: 地域内にて動いているアバターが多すぎる +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		考えられる原因: 画像計算が多すぎる +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		考えられる原因: シミュレーターの過負荷 +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="クライアント ラグ ステータス"/> +	<text name="client"> +		クライアント +	</text> +	<text name="client_text"> +		ノーマル +	</text> +	<button name="network_lagmeter" tool_tip="ネットワーク ラグ ステータス"/> +	<text name="network"> +		ネットワーク +	</text> +	<text name="network_text"> +		ノーマル +	</text> +	<button name="server_lagmeter" tool_tip="サーバー ラグ ステータス"/> +	<text name="server"> +		サーバー +	</text> +	<text name="server_text"> +		ノーマル +	</text> +	<button label=">> " name="minimize" tool_tip="フローターのサイズをトグル"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml new file mode 100644 index 0000000000..8038550bcb --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="POMIAR LAGÓW"> +	<floater.string name="max_title_msg"> +		Pomiar lagów +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Klient +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		W normie, okno w tle +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Ilość klatek na sekundę klienta poniżej [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Ilość klatek na sekundę pomiędzy [CLIENT_FRAME_RATE_CRITICAL] i [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		W normie +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Przyczyna: dystans rysowania jest za wysoki +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Przyczyna: ładowanie obrazu +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Przyczyna: za dużo obrazów w pamięci +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Przyczyna: za dużo złożonych obiektów +	</floater.string> +	<floater.string name="network_text_msg"> +		Sieć +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Utrata pakietów przekracza [NETWORK_PACKET_LOSS_CRITICAL]% +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Utrata pakietów przekracza [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		W normie +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Fatalny ping - [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Wolny ping - [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Złe połączenie lub przepustowość. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Złe połączenie lub aplikacja współdzieląca pliki. +	</floater.string> +	<floater.string name="server_text_msg"> +		Serwer +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Ilość klatek na sekundę poniżej [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Ilość klatek na sekundę pomiędzy [SERVER_FRAME_RATE_CRITICAL] i [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		W normie +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Przyczyna: za dużo obiektów fizycznych +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Przyczyna: za dużo obieków skryptowanych +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Przyczyna: za duży ruch w sieci +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Przyczyna: za dużo poruszających się awatarów w regionie +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Przyczyna: za dużo kalkulacji obrazu +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Przyczyna: symulator ładuje się zbyt powoli +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta"/> +	<text name="client"> +		Klient +	</text> +	<text name="client_text"> +		W normie +	</text> +	<button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> +	<text name="network"> +		Sieć +	</text> +	<text name="network_text"> +		W normie +	</text> +	<button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status"/> +	<text name="server"> +		Serwer +	</text> +	<text name="server_text"> +		W normie +	</text> +	<button label=">>" name="minimize" tool_tip="Złącz rozmiar pliku xml"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml new file mode 100644 index 0000000000..9932318293 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG - Índice"> +	<floater.string name="max_title_msg"> +		Medidor de Atraso +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Atraso +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Cliente +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, janela por baixo +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Causa possível: Distância de desenho ajustada muito alta +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Causa possível: Carregamento de Imagens +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Causa possível: Muitas imagens na memória +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Causa possível: Muitos objetos complexos na cena +	</floater.string> +	<floater.string name="network_text_msg"> +		Rede +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Tempo de conexão de ping é cerca de  [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Possível conexão ruim ou 'Largura de Banda' escolhida muito alta. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Possível conexão ruim ou aplicativos compartilhando arquivos. +	</floater.string> +	<floater.string name="server_text_msg"> +		Servidor +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Causa possível: Muitos objetos físicos +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Causa possível: Muitos objetos com scripts +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Causa possível: Muito tráfego na rede +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Causa possível: Muitas pessoas se movendo na região +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Causa possível: Muitos cálculos de imagem +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Causa possível: Carga no simulador muito pesada +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/> +	<text name="client"> +		Cliente +	</text> +	<text font="SansSerifSmall" name="client_text"> +		Normal +	</text> +	<text left="30" name="client_lag_cause" right="-10"/> +	<button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/> +	<text name="network"> +		Rede +	</text> +	<text font="SansSerifSmall" name="network_text"> +		Normal +	</text> +	<text left="30" name="network_lag_cause" right="-10"/> +	<button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/> +	<text name="server"> +		Servidor +	</text> +	<text font="SansSerifSmall" name="server_text"> +		Normal +	</text> +	<text left="30" name="server_lag_cause" right="-32"/> +	<button label=">>" name="minimize" tool_tip="Alternar o tamanho da janela"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml new file mode 100644 index 0000000000..c420006a03 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="УРОВЕНЬ ЛАГОВ"> +	<floater.string name="max_title_msg"> +		Уровень лагов +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Лаг +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		Клиент +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Нормально, окно в фоне +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Частота кадров клиента ниже [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Частота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Нормально +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Возможная причина: дальность отрисовки слишком велика +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Возможная причина: загрузка изображений +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Возможная причина: слишком много изображений в памяти +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Возможная причина: слишком много сложных объектов в сцене +	</floater.string> +	<floater.string name="network_text_msg"> +		Сеть +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Сеть теряет более [NETWORK_PACKET_LOSS_CRITICAL]% пакетов +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Сеть теряет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Нормально +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Пинг соединения более [NETWORK_PING_CRITICAL] мс +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Пинг соединения [NETWORK_PING_WARNING]–[NETWORK_PING_CRITICAL] мс +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Возможно, плохое соединение, или параметр «Ширина канала» слишком велик. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Возможно, плохое соединение или есть работающие файлообменные программы. +	</floater.string> +	<floater.string name="server_text_msg"> +		Сервер +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Частота кадров сервера ниже [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Частота кадров сервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Нормально +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Возможная причина: слишком много физических объектов +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Возможная причина: слишком много скриптовых объектов +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Возможная причина: слишком большой сетевой трафик +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Возможная причина: слишком много людей в регионе +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Возможная причина: слишком много изображений +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Возможная причина: сервер сильно загружен +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="Уровень лагов клиента"/> +	<text name="client"> +		Клиент +	</text> +	<text name="client_text"> +		Нормально +	</text> +	<button name="network_lagmeter" tool_tip="Уровень лагов сети"/> +	<text name="network"> +		Сеть +	</text> +	<text name="network_text"> +		Нормально +	</text> +	<button name="server_lagmeter" tool_tip="Уровень лагов сервера"/> +	<text name="server"> +		Сервер +	</text> +	<text name="server_text"> +		Нормально +	</text> +	<button label=">>" name="minimize" tool_tip="Переключение размера"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml new file mode 100644 index 0000000000..736c50be90 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="GECİKME ÖLÇER"> +	<floater.string name="max_title_msg"> +		Gecikme Ölçer +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Gecikme +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		İstemci +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, pencere alt zeminde +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Muhtemel neden: Çizme mesafesi çok yüksek +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Muhtemel neden: Görüntüler yükleniyor +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Muhtemel neden: Bellekte çok fazla görüntü +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Muhtemel neden: Sahnede çok fazla karmaşık nesne +	</floater.string> +	<floater.string name="network_text_msg"> +		Ağ +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Bağlantı paketlerin % [NETWORK_PACKET_LOSS_CRITICAL]'sinden fazlasını bırakıyor +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Bağlantı paketlerin % [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]'sini bırakıyor +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Bağlantı ping süresi [NETWORK_PING_CRITICAL] ms.den fazla +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Bağlantı ping süresi [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Muhtemel yetersiz bağlantı veya 'Bant Genişliği' tercihi çok yüksek. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Muhtemel yetersiz bağlantı veya dosya paylaşım uygulaması. +	</floater.string> +	<floater.string name="server_text_msg"> +		Sunucu +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] altında +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] ve [SERVER_FRAME_RATE_WARNING] arasında +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		Normal +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		Muhtemel Neden: Çok fazla fiziki nesne +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		Muhtemel Neden: Çok fazla komut dosyalı nesne +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		Muhtemel Neden: Çok fazla ağ trafiği +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		Muhtemel Neden: Bölgede hareket eden çok fazla insan var +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		Muhtemel Neden: Çok fazla görüntü hesabı +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		Muhtemel Neden: Simülatör yükü çok ağır +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="İstemci gecikme durumu"/> +	<text name="client"> +		İstemci +	</text> +	<text name="client_text"> +		Normal +	</text> +	<button name="network_lagmeter" tool_tip="Ağ gecikme durumu"/> +	<text name="network"> +		Ağ +	</text> +	<text name="network_text"> +		Normal +	</text> +	<button name="server_lagmeter" tool_tip="Sunucu gecikme durumu"/> +	<text name="server"> +		Sunucu +	</text> +	<text name="server_text"> +		Normal +	</text> +	<button label=">>" name="minimize" tool_tip="Gezdirici büyüklüğünü değiştir"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml new file mode 100644 index 0000000000..6e58e7332f --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG 測量器"> +	<floater.string name="max_title_msg"> +		Lag 測量器 +	</floater.string> +	<floater.string name="max_width_px"> +		360 +	</floater.string> +	<floater.string name="min_title_msg"> +		Lag +	</floater.string> +	<floater.string name="min_width_px"> +		90 +	</floater.string> +	<floater.string name="client_text_msg"> +		客戶端 +	</floater.string> +	<floater.string name="client_frame_rate_critical_fps"> +		10 +	</floater.string> +	<floater.string name="client_frame_rate_warning_fps"> +		15 +	</floater.string> +	<floater.string name="client_frame_time_window_bg_msg"> +		Normal, window in background +	</floater.string> +	<floater.string name="client_frame_time_critical_msg"> +		Client frame rate below [CLIENT_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="client_frame_time_warning_msg"> +		Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING] +	</floater.string> +	<floater.string name="client_frame_time_normal_msg"> +		正常 +	</floater.string> +	<floater.string name="client_draw_distance_cause_msg"> +		Possible cause: Draw distance set too high +	</floater.string> +	<floater.string name="client_texture_loading_cause_msg"> +		Possible cause: Images loading +	</floater.string> +	<floater.string name="client_texture_memory_cause_msg"> +		Possible cause: Too many images in memory +	</floater.string> +	<floater.string name="client_complex_objects_cause_msg"> +		Possible cause: Too many complex objects in scene +	</floater.string> +	<floater.string name="network_text_msg"> +		網路 +	</floater.string> +	<floater.string name="network_packet_loss_critical_pct"> +		10 +	</floater.string> +	<floater.string name="network_packet_loss_warning_pct"> +		5 +	</floater.string> +	<floater.string name="network_packet_loss_critical_msg"> +		Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets +	</floater.string> +	<floater.string name="network_packet_loss_warning_msg"> +		Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets +	</floater.string> +	<floater.string name="network_performance_normal_msg"> +		正常 +	</floater.string> +	<floater.string name="network_ping_critical_ms"> +		600 +	</floater.string> +	<floater.string name="network_ping_warning_ms"> +		300 +	</floater.string> +	<floater.string name="network_ping_critical_msg"> +		Connection ping time is over [NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_ping_warning_msg"> +		Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms +	</floater.string> +	<floater.string name="network_packet_loss_cause_msg"> +		Possible bad connection or 'Bandwidth' pref too high. +	</floater.string> +	<floater.string name="network_ping_cause_msg"> +		Possible bad connection or file-sharing app. +	</floater.string> +	<floater.string name="server_text_msg"> +		伺服器 +	</floater.string> +	<floater.string name="server_frame_rate_critical_fps"> +		20 +	</floater.string> +	<floater.string name="server_frame_rate_warning_fps"> +		30 +	</floater.string> +	<floater.string name="server_single_process_max_time_ms"> +		20 +	</floater.string> +	<floater.string name="server_frame_time_critical_msg"> +		模擬器 framerate 低於 [SERVER_FRAME_RATE_CRITICAL] +	</floater.string> +	<floater.string name="server_frame_time_warning_msg"> +		模擬器 framerate 介於 [SERVER_FRAME_RATE_CRITICAL] 與 [SERVER_FRAME_RATE_WARNING] 之間 +	</floater.string> +	<floater.string name="server_frame_time_normal_msg"> +		正常 +	</floater.string> +	<floater.string name="server_physics_cause_msg"> +		可能原因:太多物理物件 +	</floater.string> +	<floater.string name="server_scripts_cause_msg"> +		可能原因:太多腳本物件 +	</floater.string> +	<floater.string name="server_net_cause_msg"> +		可能原因:太多網路流量 +	</floater.string> +	<floater.string name="server_agent_cause_msg"> +		可能原因:地區有太多移動的人 +	</floater.string> +	<floater.string name="server_images_cause_msg"> +		可能原因:太多圖像計算 +	</floater.string> +	<floater.string name="server_generic_cause_msg"> +		可能原因:模擬器負載過重 +	</floater.string> +	<floater.string name="smaller_label"> +		>> +	</floater.string> +	<floater.string name="bigger_label"> +		<< +	</floater.string> +	<button name="client_lagmeter" tool_tip="客戶端 lag 狀態"/> +	<text name="client"> +		客戶端 +	</text> +	<text name="client_text"> +		正常 +	</text> +	<button name="network_lagmeter" tool_tip="網路 lag 狀態"/> +	<text name="network"> +		網路 +	</text> +	<text name="network_text"> +		正常 +	</text> +	<button name="server_lagmeter" tool_tip="伺服器 lag 狀態"/> +	<text name="server"> +		伺服器 +	</text> +	<text name="server_text"> +		正常 +	</text> +	<button label=">>" name="minimize" tool_tip="切換浮動視窗尺寸"/> +</floater> | 
