diff options
Diffstat (limited to 'indra/newview')
54 files changed, 609 insertions, 259 deletions
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index e1a0162441..ec3c7452e5 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -85,7 +85,7 @@ const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;  const F32 HEAD_BUFFER_SIZE = 0.3f; -const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f; +const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.1f;  const F32 LAND_MIN_ZOOM = 0.15f; @@ -2169,12 +2169,7 @@ void LLAgentCamera::changeCameraToFollow(BOOL animate)  		// unpause avatar animation  		gAgent.unpauseAnimation(); -		const U32 old_flags = gAgent.getControlFlags();  		gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); -		if (old_flags != gAgent.getControlFlags()) -		{ -			gAgent.setFlagsDirty(); -		}  		if (animate)  		{ @@ -2233,13 +2228,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)  		}  		updateLastCamera();  		mCameraMode = CAMERA_MODE_THIRD_PERSON; -		const U32 old_flags = gAgent.getControlFlags();  		gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); -		if (old_flags != gAgent.getControlFlags()) -		{ -			gAgent.setFlagsDirty(); -		} -  	}  	// Remove any pitch from the avatar @@ -2274,7 +2263,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)  //-----------------------------------------------------------------------------  // changeCameraToCustomizeAvatar()  //----------------------------------------------------------------------------- -void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate) +void LLAgentCamera::changeCameraToCustomizeAvatar()  {  	if (LLViewerJoystick::getInstance()->getOverrideCamera())  	{ @@ -2289,44 +2278,21 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came  		LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset);  	} -	if (camera_animate) -	{ -		startCameraAnimation(); -	} +	startCameraAnimation();  	if (mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR)  	{  		updateLastCamera();  		mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR; -		const U32 old_flags = gAgent.getControlFlags();  		gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); -		if (old_flags != gAgent.getControlFlags()) -		{ -			gAgent.setFlagsDirty(); -		}  		gFocusMgr.setKeyboardFocus( NULL );  		gFocusMgr.setMouseCapture( NULL );  		LLVOAvatarSelf::onCustomizeStart(); -	} - - -	// default focus point for customize avatar -	LLVector3 focus_target; -	if (isAgentAvatarValid()) -	{ -		focus_target = gAgentAvatarp->mHeadp->getWorldPosition(); -	} -	else -	{ -		focus_target = gAgent.getPositionAgent(); -	} -	if (isAgentAvatarValid()) -	{ -		if(avatar_animate) -		{	 +		if (isAgentAvatarValid()) +		{  			// Remove any pitch or rotation from the avatar  			LLVector3 at = gAgent.getAtAxis();  			at.mV[VZ] = 0.f; @@ -2340,33 +2306,30 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came  			if (turn_motion)  			{ +				// delay camera animation long enough to play through turn animation  				setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP); - -			} -			else -			{ -				setAnimationDuration(gSavedSettings.getF32("ZoomTime"));  			} + +			gAgentAvatarp->updateMeshTextures();  		} +	} -		LLVector3 agent_at = gAgent.getAtAxis(); -		agent_at.mV[VZ] = 0.f; -		agent_at.normalize(); +	LLVector3 agent_at = gAgent.getAtAxis(); +	agent_at.mV[VZ] = 0.f; +	agent_at.normalize(); -		LLVector3d camera_offset(agent_at * -1.0); -		// push camera up and out from avatar -		camera_offset.mdV[VZ] = 0.1f;  -		camera_offset *= CUSTOMIZE_AVATAR_CAMERA_DEFAULT_DIST; -		LLVector3d focus_target_global = gAgent.getPosGlobalFromAgent(focus_target); -		setCameraPosAndFocusGlobal(focus_target_global + camera_offset, focus_target_global, gAgent.getID()); -		 -		gAgentAvatarp->updateMeshTextures(); -	} -	else -	{ -		mCameraAnimating = FALSE; -		gAgent.endAnimationUpdateUI(); -	} +	// default focus point for customize avatar +	LLVector3 focus_target = isAgentAvatarValid()  +		? gAgentAvatarp->mHeadp->getWorldPosition() +		: gAgent.getPositionAgent(); + +	LLVector3d camera_offset(agent_at * -1.0); +	// push camera up and out from avatar +	camera_offset.mdV[VZ] = 0.1f;  +	camera_offset *= CUSTOMIZE_AVATAR_CAMERA_DEFAULT_DIST; +	LLVector3d focus_target_global = gAgent.getPosGlobalFromAgent(focus_target); +	setAnimationDuration(gSavedSettings.getF32("ZoomTime")); +	setCameraPosAndFocusGlobal(focus_target_global + camera_offset, focus_target_global, gAgent.getID());  } @@ -2550,7 +2513,7 @@ void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object  //-----------------------------------------------------------------------------  void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLVector3d& focus, const LLUUID &object_id)  { -	LLVector3d old_focus = mFocusTargetGlobal; +	LLVector3d old_focus = mFocusTargetGlobal.isExactlyZero() ? focus : mFocusTargetGlobal;  	F64 focus_delta_squared = (old_focus - focus).magVecSquared();  	const F64 ANIM_EPSILON_SQUARED = 0.0001; diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index fc78fef6d0..6cee21fd8a 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -94,7 +94,7 @@ public:  	void			changeCameraToDefault();  	void			changeCameraToMouselook(BOOL animate = TRUE);  	void			changeCameraToThirdPerson(BOOL animate = TRUE); -	void			changeCameraToCustomizeAvatar(BOOL avatar_animate = TRUE, BOOL camera_animate = TRUE); // Trigger transition animation +	void			changeCameraToCustomizeAvatar(); // Trigger transition animation  	void			changeCameraToFollow(BOOL animate = TRUE); 	// Ventrella  	BOOL			cameraThirdPerson() const		{ return (mCameraMode == CAMERA_MODE_THIRD_PERSON && mLastCameraMode == CAMERA_MODE_THIRD_PERSON); }  	BOOL			cameraMouselook() const			{ return (mCameraMode == CAMERA_MODE_MOUSELOOK && mLastCameraMode == CAMERA_MODE_MOUSELOOK); } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 547dfd7006..b5ad5c7a11 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -207,8 +207,9 @@ public:  }; -LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(): -	mFireCount(0) +LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(bool update_base_outfit_ordering): +	mFireCount(0), +	mUpdateBaseOrder(update_base_outfit_ordering)  {  } @@ -218,7 +219,7 @@ LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy()  	if (!LLApp::isExiting())  	{ -		LLAppearanceMgr::instance().updateAppearanceFromCOF(); +		LLAppearanceMgr::instance().updateAppearanceFromCOF(mUpdateBaseOrder);  	}  } @@ -1436,7 +1437,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  	// Create links to new COF contents.  	llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl; -	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; +	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy(!append);  #ifndef LL_RELEASE_FOR_DOWNLOAD  	llinfos << "Linking body items" << llendl; @@ -1617,7 +1618,7 @@ void LLAppearanceMgr::enforceItemCountLimits()  	}  } -void LLAppearanceMgr::updateAppearanceFromCOF() +void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)  {  	if (mIsInUpdateAppearanceFromCOF)  	{ @@ -1631,7 +1632,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	//checking integrity of the COF in terms of ordering of wearables,   	//checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) -	updateClothingOrderingInfo(); +	updateClothingOrderingInfo(LLUUID::null, update_base_outfit_ordering);  	// Remove duplicate or excess wearables. Should normally be enforced at the UI level, but  	// this should catch anything that gets through. @@ -1657,6 +1658,9 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	remove_non_link_items(obj_items);  	remove_non_link_items(gest_items); +	dumpItemArray(wear_items,"asset_dump: wear_item"); +	dumpItemArray(obj_items,"asset_dump: obj_item"); +  	if(!wear_items.count())  	{  		LLNotificationsUtil::add("CouldNotPutOnOutfit"); @@ -2336,11 +2340,19 @@ struct WearablesOrderComparator  	U32 mControlSize;  }; -void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id) +void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base_outfit_ordering)  {  	if (cat_id.isNull())  	{  		cat_id = getCOF(); +		if (update_base_outfit_ordering) +		{ +			const LLUUID base_outfit_id = getBaseOutfitUUID(); +			if (base_outfit_id.notNull()) +			{ +				updateClothingOrderingInfo(base_outfit_id,false); +			} +		}  	}  	// COF is processed if cat_id is not specified @@ -2373,6 +2385,7 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id)  			item->setComplete(TRUE);   			item->updateServer(FALSE);  			gInventory.updateItem(item); +			  			inventory_changed = true;  		}  	} @@ -2574,11 +2587,16 @@ void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg)  void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items,  										const std::string& msg)  { -	llinfos << msg << llendl;  	for (S32 i=0; i<items.count(); i++)  	{  		LLViewerInventoryItem *item = items.get(i); -		llinfos << i <<" " << item->getName() << llendl; +		LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; +		LLUUID asset_id; +		if (linked_item) +		{ +			asset_id = linked_item->getAssetUUID(); +		} +		llinfos << msg << " " << i <<" " << item->getName() << " " << asset_id.asString() << llendl;  	}  	llinfos << llendl;  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index afd1bf3ade..8834f8c395 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -54,7 +54,7 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>  public:  	typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t; -	void updateAppearanceFromCOF(); +	void updateAppearanceFromCOF(bool update_base_outfit_ordering = false);  	bool needToSaveCOF();  	void updateCOF(const LLUUID& category, bool append = false);  	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); @@ -171,7 +171,7 @@ public:  	//Check ordering information on wearables stored in links' descriptions and update if it is invalid  	// COF is processed if cat_id is not specified -	void updateClothingOrderingInfo(LLUUID cat_id = LLUUID::null); +	void updateClothingOrderingInfo(LLUUID cat_id = LLUUID::null, bool update_base_outfit_ordering = false);  	bool isOutfitLocked() { return mOutfitLocked; } @@ -226,12 +226,13 @@ public:  class LLUpdateAppearanceOnDestroy: public LLInventoryCallback  {  public: -	LLUpdateAppearanceOnDestroy(); +	LLUpdateAppearanceOnDestroy(bool update_base_outfit_ordering = false);  	virtual ~LLUpdateAppearanceOnDestroy();  	/* virtual */ void fire(const LLUUID& inv_item);  private:  	U32 mFireCount; +	bool mUpdateBaseOrder;  }; diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index cbebc93306..472d2ccf24 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -167,10 +167,18 @@ public:  protected:  	static void replaceWearable()  	{ -		static LLButton* show_add_wearables_btn = -				LLSideTray::getInstance()->getChild<LLButton>("show_add_wearables_btn"); - -		show_add_wearables_btn->onCommit(); +		// *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be: +		// LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit() +		// without casting. Getter methods provides possibility to check and construct +		// absent instance. Explicit relations between components avoids situations +		// when we tries to construct instance with unsatisfied implicit input conditions. +		LLPanelOutfitEdit	* panel_outfit_edit = +						dynamic_cast<LLPanelOutfitEdit*> (LLSideTray::getInstance()->getPanel( +								"panel_outfit_edit")); +		if (panel_outfit_edit != NULL) +		{ +			panel_outfit_edit->showAddWearablesPanel(true); +		}  	}  	/*virtual*/ LLContextMenu* createMenu() diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 84fbb861ba..2206ed406f 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -156,8 +156,9 @@ void LLStandardBumpmap::addstandard()  										LLViewerTexture::BOOST_NONE,   										LLViewerTexture::LOD_TEXTURE,  										0,  -										0);																								 -		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL ); +										0);									 +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL, NULL );  		LLStandardBumpmap::sStandardBumpmapCount++;  	} @@ -877,7 +878,7 @@ void LLBumpImageList::addTextureStats(U8 bump, const LLUUID& base_image_id, F32  	bump &= TEM_BUMP_MASK;  	LLViewerFetchedTexture* bump_image = gStandardBumpmapList[bump].mImage;  	if( bump_image ) -	{ +	{		  		bump_image->addTextureStats(virtual_size);  	}  } @@ -982,7 +983,8 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText  			(*entries_list)[src_image->getID()]->setExplicitFormat(GL_ALPHA8, GL_ALPHA);			  			// Note: this may create an LLImageGL immediately -			src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()) ); +			src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; +			src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL, NULL );  			bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image  //			bump_total++; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 2cc61a69c1..96dba5717a 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4055,13 +4055,13 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			if( get_is_item_worn( mUUID ) )  			{ -				items.push_back(std::string("Attach Separator")); +				items.push_back(std::string("Wearable And Object Separator"));  				items.push_back(std::string("Detach From Yourself"));  			}  			else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing() && !isCOFFolder())  			{ -				items.push_back(std::string("Attach Separator")); -				items.push_back(std::string("Object Wear")); +				items.push_back(std::string("Wearable And Object Separator")); +				items.push_back(std::string("Wearable And Object Wear"));  				items.push_back(std::string("Attach To"));  				items.push_back(std::string("Attach To HUD"));  				// commented out for DEV-32347 @@ -4069,7 +4069,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  				if (!gAgentAvatarp->canAttachMoreObjects())  				{ -					disabled_items.push_back(std::string("Object Wear")); +					disabled_items.push_back(std::string("Wearable And Object Wear"));  					disabled_items.push_back(std::string("Attach To"));  					disabled_items.push_back(std::string("Attach To HUD"));  				} @@ -4411,7 +4411,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		getClipboardEntries(true, items, disabled_items, flags); -		items.push_back(std::string("Wearable Separator")); +		items.push_back(std::string("Wearable And Object Separator"));  		items.push_back(std::string("Wearable Edit")); @@ -4422,7 +4422,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		// Don't allow items to be worn if their baseobj is in the trash.  		if (isLinkedObjectInTrash() || isLinkedObjectMissing() || isCOFFolder())  		{ -			disabled_items.push_back(std::string("Wearable Wear")); +			disabled_items.push_back(std::string("Wearable And Object Wear"));  			disabled_items.push_back(std::string("Wearable Add"));  			disabled_items.push_back(std::string("Wearable Edit"));  		} @@ -4438,12 +4438,12 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  				case LLAssetType::AT_BODYPART:  					if (get_is_item_worn(item->getUUID()))  					{ -						disabled_items.push_back(std::string("Wearable Wear")); +						disabled_items.push_back(std::string("Wearable And Object Wear"));  						disabled_items.push_back(std::string("Wearable Add"));  					}  					else  					{ -						items.push_back(std::string("Wearable Wear")); +						items.push_back(std::string("Wearable And Object Wear"));  						items.push_back(std::string("Wearable Add"));  						disabled_items.push_back(std::string("Take Off"));  						disabled_items.push_back(std::string("Wearable Edit")); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 6e829f2dc2..5dcf0680db 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -57,7 +57,7 @@ LLInventoryFilter::FilterOps::FilterOps() :  	mPermissions(PERM_NONE),  	mFilterTypes(FILTERTYPE_OBJECT),  	mFilterUUID(LLUUID::null), -	mIncludeLinks(TRUE) +	mFilterLinks(FILTERLINK_INCLUDE_LINKS)  {  } @@ -104,8 +104,10 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)  	const BOOL passed_filtertype = checkAgainstFilterType(item);  	const BOOL passed_permissions = checkAgainstPermissions(item); +	const BOOL passed_filterlink = checkAgainstFilterLinks(item);  	const BOOL passed = (passed_filtertype && -						 passed_permissions &&  +						 passed_permissions && +						 passed_filterlink &&  						 (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));  	return passed; @@ -229,6 +231,23 @@ BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) co  	return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;  } +BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const +{ +	const LLFolderViewEventListener* listener = item->getListener(); +	if (!listener) return TRUE; + +	const LLUUID object_id = listener->getUUID(); +	const LLInventoryObject *object = gInventory.getObject(object_id); +	if (!object) return TRUE; + +	const BOOL is_link = object->getIsLinkType(); +	if (is_link && (mFilterOps.mFilterLinks == FILTERLINK_EXCLUDE_LINKS)) +		return FALSE; +	if (!is_link && (mFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)) +		return FALSE; +	return TRUE; +} +  const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const  {  	return mFilterSubString; @@ -246,6 +265,7 @@ BOOL LLInventoryFilter::isNotDefault() const  		|| mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes   		|| mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes   		|| mFilterOps.mFilterTypes != FILTERTYPE_OBJECT +		|| mFilterOps.mFilterLinks != FILTERLINK_INCLUDE_LINKS  		|| mFilterSubString.size()   		|| mFilterOps.mPermissions != mDefaultFilterOps.mPermissions  		|| mFilterOps.mMinDate != mDefaultFilterOps.mMinDate  @@ -259,6 +279,7 @@ BOOL LLInventoryFilter::isActive() const  		|| mFilterOps.mFilterCategoryTypes != 0xffffffffffffffffULL  		|| mFilterOps.mFilterWearableTypes != 0xffffffffffffffffULL  		|| mFilterOps.mFilterTypes != FILTERTYPE_OBJECT +		|| mFilterOps.mFilterLinks != FILTERLINK_INCLUDE_LINKS  		|| mFilterSubString.size()   		|| mFilterOps.mPermissions != PERM_NONE   		|| mFilterOps.mMinDate != time_min() @@ -410,6 +431,11 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)  			mFilterOps.mFilterUUID == LLUUID::null;  			setModified(FILTER_RESTART);  		} + +		// Cancel out filter links once the search string is modified +		{ +			mFilterOps.mFilterLinks = FILTERLINK_INCLUDE_LINKS; +		}  	}  } @@ -508,16 +534,17 @@ void LLInventoryFilter::setHoursAgo(U32 hours)  	mFilterOps.mFilterTypes |= FILTERTYPE_DATE;  } -void LLInventoryFilter::setIncludeLinks(BOOL include_links) +void LLInventoryFilter::setFilterLinks(U64 filter_links)  { -	if (mFilterOps.mIncludeLinks != include_links) +	if (mFilterOps.mFilterLinks != filter_links)  	{ -		if (!mFilterOps.mIncludeLinks) -			setModified(FILTER_LESS_RESTRICTIVE); -		else +		if (mFilterOps.mFilterLinks == FILTERLINK_EXCLUDE_LINKS || +			mFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)  			setModified(FILTER_MORE_RESTRICTIVE); +		else +			setModified(FILTER_LESS_RESTRICTIVE);  	} -	mFilterOps.mIncludeLinks = include_links; +	mFilterOps.mFilterLinks = filter_links;  }  void LLInventoryFilter::setShowFolderState(EFolderShow state) @@ -895,9 +922,9 @@ U32 LLInventoryFilter::getHoursAgo() const  {   	return mFilterOps.mHoursAgo;   } -BOOL LLInventoryFilter::getIncludeLinks() const +U64 LLInventoryFilter::getFilterLinks() const  { -	return mFilterOps.mIncludeLinks; +	return mFilterOps.mFilterLinks;  }  LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const  {  diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index f740a6b333..3d476e4795 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -56,8 +56,7 @@ public:  		FILTER_MORE_RESTRICTIVE		// if you didn't pass the previous filter, you definitely won't pass this one  	}; -	enum EFilterType -	{ +	enum EFilterType	{  		FILTERTYPE_NONE = 0,  		FILTERTYPE_OBJECT = 0x1 << 0,	// normal default search-by-object-type  		FILTERTYPE_CATEGORY = 0x1 << 1,	// search by folder type @@ -66,6 +65,13 @@ public:  		FILTERTYPE_WEARABLE = 0x1 << 4	// search by wearable type  	}; +	enum EFilterLink +	{ +		FILTERLINK_INCLUDE_LINKS,	// show links too +		FILTERLINK_EXCLUDE_LINKS,	// don't show links +		FILTERLINK_ONLY_LINKS		// only show links +	}; +  	// REFACTOR: Change this to an enum.  	static const U32 SO_DATE = 1;  	static const U32 SO_FOLDERS_BY_NAME = 2; @@ -100,8 +106,8 @@ public:  	void 				setHoursAgo(U32 hours);  	U32 				getHoursAgo() const; -	void 				setIncludeLinks(BOOL include_links); -	BOOL				getIncludeLinks() const; +	void 				setFilterLinks(U64 filter_link); +	U64					getFilterLinks() const;  	// +-------------------------------------------------------------------+  	// + Execution And Results @@ -109,6 +115,8 @@ public:  	BOOL 				check(const LLFolderViewItem* item);  	BOOL 				checkAgainstFilterType(const LLFolderViewItem* item) const;  	BOOL 				checkAgainstPermissions(const LLFolderViewItem* item) const; +	BOOL 				checkAgainstFilterLinks(const LLFolderViewItem* item) const; +  	std::string::size_type getStringMatchOffset() const;  	// +-------------------------------------------------------------------+ @@ -179,7 +187,7 @@ private:  		U32				mHoursAgo;  		EFolderShow		mShowFolderState;  		PermissionMask	mPermissions; -		BOOL			mIncludeLinks; +		U64				mFilterLinks;  	};  	U32						mOrder; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 72d35af3b7..5af99f3c8f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -256,9 +256,9 @@ void LLInventoryPanel::setHoursAgo(U32 hours)  	getFilter()->setHoursAgo(hours);  } -void LLInventoryPanel::setIncludeLinks(BOOL include_links) +void LLInventoryPanel::setFilterLinks(U64 filter_links)  { -	getFilter()->setIncludeLinks(include_links); +	getFilter()->setFilterLinks(filter_links);  }  void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 84603e8b4f..c9e317f816 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -145,7 +145,7 @@ public:  	void setSinceLogoff(BOOL sl);  	void setHoursAgo(U32 hours);  	BOOL getSinceLogoff(); -	void setIncludeLinks(BOOL include_links); +	void setFilterLinks(U64 filter_links);  	void setShowFolderState(LLInventoryFilter::EFolderShow show);  	LLInventoryFilter::EFolderShow getShowFolderState(); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 23c7e64cce..dddfd9106f 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -657,10 +657,10 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)  	}  	if (command_name == "take_off")  	{ -		// Enable "Take Off" only if a worn item or base outfit is selected. -		return ( !hasItemSelected() -				 && LLAppearanceMgr::getInstance()->getBaseOutfitUUID() == mSelectedOutfitUUID ) -				|| hasWornItemSelected(); +		// Enable "Take Off" if any of selected items can be taken off +		// or the selected outfit contains items that can be taken off. +		return ( hasItemSelected() && canTakeOffSelected() ) +				|| ( !hasItemSelected() && LLAppearanceMgr::getCanRemoveFromCOF(mSelectedOutfitUUID) );  	}  	if (command_name == "wear_add") @@ -955,14 +955,19 @@ void LLOutfitsList::applyFilterToTab(  	}  } -bool LLOutfitsList::hasWornItemSelected() +bool LLOutfitsList::canTakeOffSelected()  {  	uuid_vec_t selected_uuids;  	getSelectedItemsUUIDs(selected_uuids); +	LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false); +  	for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it)  	{ -		if (get_is_item_worn(*it)) return true; +		LLViewerInventoryItem* item = gInventory.getItem(*it); +		if (!item) continue; + +		if (is_worn(NULL, item)) return true;  	}  	return false;  } diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 26722f2a96..d7cf8a8c08 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -179,9 +179,9 @@ private:  	void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring);  	/** -	 * Returns true if there are any worn items among currently selected, otherwise false. +	 * Returns true if there are any items that can be taken off among currently selected, otherwise false.  	 */ -	bool hasWornItemSelected(); +	bool canTakeOffSelected();  	void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);  	void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 9eece81861..fa7e06d323 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -392,6 +392,7 @@ void LLPanelMainInventory::onClearSearch()  	{  		mActivePanel->setFilterSubString(LLStringUtil::null);  		mActivePanel->setFilterTypes(0xffffffff); +		mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS);  	}  	if (finder) @@ -1068,6 +1069,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		mFilterEditor->setFocus(TRUE);  		filter->setFilterUUID(item_id);  		filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); +		filter->setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);  	}  } @@ -1134,7 +1136,10 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  	if (command_name == "find_links")  	{ -		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); +		LLFolderView* root = getActivePanel()->getRootFolder(); +		std::set<LLUUID> selection_set = root->getSelectionList(); +		if (selection_set.size() != 1) return FALSE; +		LLFolderViewItem* current_item = root->getCurSelectedItem();  		if (!current_item) return FALSE;  		const LLUUID& item_id = current_item->getListener()->getUUID();  		const LLInventoryObject *obj = gInventory.getObject(item_id); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 22a1ef94a7..bf18c9e5e7 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -87,6 +87,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)  LLPreviewTexture::~LLPreviewTexture()  { +	LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList, this) ; +  	if( mLoadingFullImage )  	{  		getWindow()->decBusyCount(); @@ -278,7 +280,7 @@ void LLPreviewTexture::saveAs()  	mLoadingFullImage = TRUE;  	getWindow()->incBusyCount();  	mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,  -								0, TRUE, FALSE, new LLUUID( mItemUUID ) ); +								0, TRUE, FALSE, new LLUUID( mItemUUID ), this, &mCallbackTextureList );  }  // virtual diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 7cd2adad56..0f29a741c1 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -99,5 +99,7 @@ private:  	S32 mLastWidth;  	F32 mAspectRatio;  	BOOL mUpdateDimensions; + +	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;   };  #endif  // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 6f5238f0a1..36d581a41a 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -209,6 +209,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)  	if (current_weight != new_weight )  	{  		self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); +		self->mWearable->writeToAvatar();  		gAgentAvatarp->updateVisualParams();  	}  } @@ -298,6 +299,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )  				&& new_percent < slider->getMaxValue())  			{  				mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE); +				mWearable->writeToAvatar();  				gAgentAvatarp->updateVisualParams();  				slider->setValue( weightToPercent( new_weight ) ); @@ -330,6 +332,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata )  				&& new_percent < slider->getMaxValue())  			{  				self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); +				self->mWearable->writeToAvatar();  				slider->setValue( self->weightToPercent( new_weight ) );  			}  		} @@ -363,6 +366,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )  					&& new_percent < slider->getMaxValue())  				{  					self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); +					self->mWearable->writeToAvatar();  					slider->setValue( self->weightToPercent( new_weight ) );  				}  			} diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 951323551c..7a7ffb9983 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -196,6 +196,15 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  			{  				gAgentCamera.changeCameraToCustomizeAvatar();  			} +			if (mEditWearable && mEditWearable->getVisible()) +			{ +				LLWearable *wearable_ptr = mEditWearable->getWearable(); +				if (gAgentWearables.getWearableIndex(wearable_ptr) == LLAgentWearables::MAX_CLOTHING_PER_TYPE) +				{ +					// we're no longer wearing the wearable we were last editing, switch back to outfit editor +					showOutfitEditPanel(); +				} +			}  		}  	}  	else diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 6ccd89dddb..d9870e81c5 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -323,6 +323,19 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  		childSetText("LabelOwnerName",getString("public"));  	} +	//////////// +	// ORIGIN // +	//////////// + +	if (object) +	{ +		childSetText("origin",getString("origin_inworld")); +	} +	else +	{ +		childSetText("origin",getString("origin_inventory")); +	} +  	//////////////////  	// ACQUIRE DATE //  	////////////////// @@ -341,9 +354,9 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  		childSetText ("LabelAcquiredDate", timeStr);  	} -	///////////////////////////////////// -	// PERMISSIONS AND SALE ITEM HIDING -	///////////////////////////////////// +	////////////////////////////////////// +	// PERMISSIONS AND SALE ITEM HIDING // +	//////////////////////////////////////  	const std::string perm_and_sale_items[]={  		"perms_inv", diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 0b86cefa1d..fcb9deb20b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -423,8 +423,9 @@ BOOL LLFloaterTexturePicker::postBuild()  		mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  		mInventoryPanel->setAllowMultiSelect(FALSE); -		// store this filter as the default one -		mInventoryPanel->getRootFolder()->getFilter()->markDefault(); +		// Commented out to scroll to currently selected texture. See EXT-5403. +		// // store this filter as the default one +		// mInventoryPanel->getRootFolder()->getFilter()->markDefault();  		// Commented out to stop opening all folders with textures  		// mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9b5b210bf7..0afbce7d51 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -112,15 +112,57 @@ const F64 log_2 = log(2.0);  LLLoadedCallbackEntry::LLLoadedCallbackEntry(loaded_callback_func cb,  					  S32 discard_level,  					  BOOL need_imageraw, // Needs image raw for the callback -					  void* userdata )  +					  void* userdata, +					  LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, +					  void* source, +					  LLViewerFetchedTexture* target, +					  BOOL pause)   	: mCallback(cb),  	  mLastUsedDiscard(MAX_DISCARD_LEVEL+1),  	  mDesiredDiscard(discard_level),  	  mNeedsImageRaw(need_imageraw), -	  mUserData(userdata) +	  mUserData(userdata), +	  mSourceCallbackList(src_callback_list), +	  mSource(source), +	  mPaused(pause) +{ +	if(mSourceCallbackList) +	{ +		mSourceCallbackList->insert(target->getID()); +	} +} + +LLLoadedCallbackEntry::~LLLoadedCallbackEntry()  {  } +void LLLoadedCallbackEntry::removeTexture(LLViewerFetchedTexture* tex) +{ +	if(mSourceCallbackList) +	{ +		mSourceCallbackList->erase(tex->getID()) ; +	} +} + +//static  +void LLLoadedCallbackEntry::cleanUpCallbackList(LLLoadedCallbackEntry::source_callback_list_t* callback_list, void* src) +{ +	//clear texture callbacks. +	if(!callback_list->empty()) +	{ +		for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = callback_list->begin(); +				iter != callback_list->end(); ++iter) +		{ +			LLViewerFetchedTexture* tex = gTextureList.findImage(*iter) ; +			if(tex) +			{ +				tex->deleteCallbackEntry(src) ;			 +			} +		} +		callback_list->clear() ; +	} +} +  LLViewerMediaTexture* LLViewerTextureManager::createMediaTexture(const LLUUID &media_id, BOOL usemipmaps, LLImageGL* gl_image)  {  	return new LLViewerMediaTexture(media_id, usemipmaps, gl_image) ;		 @@ -324,9 +366,7 @@ void LLViewerTextureManager::cleanup()  	LLViewerFetchedTexture::sMissingAssetImagep = NULL;  	LLViewerFetchedTexture::sWhiteImagep = NULL; -	LLViewerMediaTexture::cleanup() ;	 - -	LLViewerTexture::cleanupClass() ; +	LLViewerMediaTexture::cleanUpClass() ;	  }  //---------------------------------------------------------------------------------------------- @@ -345,11 +385,6 @@ void LLViewerTexture::initClass()  }  // static -void LLViewerTexture::cleanupClass() -{ -} - -// static  S32 LLViewerTexture::getTotalNumOfCategories()   {  	return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; @@ -492,10 +527,10 @@ void LLViewerTexture::init(bool firstinit)  	mTextureState = NO_DELETE ;  	mDontDiscard = FALSE; -	mCanResetMaxVirtualSize = true ;  	mMaxVirtualSize = 0.f;  	mNeedsGLTexture = FALSE ; -	mNeedsResetMaxVirtualSize = FALSE ; +	mMaxVirtualSizeResetInterval = 1; +	mMaxVirtualSizeResetCounter = 1 ;  	mAdditionalDecodePriority = 0.f ;	  	mParcelMedia = NULL ;  	mNumFaces = 0 ; @@ -510,6 +545,7 @@ S8 LLViewerTexture::getType() const  	return LLViewerTexture::LOCAL_TEXTURE ;  } +//virtual  void LLViewerTexture::cleanup()  {  	mFaceList.clear() ; @@ -591,11 +627,6 @@ void LLViewerTexture::forceImmediateUpdate()  {  } -void LLViewerTexture::setResetMaxVirtualSizeFlag(bool flag)  -{ -	mCanResetMaxVirtualSize = flag ; -} -  void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const   {  	if(needs_gltexture) @@ -603,10 +634,10 @@ void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) co  		mNeedsGLTexture = TRUE ;  	} -	if(mNeedsResetMaxVirtualSize) +	if(!mMaxVirtualSizeResetCounter)  	{  		//flag to reset the values because the old values are used. -		mNeedsResetMaxVirtualSize = FALSE ; +		resetMaxVirtualSizeResetCounter() ;  		mMaxVirtualSize = virtual_size;		  		mAdditionalDecodePriority = 0.f ;	  		mNeedsGLTexture = needs_gltexture ; @@ -621,7 +652,7 @@ void LLViewerTexture::resetTextureStats()  {  	mMaxVirtualSize = 0.0f ;  	mAdditionalDecodePriority = 0.f ;	 -	mNeedsResetMaxVirtualSize = FALSE ; +	mMaxVirtualSizeResetCounter = 0 ;  }  //virtual  @@ -1098,6 +1129,7 @@ void LLViewerFetchedTexture::init(bool firstinit)  	mIsMissingAsset = FALSE;  	mLoadedCallbackDesiredDiscardLevel = 0; +	mPauseLoadedCallBacks = TRUE ;  	mNeedsCreateTexture = FALSE; @@ -1144,6 +1176,7 @@ S8 LLViewerFetchedTexture::getType() const  	return LLViewerTexture::FETCHED_TEXTURE ;  } +//virtual  void LLViewerFetchedTexture::cleanup()  {  	for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); @@ -1153,6 +1186,7 @@ void LLViewerFetchedTexture::cleanup()  		// We never finished loading the image.  Indicate failure.  		// Note: this allows mLoadedCallbackUserData to be cleaned up.  		entryp->mCallback( FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData ); +		entryp->removeTexture(this) ;  		delete entryp;  	}  	mLoadedCallbackList.clear(); @@ -1164,6 +1198,8 @@ void LLViewerFetchedTexture::cleanup()  	mCachedRawDiscardLevel = -1 ;  	mCachedRawImageReady = FALSE ;  	mSavedRawImage = NULL ; + +	LLViewerTexture::cleanup();  }  void LLViewerFetchedTexture::setForSculpt() @@ -1529,6 +1565,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	F32 pixel_priority = fsqrtf(mMaxVirtualSize);  	F32 priority = 0.f; +  	if (mIsMissingAsset)  	{  		priority = 0.0f; @@ -1550,7 +1587,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	{  		priority = 1.f;  	} -	else if (pixel_priority <= 0.f && !have_all_data) +	else if (pixel_priority < 0.001f && !have_all_data)  	{  		// Not on screen but we might want some data  		if (mBoostLevel > BOOST_HIGH) @@ -1558,11 +1595,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  			// Always want high boosted images  			priority = 1.f;  		} -		else if(mForceToSaveRawImage) -		{ -			//force to fetch the raw image. -			priority = 1.f; -		}  		else  		{  			priority = -5.f; //stop fetching @@ -1665,7 +1697,7 @@ void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority)  void LLViewerFetchedTexture::updateVirtualSize()   {	 -	if(mNeedsResetMaxVirtualSize) +	if(!mMaxVirtualSizeResetCounter)  	{  		addTextureStats(0.f, FALSE) ;//reset  	} @@ -1685,9 +1717,9 @@ void LLViewerFetchedTexture::updateVirtualSize()  		}  	} -	if(mCanResetMaxVirtualSize) +	if(mMaxVirtualSizeResetCounter > 0)  	{ -		mNeedsResetMaxVirtualSize = TRUE ; +		mMaxVirtualSizeResetCounter--;  	}  	reorganizeFaceList() ;  	reorganizeVolumeList(); @@ -1765,6 +1797,7 @@ bool LLViewerFetchedTexture::updateFetch()  		if (finished)  		{  			mIsFetching = FALSE; +			mLastPacketTimer.reset() ;  		}  		else  		{ @@ -1794,6 +1827,7 @@ bool LLViewerFetchedTexture::updateFetch()  					setIsMissingAsset();  					mRawDiscardLevel = INVALID_DISCARD_LEVEL ;  					mIsFetching = FALSE ; +					mLastPacketTimer.reset();  				}  				else  				{ @@ -1961,6 +1995,7 @@ void LLViewerFetchedTexture::setIsMissingAsset()  		LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);  		mHasFetcher = FALSE;  		mIsFetching = FALSE; +		mLastPacketTimer.reset();  		mFetchState = 0;  		mFetchPriority = 0;  	} @@ -1968,7 +2003,8 @@ void LLViewerFetchedTexture::setIsMissingAsset()  }  void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_callback, -									   S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* userdata) +									   S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* userdata, void* src, +									   LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, BOOL pause)  {  	//  	// Don't do ANYTHING here, just add it to the global callback list @@ -1984,12 +2020,17 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call  		mLoadedCallbackDesiredDiscardLevel = llmin(mLoadedCallbackDesiredDiscardLevel, (S8)discard_level) ;  	} -	LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata); -	mLoadedCallbackList.push_back(entryp); +	if(mPauseLoadedCallBacks && !pause) +	{ +		unpauseLoadedCallbacks(src) ; +	} +	LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata, src_callback_list, src, this, pause); +	mLoadedCallbackList.push_back(entryp);	 +  	mNeedsAux |= needs_aux;  	if(keep_imageraw)  	{ -		forceToSaveRawImage(discard_level) ; +		forceToSaveRawImage(discard_level, true) ;  	}  	if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0)  	{ @@ -1998,6 +2039,113 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call  	}  } +void LLViewerFetchedTexture::deleteCallbackEntry(void* src) +{ +	if(mLoadedCallbackList.empty()) +	{ +		return ; +	} + +	S32 desired_discard = INVALID_DISCARD_LEVEL ; +	S32 desired_raw_discard = INVALID_DISCARD_LEVEL ; +	for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); +			iter != mLoadedCallbackList.end(); ) +	{ +		LLLoadedCallbackEntry *entryp = *iter; +		if(entryp->mSource == src) +		{ +			// We never finished loading the image.  Indicate failure. +			// Note: this allows mLoadedCallbackUserData to be cleaned up. +			entryp->mCallback(FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData); +			delete entryp; +			iter = mLoadedCallbackList.erase(iter) ; +		} +		else +		{ +			++iter; + +			desired_discard = llmin(desired_discard, entryp->mDesiredDiscard) ; +			if(entryp->mNeedsImageRaw) +			{ +				desired_raw_discard = llmin(desired_raw_discard, entryp->mDesiredDiscard) ; +			} +		} +	} + +	mLoadedCallbackDesiredDiscardLevel = desired_discard; +	if (mLoadedCallbackList.empty()) +	{ +		// If we have no callbacks, take us off of the image callback list. +		gTextureList.mCallbackList.erase(this); +		mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; + +		if(mForceToSaveRawImage) +		{ +			destroySavedRawImage() ; +		} +	} +	else if(mForceToSaveRawImage && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) +	{ +		if(desired_raw_discard != INVALID_DISCARD_LEVEL) +		{ +			mDesiredSavedRawDiscardLevel = desired_raw_discard ; +		} +		else +		{ +			destroySavedRawImage() ; +		} +	} +} + +void LLViewerFetchedTexture::unpauseLoadedCallbacks(void* src) +{ +	BOOL need_raw = FALSE ; +	for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); +			iter != mLoadedCallbackList.end(); ) +	{ +		LLLoadedCallbackEntry *entryp = *iter++; +		if(entryp->mSource == src) +		{ +			entryp->mPaused = FALSE ; +			if(entryp->mNeedsImageRaw) +			{ +				need_raw = TRUE ; +			} +		} +	} +	mPauseLoadedCallBacks = FALSE ; +	if(need_raw) +	{ +		mForceToSaveRawImage = TRUE ; +	} +} + +void LLViewerFetchedTexture::pauseLoadedCallbacks(void* src) +{ +	bool paused = true ; + +	for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); +			iter != mLoadedCallbackList.end(); ) +	{ +		LLLoadedCallbackEntry *entryp = *iter++; +		if(entryp->mSource == src) +		{ +			entryp->mPaused = TRUE ; +		} +		else if(!entryp->mPaused) +		{ +			paused = false ; +		} +	} + +	if(paused) +	{ +		mPauseLoadedCallBacks = TRUE ;//when set, loaded callback is paused. +		resetTextureStats(); +		mForceToSaveRawImage = FALSE ; +	} +} +  bool LLViewerFetchedTexture::doLoadedCallbacks()  {  	if (mNeedsCreateTexture) @@ -2023,6 +2171,11 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()  		// Remove ourself from the global list of textures with callbacks  		gTextureList.mCallbackList.erase(this);  	} +	if(mPauseLoadedCallBacks) +	{ +		destroyRawImage(); +		return res; //paused +	}  	S32 gl_discard = getDiscardLevel(); @@ -2432,10 +2585,12 @@ void LLViewerFetchedTexture::saveRawImage()  	mLastReferencedSavedRawImageTime = sCurrentTime ;  } -void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)  +void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_callback)   {   	if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)  	{ +		llassert_always(from_callback || mBoostLevel == LLViewerTexture::BOOST_PREVIEW) ; +  		mForceToSaveRawImage = TRUE ;  		mDesiredSavedRawDiscardLevel = desired_discard ; @@ -2882,7 +3037,7 @@ void LLViewerMediaTexture::removeMediaImplFromTexture(const LLUUID& media_id)  }  //static -void LLViewerMediaTexture::cleanup() +void LLViewerMediaTexture::cleanUpClass()  {  	sMediaMap.clear() ;  } @@ -3291,7 +3446,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  	}  	mUpdateVirtualSizeTime = LLFrameTimer::getFrameCount() ; -	if(mNeedsResetMaxVirtualSize) +	if(!mMaxVirtualSizeResetCounter)  	{  		addTextureStats(0.f, FALSE) ;//reset  	} @@ -3324,9 +3479,9 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  		}  	} -	if(mCanResetMaxVirtualSize) +	if(mMaxVirtualSizeResetCounter > 0)  	{ -		mNeedsResetMaxVirtualSize = TRUE ; +		mMaxVirtualSizeResetCounter--;  	}  	reorganizeFaceList() ;  	reorganizeVolumeList(); diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 361f56e02f..8b69408e4b 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -67,16 +67,31 @@ class LLVOVolume ;  class LLLoadedCallbackEntry  {  public: +	typedef std::set< LLUUID > source_callback_list_t; + +public:  	LLLoadedCallbackEntry(loaded_callback_func cb,  						  S32 discard_level,  						  BOOL need_imageraw, // Needs image raw for the callback -						  void* userdata ); +						  void* userdata, +						  source_callback_list_t* src_callback_list, +						  void* source, +						  LLViewerFetchedTexture* target, +						  BOOL pause); +	~LLLoadedCallbackEntry(); +	void removeTexture(LLViewerFetchedTexture* tex) ;  	loaded_callback_func	mCallback;  	S32						mLastUsedDiscard;  	S32						mDesiredDiscard;  	BOOL					mNeedsImageRaw; +	BOOL                    mPaused;  	void*					mUserData; +	source_callback_list_t* mSourceCallbackList; +	void*                   mSource; +	 +public: +	static void cleanUpCallbackList(LLLoadedCallbackEntry::source_callback_list_t* callback_list, void* src) ;  };  class LLTextureBar; @@ -103,22 +118,23 @@ public:  	enum EBoostLevel  	{  		BOOST_NONE 			= 0, -		BOOST_AVATAR_BAKED	= 1, -		BOOST_AVATAR		= 2, -		BOOST_CLOUDS		= 3, -		BOOST_SCULPTED      = 4, +		BOOST_AVATAR_BAKED	, +		BOOST_AVATAR		, +		BOOST_CLOUDS		, +		BOOST_SCULPTED      ,  		BOOST_HIGH 			= 10, -		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail -		BOOST_SELECTED		= 12, -		BOOST_HUD			= 13, -		BOOST_AVATAR_BAKED_SELF	= 14, -		BOOST_ICON			= 15, -		BOOST_UI			= 16, -		BOOST_PREVIEW		= 17, -		BOOST_MAP			= 18, -		BOOST_MAP_VISIBLE	= 19, -		BOOST_AVATAR_SELF	= 20, // needed for baking avatar +		BOOST_BUMP          , +		BOOST_TERRAIN		, // has to be high priority for minimap / low detail +		BOOST_SELECTED		, +		BOOST_HUD			, +		BOOST_AVATAR_BAKED_SELF	, +		BOOST_ICON			, +		BOOST_UI			, +		BOOST_PREVIEW		, +		BOOST_MAP			, +		BOOST_MAP_VISIBLE	, +		BOOST_AVATAR_SELF	, // needed for baking avatar  		BOOST_MAX_LEVEL,  		//other texture Categories @@ -144,7 +160,6 @@ protected:  public:	  	static void initClass(); -	static void cleanupClass();  	static void updateClass(const F32 velocity, const F32 angular_velocity) ;  	LLViewerTexture(BOOL usemipmaps = TRUE); @@ -166,7 +181,8 @@ public:  	void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const;  	void resetTextureStats();	 -	void setResetMaxVirtualSizeFlag(bool flag) ; +	void setMaxVirtualSizeResetInterval(S32 interval)const {mMaxVirtualSizeResetInterval = interval;} +	void resetMaxVirtualSizeResetCounter()const {mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval;}  	virtual F32  getMaxVirtualSize() ; @@ -248,7 +264,7 @@ public:  	/*virtual*/ void updateBindStatsForTester() ;  protected: -	void cleanup() ; +	virtual void cleanup() ;  	void init(bool firstinit) ;	  	void reorganizeFaceList() ;  	void reorganizeVolumeList() ; @@ -264,10 +280,10 @@ protected:  	S32 mFullHeight;  	BOOL  mUseMipMaps ;  	S8  mComponents; -	bool mCanResetMaxVirtualSize; -	mutable F32 mMaxVirtualSize;	// The largest virtual size of the image, in pixels - how much data to we need?  	mutable S8  mNeedsGLTexture; -	mutable BOOL mNeedsResetMaxVirtualSize ; +	mutable F32 mMaxVirtualSize;	// The largest virtual size of the image, in pixels - how much data to we need?	 +	mutable S32  mMaxVirtualSizeResetCounter ; +	mutable S32  mMaxVirtualSizeResetInterval;  	mutable F32 mAdditionalDecodePriority;  // priority add to mDecodePriority.  	LLFrameTimer mLastReferencedTimer;	 @@ -368,10 +384,13 @@ public:  	// Set callbacks to get called when the image gets updated with higher   	// resolution versions.  	void setLoadedCallback(loaded_callback_func cb, -						   S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, -						   void* userdata); +						   S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* src, +						   void* userdata, LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, BOOL pause = FALSE);  	bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; }	 +	void pauseLoadedCallbacks(void* src); +	void unpauseLoadedCallbacks(void* src);  	bool doLoadedCallbacks(); +	void deleteCallbackEntry(void* src);  	void addToCreateTexture(); @@ -449,7 +468,7 @@ public:  	S32         getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}  	BOOL        isCachedRawImageReady() const {return mCachedRawImageReady ;}  	BOOL        isRawImageValid()const { return mIsRawImageValid ; }	 -	void        forceToSaveRawImage(S32 desired_discard = 0) ; +	void        forceToSaveRawImage(S32 desired_discard = 0, bool from_callback = false) ;  	/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;  	void        destroySavedRawImage() ;  	LLImageRaw* getSavedRawImage() ; @@ -466,7 +485,7 @@ protected:  private:  	void init(bool firstinit) ; -	void cleanup() ; +	/*virtual*/ void cleanup() ;  	void saveRawImage() ;  	void setCachedRawImage() ; @@ -515,6 +534,7 @@ protected:  	typedef std::list<LLLoadedCallbackEntry*> callback_list_t;  	S8              mLoadedCallbackDesiredDiscardLevel; +	BOOL            mPauseLoadedCallBacks;  	callback_list_t mLoadedCallbackList;  	LLPointer<LLImageRaw> mRawImage; @@ -638,7 +658,7 @@ private:  public:  	static void updateClass() ; -	static void cleanup() ;	 +	static void cleanUpClass() ;	  	static LLViewerMediaTexture* findMediaTexture(const LLUUID& media_id) ;  	static void removeMediaImplFromTexture(const LLUUID& media_id) ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 1e3311dafe..b3aff30324 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1219,7 +1219,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d  		delete [] data;  		return;  	} -	image->getLastPacketTimer()->reset(); +	//image->getLastPacketTimer()->reset();  	bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);  	if (!res)  	{ @@ -1283,7 +1283,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d  		delete [] data;  		return;  	} -	image->getLastPacketTimer()->reset(); +	//image->getLastPacketTimer()->reset();  	bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data);  	if (!res)  	{ @@ -1406,7 +1406,7 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st  	datap->mImageName = name;  	datap->mImageScaleRegion = scale_rect; -	imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap); +	imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap, NULL, NULL);  	return new_imagep;  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4be703cfb0..82823f3de2 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -677,7 +677,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mFullyLoaded(FALSE),  	mPreviousFullyLoaded(FALSE),  	mFullyLoadedInitialized(FALSE), -	mSupportsAlphaLayers(FALSE) +	mSupportsAlphaLayers(FALSE), +	mLoadedCallbacksPaused(FALSE)  {  	LLMemType mt(LLMemType::MTYPE_AVATAR);  	//VTResume();  // VTune @@ -839,6 +840,7 @@ void LLVOAvatar::markDead()  		sNumVisibleChatBubbles--;  	}  	mVoiceVisualizer->markDead(); +	LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList, this) ;  	LLViewerObject::markDead();  } @@ -2229,12 +2231,14 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	{  		llinfos << "Warning!  Idle on dead avatar" << llendl;  		return TRUE; -	} +	}	   	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))  	{  		return TRUE;  	} + +	checkTextureLoading() ;  	// force immediate pixel area update on avatars using last frames data (before drawable or camera updates)  	setPixelAreaAndAngle(gAgent); @@ -4093,6 +4097,7 @@ void LLVOAvatar::updateTextures()  	{  		render_avatar = isVisible() && !mCulled;  	} +	checkTextureLoading() ;  	std::vector<BOOL> layer_baked;  	// GL NOT ACTIVE HERE - *TODO @@ -4133,7 +4138,7 @@ void LLVOAvatar::updateTextures()  				}  			}  		} -		if (isIndexBakedTexture((ETextureIndex) texture_index)) +		if (isIndexBakedTexture((ETextureIndex) texture_index) && render_avatar)  		{  			const S32 boost_level = getAvatarBakedBoostLevel();  			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE); @@ -4149,7 +4154,7 @@ void LLVOAvatar::updateTextures()  										 << " on host " << getRegion()->getHost() << llendl;  			} -			addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level ); +			addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );			  		}  	} @@ -4168,13 +4173,66 @@ void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerFetchedTexture  } +void LLVOAvatar::checkTextureLoading() +{ +	static const F32 MAX_INVISIBLE_WAITING_TIME = 30.f ; //seconds + +	BOOL pause = !isVisible() ; +	if(!pause) +	{ +		mInvisibleTimer.reset() ; +	} +	if(mLoadedCallbacksPaused == pause) +	{ +		return ;  +	} +	 +	if(mCallbackTextureList.empty()) //when is self or no callbacks. Note: this list for self is always empty. +	{ +		mLoadedCallbacksPaused = pause ; +		return ; //nothing to check. +	} +	 +	if(pause && mInvisibleTimer.getElapsedTimeF32() < MAX_INVISIBLE_WAITING_TIME) +	{ +		return ; +	} +	 +	for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = mCallbackTextureList.begin(); +		iter != mCallbackTextureList.end(); ++iter) +	{ +		LLViewerFetchedTexture* tex = gTextureList.findImage(*iter) ; +		if(tex) +		{ +			if(pause)//pause texture fetching. +			{ +				tex->pauseLoadedCallbacks(this) ; +			} +			else//unpause +			{ +				static const F32 START_AREA = 100.f ; + +				tex->unpauseLoadedCallbacks(this) ; +				tex->addTextureStats(START_AREA); //jump start the fetching again +			} +		}		 +	}			 +	 +	mLoadedCallbacksPaused = pause ; +	return ; +} +  void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level)  { -	mMaxPixelArea = llmax(pixel_area, mMaxPixelArea); -	mMinPixelArea = llmin(pixel_area, mMinPixelArea); +	//if this function is not called for the last 512 frames, the texture pipeline will stop fetching this texture. +	static const S32  MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL = 512 ; //frames	 +  	imagep->resetTextureStats(); -	imagep->setResetMaxVirtualSizeFlag(false) ;  	imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. +	imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); + +	mMaxPixelArea = llmax(pixel_area, mMaxPixelArea); +	mMinPixelArea = llmin(pixel_area, mMinPixelArea);	  	imagep->addTextureStats(pixel_area / texel_area_ratio);  	imagep->setBoostLevel(boost_level);  	if(boost_level == LLViewerTexture::BOOST_AVATAR_BAKED_SELF) @@ -5987,6 +6045,15 @@ void LLVOAvatar::updateMeshTextures()  	const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures  	const BOOL other_culled = !isSelf() && mCulled; +	LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ; +	void* callback_src = NULL ; +	BOOL paused = FALSE; +	if(!isSelf()) +	{ +		callback_src = this ; +		src_callback_list = &mCallbackTextureList ; +		paused = mLoadedCallbacksPaused ; +	}  	std::vector<BOOL> is_layer_baked;  	is_layer_baked.resize(mBakedTextureDatas.size(), false); @@ -6057,10 +6124,12 @@ void LLVOAvatar::updateMeshTextures()  			{  				mBakedTextureDatas[i].mIsLoaded = FALSE;  				if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) -				{ -					baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));	 +				{			 +					baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),  +						callback_src, src_callback_list, paused);	  				} -				baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); +				baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ),  +					callback_src, src_callback_list, paused );  			}  		}  		else if (mBakedTextureDatas[i].mTexLayerSet  @@ -6520,6 +6589,16 @@ void LLVOAvatar::onFirstTEMessageReceived()  	{  		mFirstTEMessageReceived = TRUE; +		LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ; +		void* callback_src = NULL ; +		BOOL paused = FALSE ; +		if(!isSelf()) +		{ +			callback_src = this ; +			src_callback_list = &mCallbackTextureList ; +			paused = mLoadedCallbacksPaused ; +		} +  		for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  		{  			const BOOL layer_baked = isTextureDefined(mBakedTextureDatas[i].mTextureIndex); @@ -6533,9 +6612,11 @@ void LLVOAvatar::onFirstTEMessageReceived()  				// If we have more than one texture for the other baked layers, we'll want to call this for them too.  				if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )  				{ -					image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); +					image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),  +						callback_src, src_callback_list, paused);  				} -				image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); +				image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ),  +					callback_src, src_callback_list, paused );  			}  		} diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b74e4c83fb..2e0f635649 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -263,6 +263,8 @@ private:  	S32				mFullyLoadedFrameCounter;  	LLFrameTimer	mFullyLoadedTimer;  	LLFrameTimer	mRuthTimer; +protected: +	LLFrameTimer    mInvisibleTimer;  /**                    State   **                                                                            ** @@ -498,7 +500,8 @@ protected:  	};  	typedef std::vector<BakedTextureData> 	bakedtexturedata_vec_t;  	bakedtexturedata_vec_t 					mBakedTextureDatas; - +	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;  +	BOOL mLoadedCallbacksPaused;  	//--------------------------------------------------------------------  	// Local Textures  	//-------------------------------------------------------------------- @@ -518,7 +521,7 @@ private:  	virtual const LLTextureEntry* getTexEntry(const U8 te_num) const;  	virtual void setTexEntry(const U8 index, const LLTextureEntry &te); - +	void checkTextureLoading() ;  	//--------------------------------------------------------------------  	// Layers  	//-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 982d9c375c..4edbbb7402 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1632,8 +1632,8 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					}  				}  				else -				{ -					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type)); +				{					 +					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL, NULL);  				}  			}  			tex->setMinDiscardLevel(desired_discard); @@ -2032,7 +2032,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  			imagep->setBoostLevel(getAvatarBoostLevel());  			imagep->resetTextureStats(); -			imagep->setResetMaxVirtualSizeFlag(false) ; +			imagep->setMaxVirtualSizeResetInterval(16);  			imagep->addTextureStats( desired_pixels / texel_area_ratio );  			imagep->setAdditionalDecodePriority(1.0f) ;  			imagep->forceUpdateBindStats() ; diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 2eb233ddd9..ec9c78ee53 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -444,8 +444,8 @@ BOOL LLWearable::importFile( LLFILE* file )  			delete mSavedTEMap[te];  		} -		image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te)); - +		image->setBoostLevel(LLViewerTexture::BOOST_AVATAR_SELF) ; +		image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te), NULL, NULL);  		LLUUID textureid(text_buffer);  		mTEMap[te] = new LLLocalTextureObject(image, textureid); diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 6b6067fd27..9ca8a9c3f9 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -164,7 +164,7 @@ private:  	te_map_t mTEMap;				// maps TE to LocalTextureObject  	te_map_t mSavedTEMap;			// last saved version of TEMap -	LLUUID				mItemID;  // ID of the inventory item in the agent's inventory +	LLUUID				mItemID;  // ID of the inventory item in the agent's inventory	  };  #endif  // LL_LLWEARABLE_H diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index cf165f8f66..868322699e 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -621,6 +621,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  	U32 mask = 0;					// mask of selected items' types  	U32 n_items = ids.size();		// number of selected items  	U32 n_worn = 0;					// number of worn items among the selected ones +	U32 n_already_worn = 0;			// number of items worn of same type as selected items  	U32 n_links = 0;				// number of links among the selected items  	U32 n_editable = 0;				// number of editable items among the selected ones @@ -638,10 +639,11 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  		updateMask(mask, item->getType()); -		bool is_link = item->getIsLinkType(); -		bool is_worn = get_is_item_worn(id); -		bool is_editable = gAgentWearables.isWearableModifiable(id); - +		const LLWearableType::EType wearable_type = item->getWearableType(); +		const bool is_link = item->getIsLinkType(); +		const bool is_worn = get_is_item_worn(id); +		const bool is_editable = gAgentWearables.isWearableModifiable(id); +		const bool is_already_worn = gAgentWearables.selfHasWearable(wearable_type);  		if (is_worn)  		{  			++n_worn; @@ -654,14 +656,20 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  		{  			++n_links;  		} +		if (is_already_worn) +		{ +			++n_already_worn; +		}  	} // for  	bool standalone = mParent ? mParent->isStandalone() : false;  	// *TODO: eliminate multiple traversals over the menu items -	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0); -	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front())); -	setMenuItemVisible(menu, "wear",				n_worn == 0); +	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0); +	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0); +	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0); +	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front()) && n_already_worn != 0); +	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0);  	//visible only when one item selected and this item is worn  	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);  	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1); diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml index ff20e21999..46f7c74a9a 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Profil for genstand"/> -	<text name="where" value="(Beholdning)"/> +	<text name="origin" value="(Beholdning)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Navn: diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 66c75aca4c..32f37c038e 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1065,7 +1065,7 @@  	<string name="InvFolder Gestures">  		Bevægelser  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoritter  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index 09935019ab..77b6076809 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Objektprofil"/> -	<text name="where" value="(Inventar)"/> +	<text name="origin" value="(Inventar)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Name: diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 67b7d6c1d2..f6ae17239a 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1095,7 +1095,7 @@  	<string name="InvFolder Gestures">  		Gesten  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoriten  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 14aacafa9f..68e36ff0b3 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -191,9 +191,10 @@               type="string"               length="1"               follows="left|top" -             height="16" +             height="20"               layout="topleft"               left_pad="2" +             valign="center"                name="ContentRatingText"               top_delta="0"               width="250"> @@ -207,7 +208,7 @@               layout="topleft"               left="10"               name="Owner:" -             top_pad="5" +             top_pad="1"               width="100">                  Owner:              </text> @@ -729,8 +730,10 @@ Leyla Linden               </text>               height="16"               layout="topleft"               left_pad="10" +             top_delta="-3"                mouse_opaque="false"               name="region_maturity_text" +             valign="center"                width="150">                  Adult              </text> @@ -743,6 +746,7 @@ Leyla Linden               </text>               left="10"               mouse_opaque="false"               name="resellable_lbl" +             top_pad="9"                width="100">                  Resale:              </text> @@ -1924,6 +1928,8 @@ Only large parcels can be listed in search.               left_delta="0"               name="public_access"               top_pad="5" +             label_text.valign="center" +             label_text.v_pad="-7"                width="278" />              <text               type="string" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 221457ac1f..5c19f1932d 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -606,7 +606,7 @@      </menu_item_call>      <menu_item_separator       layout="topleft"  -     name="Attach Separator"/> +     name="Wearable And Object Separator"/>      <menu_item_call       label="Detach From Yourself"       layout="topleft" @@ -629,10 +629,10 @@      <menu_item_call       label="Wear"       layout="topleft" -     name="Object Wear"> +     name="Wearable And Object Wear">          <menu_item_call.on_click           function="Inventory.DoToSelected" -         parameter="attach" /> +         parameter="wear" />      </menu_item_call>      <menu       label="Attach To" @@ -642,9 +642,6 @@       label="Attach To HUD"       layout="topleft"       name="Attach To HUD" /> -    <menu_item_separator -     layout="topleft"  -     name="Wearable Separator"/>      <menu_item_call       label="Edit"       layout="topleft" @@ -654,14 +651,6 @@           parameter="edit" />      </menu_item_call>      <menu_item_call -     label="Wear" -     layout="topleft" -     name="Wearable Wear"> -        <menu_item_call.on_click -         function="Inventory.DoToSelected" -         parameter="wear" /> -    </menu_item_call> -    <menu_item_call       label="Add"       layout="topleft"       name="Wearable Add"> diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index 23eb89e448..c3adbb7904 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -4,11 +4,18 @@      <menu_item_call       label="Replace"       layout="topleft" -     name="wear"> +     name="wear_replace">          <on_click           function="Wearable.Wear" />      </menu_item_call>      <menu_item_call +     label="Wear" +     layout="topleft" +     name="wear_wear"> +        <on_click +         function="Wearable.Add" /> +    </menu_item_call> +    <menu_item_call       label="Add"       layout="topleft"       name="wear_add"> diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index d2c8ab159f..d5943ea156 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -35,7 +35,10 @@               multi_select="true"               name="list_attachments"               top="0" -             width="311" /> +             width="311"> +              <flat_list_view.no_items_text +               value="No attachments worn" /> +              </flat_list_view>          </accordion_tab>          <accordion_tab           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 10d8c7dbb8..02ab0ffee5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -52,14 +52,14 @@ width="333">        visible="false" />        <icon        follows="top|left" -      height="32" -      image_name="TabIcon_Appearance_Off" +      height="31" +      image_name="Shirt_Large"        name="outfit_icon"        mouse_opaque="false"        visible="true" -      left="0" +      left="1"        top="0" -      width="32" /> +      width="31" />        <text        font="SansSerifSmall"        text_color="EmphasisColor" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index f3912b5133..50df227fbf 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -26,6 +26,14 @@      	 name="acquiredDate">          [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string> +	<panel.string +		 name="origin_inventory"> +        (Inventory) +	</panel.string> +	<panel.string +		 name="origin_inworld"> +        (Inworld) +	</panel.string>  	<icon       	 follows="top|right"       	 height="18" @@ -65,7 +73,7 @@       height="13"       layout="topleft"       left="45" -     name="where" +     name="origin"       text_color="LtGray_50"       value="(Inventory)"       width="150" /> diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index ef7ec74b5a..843015cb8b 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -85,7 +85,7 @@       left="45"       name="where"       text_color="LtGray_50" -     value="(inworld)" +     value="(Inworld)"       width="150" />  	<panel           follows="all" diff --git a/indra/newview/skins/default/xui/en/widgets/textbase.xml b/indra/newview/skins/default/xui/en/widgets/textbase.xml index f4dc192bc3..b2da2147c1 100644 --- a/indra/newview/skins/default/xui/en/widgets/textbase.xml +++ b/indra/newview/skins/default/xui/en/widgets/textbase.xml @@ -1,3 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <textbase clip_partial="false" +          halign="left"  +          valign="top"             font="SansSerif"/> diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml index d647f36125..d2c1295c76 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</panel.string>  	<text name="title" value="Perfil del elemento"/> -	<text name="where" value="(Inventario)"/> +	<text name="origin" value="(Inventario)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Nombre: diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 1697b29718..717665f4d9 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1068,7 +1068,7 @@  	<string name="InvFolder Gestures">  		Gestos  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoritos  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml index 297cdd2839..db7e6a9365 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Profil de l'article"/> -	<text name="where" value="(inventaire)"/> +	<text name="origin" value="(inventaire)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Nom : diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 95e081b574..604398a658 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1095,7 +1095,7 @@  	<string name="InvFolder Gestures">  		Gestes  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoris  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index 9886cbcf04..37a19b2e50 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Profilo articolo"/> -	<text name="where" value="(Inventario)"/> +	<text name="origin" value="(Inventario)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Nome: diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 03747abb59..aeaf8098b9 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1074,7 +1074,7 @@  	<string name="InvFolder Gestures">  		Gesture  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Preferiti  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index 584524e3b1..b194608181 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</panel.string>  	<text name="title" value="アイテムのプロフィール"/> -	<text name="where" value="(持ち物)"/> +	<text name="origin" value="(持ち物)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			名前: diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index bf8541a73d..619f9fc9ef 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1095,7 +1095,7 @@  	<string name="InvFolder Gestures">  		ジェスチャー  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		お気に入り  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index ae8d3b89dc..25071b5460 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -909,7 +909,7 @@  	<string name="InvFolder Gestures">  		Gebaren  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoriten  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml index 3b038a7102..5f324490c2 100644 --- a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Profil Obiektu"/> -	<text name="where" value="(Szafa)"/> +	<text name="origin" value="(Szafa)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Nazwa: diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index c72f783a51..f110052f68 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -986,7 +986,7 @@  	<string name="InvFolder Gestures">  		Gesturki  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Ulubione  	</string>  	<string name="InvFolder Current Outfit"> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml index 92895b1043..8189da5efb 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -16,7 +16,7 @@  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string>  	<text name="title" value="Perfil do item"/> -	<text name="where" value="(Inventário)"/> +	<text name="origin" value="(Inventário)"/>  	<panel label="">  		<text name="LabelItemNameTitle">  			Nome: diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 74ba7888e9..ca32412058 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1068,7 +1068,7 @@  	<string name="InvFolder Gestures">  		Gestos  	</string> -	<string name="InvFolder favorite"> +	<string name="InvFolder Favorite">  		Favoritos  	</string>  	<string name="InvFolder Current Outfit">  | 
