diff options
34 files changed, 489 insertions, 139 deletions
| diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp index bad9c198ad..97293bf134 100755 --- a/indra/llcharacter/lljoint.cpp +++ b/indra/llcharacter/lljoint.cpp @@ -45,9 +45,9 @@ LLJoint::AttachmentOverrideRecord::AttachmentOverrideRecord()  }  template <class T>  -bool attachment_map_iter_compare_name(const T& a, const T& b) +bool attachment_map_iter_compare_key(const T& a, const T& b)  { -	return a.second.name < b.second.name; +	return a.first < b.first;  }  //----------------------------------------------------------------------------- @@ -257,61 +257,60 @@ void LLJoint::setPosition( const LLVector3& pos )  //--------------------------------------------------------------------  // addAttachmentPosOverride()  //-------------------------------------------------------------------- -void LLJoint::addAttachmentPosOverride( const LLVector3& pos, const std::string& attachment_name ) +void LLJoint::addAttachmentPosOverride( const LLVector3& pos, const LLUUID& mesh_id, const std::string& av_info )  { -	if (attachment_name.empty()) +	if (mesh_id.isNull())  	{  		return;  	}  	if (m_attachmentOverrides.empty())  	{ -		LL_DEBUGS("Avatar") << getName() << " saving m_posBeforeOverrides " << getPosition() << LL_ENDL; +		LL_DEBUGS("Avatar") << "av " << av_info << " joint " << getName() << " saving m_posBeforeOverrides " << getPosition() << LL_ENDL;  		m_posBeforeOverrides = getPosition();  	}  	AttachmentOverrideRecord rec; -	rec.name = attachment_name;  	rec.pos = pos; -	m_attachmentOverrides[attachment_name] = rec; -	LL_DEBUGS("Avatar") << getName() << " addAttachmentPosOverride for " << attachment_name << " pos " << pos << LL_ENDL; -	updatePos(); +	m_attachmentOverrides[mesh_id] = rec; +	LL_DEBUGS("Avatar") << "av " << av_info << " joint " << getName() << " addAttachmentPosOverride for mesh " << mesh_id << " pos " << pos << LL_ENDL; +	updatePos(av_info);  }  //--------------------------------------------------------------------  // removeAttachmentPosOverride()  //-------------------------------------------------------------------- -void LLJoint::removeAttachmentPosOverride( const std::string& attachment_name ) +void LLJoint::removeAttachmentPosOverride( const LLUUID& mesh_id, const std::string& av_info )  { -	if (attachment_name.empty()) +	if (mesh_id.isNull())  	{  		return;  	} -	attachment_map_t::iterator it = m_attachmentOverrides.find(attachment_name); +	attachment_map_t::iterator it = m_attachmentOverrides.find(mesh_id);  	if (it != m_attachmentOverrides.end())  	{ -		LL_DEBUGS("Avatar") << getName() << " removeAttachmentPosOverride for " << attachment_name << LL_ENDL; +		LL_DEBUGS("Avatar") << "av " << av_info << " joint " << getName() << " removeAttachmentPosOverride for " << mesh_id << LL_ENDL;  		m_attachmentOverrides.erase(it);  	} -	updatePos(); +	updatePos(av_info);  }  //--------------------------------------------------------------------  // updatePos()  //-------------------------------------------------------------------- -void LLJoint::updatePos() +void LLJoint::updatePos(const std::string& av_info)  {  	LLVector3 pos;  	attachment_map_t::iterator it = std::max_element(m_attachmentOverrides.begin(),  													 m_attachmentOverrides.end(), -													 attachment_map_iter_compare_name<LLJoint::attachment_map_t::value_type>); +													 attachment_map_iter_compare_key<LLJoint::attachment_map_t::value_type>);  	if (it != m_attachmentOverrides.end())  	{  		AttachmentOverrideRecord& rec = it->second; -		LL_DEBUGS("Avatar") << getName() << " updatePos, winner of " << m_attachmentOverrides.size() << " is attachment " << rec.name << " pos " << rec.pos << LL_ENDL; +		LL_DEBUGS("Avatar") << "av " << av_info << " joint " << getName() << " updatePos, winner of " << m_attachmentOverrides.size() << " is mesh " << it->first << " pos " << rec.pos << LL_ENDL;  		pos = rec.pos;  	}  	else  	{ -		LL_DEBUGS("Avatar") << getName() << " updatePos, winner is posBeforeOverrides " << m_posBeforeOverrides << LL_ENDL; +		LL_DEBUGS("Avatar") << "av " << av_info << " joint " << getName() << " updatePos, winner is posBeforeOverrides " << m_posBeforeOverrides << LL_ENDL;  		pos = m_posBeforeOverrides;  	}  	setPosition(pos); diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h index 0ef054d9c1..951cafad94 100755 --- a/indra/llcharacter/lljoint.h +++ b/indra/llcharacter/lljoint.h @@ -103,13 +103,12 @@ public:  	{  		AttachmentOverrideRecord();  		LLVector3 pos; -		std::string name;  	}; -	typedef std::map<std::string,AttachmentOverrideRecord> attachment_map_t; +	typedef std::map<LLUUID,AttachmentOverrideRecord> attachment_map_t;  	attachment_map_t m_attachmentOverrides;  	LLVector3 m_posBeforeOverrides; -	void updatePos(); +	void updatePos(const std::string& av_info);  public:  	LLJoint(); @@ -192,8 +191,8 @@ public:  	S32 getJointNum() const { return mJointNum; } -	void addAttachmentPosOverride( const LLVector3& pos, const std::string& attachment_name ); -	void removeAttachmentPosOverride( const std::string& attachment_name ); +	void addAttachmentPosOverride( const LLVector3& pos, const LLUUID& mesh_id, const std::string& av_info ); +	void removeAttachmentPosOverride( const LLUUID& mesh_id, const std::string& av_info );  	//Accessor for the joint id  	LLUUID getId( void ) { return mId; } diff --git a/indra/llcommon/lluriparser.cpp b/indra/llcommon/lluriparser.cpp index ef4481d32f..d07288f123 100644 --- a/indra/llcommon/lluriparser.cpp +++ b/indra/llcommon/lluriparser.cpp @@ -175,29 +175,58 @@ S32 LLUriParser::normalize()  				if (!mRes)  				{  					mNormalizedUri = &label_buf[mTmpScheme ? 7 : 0]; +					mTmpScheme = false;  				}  			}  		}  	} +	if(mTmpScheme) +	{ +		mNormalizedUri = mNormalizedUri.substr(7); +		mTmpScheme = false; +	} +  	return mRes;  }  void LLUriParser::glue(std::string& uri) const  { +	std::string first_part; +	glueFirst(first_part); + +	std::string second_part; +	glueSecond(second_part); + +	uri = first_part + second_part; +} + +void LLUriParser::glueFirst(std::string& uri) const +{  	if (mScheme.size())  	{  		uri = mScheme;  		uri += "://";  	} +	else +	{ +		uri.clear(); +	}  	uri += mHost; +} +void LLUriParser::glueSecond(std::string& uri) const +{  	if (mPort.size())  	{ -		uri += ':'; +		uri = ':';  		uri += mPort;  	} +	else +	{ +		uri.clear(); +	}  	uri += mPath; diff --git a/indra/llcommon/lluriparser.h b/indra/llcommon/lluriparser.h index 719f916837..e987bae924 100644 --- a/indra/llcommon/lluriparser.h +++ b/indra/llcommon/lluriparser.h @@ -60,6 +60,8 @@ public:  	void extractParts();  	void glue(std::string& uri) const; +	void glueFirst(std::string& uri) const; +	void glueSecond(std::string& uri) const;  	bool test() const;  	S32 normalize(); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 09f923e74f..310323445b 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2063,8 +2063,17 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  			LLTextUtil::processUrlMatch(&match, this, isContentTrusted() || match.isTrusted());  			// output the styled Url -			//appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly());  			appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); + +			// show query part of url with gray color if enabled in global settings in "HTTPNoProtocolShowGreyQuery" +			// and only for LLUrlEntryHTTP and LLUrlEntryHTTPNoProtocol url entries +			std::string label = match.getQuery(); +			if (label.size()) +			{ +				link_params.color = LLColor4::grey; +				link_params.readonly_color = LLColor4::grey; +				appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly()); +			}  			// set the tooltip for the Url label  			if (! match.getTooltip().empty()) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index c06d6144b9..ac023e664d 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -48,7 +48,9 @@ std::string localize_slapp_label(const std::string& url, const std::string& full  LLUrlEntryBase::LLUrlEntryBase() -{} +{ +	mGreyQuery = LLUI::sSettingGroups["config"]->getBOOL("HTTPNoProtocolShowGreyQuery"); +}  LLUrlEntryBase::~LLUrlEntryBase()  { @@ -187,6 +189,33 @@ bool LLUrlEntryBase::isWikiLinkCorrect(std::string url)  	return (LLUrlRegistry::instance().hasUrl(label)) ? false : true;  } +std::string LLUrlEntryBase::urlToLabelWithGreyQuery(const std::string &url) const +{ +	LLUriParser up(unescapeUrl(url)); +	up.normalize(); + +	std::string label; +	up.extractParts(); +	up.glueFirst(label); + +	return label; +} + +std::string LLUrlEntryBase::urlToGreyQuery(const std::string &url) const +{ +	LLUriParser up(unescapeUrl(url)); + +	std::string query; +	if (mGreyQuery) +	{ +		up.extractParts(); +		up.glueSecond(query); +	} + +	return query; +} + +  static std::string getStringAfterToken(const std::string str, const std::string token)  {  	size_t pos = str.find(token); @@ -203,6 +232,7 @@ static std::string getStringAfterToken(const std::string str, const std::string  // LLUrlEntryHTTP Describes generic http: and https: Urls  //  LLUrlEntryHTTP::LLUrlEntryHTTP() +	: LLUrlEntryBase()  {  	mPattern = boost::regex("https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*",  							boost::regex::perl|boost::regex::icase); @@ -212,6 +242,25 @@ LLUrlEntryHTTP::LLUrlEntryHTTP()  std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  { +	return urlToLabelWithGreyQuery(url); +} + +std::string LLUrlEntryHTTP::getQuery(const std::string &url) const +{ +	return urlToGreyQuery(url); +} + +std::string LLUrlEntryHTTP::getUrl(const std::string &string) const +{ +	if (string.find("://") == std::string::npos) +	{ +		return "http://" + escapeUrl(string); +	} +	return escapeUrl(string); +} + +std::string LLUrlEntryHTTP::getTooltip(const std::string &url) const +{  	return unescapeUrl(url);  } @@ -247,6 +296,7 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) const  // LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com  //  LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol() +	: LLUrlEntryBase()  {  	mPattern = boost::regex("("  				"\\bwww\\.\\S+\\.\\S+" // i.e. www.FOO.BAR @@ -260,7 +310,12 @@ LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol()  std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  { -	return unescapeUrl(url); +	return urlToLabelWithGreyQuery(url); +} + +std::string LLUrlEntryHTTPNoProtocol::getQuery(const std::string &url) const +{ +	return urlToGreyQuery(url);  }  std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const @@ -272,6 +327,11 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const  	return escapeUrl(string);  } +std::string LLUrlEntryHTTPNoProtocol::getTooltip(const std::string &url) const +{ +	return unescapeUrl(url); +} +  //  // LLUrlEntrySLURL Describes generic http: and https: Urls  // @@ -345,29 +405,53 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const  }  // -// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link +// LLUrlEntrySeconlifeURL Describes *secondlife.com/ and *lindenlab.com/ urls to substitute icon 'hand.png' before link  // -LLUrlEntrySeconlifeURL::LLUrlEntrySeconlifeURL() -{  -	mPattern = boost::regex("\\b(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?(/\\S*)?\\b", +LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL() +{                               +	mPattern = boost::regex("(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?\\/\\S*",  		boost::regex::perl|boost::regex::icase);  	mIcon = "Hand";  	mMenuName = "menu_url_http.xml";  } -std::string LLUrlEntrySeconlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +std::string LLUrlEntrySecondlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  {  	LLUriParser up(url);  	up.extractParts(); -	return up.host(); + +	std::string label; +	up.glueFirst(label); +	return label;  } -std::string LLUrlEntrySeconlifeURL::getTooltip(const std::string &url) const +std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const  {  	return url;  } +std::string LLUrlEntrySecondlifeURL::getUrl(const std::string &string) const +{ +	if (string.find("://") == std::string::npos) +	{ +		return "http://" + escapeUrl(string); +	} +	return escapeUrl(string); +} + +// +// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link +// +LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL() +  { +	mPattern = boost::regex("(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(?!\\S)", +		boost::regex::perl|boost::regex::icase); + +	mIcon = "Hand"; +	mMenuName = "menu_url_http.xml"; +} +  //  // LLUrlEntryAgent Describes a Second Life agent Url, e.g.,  // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 1cb11cdb1c..fd18389303 100755 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -78,6 +78,9 @@ public:  	/// Given a matched Url, return a label for the Url  	virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; } +	/// Return port, query and fragment parts for the Url +	virtual std::string getQuery(const std::string &url) const { return ""; } +  	/// Return an icon that can be displayed next to Urls of this type  	virtual std::string getIcon(const std::string &url); @@ -111,6 +114,8 @@ protected:  	std::string getLabelFromWikiLink(const std::string &url) const;  	std::string getUrlFromWikiLink(const std::string &string) const;  	void addObserver(const std::string &id, const std::string &url, const LLUrlLabelCallback &cb);  +	std::string urlToLabelWithGreyQuery(const std::string &url) const; +	std::string urlToGreyQuery(const std::string &url) const;  	virtual void callObservers(const std::string &id, const std::string &label, const std::string& icon);  	typedef struct { @@ -123,6 +128,7 @@ protected:  	std::string                                    	mMenuName;  	std::string                                    	mTooltip;  	std::multimap<std::string, LLUrlEntryObserver>	mObservers; +	bool											mGreyQuery;  };  /// @@ -133,6 +139,9 @@ class LLUrlEntryHTTP : public LLUrlEntryBase  public:  	LLUrlEntryHTTP();  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getQuery(const std::string &url) const; +	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getTooltip(const std::string &url) const;  };  /// @@ -155,7 +164,9 @@ class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase  public:  	LLUrlEntryHTTPNoProtocol();  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getQuery(const std::string &url) const;  	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getTooltip(const std::string &url) const;  };  /// @@ -172,16 +183,23 @@ public:  ///  /// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls  /// -class LLUrlEntrySeconlifeURL : public LLUrlEntryBase +class LLUrlEntrySecondlifeURL : public LLUrlEntryBase  {  public: -	LLUrlEntrySeconlifeURL(); +	LLUrlEntrySecondlifeURL();  	bool isTrusted() const { return true; }  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);  	/*virtual*/ std::string getTooltip(const std::string &url) const; +	/*virtual*/ std::string getUrl(const std::string &string) const; +}; -private: -	std::string mLabel; +/// +/// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls +/// +class LLUrlEntrySimpleSecondlifeURL : public LLUrlEntrySecondlifeURL +{ +public: +	LLUrlEntrySimpleSecondlifeURL();  };  /// diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index 016d1ca92d..2f2ac969e1 100755 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -42,8 +42,8 @@ LLUrlMatch::LLUrlMatch() :  {  } -void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, -						   const std::string &label, const std::string &tooltip, +void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std::string &label, +						   const std::string& query, const std::string &tooltip,  						   const std::string &icon, const LLStyle::Params& style,  						   const std::string &menu, const std::string &location,  						   const LLUUID& id, bool underline_on_hover_only, bool trusted) @@ -52,6 +52,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  	mEnd = end;  	mUrl = url;  	mLabel = label; +	mQuery = query;  	mTooltip = tooltip;  	mIcon = icon;  	mStyle = style; diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index 9f8960b32f..ff699902ca 100755 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -62,6 +62,9 @@ public:  	/// return a label that can be used for the display of this Url  	std::string getLabel() const { return mLabel; } +	/// return a right part of url which should be drawn in grey +	std::string getQuery() const { return mQuery; } +  	/// return a message that could be displayed in a tooltip or status bar  	std::string getTooltip() const { return mTooltip; } @@ -85,10 +88,10 @@ public:  	/// Change the contents of this match object (used by LLUrlRegistry)  	void setValues(U32 start, U32 end, const std::string &url, const std::string &label, -	               const std::string &tooltip, const std::string &icon, +	               const std::string& query, const std::string &tooltip, const std::string &icon,  				   const LLStyle::Params& style, const std::string &menu,   				   const std::string &location, const LLUUID& id, -				   bool underline_on_hover_only = false, bool trusted = false ); +				   bool underline_on_hover_only = false, bool trusted = false);  	const LLUUID& getID() const { return mID; }  private: @@ -96,6 +99,7 @@ private:  	U32         mEnd;  	std::string mUrl;  	std::string mLabel; +	std::string mQuery;  	std::string mTooltip;  	std::string mIcon;  	std::string mMenuName; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 9e8d8d01f1..280d066087 100755 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -47,7 +47,8 @@ LLUrlRegistry::LLUrlRegistry()  	registerUrl(new LLUrlEntrySLURL());  	// decorated links for host names like: secondlife.com and lindenlab.com -	registerUrl(new LLUrlEntrySeconlifeURL()); +	registerUrl(new LLUrlEntrySecondlifeURL()); +	registerUrl(new LLUrlEntrySimpleSecondlifeURL());  	registerUrl(new LLUrlEntryHTTP());  	mUrlEntryHTTPLabel = new LLUrlEntryHTTPLabel(); @@ -199,6 +200,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  				match_start = start;  				match_end = end;  				match_entry = url_entry; +				break;  			}  		}  	} @@ -216,6 +218,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  		match.setValues(match_start, match_end,  						match_entry->getUrl(url),  						match_entry->getLabel(url, cb), +						match_entry->getQuery(url),  						match_entry->getTooltip(url),  						match_entry->getIcon(url),  						match_entry->getStyle(), @@ -252,6 +255,7 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr  		match.setValues(start, end, match.getUrl(),   						match.getLabel(), +						match.getQuery(),  						match.getTooltip(),  						match.getIcon(),  						match.getStyle(), diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 55c1efefef..843886eb69 100755 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -151,7 +151,7 @@ namespace tut  		LLUrlMatch match;  		ensure("empty()", match.empty()); -		match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(0, 1, "http://secondlife.com", "", "Second Life", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("! empty()", ! match.empty());  	} @@ -164,7 +164,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getStart() == 0", match.getStart(), 0); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getStart() == 10", match.getStart(), 10);  	} @@ -177,7 +177,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getEnd() == 0", match.getEnd(), 0); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getEnd() == 20", match.getEnd(), 20);  	} @@ -190,10 +190,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getUrl() == ''", match.getUrl(), ""); -		match.setValues(10, 20, "http://slurl.com/", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "http://slurl.com/", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getUrl() == '' (2)", match.getUrl(), "");  	} @@ -206,10 +206,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getLabel() == ''", match.getLabel(), ""); -		match.setValues(10, 20, "", "Label", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "Label", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getLabel() == '' (2)", match.getLabel(), "");  	} @@ -222,10 +222,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getTooltip() == ''", match.getTooltip(), ""); -		match.setValues(10, 20, "", "", "Info", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "Info", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getTooltip() == '' (2)", match.getTooltip(), "");  	} @@ -238,10 +238,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getIcon() == ''", match.getIcon(), ""); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getIcon() == '' (2)", match.getIcon(), "");  	} @@ -254,10 +254,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getMenuName() empty", match.getMenuName().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "", LLUUID::null);  		ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("getMenuName() empty (2)", match.getMenuName().empty());  	} @@ -270,10 +270,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getLocation() empty", match.getLocation().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "Paris", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "Paris", LLUUID::null);  		ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("getLocation() empty (2)", match.getLocation().empty());  	}  } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6ac9c161d1..16705e1913 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4982,6 +4982,7 @@        <key>Type</key>        <string>LLSD</string>        <key>Value</key> +      <array />      </map>      <key>LSLFindCaseInsensitivity</key>          <map> @@ -11737,7 +11738,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <integer>0.0</integer> +    <real>0.0</real>    </map>      <key>TextureFetchSource</key>      <map> @@ -13180,6 +13181,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>EnvironmentPersistAcrossLogin</key> +    <map> +      <key>Comment</key> +      <string>Keep Environment settings consistent across sessions</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseDayCycle</key>      <map>        <key>Comment</key> @@ -15573,7 +15585,17 @@        <key>Value</key>        <integer>0</integer>      </map> - +    <key>HTTPNoProtocolShowGreyQuery</key> +    <map> +        <key>Comment</key> +        <string>Enable(disable) appearance of port, query and fragment parts of url for HTTP and HTTPNoProtocol entries in grey.</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Boolean</string> +        <key>Value</key> +        <integer>1</integer> +    </map>  </map>  </llsd> diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index a98ff64d0a..466677b8be 100755 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -229,21 +229,34 @@ void LLAssetUploadResponder::httpFailure()  {  	// *TODO: Add adaptive retry policy?  	LL_WARNS() << dumpResponse() << LL_ENDL; -	LLSD args; +	std::string reason;  	if (isHttpClientErrorStatus(getStatus()))  	{ -		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); -		args["REASON"] = "Error in upload request.  Please visit " +		reason = "Error in upload request.  Please visit "  			"http://secondlife.com/support for help fixing this problem."; -		LLNotificationsUtil::add("CannotUploadReason", args);  	}  	else  	{ -		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); -		args["REASON"] = "The server is experiencing unexpected " +		reason = "The server is experiencing unexpected "  			"difficulties."; -		LLNotificationsUtil::add("CannotUploadReason", args);  	} +	LLSD args; +	args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); +	args["REASON"] = reason; +	LLNotificationsUtil::add("CannotUploadReason", args); + +	// unfreeze script preview +	if(mAssetType == LLAssetType::AT_LSL_TEXT) +	{ +		LLPreviewLSL* preview = LLFloaterReg::findTypedInstance<LLPreviewLSL>("preview_script", mPostData["item_id"]); +		if (preview) +		{ +			LLSD errors; +			errors.append(LLTrans::getString("UploadFailed") + reason); +			preview->callbackLSLCompileFailed(errors); +		} +	} +  	LLUploadDialog::modalUploadFinished();  	LLFilePicker::instance().reset();  // unlock file picker when bulk upload fails  } @@ -298,8 +311,22 @@ void LLAssetUploadResponder::uploadUpload(const LLSD& content)  void LLAssetUploadResponder::uploadFailure(const LLSD& content)  {  	LL_WARNS() << dumpResponse() << LL_ENDL; + +	// unfreeze script preview +	if(mAssetType == LLAssetType::AT_LSL_TEXT) +	{ +		LLPreviewLSL* preview = LLFloaterReg::findTypedInstance<LLPreviewLSL>("preview_script", mPostData["item_id"]); +		if (preview) +		{ +			LLSD errors; +			errors.append(LLTrans::getString("UploadFailed") + content["message"].asString()); +			preview->callbackLSLCompileFailed(errors); +		} +	} +  	// remove the "Uploading..." message  	LLUploadDialog::modalUploadFinished(); +  	LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");  	if (floater_snapshot)  	{ diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 41d378fea1..a626ad1bff 100755 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -303,7 +303,8 @@ void LLEnvManagerNew::loadUserPrefs()  	mUserPrefs.mSkyPresetName	= gSavedSettings.getString("SkyPresetName");  	mUserPrefs.mDayCycleName	= gSavedSettings.getString("DayCycleName"); -	mUserPrefs.mUseRegionSettings	= gSavedSettings.getBOOL("UseEnvironmentFromRegion"); +	bool use_region_settings = gSavedSettings.getBOOL("EnvironmentPersistAcrossLogin") ? gSavedSettings.getBOOL("UseEnvironmentFromRegion") : true; +	mUserPrefs.mUseRegionSettings	= use_region_settings;  	mUserPrefs.mUseDayCycle			= gSavedSettings.getBOOL("UseDayCycle");  	if (mUserPrefs.mUseRegionSettings) diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 0c59ba9a6d..535cb368bd 100755 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -342,11 +342,6 @@ void LLFloaterColorPicker::setCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn )  	curG = curGIn;  	curB = curBIn; -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	} -  	// update corresponding HSL values and  	LLColor3(curRIn, curGIn, curBIn).calcHSL(&curH, &curS, &curL); @@ -374,11 +369,6 @@ void LLFloaterColorPicker::setCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn )  	// update corresponding RGB values and  	hslToRgb ( curH, curS, curL, curR, curG, curB ); - -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	}  }  ////////////////////////////////////////////////////////////////////////////// @@ -467,7 +457,8 @@ void LLFloaterColorPicker::onImmediateCheck( LLUICtrl* ctrl, void* data)  void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te )  { -	setCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]); +	// Pipete +	selectCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]);  }  void LLFloaterColorPicker::onMouseCaptureLost() @@ -643,6 +634,28 @@ const LLColor4& LLFloaterColorPicker::getComplimentaryColor ( const LLColor4& ba  }  ////////////////////////////////////////////////////////////////////////////// +// set current RGB and rise change event if needed. +void LLFloaterColorPicker::selectCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ) +{ +	setCurRgb(curRIn, curGIn, curBIn); +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	} +} + +////////////////////////////////////////////////////////////////////////////// +// set current HSL and rise change event if needed. +void LLFloaterColorPicker::selectCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn ) +{ +	setCurHsl(curHIn, curSIn, curLIn); +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	} +} + +//////////////////////////////////////////////////////////////////////////////  // draw color palette  void LLFloaterColorPicker::drawPalette ()  { @@ -736,7 +749,7 @@ void LLFloaterColorPicker::onTextEntryChanged ( LLUICtrl* ctrl )  		}  		// update current RGB (and implicitly HSL) -		setCurRgb ( rVal, gVal, bVal ); +		selectCurRgb ( rVal, gVal, bVal );  		updateTextEntry ();  	} @@ -759,15 +772,10 @@ void LLFloaterColorPicker::onTextEntryChanged ( LLUICtrl* ctrl )  			lVal = (F32)ctrl->getValue().asReal() / 100.0f;  		// update current HSL (and implicitly RGB) -		setCurHsl ( hVal, sVal, lVal ); +		selectCurHsl ( hVal, sVal, lVal );  		updateTextEntry ();  	} - -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	}  }  ////////////////////////////////////////////////////////////////////////////// @@ -780,7 +788,7 @@ BOOL LLFloaterColorPicker::updateRgbHslFromPoint ( S32 xPosIn, S32 yPosIn )  		 yPosIn >= mRGBViewerImageTop - mRGBViewerImageHeight )  	{  		// update HSL (and therefore RGB) based on new H & S and current L -		setCurHsl ( ( ( F32 )xPosIn - ( F32 )mRGBViewerImageLeft ) / ( F32 )mRGBViewerImageWidth, +		selectCurHsl ( ( ( F32 )xPosIn - ( F32 )mRGBViewerImageLeft ) / ( F32 )mRGBViewerImageWidth,  					( ( F32 )yPosIn - ( ( F32 )mRGBViewerImageTop - ( F32 )mRGBViewerImageHeight ) ) / ( F32 )mRGBViewerImageHeight,  					getCurL () ); @@ -795,7 +803,7 @@ BOOL LLFloaterColorPicker::updateRgbHslFromPoint ( S32 xPosIn, S32 yPosIn )  	{  		// update HSL (and therefore RGB) based on current HS and new L -		 setCurHsl ( getCurH (), +		 selectCurHsl ( getCurH (),  					 getCurS (),  					( ( F32 )yPosIn - ( ( F32 )mRGBViewerImageTop - ( F32 )mRGBViewerImageHeight ) ) / ( F32 )mRGBViewerImageHeight ); @@ -887,7 +895,7 @@ BOOL LLFloaterColorPicker::handleMouseDown ( S32 x, S32 y, MASK mask )  		{  			LLColor4 selected = *mPalette [ index ]; -			setCurRgb ( selected [ 0 ], selected [ 1 ], selected [ 2 ] ); +			selectCurRgb ( selected [ 0 ], selected [ 1 ], selected [ 2 ] );  			if (mApplyImmediateCheck->get())  			{ diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index d4d22b643a..8c16ebdf03 100755 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -122,6 +122,9 @@ class LLFloaterColorPicker  		static void onImmediateCheck ( LLUICtrl* ctrl, void* data );  			   void onColorSelect( const class LLTextureEntry& te );  	private: +		// mutators for color values, can raise event to preview changes at object +		void selectCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ); +		void selectCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn );  		// draws color selection palette  		void drawPalette (); diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 2864f018b2..357b635594 100755 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -118,6 +118,7 @@ LLFloaterIMSessionTab* LLFloaterIMSessionTab::getConversation(const LLUUID& uuid  	else  	{  		conv = LLFloaterReg::getTypedInstance<LLFloaterIMSessionTab>("impanel", LLSD(uuid)); +		conv->setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);  	}  	return conv; diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 5a1dfc99ab..568fc74c49 100755 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -32,6 +32,7 @@  #include "llfloatertools.h"  #include "llavataractions.h"  #include "llavatarnamecache.h" +#include "llgroupactions.h"  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h"  #include "llselectmgr.h" @@ -147,8 +148,17 @@ void LLFloaterInspect::onClickOwnerProfile()  		LLSelectNode* node = mObjectSelection->getFirstNode(&func);  		if(node)  		{ -			const LLUUID& owner_id = node->mPermissions->getOwner(); -			LLAvatarActions::showProfile(owner_id); +			if(node->mPermissions->isGroupOwned()) +			{ +				const LLUUID& idGroup = node->mPermissions->getGroup(); +				LLGroupActions::show(idGroup); +			} +			else +			{ +				const LLUUID& owner_id = node->mPermissions->getOwner(); +				LLAvatarActions::showProfile(owner_id); +			} +  		}  	}  } @@ -219,21 +229,42 @@ void LLFloaterInspect::refresh()  		const LLUUID& idCreator = obj->mPermissions->getCreator();  		LLAvatarName av_name; -		// Only work with the names if we actually get a result -		// from the name cache. If not, defer setting the -		// actual name and set a placeholder. -		if (LLAvatarNameCache::get(idOwner, &av_name)) +		if(obj->mPermissions->isGroupOwned())  		{ -			owner_name = av_name.getCompleteName(); +			std::string group_name; +			const LLUUID& idGroup = obj->mPermissions->getGroup(); +			if(gCacheName->getGroupName(idGroup, group_name)) +			{ +				owner_name = group_name; +			} +			else +			{ +				owner_name = LLTrans::getString("RetrievingData"); +				if (mOwnerNameCacheConnection.connected()) +				{ +					mOwnerNameCacheConnection.disconnect(); +				} +				mOwnerNameCacheConnection = gCacheName->getGroup(idGroup, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this)); +			}  		}  		else  		{ -			owner_name = LLTrans::getString("RetrievingData"); -			if (mOwnerNameCacheConnection.connected()) +			// Only work with the names if we actually get a result +			// from the name cache. If not, defer setting the +			// actual name and set a placeholder. +			if (LLAvatarNameCache::get(idOwner, &av_name)) +			{ +				owner_name = av_name.getCompleteName(); +			} +			else  			{ -				mOwnerNameCacheConnection.disconnect(); +				owner_name = LLTrans::getString("RetrievingData"); +				if (mOwnerNameCacheConnection.connected()) +				{ +					mOwnerNameCacheConnection.disconnect(); +				} +				mOwnerNameCacheConnection = LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this));  			} -			mOwnerNameCacheConnection = LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this));  		}  		if (LLAvatarNameCache::get(idCreator, &av_name)) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7621c35ed2..3cef7958c2 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1983,6 +1983,7 @@ void LLPanelLandOptions::refresh()  	else  	{  		// something selected, hooray! +		LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  		// Display options  		BOOL can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS); @@ -1998,8 +1999,9 @@ void LLPanelLandOptions::refresh()  		mCheckGroupObjectEntry	->set( parcel->getAllowGroupObjectEntry() ||  parcel->getAllowAllObjectEntry());  		mCheckGroupObjectEntry	->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() ); +		BOOL region_damage = regionp ? regionp->getAllowDamage() : FALSE;  		mCheckSafe			->set( !parcel->getAllowDamage() ); -		mCheckSafe			->setEnabled( can_change_options ); +		mCheckSafe			->setEnabled( can_change_options && region_damage );  		mCheckFly			->set( parcel->getAllowFly() );  		mCheckFly			->setEnabled( can_change_options ); @@ -2079,7 +2081,6 @@ void LLPanelLandOptions::refresh()  			// they can see the checkbox, but its disposition depends on the   			// state of the region -			LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  			if (regionp)  			{  				if (regionp->getSimAccess() == SIM_ACCESS_PG) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 195a7f5ffe..73bf7f3e23 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1935,7 +1935,9 @@ bool LLModelLoader::doLoadModel()  										LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );  										if ( pJoint )  										{    -											pJoint->addAttachmentPosOverride( jointTransform.getTranslation(), mFilename); +											LLUUID fake_mesh_id; +											fake_mesh_id.generate(); +											pJoint->addAttachmentPosOverride( jointTransform.getTranslation(), fake_mesh_id, gAgentAvatarp->avString());  										}  										else  										{ diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index fadbf78ca5..2ba9142763 100755 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -39,8 +39,7 @@  #include "llrendersphere.h"  #include "llselectmgr.h"  #include "llglheaders.h" -#include "llfontgl.h" -#include "llhudrender.h" +  #include "llxmltree.h" @@ -497,15 +496,14 @@ void LLHUDEffectLookAt::render()  	{  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		LLVOAvatar* source_avatar = ((LLVOAvatar*)(LLViewerObject*)mSourceObject); -		LLVector3 target = mTargetPos + source_avatar->mHeadp->getWorldPosition(); +		LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();  		gGL.matrixMode(LLRender::MM_MODELVIEW);  		gGL.pushMatrix();  		gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);  		gGL.scalef(0.3f, 0.3f, 0.3f); -		LLColor3 color = (*mAttentions)[mTargetType].mColor;  		gGL.begin(LLRender::LINES);  		{ +			LLColor3 color = (*mAttentions)[mTargetType].mColor;  			gGL.color3f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);  			gGL.vertex3f(-1.f, 0.f, 0.f);  			gGL.vertex3f(1.f, 0.f, 0.f); @@ -517,17 +515,6 @@ void LLHUDEffectLookAt::render()  			gGL.vertex3f(0.f, 0.f, 1.f);  		} gGL.end();  		gGL.popMatrix(); - - -		if(!source_avatar->isSelf()) -		{ -			std::string av_name = source_avatar->getFullname(); -			const LLFontGL* big_fontp = LLFontGL::getFontSansSerif(); -			gGL.pushMatrix(); -			hud_render_utf8text(av_name,target+LLVector3(0.f,0.f,0.4f),*big_fontp,LLFontGL::NORMAL,LLFontGL::DROP_SHADOW_SOFT,-0.5*big_fontp->getWidthF32(av_name),3.f,color,FALSE); -			gGL.popMatrix(); -		} -  	}  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 02e05d3d9a..ced2635520 100755 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -242,6 +242,8 @@ BOOL	LLPanelFace::postBuild()  	if(mShinyColorSwatch)  	{  		mShinyColorSwatch->setCommitCallback(boost::bind(&LLPanelFace::onCommitShinyColor, this, _2)); +		mShinyColorSwatch->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelShinyColor, this, _2)); +		mShinyColorSwatch->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectShinyColor, this, _2));  		mShinyColorSwatch->setFollowsTop();  		mShinyColorSwatch->setFollowsLeft();  		mShinyColorSwatch->setCanApplyImmediately(TRUE); @@ -1463,12 +1465,23 @@ void LLPanelFace::onCancelColor(const LLSD& data)  	LLSelectMgr::getInstance()->selectionRevertColors();  } +void LLPanelFace::onCancelShinyColor(const LLSD& data) +{ +	LLSelectMgr::getInstance()->selectionRevertShinyColors(); +} +  void LLPanelFace::onSelectColor(const LLSD& data)  {  	LLSelectMgr::getInstance()->saveSelectedObjectColors();  	sendColor();  } +void LLPanelFace::onSelectShinyColor(const LLSD& data) +{ +	LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get()); +	LLSelectMgr::getInstance()->saveSelectedShinyColors(); +} +  // static  void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)  { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index e32f039921..9823e84cd9 100755 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -143,7 +143,9 @@ protected:  	void 	onCommitShinyColor(const LLSD& data);  	void 	onCommitAlpha(const LLSD& data);  	void 	onCancelColor(const LLSD& data); +	void 	onCancelShinyColor(const LLSD& data);  	void 	onSelectColor(const LLSD& data); +	void 	onSelectShinyColor(const LLSD& data);  	void 	onCloseTexturePicker(const LLSD& data); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index eb3a4c37d9..2a0a2f31be 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1766,6 +1766,40 @@ void LLSelectMgr::selectionRevertColors()  	getSelection()->applyToObjects(&sendfunc);  } +void LLSelectMgr::selectionRevertShinyColors() +{ +	struct f : public LLSelectedTEFunctor +	{ +		LLObjectSelectionHandle mSelectedObjects; +		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} +		bool apply(LLViewerObject* object, S32 te) +		{ +			if (object->permModify()) +			{ +				LLSelectNode* nodep = mSelectedObjects->findNode(object); +				if (nodep && te < (S32)nodep->mSavedShinyColors.size()) +				{ +					LLColor4 color = nodep->mSavedShinyColors[te]; +					// update viewer side color in anticipation of update from simulator +					LLMaterialPtr old_mat = object->getTE(te)->getMaterialParams(); +					if (!old_mat.isNull()) +					{ +						LLMaterialPtr new_mat = gFloaterTools->getPanelFace()->createDefaultMaterial(old_mat); +						new_mat->setSpecularLightColor(color); +						object->getTE(te)->setMaterialParams(new_mat); +						LLMaterialMgr::getInstance()->put(object->getID(), te, *new_mat); +					} +				} +			} +			return true; +		} +	} setfunc(mSelectedObjects); +	getSelection()->applyToTEs(&setfunc); + +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc); +} +  BOOL LLSelectMgr::selectionRevertTextures()  {  	struct f : public LLSelectedTEFunctor @@ -4501,6 +4535,19 @@ void LLSelectMgr::saveSelectedObjectColors()  	getSelection()->applyToNodes(&func);	  } +void LLSelectMgr::saveSelectedShinyColors() +{ +	struct f : public LLSelectedNodeFunctor +	{ +		virtual bool apply(LLSelectNode* node) +		{ +			node->saveShinyColors(); +			return true; +		} +	} func; +	getSelection()->applyToNodes(&func); +} +  void LLSelectMgr::saveSelectedObjectTextures()  {  	// invalidate current selection so we update saved textures @@ -5752,6 +5799,7 @@ LLSelectNode::LLSelectNode(LLViewerObject* object, BOOL glow)  	mCreationDate(0)  {  	saveColors(); +	saveShinyColors();  }  LLSelectNode::LLSelectNode(const LLSelectNode& nodep) @@ -5797,6 +5845,11 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)  	{  		mSavedColors.push_back(*color_iter);  	} +	mSavedShinyColors.clear(); +	for (color_iter = nodep.mSavedShinyColors.begin(); color_iter != nodep.mSavedShinyColors.end(); ++color_iter) +	{ +		mSavedShinyColors.push_back(*color_iter); +	}  	saveTextures(nodep.mSavedTextures);  } @@ -5880,6 +5933,26 @@ void LLSelectNode::saveColors()  	}  } +void LLSelectNode::saveShinyColors() +{ +	if (mObject.notNull()) +	{ +		mSavedShinyColors.clear(); +		for (S32 i = 0; i < mObject->getNumTEs(); i++) +		{ +			const LLMaterialPtr mat = mObject->getTE(i)->getMaterialParams(); +			if (!mat.isNull()) +			{ +				mSavedShinyColors.push_back(mat->getSpecularLightColor()); +			} +			else +			{ +				mSavedShinyColors.push_back(LLColor4::white); +			} +		} +	} +} +  void LLSelectNode::saveTextures(const uuid_vec_t& textures)  {  	if (mObject.notNull()) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index a68328167a..9906dfd524 100755 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -179,6 +179,7 @@ public:  	void setObject(LLViewerObject* object);  	// *NOTE: invalidate stored textures and colors when # faces change  	void saveColors(); +	void saveShinyColors();  	void saveTextures(const uuid_vec_t& textures);  	void saveTextureScaleRatios(LLRender::eTexIndex index_to_query); @@ -215,6 +216,7 @@ public:  	std::string		mSitName;  	U64				mCreationDate;  	std::vector<LLColor4>	mSavedColors; +	std::vector<LLColor4>	mSavedShinyColors;  	uuid_vec_t		mSavedTextures;  	std::vector<LLVector3>  mTextureScaleRatios;  	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object @@ -545,6 +547,7 @@ public:  	////////////////////////////////////////////////////////////////  	void saveSelectedObjectTransform(EActionType action_type);  	void saveSelectedObjectColors(); +	void saveSelectedShinyColors();  	void saveSelectedObjectTextures();  	// Sets which texture channel to query for scale and rot of display @@ -573,6 +576,7 @@ public:  	void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels  	void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel  	void selectionRevertColors(); +	void selectionRevertShinyColors();  	BOOL selectionRevertTextures();  	void selectionSetBumpmap( U8 bumpmap );  	void selectionSetTexGen( U8 texgen ); diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 58073d1186..c12c106b8b 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -136,7 +136,7 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask)  	gViewerWindow->hideCursor(); -	gViewerWindow->pickAsync(x, y, mask, pickCallback); +	gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, TRUE);  	return TRUE;  } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 78e9216f61..690d6aebe2 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3367,8 +3367,17 @@ void LLViewerObject::setLinksetCost(F32 cost)  {  	mLinksetCost = cost;  	mCostStale = false; -	 -	if (isSelected()) + +	BOOL needs_refresh = isSelected(); +	child_list_t::iterator iter = mChildList.begin(); +	while(iter != mChildList.end() && !needs_refresh) +	{ +		LLViewerObject* child = *iter; +		needs_refresh = child->isSelected(); +		iter++; +	} + +	if (needs_refresh)  	{  		gFloaterTools->dirty();  	} diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 2f4365036c..d574dec11d 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -705,7 +705,7 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL  bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const  {  	return (region && region->getAllowDamage()) -		|| (parcel && parcel->getAllowDamage()); +		&& (parcel && parcel->getAllowDamage());  }  BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9dcd0b81e0..756248a356 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3757,7 +3757,12 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe  	return intersect;  } -void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent) +void LLViewerWindow::pickAsync( S32 x, +								S32 y_from_bot, +								MASK mask, +								void (*callback)(const LLPickInfo& info), +								BOOL pick_transparent, +								BOOL pick_unselectable)  {  	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");  	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) @@ -3767,7 +3772,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback  		pick_transparent = TRUE;  	} -	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, callback); +	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, pick_unselectable, callback);  	schedulePick(pick_info);  } @@ -3835,7 +3840,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans  	// shortcut queueing in mPicks and just update mLastPick in place  	MASK	key_mask = gKeyboard->currentMask(TRUE); -	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, NULL); +	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, FALSE, NULL);  	mLastPick.fetchResults();  	return mLastPick; @@ -4084,7 +4089,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con  // Returns global position -BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_position_global) +BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_position_global, BOOL ignore_distance)  {  	LLVector3		mouse_direction_global = mouseDirectionGlobal(x,y);  	F32				mouse_dir_scale; @@ -4093,6 +4098,7 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d  	F32			land_z;  	const F32	FIRST_PASS_STEP = 1.0f;		// meters  	const F32	SECOND_PASS_STEP = 0.1f;	// meters +	const F32	draw_distance = ignore_distance ? MAX_FAR_CLIP : gAgentCamera.mDrawDistance;  	LLVector3d	camera_pos_global;  	camera_pos_global = gAgentCamera.getCameraPositionGlobal(); @@ -4100,7 +4106,7 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d  	LLVector3		probe_point_region;  	// walk forwards to find the point -	for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgentCamera.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP) +	for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < draw_distance; mouse_dir_scale += FIRST_PASS_STEP)  	{  		LLVector3d mouse_direction_global_d;  		mouse_direction_global_d.setVec(mouse_direction_global * mouse_dir_scale); @@ -5247,6 +5253,7 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,  		       BOOL pick_transparent,  			   BOOL pick_particle,  		       BOOL pick_uv_coords, +			   BOOL pick_unselectable,  		       void (*pick_callback)(const LLPickInfo& pick_info))  	: mMousePt(mouse_pos),  	  mKeyMask(keyboard_mask), @@ -5262,7 +5269,8 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,  	  mBinormal(),  	  mHUDIcon(NULL),  	  mPickTransparent(pick_transparent), -	  mPickParticle(pick_particle) +	  mPickParticle(pick_particle), +	  mPickUnselectable(pick_unselectable)  {  } @@ -5337,7 +5345,7 @@ void LLPickInfo::fetchResults()  			// put global position into land_pos  			LLVector3d land_pos; -			if (!gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos)) +			if (!gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos, mPickUnselectable))  			{  				// The selected point is beyond the draw distance or is otherwise   				// not selectable. Return before calling mPickCallback(). diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5d2df2dfd7..7fde52d4e1 100755 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -91,6 +91,7 @@ public:  		BOOL pick_transparent,  		BOOL pick_particle,  		BOOL pick_surface_info, +		BOOL pick_unselectable,  		void (*pick_callback)(const LLPickInfo& pick_info));  	void fetchResults(); @@ -123,6 +124,7 @@ public:  	LLVector3		mBinormal;  	BOOL			mPickTransparent;  	BOOL			mPickParticle; +	BOOL			mPickUnselectable;  	void		    getSurfaceInfo();  private: @@ -360,7 +362,12 @@ public:  	void			performPick();  	void			returnEmptyPicks(); -	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE); +	void			pickAsync(	S32 x, +								S32 y_from_bot, +								MASK mask, +								void (*callback)(const LLPickInfo& pick_info), +								BOOL pick_transparent = FALSE, +								BOOL pick_unselectable = FALSE);  	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE);  	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,  										   LLVector4a* intersection); @@ -386,7 +393,7 @@ public:  	//const LLVector3d& lastNonFloraObjectHitOffset();  	// mousePointOnLand() returns true if found point -	BOOL			mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global); +	BOOL			mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global, BOOL ignore_distance = FALSE);  	BOOL			mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, const S32 y, const LLVector3d &plane_point, const LLVector3 &plane_normal);  	LLVector3d		clickPointInWorldGlobal(const S32 x, const S32 y_from_bot, LLViewerObject* clicked_object) const;  	BOOL			clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewerObject *objectp, LLVector3d &point_global) const; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index dfb9bb54e7..157c402795 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3212,6 +3212,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		{  			debug_line += llformat(" - cof rcv:%d", last_received_cof_version);  		} +		debug_line += llformat(" bsz-z: %f avofs-z: %f", mBodySize[2], mAvatarOffset[2]);  		addDebugText(debug_line);  	}  	if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) @@ -5075,7 +5076,7 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )  //-----------------------------------------------------------------------------  // resetJointPositionsOnDetach  //----------------------------------------------------------------------------- -void LLVOAvatar::resetJointPositionsOnDetach(const std::string& attachment_name) +void LLVOAvatar::resetJointPositionsOnDetach(const LLUUID& mesh_id)  {	  	//Subsequent joints are relative to pelvis  	avatar_joint_list_t::iterator iter = mSkeleton.begin(); @@ -5090,7 +5091,7 @@ void LLVOAvatar::resetJointPositionsOnDetach(const std::string& attachment_name)  		if ( pJoint && pJoint != pJointPelvis)  		{			  			pJoint->setId( LLUUID::null ); -			pJoint->removeAttachmentPosOverride(attachment_name); +			pJoint->removeAttachmentPosOverride(mesh_id, avString());  		}		  		else  		if ( pJoint && pJoint == pJointPelvis) @@ -5760,8 +5761,8 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )  				&& pSkinData->mJointNames.size() > JOINT_COUNT_REQUIRED_FOR_FULLRIG	// full rig  				&& pSkinData->mAlternateBindMatrix.size() > 0 )  					{				 -						const std::string& attachment_name = pVO->getAttachmentItemName(); -						LLVOAvatar::resetJointPositionsOnDetach(attachment_name);							 +						const LLUUID& mesh_id = pSkinData->mMeshID; +						LLVOAvatar::resetJointPositionsOnDetach(mesh_id);							  						//Need to handle the repositioning of the cam, updating rig data etc during outfit editing   						//This handles the case where we detach a replacement rig.  						if ( gAgentCamera.cameraCustomizeAvatar() ) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4d5e616906..0fde732b6f 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -200,7 +200,7 @@ public:  	virtual LLJoint*		getJoint(const std::string &name); -	void					resetJointPositionsOnDetach(const std::string& attachment_name); +	void					resetJointPositionsOnDetach(const LLUUID& mesh_id);  	/*virtual*/ const LLUUID&	getID() const;  	/*virtual*/ void			addDebugText(const std::string& text); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 9d16ce5a7b..35893a0354 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4637,8 +4637,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  											const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();									  											//Set the joint position -											const std::string& attachment_name = drawablep->getVObj()->getAttachmentItemName();				 -											pJoint->addAttachmentPosOverride( jointPos, attachment_name ); +											const LLUUID& mesh_id = pSkinData->mMeshID; +											pJoint->addAttachmentPosOverride( jointPos, mesh_id, pAvatarVO->avString() );  											//If joint is a pelvis then handle old/new pelvis to foot values  											if ( lookingForJoint == "mPelvis" ) diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 5dcb8e2cdf..cc2f645b8e 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2509,6 +2509,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.  	<string name="CompileSuccessful">Compile successful!</string>  	<string name="CompileSuccessfulSaving">Compile successful, saving...</string>  	<string name="SaveComplete">Save complete.</string> +	<string name="UploadFailed">File upload failed: </string>  	<string name="ObjectOutOfRange">Script (object out of range)</string>  	<!-- god tools --> | 
