diff options
Diffstat (limited to 'indra')
29 files changed, 401 insertions, 208 deletions
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 2d88e2c676..d342dece84 100755 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -36,10 +36,18 @@ StringVec sv(const StringVec& listof) { return listof; }  #if defined(LL_WINDOWS)  #define sleep(secs) _sleep((secs) * 1000) -#endif +// WOLF-300: It appears that driving a megabyte of data through an LLLeap pipe +// causes Windows abdominal pain such that it later fails code-signing in some +// mysterious way. Entirely suppressing these LLLeap tests pushes the failure +// rate MUCH lower. Can we re-enable them with a smaller data size on Windows? +const size_t BUFFERED_LENGTH =  100*1024; + +#else // not Windows  const size_t BUFFERED_LENGTH = 1023*1024; // try wrangling just under a megabyte of data +#endif +  void waitfor(const std::vector<LLLeap*>& instances, int timeout=60)  {      int i; diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index afc88fc861..9a1f8d09e8 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -62,6 +62,9 @@  #include "glh/glh_linear.h"  #include "llmatrix4a.h" +#include <boost/regex.hpp> +#include <boost/algorithm/string/replace.hpp> +  std::string colladaVersion[VERSIONTYPE_COUNT+1] =   {  	"1.4.0", @@ -236,7 +239,10 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  					// Don't share verts within the same tri, degenerate  					// -					if ((indices.size() % 3) && (indices[indices.size()-1] != shared_index)) +                    U32 indx_size = indices.size(); +                    U32 verts_new_tri = indx_size % 3; +                    if ((verts_new_tri < 1 || indices[indx_size - 1] != shared_index) +                        && (verts_new_tri < 2 || indices[indx_size - 2] != shared_index))  					{  						found = true;  						indices.push_back(shared_index); @@ -821,8 +827,7 @@ LLDAELoader::LLDAELoader(  		opaque_userdata,  		jointMap,  		jointsFromNodes), -mGeneratedModelLimit(modelLimit), -mForceIdNaming(false) +mGeneratedModelLimit(modelLimit)  {  } @@ -846,7 +851,9 @@ bool LLDAELoader::OpenFile(const std::string& filename)  {  	//no suitable slm exists, load from the .dae file  	DAE dae; -	domCOLLADA* dom = dae.open(filename); +	 +	std::string fileURI = "from memory"; // set to a null device +	domCOLLADA* dom = dae.openFromMemory(fileURI, preprocessDAE(filename).c_str());  	if (!dom)  	{ @@ -874,7 +881,7 @@ bool LLDAELoader::OpenFile(const std::string& filename)  	daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH); -	daeDocument* doc = dae.getDoc(mFilename); +	daeDocument* doc = dae.getDoc(fileURI);  	if (!doc)  	{  		LL_WARNS() << "can't find internal doc" << LL_ENDL; @@ -945,32 +952,6 @@ bool LLDAELoader::OpenFile(const std::string& filename)  	mTransform.condition();	 -	mForceIdNaming = false; -	std::vector<std::string> checkNames; -	for (daeInt idx = 0; idx < count; ++idx) -	{ -		domMesh* mesh = NULL; -		db->getElement((daeElement**)&mesh, idx, NULL, COLLADA_TYPE_MESH); - -		if (mesh) -		{ -			std::string name = getLodlessLabel(mesh, false); - -			std::vector<std::string>::iterator it; -			it = std::find(checkNames.begin(), checkNames.end(), name); -			if (it != checkNames.end()) -			{ -				LL_WARNS() << "document has duplicate names, using IDs instead" << LL_ENDL; -				mForceIdNaming = true; -				break; -			} -			else -			{ -				checkNames.push_back(name); -			} -		} -	} -	  	U32 submodel_limit = count > 0 ? mGeneratedModelLimit/count : 0;  	for (daeInt idx = 0; idx < count; ++idx)  	{ //build map of domEntities to LLModel @@ -1078,6 +1059,41 @@ bool LLDAELoader::OpenFile(const std::string& filename)  	return true;  } +std::string LLDAELoader::preprocessDAE(std::string filename) +{ +	// Open a DAE file for some preprocessing (like removing space characters in IDs), see MAINT-5678 +	std::ifstream inFile; +	inFile.open(filename.c_str(), std::ios_base::in); +	std::stringstream strStream; +	strStream << inFile.rdbuf(); +	std::string buffer = strStream.str(); + +	LL_INFOS() << "Preprocessing dae file to remove spaces from the names, ids, etc." << LL_ENDL; + +	try +	{ +		boost::regex re("\"[\\w\\.@#$-]*(\\s[\\w\\.@#$-]*)+\""); +		boost::sregex_iterator next(buffer.begin(), buffer.end(), re); +		boost::sregex_iterator end; +		while (next != end) +		{ +			boost::smatch match = *next; +			std::string s = match.str(); +			LL_INFOS() << s << " found" << LL_ENDL; +			boost::replace_all(s, " ", "_"); +			LL_INFOS() << "Replacing with " << s << LL_ENDL; +			boost::replace_all(buffer, match.str(), s); +			next++; +		} +	} +	catch (boost::regex_error &) +	{ +		LL_INFOS() << "Regex error" << LL_ENDL; +	} + +	return buffer; +} +  void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, domMesh* mesh, domSkin* skin)  {  	llassert(model && dae && mesh && skin); @@ -1971,7 +1987,7 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da  					if (model->mLabel.empty())  					{ -						label = getLodlessLabel(instance_geo, mForceIdNaming); +						label = getLodlessLabel(instance_geo);  						llassert(!label.empty()); @@ -2186,17 +2202,12 @@ LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE  	return mat;  } -std::string LLDAELoader::getElementLabel(daeElement *element) -{ -	return getElementLabel(element, mForceIdNaming); -} -  // try to get a decent label for this element -std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming) +std::string LLDAELoader::getElementLabel(daeElement *element)  {  	// if we have a name attribute, use it  	std::string name = element->getAttribute("name"); -	if (name.length() && !forceIdNaming) +	if (name.length())  	{  		return name;  	} @@ -2219,7 +2230,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming  		// if parent has a name or ID, use it  		std::string name = parent->getAttribute("name"); -		if (!name.length() || forceIdNaming) +		if (!name.length())  		{  			name = std::string(parent->getID());  		} @@ -2262,9 +2273,9 @@ size_t LLDAELoader::getSuffixPosition(std::string label)  }  // static -std::string LLDAELoader::getLodlessLabel(daeElement *element, bool forceIdNaming) +std::string LLDAELoader::getLodlessLabel(daeElement *element)  { -	std::string label = getElementLabel(element, forceIdNaming); +	std::string label = getElementLabel(element);  	size_t ext_pos = getSuffixPosition(label);  	if (ext_pos != -1)  	{ @@ -2335,13 +2346,8 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)  	return (status == LLModel::NO_ERRORS);  } -LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh) -{ -	return loadModelFromDomMesh(mesh, mForceIdNaming); -} -  //static  -LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming) +LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)  {  	LLVolumeParams volume_params;  	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); @@ -2349,7 +2355,7 @@ LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)  	createVolumeFacesFromDomMesh(ret, mesh);      if (ret->mLabel.empty())      { -		ret->mLabel = getElementLabel(mesh, forceIdNaming); +	    ret->mLabel = getElementLabel(mesh);      }      return ret;  } @@ -2367,7 +2373,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo  	LLModel* ret = new LLModel(volume_params, 0.f); -	std::string model_name = getLodlessLabel(mesh, mForceIdNaming); +	std::string model_name = getLodlessLabel(mesh);  	ret->mLabel = model_name + lod_suffix[mLod];  	llassert(!ret->mLabel.empty()); diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h index 3ababd3156..19a85a5339 100644 --- a/indra/llprimitive/lldaeloader.h +++ b/indra/llprimitive/lldaeloader.h @@ -89,22 +89,21 @@ protected:  	static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);  	static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh); -	static LLModel* loadModelFromDomMesh(domMesh* mesh, bool forceIdNaming); -	LLModel* loadModelFromDomMesh(domMesh* mesh); +	static LLModel* loadModelFromDomMesh(domMesh* mesh);  	// Loads a mesh breaking it into one or more models as necessary  	// to get around volume face limitations while retaining >8 materials  	//  	bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit); -	static std::string getElementLabel(daeElement *element, bool forceIdNaming); -	std::string getElementLabel(daeElement *element); +	static std::string getElementLabel(daeElement *element);  	static size_t getSuffixPosition(std::string label); -	static std::string getLodlessLabel(daeElement *element, bool forceIdNaming = false); +	static std::string getLodlessLabel(daeElement *element); + +	static std::string preprocessDAE(std::string filename);  private:  	U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels -	bool mForceIdNaming;  };  #endif  // LL_LLDAELLOADER_H diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp index 58b66f60ca..f841901801 100755 --- a/indra/llui/lliconctrl.cpp +++ b/indra/llui/lliconctrl.cpp @@ -54,7 +54,9 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)  	mUseDrawContextAlpha(p.use_draw_context_alpha),  	mPriority(0),  	mMinWidth(p.min_width), -	mMinHeight(p.min_height) +	mMinHeight(p.min_height), +	mMaxWidth(0), +	mMaxHeight(0)  {  	if (mImagep.notNull())  	{ @@ -104,7 +106,15 @@ void LLIconCtrl::setValue(const LLSD& value )  		&& mMinWidth   		&& mMinHeight)  	{ -		mImagep->getImage()->setKnownDrawSize(llmax(mMinWidth, mImagep->getWidth()), llmax(mMinHeight, mImagep->getHeight())); +        S32 desired_draw_width = llmax(mMinWidth, mImagep->getWidth()); +        S32 desired_draw_height = llmax(mMinHeight, mImagep->getHeight()); +        if (mMaxWidth && mMaxHeight) +        { +            desired_draw_width = llmin(desired_draw_width, mMaxWidth); +            desired_draw_height = llmin(desired_draw_height, mMaxHeight); +        } + +        mImagep->getImage()->setKnownDrawSize(desired_draw_width, desired_draw_height);  	}  } diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 8b1092df46..7971cd44d3 100755 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -79,7 +79,9 @@ protected:  	//the output size of the icon image if set.  	S32 mMinWidth, -		mMinHeight; +		mMinHeight, +		mMaxWidth, +		mMaxHeight;  	// If set to true (default), use the draw context transparency.  	// If false, will use transparency returned by getCurrentTransparency(). See STORM-698. diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 576fff5fb2..57de35dfde 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -229,7 +229,7 @@ static std::string getStringAfterToken(const std::string str, const std::string  LLUrlEntryHTTP::LLUrlEntryHTTP()  	: LLUrlEntryBase()  { -	mPattern = boost::regex("https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?\\.[a-z](:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*", +	mPattern = boost::regex("https?://([^\\s/?\\.#]+\\.?)+\\.\\w+(:\\d+)?(/\\S*)?",  							boost::regex::perl|boost::regex::icase);  	mMenuName = "menu_url_http.xml";  	mTooltip = LLTrans::getString("TooltipHttpUrl"); diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index dde54c78c4..d41930a492 100755 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -232,6 +232,14 @@ namespace tut  		testRegex("http url with newlines", url,  				  "XX\nhttp://www.secondlife.com/\nXX",  				  "http://www.secondlife.com/"); + +		testRegex("http url without tld shouldn't be decorated (1)", url, +				  "http://test", +				  ""); + +		testRegex("http url without tld shouldn't be decorated (2)", url, +				  "http://test .com", +				  "");  	}  	template<> template<> diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 714b456ae7..d8b6cc729d 100755 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -567,13 +567,25 @@ void AISUpdate::parseCategory(const LLSD& category_map)  		parseDescendentCount(category_id, category_map["_embedded"]);  	} -	LLPointer<LLViewerInventoryCategory> new_cat(new LLViewerInventoryCategory(category_id)); +	LLPointer<LLViewerInventoryCategory> new_cat;  	LLViewerInventoryCategory *curr_cat = gInventory.getCategory(category_id);  	if (curr_cat)  	{  		// Default to current values where not provided. -		new_cat->copyViewerCategory(curr_cat); -	} +        new_cat = new LLViewerInventoryCategory(curr_cat); +    } +    else +    { +        if (category_map.has("agent_id")) +        { +            new_cat = new LLViewerInventoryCategory(category_map["agent_id"].asUUID()); +        } +        else +        { +            LL_DEBUGS() << "No owner provided, folder might be assigned wrong owner" << LL_ENDL; +            new_cat = new LLViewerInventoryCategory(LLUUID::null); +        } +    }  	BOOL rv = new_cat->unpackMessage(category_map);  	// *NOTE: unpackMessage does not unpack version or descendent count.  	//if (category_map.has("version")) diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 25a5df9781..932326acae 100755 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -182,38 +182,12 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)  	mSymbolPos(p.symbol_pos)  {  	mPriority = LLViewerFetchedTexture::BOOST_ICON; -	 -	LLRect rect = p.rect; - -	// BottomRight is the default position -	S32 left = rect.getWidth() - mSymbolSize - mSymbolHpad; -	S32 bottom = mSymbolVpad; -	switch(mSymbolPos) -	{ -	case LLAvatarIconCtrlEnums::BOTTOM_LEFT: -	{ -		left = mSymbolHpad; -		bottom = mSymbolVpad; -	} - -	case LLAvatarIconCtrlEnums::TOP_LEFT: -	{ -		left = mSymbolHpad; -		bottom = rect.getHeight() - mSymbolSize - mSymbolVpad; -	} - -	case LLAvatarIconCtrlEnums::TOP_RIGHT: -	{ -		left = rect.getWidth() - mSymbolSize - mSymbolHpad; -		bottom = rect.getHeight() - mSymbolSize - mSymbolVpad; -	} - -	case LLAvatarIconCtrlEnums::BOTTOM_RIGHT: -		// fallthrough, is default -	default: -		rect.setOriginAndSize(left, bottom, mSymbolSize, mSymbolSize); -	} +    // don't request larger image then necessary to save gl memory, +    // but ensure that quality is sufficient +    LLRect rect = p.rect; +    mMaxHeight = llmax((S32)p.min_height, rect.getHeight()); +    mMaxWidth = llmax((S32)p.min_width, rect.getWidth());  	if (p.avatar_id.isProvided())  	{ diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 5d1e01c1f7..16566bea73 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -2049,6 +2049,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)  	BOOL manager = (region && region->isEstateManager());  	setCtrlsEnabled(god || owner || manager); +	getChildView("apply_btn")->setEnabled(FALSE); +  	BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ?  TRUE : FALSE;  	BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ?  TRUE : FALSE;  	BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ?  TRUE : FALSE; diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp index 6abf9ea637..1974a073dd 100755 --- a/indra/newview/llgroupiconctrl.cpp +++ b/indra/newview/llgroupiconctrl.cpp @@ -37,7 +37,10 @@ LLGroupIconCtrl::Params::Params()  :	group_id("group_id"),  	draw_tooltip("draw_tooltip", true),  	default_icon_name("default_icon_name") -{} +{ +    changeDefault(min_width, 32); +    changeDefault(min_height, 32); +}  LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p) @@ -48,6 +51,12 @@ LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)  {  	mPriority = LLViewerFetchedTexture::BOOST_ICON; +    // don't request larger image then necessary to save gl memory, +    // but ensure that quality is sufficient +    LLRect rect = p.rect; +    mMaxHeight = llmax((S32)p.min_height, rect.getHeight()); +    mMaxWidth = llmax((S32)p.min_width, rect.getWidth()); +  	if (p.group_id.isProvided())  	{  		LLSD value(p.group_id); diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index 76617b55bf..8e91af321e 100755 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -42,16 +42,13 @@  #include "lltrans.h"  #include "lluictrl.h" -class LLFetchGroupData; - -  //////////////////////////////////////////////////////////////////////////////  // LLInspectGroup  //////////////////////////////////////////////////////////////////////////////  /// Group Inspector, a small information window used when clicking  /// on group names in the 2D UI -class LLInspectGroup : public LLInspect +class LLInspectGroup : public LLInspect, public LLGroupMgrObserver  {  	friend class LLFloaterReg; @@ -65,12 +62,16 @@ public:  	// (for example, inspector about same group but in different position)  	/*virtual*/ void onOpen(const LLSD& group_id); +	void setGroupID(const LLUUID& group_id); +  	// When closing they should close their gear menu   	/*virtual*/ void onClose(bool app_quitting);  	// Update view based on information from group manager  	void processGroupData(); -	 + +	virtual void changed(LLGroupChange gc); +  	// Make network requests for all the data to display in this view.  	// Used on construction and if avatar id changes.  	void requestUpdate(); @@ -88,53 +89,12 @@ public:  private:  	LLUUID				mGroupID; -	// an in-flight network request for group properties  -	// is represented by this object -	LLFetchGroupData*	mPropertiesRequest;  }; -////////////////////////////////////////////////////////////////////////////// -// LLFetchGroupData -////////////////////////////////////////////////////////////////////////////// - -// This object represents a pending request for avatar properties information -class LLFetchGroupData : public LLGroupMgrObserver -{ -public: -	// If the inspector closes it will delete the pending request object, so the -	// inspector pointer will be valid for the lifetime of this object -	LLFetchGroupData(const LLUUID& group_id, LLInspectGroup* inspector) -	:	LLGroupMgrObserver(group_id), -		mInspector(inspector) -	{ -		LLGroupMgr* mgr = LLGroupMgr::getInstance(); -		// register ourselves as an observer -		mgr->addObserver(this); -		// send a request -		mgr->sendGroupPropertiesRequest(group_id); -	} -	 -	~LLFetchGroupData() -	{ -		// remove ourselves as an observer -		LLGroupMgr::getInstance()->removeObserver(this); -	} -	 -	void changed(LLGroupChange gc) -	{ -		if (gc == GC_PROPERTIES) -		{ -			mInspector->processGroupData(); -		} -	} -	 -	LLInspectGroup* mInspector; -};  LLInspectGroup::LLInspectGroup(const LLSD& sd)  :	LLInspect( LLSD() ),	// single_instance, doesn't really need key -	mGroupID(),			// set in onOpen() -	mPropertiesRequest(NULL) +	mGroupID()			// set in onOpen()  {  	mCommitCallbackRegistrar.add("InspectGroup.ViewProfile",  		boost::bind(&LLInspectGroup::onClickViewProfile, this)); @@ -149,10 +109,7 @@ LLInspectGroup::LLInspectGroup(const LLSD& sd)  LLInspectGroup::~LLInspectGroup()  { -	// clean up any pending requests so they don't call back into a deleted -	// view -	delete mPropertiesRequest; -	mPropertiesRequest = NULL; +    LLGroupMgr::getInstance()->removeObserver(this);  } @@ -164,7 +121,7 @@ void LLInspectGroup::onOpen(const LLSD& data)  	// start fade animation  	LLInspect::onOpen(data); -	mGroupID = data["group_id"]; +	setGroupID(data["group_id"]);  	// Position the inspector relative to the mouse cursor  	// Similar to how tooltips are positioned @@ -185,7 +142,8 @@ void LLInspectGroup::onOpen(const LLSD& data)  // virtual  void LLInspectGroup::onClose(bool app_quitting)  { -	// *TODO: If we add a gear menu, close it here +    LLGroupMgr::getInstance()->removeObserver(this); +    // *TODO: If we add a gear menu, close it here  }	  void LLInspectGroup::requestUpdate() @@ -213,9 +171,15 @@ void LLInspectGroup::requestUpdate()  	getChild<LLUICtrl>("leave_btn")->setVisible(false);  	getChild<LLUICtrl>("join_btn")->setVisible(false); -	// Make a new request for properties -	delete mPropertiesRequest; -	mPropertiesRequest = new LLFetchGroupData(mGroupID, this); +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); +	if (!gdatap || !gdatap->isGroupPropertiesDataComplete() ) +	{ +	    LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID); +	} +	else +	{ +	    processGroupData(); +	}  	// Name lookup will be faster out of cache, use that  	gCacheName->getGroup(mGroupID, @@ -223,6 +187,16 @@ void LLInspectGroup::requestUpdate()  			this, _1, _2, _3));  } +void LLInspectGroup::setGroupID(const LLUUID& group_id) +{ +    LLGroupMgr::getInstance()->removeObserver(this); + +    mID = group_id; +    mGroupID = group_id; + +    LLGroupMgr::getInstance()->addObserver(this); +} +  void LLInspectGroup::nameUpdatedCallback(  	const LLUUID& id,  	const std::string& name, @@ -236,6 +210,14 @@ void LLInspectGroup::nameUpdatedCallback(  	// Otherwise possibly a request for an older inspector, ignore it  } +void LLInspectGroup::changed(LLGroupChange gc) +{ +    if (gc == GC_PROPERTIES) +    { +        processGroupData(); +    } +} +  void LLInspectGroup::processGroupData()  {  	LLGroupMgrGroupData* data = @@ -288,10 +270,6 @@ void LLInspectGroup::processGroupData()  		bool can_join = !is_member && data->mOpenEnrollment;  		getChild<LLUICtrl>("join_btn")->setEnabled(can_join);  	} - -	// Delete the request object as it has been satisfied -	delete mPropertiesRequest; -	mPropertiesRequest = NULL;  }  void LLInspectGroup::onClickViewProfile() diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0bad4702e0..e123a3e68a 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1075,7 +1075,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32  	else  	{  		// add this category -		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat->getParentUUID()); +		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat->getOwnerID());  		new_cat->copyViewerCategory(cat);  		addCategory(new_cat); diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 5510598ae7..fe75ab8e50 100755 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -345,7 +345,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(  					}  					mAvatarNameCacheConnections.erase(it);  				} -				mAvatarNameCacheConnections[id] = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, suffix, item->getHandle())); +				mAvatarNameCacheConnections[id] = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, suffix, prefix, item->getHandle()));  				if(mPendingLookupsRemaining <= 0)  				{ @@ -418,6 +418,7 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)  void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,  									   const LLAvatarName& av_name,  									   std::string suffix, +									   std::string prefix,  									   LLHandle<LLNameListItem> item)  {  	avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(agent_id); @@ -442,6 +443,11 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,  		name.append(suffix);  	} +	if (!prefix.empty()) +	{ +	    name.insert(0, prefix); +	} +  	LLNameListItem* list_item = item.get();  	if (list_item && list_item->getUUID() == agent_id)  	{ diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 19ce3c7aed..677b49e667 100755 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -170,7 +170,7 @@ public:  	/*virtual*/ void mouseOverHighlightNthItem( S32 index );  private:  	void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false); -	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, LLHandle<LLNameListItem> item); +	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item);  private:  	S32    			mNameColumnIndex; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index f1f87e212d..c9f8683e0e 100755 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -713,7 +713,7 @@ void LLPanelVolume::onLightCancelTexture(const LLSD& data)  	if (LightTextureCtrl)  	{ -		LightTextureCtrl->setImageAssetID(LLUUID::null); +        LightTextureCtrl->setImageAssetID(mLightSavedTexture);  	}  	LLVOVolume *volobjp = (LLVOVolume *) mObject.get(); @@ -722,7 +722,16 @@ void LLPanelVolume::onLightCancelTexture(const LLSD& data)  		// Cancel the light texture as requested  		// NORSPEC-292  		// -		volobjp->setLightTextureID(LLUUID::null); +        bool is_spotlight = volobjp->isLightSpotlight(); +        volobjp->setLightTextureID(mLightSavedTexture); //updates spotlight + +        if (!is_spotlight && mLightSavedTexture.notNull()) +        { +            LLVector3 spot_params = volobjp->getSpotLightParams(); +            getChild<LLUICtrl>("Light FOV")->setValue(spot_params.mV[0]); +            getChild<LLUICtrl>("Light Focus")->setValue(spot_params.mV[1]); +            getChild<LLUICtrl>("Light Ambiance")->setValue(spot_params.mV[2]); +        }  	}  } @@ -821,7 +830,12 @@ void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )  				self->getChild<LLUICtrl>("Light Ambiance")->setValue(spot_params.mV[2]);  			}  			else -			{ //modifying existing params +			{ //modifying existing params, this time volobjp won't change params on its own. +                if (volobjp->getLightTextureID() != id) +                { +                    volobjp->setLightTextureID(id); +                } +  				LLVector3 spot_params;  				spot_params.mV[0] = (F32) self->getChild<LLUICtrl>("Light FOV")->getValue().asReal();  				spot_params.mV[1] = (F32) self->getChild<LLUICtrl>("Light Focus")->getValue().asReal(); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 67832c5994..33847b7885 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1961,7 +1961,8 @@ LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) :  	mCloseAfterSave(FALSE),  	mPendingUploads(0),  	mIsModifiable(FALSE), -	mIsNew(false) +	mIsNew(false), +	mIsSaving(FALSE)  {  	mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this);  } @@ -2002,6 +2003,8 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id,  	LL_DEBUGS() << "LSL Bytecode saved" << LL_ENDL;  	mScriptEd->mErrorList->setCommentText(LLTrans::getString("CompileSuccessful"));  	mScriptEd->mErrorList->setCommentText(LLTrans::getString("SaveComplete")); +	getChild<LLCheckBoxCtrl>("running")->set(is_script_running); +	mIsSaving = FALSE;  	closeIfNeeded();  } @@ -2022,6 +2025,7 @@ void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors)  		mScriptEd->mErrorList->addElement(row);  	}  	mScriptEd->selectFirstError(); +	mIsSaving = FALSE;  	closeIfNeeded();  } @@ -2249,12 +2253,12 @@ void LLLiveLSLEditor::draw()  		if(object->permAnyOwner())  		{  			runningCheckbox->setLabel(getString("script_running")); -			runningCheckbox->setEnabled(TRUE); +			runningCheckbox->setEnabled(!mIsSaving);  			if(object->permAnyOwner())  			{  				runningCheckbox->setLabel(getString("script_running")); -				runningCheckbox->setEnabled(TRUE); +				runningCheckbox->setEnabled(!mIsSaving);  			}  			else  			{ @@ -2387,6 +2391,7 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/)  	getWindow()->incBusyCount();  	mPendingUploads++;  	BOOL is_running = getChild<LLCheckBoxCtrl>( "running")->get(); +	mIsSaving = TRUE;  	if (!url.empty())  	{  		uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running, mScriptEd->getAssociatedExperience()); diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 5f65be7383..d403214c22 100755 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -315,6 +315,8 @@ private:  	// need to save both text and script, so need to decide when done  	S32					mPendingUploads; +	BOOL                mIsSaving; +  	BOOL getIsModifiable() const { return mIsModifiable; } // Evaluated on load assert  	LLCheckBoxCtrl*	mMonoCheckbox; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7620046ee3..4f63df1ea2 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1628,7 +1628,11 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  		f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {}  		bool apply(LLViewerObject* objectp, S32 te)  		{ -			if (mItem) +		    if(objectp && !objectp->permModify()) +		    { +		        return false; +		    } +		    if (mItem)  			{  				if (te == -1) // all faces  				{ diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 2548d730f0..403ca7bcbf 100755 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -380,6 +380,10 @@ void LLSidepanelTaskInfo::refresh()  		mDACreatorName->setValue(creator_name);  		mCreatorID = creator_id;  	} +	if(mDACreatorName->getValue().asString() == LLStringUtil::null) +	{ +	    mDACreatorName->setValue(creator_name); +	}  	mDACreatorName->setEnabled(TRUE);  	// Update owner text field @@ -415,6 +419,11 @@ void LLSidepanelTaskInfo::refresh()  		mDAOwnerName->setValue(owner_name);  		mOwnerID = owner_id;  	} +	if(mDAOwnerName->getValue().asString() == LLStringUtil::null) +	{ +	    mDAOwnerName->setValue(owner_name); +	} +  	getChildView("Owner Name")->setEnabled(TRUE);  	// update group text field diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 904cf32ec8..455a9951ac 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -86,7 +86,8 @@ LLToolPie::LLToolPie()  	mBlockClickToWalk(false),  	mClickAction(0),  	mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ), -	mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ) +	mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ), +	mDoubleClickTimer()  {  } @@ -102,11 +103,16 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp  BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)  { -	mMouseOutsideSlop = FALSE; +    if (mDoubleClickTimer.getStarted()) +    { +        mDoubleClickTimer.stop(); +    } + +    mMouseOutsideSlop = FALSE;  	mMouseDownX = x;  	mMouseDownY = y; -	//left mouse down always picks transparent +	//left mouse down always picks transparent (but see handleMouseUp)  	mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE);  	mPick.mKeyMask = mask; @@ -644,7 +650,15 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)  { -	LLViewerObject* obj = mPick.getObject(); +    if (!mDoubleClickTimer.getStarted()) +    { +        mDoubleClickTimer.start(); +    } +    else +    { +        mDoubleClickTimer.reset(); +    } +    LLViewerObject* obj = mPick.getObject();  	U8 click_action = final_click_action(obj);  	// let media have first pass at click @@ -661,30 +675,52 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)  		&& gAgentAvatarp  		&& !gAgentAvatarp->isSitting()  		&& !mBlockClickToWalk							// another behavior hasn't cancelled click to walk -		&& !mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick -		&& (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land -			|| mPick.mObjectID.notNull()))				// or on an object -	{ -		// handle special cases of steering picks -		LLViewerObject* avatar_object = mPick.getObject(); - -		// get pointer to avatar -		while (avatar_object && !avatar_object->isAvatar()) -		{ -			avatar_object = (LLViewerObject*)avatar_object->getParent(); -		} - -		if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) -		{ -			const F64 SELF_CLICK_WALK_DISTANCE = 3.0; -			// pretend we picked some point a bit in front of avatar -			mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; -		} -		gAgentCamera.setFocusOnAvatar(TRUE, TRUE); -		walkToClickedLocation(); -		LLFirstUse::notMoving(false); - -		return TRUE; +        ) +	{ +        // We may be doing click to walk, but we don't want to use a target on +        // a transparent object because the user thought they were clicking on +        // whatever they were seeing through it, so recompute what was clicked on +        // ignoring transparent objects +        LLPickInfo savedPick = mPick; +        mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY, +                                             FALSE /* ignore transparent */, +                                             FALSE /* ignore particles */); + +        if (!mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick +            && (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land +                || mPick.mObjectID.notNull()))				// or on an object +        { +            // handle special cases of steering picks +            LLViewerObject* avatar_object = mPick.getObject(); + +            // get pointer to avatar +            while (avatar_object && !avatar_object->isAvatar()) +            { +                avatar_object = (LLViewerObject*)avatar_object->getParent(); +            } + +            if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) +            { +                const F64 SELF_CLICK_WALK_DISTANCE = 3.0; +                // pretend we picked some point a bit in front of avatar +                mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; +            } +            gAgentCamera.setFocusOnAvatar(TRUE, TRUE); +            walkToClickedLocation(); +            LLFirstUse::notMoving(false); + +            return TRUE; +        } +        else +        { +            LL_DEBUGS("maint5901") << "walk target was " +                                   << (mPick.mPosGlobal.isExactlyZero() ? "zero" : "not zero") +                                   << ", pick type was " << (mPick.mPickType == LLPickInfo::PICK_LAND ? "land" : "not land") +                                   << ", pick object was " << mPick.mObjectID +                                   << LL_ENDL; +            // we didn't click to walk, so restore the original target +            mPick = savedPick; +        }  	}  	gViewerWindow->setCursor(UI_CURSOR_ARROW);  	if (hasMouseCapture()) @@ -716,14 +752,44 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)  		LL_INFOS() << "LLToolPie handleDoubleClick (becoming mouseDown)" << LL_ENDL;  	} +	if (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f)) +	{ +	    mDoubleClickTimer.stop(); +	    return FALSE; +	} +	mDoubleClickTimer.stop(); +  	if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))  	{ +        // We may be doing double click to walk, but we don't want to use a target on +        // a transparent object because the user thought they were clicking on +        // whatever they were seeing through it, so recompute what was clicked on +        // ignoring transparent objects +        LLPickInfo savedPick = mPick; +        mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY, +                                             FALSE /* ignore transparent */, +                                             FALSE /* ignore particles */); + +        if(mPick.mPickType == LLPickInfo::PICK_OBJECT) +        { +            if (mPick.getObject() && mPick.getObject()->isHUDAttachment()) +            { +                mPick = savedPick; +                return FALSE; +            } +        } +  		if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||  			(mPick.mObjectID.notNull()  && !mPick.mPosGlobal.isExactlyZero()))  		{  			walkToClickedLocation();  			return TRUE;  		} +        else +        { +            // restore the original pick for any other purpose +            mPick = savedPick; +        }  	}  	else if (gSavedSettings.getBOOL("DoubleClickTeleport"))  	{ diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 68fe8bc4a5..6e9335251b 100755 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -118,6 +118,7 @@ private:  	LLSafeHandle<LLObjectSelection> mLeftClickSelection;  	BOOL				mClickActionBuyEnabled;  	BOOL				mClickActionPayEnabled; +	LLFrameTimer mDoubleClickTimer;  };  #endif diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 6ba10373b9..49886b5e4f 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3061,6 +3061,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{  				send_do_not_disturb_message(msg, from_id);  			} +			else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL)) +			{ +				return; +			}  			else  			{  				LLVector3 pos, look_at; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a957367f61..c8c71b74b7 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -97,6 +97,7 @@ S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size  const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;  const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;  const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128; +const S32 DEFAULT_ICON_DIMENTIONS = 32;  S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.  S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;  BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE; @@ -1178,6 +1179,17 @@ void LLViewerFetchedTexture::loadFromFastCache()  		}  		else  		{ +            if (mBoostLevel == LLGLTexture::BOOST_ICON) +            { +                S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; +                S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +                if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +                { +                    // scale oversized icon, no need to give more work to gl +                    mRawImage->scale(expected_width, expected_height); +                } +            } +  			mRequestedDiscardLevel = mDesiredDiscardLevel + 1;  			mIsRawImageValid = TRUE;			  			addToCreateTexture(); @@ -1506,6 +1518,17 @@ void LLViewerFetchedTexture::processTextureStats()  		{  			mDesiredDiscardLevel = 0;  		} +        else if (mDontDiscard && 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); @@ -1936,6 +1959,17 @@ bool LLViewerFetchedTexture::updateFetch()  					addToCreateTexture();  				} +                if (mBoostLevel == LLGLTexture::BOOST_ICON) +                { +                    S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; +                    S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +                    if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +                    { +                        // scale oversized icon, no need to give more work to gl +                        mRawImage->scale(expected_width, expected_height); +                    } +                } +  				return TRUE;  			}  			else @@ -2670,7 +2704,7 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)  	if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)  	{ -		if(mSavedRawDiscardLevel != discard_level) +		if (mSavedRawDiscardLevel != discard_level && mBoostLevel != BOOST_ICON)  		{  			mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents());  			mRawImage->copy(getSavedRawImage()); @@ -2771,8 +2805,25 @@ void LLViewerFetchedTexture::switchToCachedImage()  void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)   {  	if(imageraw != mRawImage.get()) -	{ -		mCachedRawImage = imageraw; +    { +        if (mBoostLevel == LLGLTexture::BOOST_ICON) +        { +            S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; +            S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +            if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +            { +                mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents()); +                mCachedRawImage->copyScaled(imageraw); +            } +            else +            { +                mCachedRawImage = imageraw; +            } +        } +        else +        { +            mCachedRawImage = imageraw; +        }  		mCachedRawDiscardLevel = discard_level;  		mCachedRawImageReady = TRUE;  	} @@ -2862,7 +2913,24 @@ void LLViewerFetchedTexture::saveRawImage()  	}  	mSavedRawDiscardLevel = mRawDiscardLevel; -	mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()); +    if (mBoostLevel == LLGLTexture::BOOST_ICON) +    { +        S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; +        S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +        if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +        { +            mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); +            mSavedRawImage->copyScaled(mRawImage); +        } +        else +        { +            mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()); +        } +    } +    else +    { +        mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()); +    }  	if(mForceToSaveRawImage && mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel)  	{ diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index 7b5bcf4db0..2782cd9545 100755 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -124,11 +124,17 @@ void LLWatchdogTimeout::setTimeout(F32 d)  void LLWatchdogTimeout::start(const std::string& state)   { -	// Order of operation is very impmortant here. +    if (mTimeout == 0) +    { +        LL_WARNS() << "Cant' start watchdog entry - no timeout set" << LL_ENDL; +        return; +    } +	// Order of operation is very important here.  	// After LLWatchdogEntry::start() is called  	// LLWatchdogTimeout::isAlive() will be called asynchronously.   	ping(state); -	mTimer.start();  +	mTimer.start(); +    mTimer.setTimerExpirySec(mTimeout); // timer expiration set to 0 by start()  	LLWatchdogEntry::start();  } @@ -235,7 +241,6 @@ void LLWatchdog::run()  				mSuspects.end(),   				std::not1(std::mem_fun(&LLWatchdogEntry::isAlive))  				); -  		if(result != mSuspects.end())  		{  			// error!!! diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 5d657f7eef..11d3706821 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1281,7 +1281,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi  	{  		LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; -		if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy) +		if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy && !pVOAvatar->isOrphaned())  		{  			LLVector3d pos_global = pVOAvatar->getPositionGlobal();  			LLUUID uuid = pVOAvatar->getID(); diff --git a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml index c17d2a1f37..b5ae9db7e9 100644 --- a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml +++ b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml @@ -136,16 +136,16 @@      </tab_container>      <layout_stack width="336" height="26" enabled="true" orientation="horizontal"  follows="left|right" name="ButtonsStack"> -      <layout_panel width="336" height="30" enabled="true" name="CondenseAllButtonPanel"> +      <layout_panel width="93" height="30" enabled="true" name="CondenseAllButtonPanel">          <button width="93" height="21" left="2" label="Collapse all" name="collapse_all_button">          </button>        </layout_panel> -      <layout_panel width="336" height="30" enabled="true" name="GapLayoutPanel"> +      <layout_panel width="93" height="30" enabled="true" name="GapLayoutPanel">          <panel width="90" height="21" left="2" label="Gap Panel" border="false" name="GapPanel">          </panel>        </layout_panel> -      <layout_panel width="336" height="30" enabled="true" name="DeleteAllButtonPanel"> -        <button width="93" height="21" left="2" label="Delete all" name="delete_all_button"> +      <layout_panel width="100" height="30" enabled="true" name="DeleteAllButtonPanel"> +        <button width="93" height="21" left="0" label="Delete all" follows="right" name="delete_all_button">          </button>        </layout_panel>      </layout_stack> diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index ebbb53729d..170b7177fb 100755 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -14,6 +14,7 @@        <file>ヒラギノ角ゴ ProN W3.otf</file>        <file>AppleGothic.dfont</file>        <file>AppleGothic.ttf</file> +      <file>AppleSDGothicNeo-Regular.otf</file>        <file>华文细黑.ttf</file>      </os>    </font> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 10907344ae..79493d3885 100755 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -353,10 +353,10 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.  				Foto:  			</text>  			<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/> -			<text name="allow_label5"> +			<text name="allow_label5" top="170">  				Los avatares de otras parcelas pueden ver a los avatares de esta parcela y chatear con ellos  			</text> -			<check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/> +			<check_box label="Ver los avatares" name="SeeAvatarsCheck" top="170" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>  			<text name="landing_point">  				Punto de llegada: [LANDING]  			</text>  | 
