diff options
67 files changed, 394 insertions, 369 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 3f33763ce0..5667b69c28 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -323,6 +323,8 @@ Khyota Wulluf  	VWR-8885  	VWR-9256  	VWR-9966 +Kitty Barnett +	VWR-19699  Kunnis Basiat  	VWR-82  	VWR-102 diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 41ff5849f4..d06d6baf85 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -954,7 +954,12 @@ namespace LLError  		std::string class_name = className(site.mClassInfo);  		std::string function_name = functionName(site.mFunction); +#if LL_LINUX +		// gross, but typeid comparison seems to always fail here with gcc4.1 +		if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) +#else  		if (site.mClassInfo != typeid(NoClassInfo)) +#endif // LL_LINUX  		{  			function_name = class_name + "::" + function_name;  		} @@ -1079,7 +1084,12 @@ namespace LLError  	#if LL_WINDOWS  		// DevStudio: __FUNCTION__ already includes the full class name  	#else +                #if LL_LINUX +		// gross, but typeid comparison seems to always fail here with gcc4.1 +		if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) +                #else  		if (site.mClassInfo != typeid(NoClassInfo)) +                #endif // LL_LINUX  		{  			prefix << className(site.mClassInfo) << "::";  		} diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index 09812de2b8..e64ee5e081 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -179,7 +179,7 @@ namespace LLError  		{ return s; }  		// used to indicate the end of a message -	class NoClassInfo { }; +	class LL_COMMON_API NoClassInfo { };  		// used to indicate no class info known for logging     //LLCallStacks keeps track of call stacks and output the call stacks to log file diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index ad8f8632a2..8071c8aa2d 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -249,7 +249,7 @@ public:  	/////////////////////////////////////////////////////////////////////////////////////////  	// Static Utility functions that operate on std::strings -	static std::basic_string<T> null; +	static const std::basic_string<T> null;  	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;  	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims); @@ -371,7 +371,7 @@ private:  	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);  }; -template<class T> std::basic_string<T> LLStringUtilBase<T>::null; +template<class T> const std::basic_string<T> LLStringUtilBase<T>::null;  template<class T> std::string LLStringUtilBase<T>::sLocale;  typedef LLStringUtilBase<char> LLStringUtil; diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 6785d0cf17..1558df231a 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -545,15 +545,6 @@ namespace tut  		// output order  	void ErrorTestObject::test<10>()  	{ -#if LL_LINUX -        skip("Fails on Linux, see comments"); -// on Linux: -// [error, 10] fail: 'order is time type location function message: expected -// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) : -// writeReturningLocationAndFunction: apple' actual -// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) : -// LLError::NoClassInfo::writeReturningLocationAndFunction: apple'' -#endif  		LLError::setPrintLocation(true);  		LLError::setTimeFunction(roswell);  		mRecorder.setWantsTime(true); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 55dbf50fd7..d86709c448 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1101,7 +1101,7 @@ S32 LLTextBase::getLeftOffset(S32 width)  	case LLFontGL::LEFT:  		return mHPad;  	case LLFontGL::HCENTER: -		return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2; +		return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2);  	case LLFontGL::RIGHT:  		return mVisibleTextRect.getWidth() - width;  	default: @@ -1207,11 +1207,6 @@ void LLTextBase::reflow()  			// grow line height as necessary based on reported height of this segment  			line_height = llmax(line_height, segment_height);  			remaining_pixels -= segment_width; -			if (remaining_pixels < 0) -			{ -				// getNumChars() and getDimensions() should return consistent results -				remaining_pixels = 0; -			}  			seg_offset += character_count; @@ -1893,7 +1888,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  {  	// Figure out which line we're nearest to.  	LLRect visible_region = getVisibleDocumentRect(); - +	  	// binary search for line that starts before local_y  	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom()); @@ -1903,7 +1898,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  	}  	S32 pos = getLength(); -	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft; +	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;  	segment_set_t::iterator line_seg_iter;  	S32 line_seg_offset; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f87f041d6f..53af87a870 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -583,7 +583,7 @@        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>0</integer> +      <integer>180</integer>      </map>      <key>AvatarSex</key>      <map> @@ -3862,7 +3862,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>InBandwidth</key>      <map> diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 5aad295cb1..62766f9229 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -204,8 +204,8 @@ NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*				1		1  NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*				1		1  NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*				1		1  NVIDIA GeForce 7600				.*NVIDIA.*GeForce 76.*				1		1 -NVIDIA GeForce 7800				.*NVIDIA.*GeForce.*78.*				1		1 -NVIDIA GeForce 7900				.*NVIDIA.*GeForce.*79.*				1		1 +NVIDIA GeForce 7800				.*NVIDIA.*GeForce 78.*				1		1 +NVIDIA GeForce 7900				.*NVIDIA.*GeForce 79.*				1		1  NVIDIA GeForce 8100				.*NVIDIA.*GeForce 81.*				1		1  NVIDIA GeForce 8200				.*NVIDIA.*GeForce 82.*				1		1  NVIDIA GeForce 8300				.*NVIDIA.*GeForce 83.*				1		1 @@ -259,6 +259,7 @@ NVIDIA G84						.*G84.*								1		1  NVIDIA G92						.*G92.*								3		1  NVIDIA G94						.*G94.*								3		1  NVIDIA GeForce Go 6				.*GeForce Go 6.*					1		1 +NVIDIA ION						.*NVIDIA ION.*						1		1  NVIDIA NB9M						.*GeForce NB9M.*					1		1  NVIDIA NB9P						.*GeForce NB9P.*					1		1  NVIDIA GeForce PCX				.*GeForce PCX.*						0		1 diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 47f290ad3b..644363826a 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2360,7 +2360,6 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came  				mAnimationDuration = gSavedSettings.getF32("ZoomTime");  			}  		} -		setFocusGlobal(LLVector3d::zero);  	}  	else  	{ diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index e0104eddf0..d823a3cbbb 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1638,10 +1638,6 @@ LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextur  			{  				LLUUID asset_id = wearable->getAssetID();  				hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); -				if (!generate_valid_hash) -				{ -					hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); -				}  				hash_computed = true;  			}  		} @@ -1649,6 +1645,15 @@ LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextur  	if (hash_computed)  	{  		hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES); + +		// Add some garbage into the hash so that it becomes invalid. +		if (!generate_valid_hash) +		{ +			if (isAgentAvatarValid()) +			{ +				hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES); +			} +		}  		hash.finalize();  		hash.raw_digest(hash_id.mData);  	} diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e6f363028a..a899926938 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -656,15 +656,37 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  {  	if (item_id_to_wear.isNull()) return false; -	//only the item from a user's inventory is allowed -	if (!gInventory.isObjectDescendentOf(item_id_to_wear, gInventory.getRootFolderID())) return false; -  	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);  	if (!item_to_wear) return false; +	if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) +	{ +		LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace); +		copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb); +		return false; +	}  +	else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID())) +	{ +		return false; // not in library and not in agent's inventory +	} +	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH))) +	{ +		LLNotificationsUtil::add("CannotWearTrash"); +		return false; +	} +  	switch (item_to_wear->getType())  	{  	case LLAssetType::AT_CLOTHING: +		if (gAgentWearables.areWearablesLoaded()) +		{ +			S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType()); +			if ((replace && wearable_count != 0) || +				(wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) ) +			{ +				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); +			} +		}   	case LLAssetType::AT_BODYPART:  		// Don't wear anything until initial wearables are loaded, can  		// destroy clothing items. @@ -676,7 +698,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  		// Remove the existing wearables of the same type.  		// Remove existing body parts anyway because we must not be able to wear e.g. two skins. -		if (replace || item_to_wear->getType() == LLAssetType::AT_BODYPART) +		if (item_to_wear->getType() == LLAssetType::AT_BODYPART)  		{  			removeCOFLinksOfType(item_to_wear->getWearableType(), false);  		} @@ -1559,6 +1581,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  								  item_array,  								  LLInventoryModel::EXCLUDE_TRASH);  	bool linked_already = false; +	U32 count = 0;  	for (S32 i=0; i<item_array.count(); i++)  	{  		// Are these links to the same object? @@ -1576,15 +1599,21 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  		}  		// Are these links to different items of the same body part  		// type? If so, new item will replace old. -		// TODO: MULTI-WEARABLE: check for wearable limit for clothing types -		else if (is_body_part && (vitem->isWearableType()) && (vitem->getWearableType() == wearable_type)) +		else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))  		{ -			if (inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type)) +			++count; +			if (is_body_part && inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type))  			{  				gInventory.purgeObject(inv_item->getUUID());  			} +			else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) +			{ +				// MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE +				gInventory.purgeObject(inv_item->getUUID()); +			}  		}  	} +  	if (linked_already)  	{  		if (do_update) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0e63c21e16..3a9c5ba698 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -103,7 +103,6 @@ void dec_busy_count()  }  // Function declarations -void wear_add_inventory_item_on_avatar(LLInventoryItem* item);  void remove_inventory_category_from_avatar(LLInventoryCategory* category);  void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);  bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); @@ -4277,33 +4276,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,  	mInvType = inv_type;  } -// *NOTE: hack to get from avatar inventory to avatar -void wear_inventory_item_on_avatar( LLInventoryItem* item ) -{ -	if(item) -	{ -		lldebugs << "wear_inventory_item_on_avatar( " << item->getName() -				 << " )" << llendl; - -		LLAppearanceMgr::getInstance()->wearItemOnAvatar(item->getUUID(), true, false); -	} -} - -void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) -{ -	if(item) -	{ -		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() -				 << " )" << llendl; - -		LLWearableList::instance().getAsset(item->getAssetUUID(), -											item->getName(), -											item->getType(), -											LLWearableBridge::onWearAddOnAvatarArrived, -											new LLUUID(item->getUUID())); -	} -} -  void remove_inventory_category_from_avatar( LLInventoryCategory* category )  {  	if(!category) return; @@ -4619,21 +4591,7 @@ void LLWearableBridge::wearOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);  	}  } @@ -4650,21 +4608,7 @@ void LLWearableBridge::wearAddOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_add_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, false);  	}  } @@ -5189,41 +5133,7 @@ class LLWearableBridgeAction: public LLInvFVBridgeAction  public:  	virtual void doIt()  	{ -		if(isItemInTrash()) -		{ -			LLNotificationsUtil::add("CannotWearTrash"); -		} -		else if(isAgentInventory()) -		{ -			if(!get_is_item_worn(mUUID)) -			{ -				wearOnAvatar(); -			} -		} -		else -		{ -			// must be in the inventory library. copy it to our inventory -			// and put it on right away. -			LLViewerInventoryItem* item = getItem(); -			if(item && item->isFinished()) -			{ -				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -				copy_inventory_item( -					gAgent.getID(), -					item->getPermissions().getOwner(), -					item->getUUID(), -					LLUUID::null, -					std::string(), -					cb); -			} -			else if(item) -			{ -				// *TODO: We should fetch the item details, and then do -				// the operation above. -				LLNotificationsUtil::add("CannotWearInfoNotComplete"); -			} -		} -		LLInvFVBridgeAction::doIt(); +		wearOnAvatar();  	}  	virtual ~LLWearableBridgeAction(){}  protected: @@ -5262,21 +5172,7 @@ void LLWearableBridgeAction::wearOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);  	}  } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 310fd7fb1d..a342a2da14 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -591,8 +591,6 @@ public:  		U32 flags = 0x00) const;  }; -void wear_inventory_item_on_avatar(LLInventoryItem* item); -  void rez_attachment(LLViewerInventoryItem* item,   					LLViewerJointAttachment* attachment); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 2e1c5238d3..6fc5804a48 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -35,6 +35,7 @@  #include "llagent.h"  #include "llagentwearables.h" +#include "llappearancemgr.h"  #include "llinventorypanel.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" @@ -2561,7 +2562,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)  		{  			LLViewerInventoryItem* wearable_item;  			wearable_item = gInventory.getItem(wearable_ids[i]); -			wear_inventory_item_on_avatar(wearable_item); +			LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);  		}  	} diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index d605d4430e..d09f729943 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -72,7 +72,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)  // public  void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, -								 BOOL enabled, std::string& suffix) +								 BOOL enabled, const std::string& suffix)  {  	//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; @@ -268,7 +268,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p  LLScrollListItem* LLNameListCtrl::addNameItemRow(  	const LLNameListCtrl::NameItem& name_item,  	EAddPosition pos, -	std::string& suffix) +	const std::string& suffix)  {  	LLUUID id = name_item.value().asUUID();  	LLNameListItem* item = NULL; diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 1c26ee5db4..ee71db7540 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -90,11 +90,11 @@ public:  	// Add a user to the list by name.  It will be added, the name   	// requested from the cache, and updated as necessary.  	void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, -					 BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null); +					 BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);  	void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);  	/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); -	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null); +	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);  	// Add a user to the list by name.  It will be added, the name   	// requested from the cache, and updated as necessary. diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 8d0e3d4647..a1a9300ec2 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -51,6 +51,7 @@  #include "llagentwearables.h"  #include "llscrollingpanelparam.h"  #include "llradiogroup.h" +#include "llnotificationsutil.h"  #include "llcolorswatch.h"  #include "lltexturectrl.h" @@ -624,6 +625,7 @@ BOOL LLPanelEditWearable::postBuild()  	mDescTitle = getChild<LLTextBox>("description_text");  	getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); +	getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));  	// The following panels will be shown/hidden based on what wearable we're editing  	// body parts @@ -744,6 +746,28 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)  	panel->revertChanges();  } +void LLPanelEditWearable::onSaveAsButtonClicked() +{ +	LLSD args; +	args["DESC"] = mTextEditor->getText(); + +	LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); +} + +void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (0 == option) +	{ +		std::string wearable_name = response["message"].asString(); +		LLStringUtil::trim(wearable_name); +		if( !wearable_name.empty() ) +		{ +			mTextEditor->setText(wearable_name); +			saveChanges(); +		} +	} +}  void LLPanelEditWearable::onCommitSexChange()  { @@ -991,8 +1015,14 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)  			// storage for ordered list of visual params  			value_map_t sorted_params;  			getSortedParams(sorted_params, edit_group); -	 -			buildParamList(panel_list, sorted_params, tab); + +			LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); +			if (!jointp) +			{ +				jointp = gAgentAvatarp->getJoint("mHead"); +			} + +			buildParamList(panel_list, sorted_params, tab, jointp);  			updateScrollingPanelUI();  		} @@ -1229,7 +1259,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std:  	}  } -void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab) +void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp)  {  	// sorted_params is sorted according to magnitude of effect from  	// least to greatest.  Adding to the front of the child list @@ -1243,7 +1273,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value  		{  			LLPanel::Params p;  			p.name("LLScrollingPanelParam"); -			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable()); +			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);  			height = panel_list->addPanel( panel_param );  		}  	} diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 6b376fe3d9..54f729fa7a 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -48,6 +48,7 @@ class LLViewerVisualParam;  class LLVisualParamHint;  class LLViewerJointMesh;  class LLAccordionCtrlTab; +class LLJoint;  class LLPanelEditWearable : public LLPanel  { @@ -72,6 +73,8 @@ public:  	static void			onRevertButtonClicked(void* userdata);  	void				onCommitSexChange(); +	void				onSaveAsButtonClicked(); +	void				saveAsCallback(const LLSD& notification, const LLSD& response);  private: @@ -81,7 +84,7 @@ private:  	void				updateScrollingPanelUI();  	LLPanel*			getPanel(LLWearableType::EType type);  	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group); -	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab); +	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp);  	// update bottom bar buttons ("Save", "Revert", etc)  	void				updateVerbs(); diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 242af6981c..6f5238f0a1 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -56,7 +56,7 @@ const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128;  S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;  LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params, -											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ) +											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp )  	: LLScrollingPanel( panel_params ),  	  mParam(param),  	  mAllowModify(allow_modify), @@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param  	F32 min_weight = param->getMinWeight();  	F32 max_weight = param->getMaxWeight(); -	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight); +	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight, jointp);  	pos_x = getChild<LLViewBorder>("right_border")->getRect().mLeft + left_border->getBorderWidth(); -	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight ); +	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight, jointp );  	mHintMin->setAllowsUpdates( FALSE );  	mHintMax->setAllowsUpdates( FALSE ); diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index fe4ce07166..3cdfd188a8 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -42,12 +42,13 @@ class LLViewerVisualParam;  class LLWearable;  class LLVisualParamHint;  class LLViewerVisualParam; +class LLJoint;  class LLScrollingPanelParam : public LLScrollingPanel  {  public:  	LLScrollingPanelParam( const LLPanel::Params& panel_params, -						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ); +						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp );  	virtual ~LLScrollingPanelParam();  	virtual void		draw(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index ef7286b7b4..e23643da0b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -189,7 +189,7 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  	{  		if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible()))  		{ -			if (!gAgentCamera.cameraCustomizeAvatar()) +			if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))  			{  				gAgentCamera.changeCameraToCustomizeAvatar();  			} @@ -197,9 +197,10 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  	}  	else  	{ -		if (gAgentCamera.cameraCustomizeAvatar()) +		if (gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))  		{  			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView();  		}  	}  } @@ -325,6 +326,7 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  	else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )  	{  		gAgentCamera.changeCameraToDefault(); +		gAgentCamera.resetView();  	}  } @@ -364,6 +366,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )  		{  			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView();  		}  	}  } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 5628205dd4..ac419d8dc7 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -394,18 +394,21 @@ void LLStatusBar::setBalance(S32 balance)  {  	std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); -	LLButton* btn_buy_currency = getChild<LLButton>("buycurrency"); +	LLTextBox* balance_box = getChild<LLTextBox>("balance");  	LLStringUtil::format_map_t string_args;  	string_args["[AMT]"] = llformat("%s", money_str.c_str());  	std::string label_str = getString("buycurrencylabel", string_args); -	btn_buy_currency->setLabel(label_str); +	balance_box->setValue(label_str); -	// Resize the balance button so that the label fits it, and the button expands to the left. -	// *TODO: LLButton should have an option where to expand. +	// Resize the L$ balance background to be wide enough for your balance plus the buy button  	{ -		S32 saved_right = btn_buy_currency->getRect().mRight; -		btn_buy_currency->autoResize(); -		btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0); +		const S32 HPAD = 24; +		LLRect balance_rect = balance_box->getTextBoundingRect(); +		LLRect buy_rect = getChildView("buyL")->getRect(); +		LLView* balance_bg_view = getChildView("balance_bg"); +		LLRect balance_bg_rect = balance_bg_view->getRect(); +		balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD); +		balance_bg_view->setShape(balance_bg_rect);  	}  	if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 1d74a7be8c..d001d692a3 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -165,6 +165,7 @@ void LLTexLayerSetBuffer::dumpTotalByteCount()  void LLTexLayerSetBuffer::requestUpdate()  { +	conditionalRestartUploadTimer();  	mNeedsUpdate = TRUE;  	// If we're in the middle of uploading a baked texture, we don't care about it any more.  	// When it's downloaded, ignore it. @@ -173,17 +174,26 @@ void LLTexLayerSetBuffer::requestUpdate()  void LLTexLayerSetBuffer::requestUpload()  { +	conditionalRestartUploadTimer(); +	mNeedsUpload = TRUE; +	mNumLowresUploads = 0; +	mUploadPending = TRUE; +} + +void LLTexLayerSetBuffer::conditionalRestartUploadTimer() +{  	// If we requested a new upload but haven't even uploaded  	// a low res version of our last upload request, then  	// keep the timer ticking instead of resetting it.  	if (mNeedsUpload && (mNumLowresUploads == 0))  	{ +		mNeedsUploadTimer.unpause(); +	} +	else +	{  		mNeedsUploadTimer.reset(); +		mNeedsUploadTimer.start();  	} -	mNeedsUpload = TRUE; -	mNumLowresUploads = 0; -	mUploadPending = TRUE; -	mNeedsUploadTimer.unpause();  }  void LLTexLayerSetBuffer::cancelUpload() @@ -307,11 +317,26 @@ BOOL LLTexLayerSetBuffer::render()  	return success;  } -bool LLTexLayerSetBuffer::isInitialized(void) const +BOOL LLTexLayerSetBuffer::isInitialized(void) const  {  	return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();  } +BOOL LLTexLayerSetBuffer::uploadPending() const +{ +	return mUploadPending; +} + +BOOL LLTexLayerSetBuffer::uploadNeeded() const +{ +	return mNeedsUpload; +} + +BOOL LLTexLayerSetBuffer::uploadInProgress() const +{ +	return !mUploadID.isNull(); +} +  BOOL LLTexLayerSetBuffer::isReadyToUpload() const  {  	if (!mNeedsUpload) return FALSE; // Don't need to upload if we haven't requested one. @@ -2277,10 +2302,15 @@ const std::string LLTexLayerSetBuffer::dumpTextureInfo() const  	const BOOL is_high_res = !mNeedsUpload;  	const U32 num_low_res = mNumLowresUploads;  	const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); -	const BOOL is_uploaded = !mUploadPending;  	const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet); -	std::string text = llformat("[ HiRes:%d LoRes:%d Uploaded:%d ] [ Timer:%d ] %s", -								is_high_res, num_low_res, is_uploaded, + +	std::string status 				= "CREATING "; +	if (!uploadNeeded()) status 	= "DONE     "; +	if (uploadInProgress()) status 	= "UPLOADING"; + +	std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", +								status.c_str(), +								is_high_res, num_low_res,  								upload_time,   								local_texture_info.c_str());  	return text; diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 2ee609fe60..cb2e1faaa6 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -275,12 +275,16 @@ public:  	virtual void			postRender(BOOL success);  	virtual BOOL			render();  	BOOL					updateImmediate(); -	bool					isInitialized(void) const; + +	BOOL					isInitialized(void) const; +	BOOL					uploadPending() const; // We are expecting a new texture to be uploaded at some point +	BOOL					uploadNeeded() const; // We need to upload a new texture +	BOOL					uploadInProgress() const; // We have started uploading a new texture and are awaiting the result +  	/*virtual*/ BOOL		needsRender();  	void					requestUpdate();  	void					requestUpload();  	void					cancelUpload(); -	BOOL					uploadPending() const { return mUploadPending; }  	BOOL					render(S32 x, S32 y, S32 width, S32 height);  	void					readBackAndUpload();  	static void				onTextureUploadComplete(const LLUUID& uuid, @@ -290,15 +294,19 @@ public:  	const std::string		dumpTextureInfo() const;  	virtual void 			restoreGLTexture();  	virtual void 			destroyGLTexture(); + +  protected:  	void					pushProjection() const;  	void					popProjection() const;  	BOOL					isReadyToUpload() const; +	void					conditionalRestartUploadTimer(); +	  private:  	LLTexLayerSet* const    mTexLayerSet;  	BOOL					mNeedsUpdate; // whether we need to update our baked textures  	BOOL					mNeedsUpload; // whether we need to send our baked textures to the server -	U32						mNumLowresUploads; // mumber of times we've sent a lowres version of our baked textures to the server +	U32						mNumLowresUploads; // number of times we've sent a lowres version of our baked textures to the server  	BOOL					mUploadPending; // whether we have received back the new baked textures  	LLUUID					mUploadID; // the current upload process (null if none).  Used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.  	static S32				sGLByteCount; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index cf3bce2ec1..74b7f123d8 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -753,17 +753,22 @@ bool LLTextureFetchWorker::doWork(S32 param)  			if (region)  			{ -				std::string http_url = region->getCapability("GetTexture"); +				std::string http_url = region->getHttpUrl() ;  				if (!http_url.empty())  				{  					mUrl = http_url + "/?texture_id=" + mID.asString().c_str();  					mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.  				} +				else +				{ +					mCanUseHTTP = false ; +				}  			}  			else  			{  				// This will happen if not logged in or if a region deoes not have HTTP Texture enabled  				//llwarns << "Region not found for host: " << mHost << llendl; +				mCanUseHTTP = false;  			}  		}  		if (mCanUseHTTP && !mUrl.empty()) diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 377449cc8b..8ea4dbeb04 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -418,10 +418,10 @@ void LLAvatarTexBar::draw()  	const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);  	const S32 v_offset = 0; +	const S32 l_offset = 3;  	//----------------------------------------------------------------------------  	LLGLSUIDefault gls_ui; -	LLColor4 text_color(1.f, 1.f, 1.f, 1.f);  	LLColor4 color;  	U32 line_num = 1; @@ -434,19 +434,36 @@ void LLAvatarTexBar::draw()  		if (!layerset) continue;  		const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();  		if (!layerset_buffer) continue; + +		LLColor4 text_color = LLColor4::white; +		 +		if (layerset_buffer->uploadNeeded()) +		{ +			text_color = LLColor4::red; +		} + 		if (layerset_buffer->uploadInProgress()) +		{ +			text_color = LLColor4::magenta; +		}  		std::string text = layerset_buffer->dumpTextureInfo(); -		LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*line_num, +		LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num,  												 text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);  		line_num++;  	}  	const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureTimeout");  	const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); +	LLColor4 header_color(1.f, 1.f, 1.f, 0.9f); +  	const std::string texture_timeout_str = texture_timeout ? llformat("%d",texture_timeout) : "Disabled";  	const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled";  	std::string header_text = llformat("[ Timeout('AvatarBakedTextureTimeout'):%s ] [ LOD_Override('TextureDiscardLevel'):%s ]", texture_timeout_str.c_str(), override_tex_discard_level_str.c_str()); -	LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, 0, v_offset + line_height*line_num, -											 text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); +	LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num, +											 header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); +	line_num++; +	std::string section_text = "Avatar Textures Information:"; +	LLFontGL::getFontMonospace()->renderUTF8(section_text, 0, 0, v_offset + line_height*line_num, +											 header_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);  }  BOOL LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask) @@ -457,7 +474,7 @@ BOOL LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask)  LLRect LLAvatarTexBar::getRequiredRect()  {  	LLRect rect; -	rect.mTop = 85; +	rect.mTop = 100;  	if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) rect.mTop = 0;  	return rect;  } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index bc77ac5fd1..c862c02b82 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1878,24 +1878,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(  				LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");  				return ACCEPT_NO;  			} - -			if (mSource == SOURCE_LIBRARY) -			{ -				// create item based on that one, and put it on if that -				// was a success. -				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -				copy_inventory_item( -					gAgent.getID(), -					item->getPermissions().getOwner(), -					item->getUUID(), -					LLUUID::null, -					std::string(), -					cb); -			} -			else -			{ -				wear_inventory_item_on_avatar( item ); -			} +			LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(),true, !(mask & MASK_CONTROL));  		}  		return ACCEPT_YES_MULTI;  	} diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index c1dc1de5e5..8996157258 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -79,7 +79,8 @@ LLVisualParamHint::LLVisualParamHint(  	LLViewerJointMesh *mesh,   	LLViewerVisualParam *param,  	LLWearable *wearable, -	F32 param_weight) +	F32 param_weight, +	LLJoint* jointp)  	:  	LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),  	mNeedsUpdate( TRUE ), @@ -91,12 +92,12 @@ LLVisualParamHint::LLVisualParamHint(  	mAllowsUpdates( TRUE ),  	mDelayFrames( 0 ),  	mRect( pos_x, pos_y + height, pos_x + width, pos_y ), -	mLastParamWeight(0.f) +	mLastParamWeight(0.f), +	mCamTargetJoint(jointp)  {  	LLVisualParamHint::sInstances.insert( this );  	mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.j2c"); -  	llassert(width != 0);  	llassert(height != 0);  } @@ -196,21 +197,6 @@ BOOL LLVisualParamHint::render()  	mNeedsUpdate = FALSE;  	mIsVisible = TRUE; -	LLViewerJointMesh* cam_target_joint = NULL; -	const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName(); -	if( !cam_target_mesh_name.empty() ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint( cam_target_mesh_name ); -	} -	if( !cam_target_joint ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint(); -	} -	if( !cam_target_joint ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint("mHead"); -	} -  	LLQuaternion avatar_rotation;  	LLJoint* root_joint = gAgentAvatarp->getRootJoint();  	if( root_joint ) @@ -218,7 +204,7 @@ BOOL LLVisualParamHint::render()  		avatar_rotation = root_joint->getWorldRotation();  	} -	LLVector3 target_joint_pos = cam_target_joint->getWorldPosition(); +	LLVector3 target_joint_pos = mCamTargetJoint->getWorldPosition();  	LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() );  	LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation); @@ -234,9 +220,9 @@ BOOL LLVisualParamHint::render()  	LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight);  	LLViewerCamera::getInstance()->setOriginAndLookAt( -		camera_pos,		// camera -		LLVector3(0.f, 0.f, 1.f),						// up -		target_pos );	// point of interest +		camera_pos,			// camera +		LLVector3::z_axis,	// up +		target_pos );		// point of interest  	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index 3bffefaa55..cbab5e765f 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -47,6 +47,7 @@  class LLViewerJointMesh;  class LLPolyMesh;  class LLViewerObject; +class LLJoint;  //-----------------------------------------------------------------------------  // LLVisualParamHint @@ -63,7 +64,8 @@ public:  		LLViewerJointMesh *mesh,   		LLViewerVisualParam *param,  		LLWearable *wearable, -		F32 param_weight);	 +		F32 param_weight,  +		LLJoint* jointp);	  	/*virtual*/ S8 getType() const ; @@ -96,6 +98,7 @@ protected:  	S32						mDelayFrames;		// updates are blocked for this many frames  	LLRect					mRect;  	F32						mLastParamWeight; +	LLJoint*				mCamTargetJoint;	// joint to target with preview camera  	LLUIImagePtr mBackgroundp; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d745356dcd..face7124c2 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -875,7 +875,7 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)  	LLViewerInventoryItem *item = gInventory.getItem(inv_item);  	if (item)  	{ -		wear_inventory_item_on_avatar(item); +		LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace);  	}  } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 8ab7c9710d..d0d3ad693e 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -243,7 +243,13 @@ public:  class WearOnAvatarCallback : public LLInventoryCallback  { +public: +	WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {} +	  	void fire(const LLUUID& inv_item); + +protected: +	bool mReplace;  };  class ModifiedCOFCallback : public LLInventoryCallback diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a1b909c609..2c7ae539ce 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7495,10 +7495,13 @@ class LLEditTakeOff : public view_listener_t  		else  		{  			LLWearableType::EType type = LLWearableType::typeNameToType(clothing); -			if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) +			if (type >= LLWearableType::WT_SHAPE  +				&& type < LLWearableType::WT_COUNT +				&& (gAgentWearables.getWearableCount(type) > 0))  			{ -				// MULTI-WEARABLES -				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0)); +				// MULTI-WEARABLES: assuming user wanted to remove top shirt. +				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; +				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index));  				LLWearableBridge::removeItemFromAvatar(item);  			} diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c48668df9a..da240cedbb 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -216,6 +216,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mColoName("unknown"),  	mProductSKU("unknown"),  	mProductName("unknown"), +	mHttpUrl(""),  	mCacheLoaded(FALSE),  	mCacheEntriesCount(0),  	mCacheID(), @@ -1555,6 +1556,10 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u  	else  	{  		mCapabilities[name] = url; +		if(name == "GetTexture") +		{ +			mHttpUrl = url ; +		}  	}  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 5c4d5a61fd..a9e7ef771c 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -291,6 +291,7 @@ public:  	friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion);      /// implements LLCapabilityProvider      virtual std::string getDescription() const; +	std::string getHttpUrl() const { return mHttpUrl ;}  	LLSpatialPartition* getSpatialPartition(U32 type);  public: @@ -383,6 +384,7 @@ private:  	std::string mColoName;  	std::string mProductSKU;  	std::string mProductName; +	std::string mHttpUrl ;  	// Maps local ids to cache entries. diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index d8a9ce9374..7e779986df 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1447,8 +1447,14 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)  //virtual  void LLViewerFetchedTexture::processTextureStats()  { -	if(mFullyLoaded)//already loaded +	if(mFullyLoaded)  	{ +		if(mDesiredDiscardLevel <= mMinDesiredDiscardLevel)//already loaded +		{ +			return ; +		} +		mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; +		mFullyLoaded = FALSE ;  		return ;  	} @@ -1482,6 +1488,7 @@ void LLViewerFetchedTexture::processTextureStats()  			mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,   					                             log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;  			mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; +			mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;  		}  		mKnownDrawSizeChanged = FALSE ; @@ -1514,7 +1521,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	}  	if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture  	{ -		return -4.0f ; //alreay fetched +		return -1.0f ; //alreay fetched  	}  	S32 cur_discard = getCurrentDiscardLevelForFetching(); @@ -1528,16 +1535,16 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	}  	else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1)  	{ -		priority = -1.0f ; +		priority = -2.0f ;  	}  	else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel)  	{ -		priority = -1.0f; +		priority = -3.0f;  	}  	else if (mDesiredDiscardLevel > getMaxDiscardLevel())  	{  		// Don't decode anything we don't need -		priority = -1.0f; +		priority = -4.0f;  	}  	else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)  	{ @@ -1551,9 +1558,14 @@ 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 = -1.f; //stop fetching +			priority = -5.f; //stop fetching  		}  	}  	else if (cur_discard < 0) @@ -1569,7 +1581,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))  	{  		// larger mips are corrupted -		priority = -3.0f; +		priority = -6.0f;  	}  	else  	{ @@ -2052,10 +2064,13 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()  	bool run_raw_callbacks = false;  	bool need_readback = false; +	mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;  	for(callback_list_t::iterator iter = mLoadedCallbackList.begin();  		iter != mLoadedCallbackList.end(); )  	{  		LLLoadedCallbackEntry *entryp = *iter++; +		mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ; +  		if (entryp->mNeedsImageRaw)  		{  			if (mNeedsAux) @@ -2187,6 +2202,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()  	if (mLoadedCallbackList.empty())  	{  		gTextureList.mCallbackList.erase(this); +		mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;  	}  	// Done with any raw image data at this point (will be re-created if we still have callbacks) diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp index 422e530dc6..1dc09a64ac 100644 --- a/indra/newview/llviewervisualparam.cpp +++ b/indra/newview/llviewervisualparam.cpp @@ -99,8 +99,6 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)  	node->getFastAttributeF32( camera_angle_string, mCamAngle );	// in degrees  	static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation");  	node->getFastAttributeF32( camera_elevation_string, mCamElevation ); -	static LLStdStringHandle camera_target_string = LLXmlTree::addAttributeString("camera_target"); -	node->getFastAttributeString( camera_target_string, mCamTargetName );  	mCamAngle += 180; diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h index 1a3975eb99..f38c01fa6c 100644 --- a/indra/newview/llviewervisualparam.h +++ b/indra/newview/llviewervisualparam.h @@ -60,7 +60,6 @@ protected:  	F32			mCamDist;  	F32			mCamAngle;		// degrees  	F32			mCamElevation; -	std::string	mCamTargetName;  	F32			mEditGroupDisplayOrder;  	BOOL		mShowSimple;	// show edit controls when in "simple ui" mode?  	F32			mSimpleMin;		// when in simple UI, apply this minimum, range 0.f to 100.f @@ -104,7 +103,6 @@ public:  	F32					getCameraDistance()	const	{ return getInfo()->mCamDist; }   	F32					getCameraAngle() const		{ return getInfo()->mCamAngle; }  // degrees  	F32					getCameraElevation() const	{ return getInfo()->mCamElevation; }  -	const std::string&	getCameraTargetName() const { return getInfo()->mCamTargetName; }  	BOOL				getShowSimple() const		{ return getInfo()->mShowSimple; }  	F32					getSimpleMin() const		{ return getInfo()->mSimpleMin; } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 462c442954..2722646eff 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1273,7 +1273,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)  //-----------------------------------------------------------------------------  BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const  { -	const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); +	//const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  +	const U32 desired_tex_discard_level = 0; // SERAPH hack to not bake textures on lower discard levels.  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ @@ -1289,7 +1290,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ -					if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(override_tex_discard_level)) +					if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level))  					{  						return FALSE;  					} @@ -1304,7 +1305,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons  BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  { -	const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); +	// const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  +	const U32 desired_tex_discard_level = 0; // SERAPH hack to not bake textures on lower discard levels  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ @@ -1318,7 +1320,7 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  			const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  			for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  			{ -				if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(override_tex_discard_level)) +				if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level))  				{  					return FALSE;  				} @@ -1882,7 +1884,7 @@ const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayer  		if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)  		{  			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; -			text += llformat("[%d] '%s' ( ",baked_index, baked_dict->mName.c_str()); +			text += llformat("%d-%s ( ",baked_index, baked_dict->mName.c_str());  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter) @@ -1975,37 +1977,47 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  		 ++iter)  	{  		const ETextureIndex t_index = (*iter); -		lldebugs << "Checking index " << (U32) t_index << llendl; -		// MULTI-WEARABLE: old method. replace. -		const LLUUID& texture_id = getTEImage( t_index )->getID(); -		if (texture_id != IMG_DEFAULT_AVATAR) -		{ -			// Search inventory for this texture. -			LLViewerInventoryCategory::cat_array_t cats; -			LLViewerInventoryItem::item_array_t items; -			LLAssetIDMatches asset_id_matches(texture_id); -			gInventory.collectDescendentsIf(LLUUID::null, -											cats, -											items, -											LLInventoryModel::INCLUDE_TRASH, -											asset_id_matches); - -			BOOL can_grab = FALSE; -			lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; -			if (items.count()) +		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index); +		U32 count = gAgentWearables.getWearableCount(wearable_type); +		lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl; +		 +		for (U32 wearable_index = 0; wearable_index < count; ++wearable_index) +		{ +			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index); +			if (wearable)  			{ -				// search for full permissions version -				for (S32 i = 0; i < items.count(); i++) +				const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index); +				const LLUUID& texture_id = texture->getID(); +				if (texture_id != IMG_DEFAULT_AVATAR)  				{ -					LLViewerInventoryItem* itemp = items[i]; -                                        if (itemp->getIsFullPerm()) +					// Search inventory for this texture. +					LLViewerInventoryCategory::cat_array_t cats; +					LLViewerInventoryItem::item_array_t items; +					LLAssetIDMatches asset_id_matches(texture_id); +					gInventory.collectDescendentsIf(LLUUID::null, +													cats, +													items, +													LLInventoryModel::INCLUDE_TRASH, +													asset_id_matches); + +					BOOL can_grab = FALSE; +					lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; +					if (items.count())  					{ -						can_grab = TRUE; -						break; +						// search for full permissions version +						for (S32 i = 0; i < items.count(); i++) +						{ +							LLViewerInventoryItem* itemp = items[i]; +												if (itemp->getIsFullPerm()) +							{ +								can_grab = TRUE; +								break; +							} +						}  					} +					if (!can_grab) return FALSE;  				}  			} -			if (!can_grab) return FALSE;  		}  	} diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 9e9b46473e..121e691710 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -656,7 +656,7 @@ void LLWearable::writeToAvatar()  				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);  			}  			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); -			// MULTI-WEARABLE: replace hard-coded 0 +			// MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this.  			gAgentAvatarp->setLocalTextureTE(te, image, 0);  		}  	} diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index edee30c2ed..6c410cf7a5 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -534,11 +534,13 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  	const uuid_vec_t& ids = mUUIDs;		// selected items IDs  	LLUUID selected_id = ids.front();	// ID of the first selected item -	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false); +	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, true); +	functor_t add = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false);  	functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);  	// Register handlers common for all wearable types.  	registrar.add("Wearable.Wear", boost::bind(handleMultiple, wear, ids)); +	registrar.add("Wearable.Add", boost::bind(handleMultiple, add, ids));  	registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));  	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));  	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tgaBinary files differ index 545b8e532c..d0134fa5fe 100644 --- a/indra/newview/skins/default/textures/map_infohub.tga +++ b/indra/newview/skins/default/textures/map_infohub.tga diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index cee5f5cbca..85ccf0f564 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -669,7 +669,7 @@ with the same filename but different name    <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />    <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> -  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="120" scale.bottom="2"/> +  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>    <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>    <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>    <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> diff --git a/indra/newview/skins/default/textures/widgets/buy_off.png b/indra/newview/skins/default/textures/widgets/buy_off.pngBinary files differ index 961ad071d4..ee5979046f 100644 --- a/indra/newview/skins/default/textures/widgets/buy_off.png +++ b/indra/newview/skins/default/textures/widgets/buy_off.png diff --git a/indra/newview/skins/default/textures/widgets/buy_over.png b/indra/newview/skins/default/textures/widgets/buy_over.pngBinary files differ index 0be19f8a31..93adb68c86 100644 --- a/indra/newview/skins/default/textures/widgets/buy_over.png +++ b/indra/newview/skins/default/textures/widgets/buy_over.png diff --git a/indra/newview/skins/default/textures/widgets/buy_press.png b/indra/newview/skins/default/textures/widgets/buy_press.pngBinary files differ index d6f587464d..3f442d6eaa 100644 --- a/indra/newview/skins/default/textures/widgets/buy_press.png +++ b/indra/newview/skins/default/textures/widgets/buy_press.png diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml index 970491b41f..f6ee78fa6d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml @@ -126,9 +126,6 @@ gennemført.  	<floater.string name="no_parcel_selected">  		(intet parcel er valgt)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml index 5708a3f80a..5369155cf9 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml @@ -124,9 +124,6 @@ unterstützt [AMOUNT2] Objekte  	<floater.string name="no_parcel_selected">  		(keine Parzelle ausgewählt)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml index 9cef7b6d35..10cf34c170 100644 --- a/indra/newview/skins/default/xui/de/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="Hinten"/>  	<text name="title" value="Ortsprofil"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml index ed1421aa60..9d1a582b7c 100644 --- a/indra/newview/skins/default/xui/de/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="Hinten"/>  	<text name="title" value="Ortsprofil"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index df44b61632..acaa508792 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -174,12 +174,15 @@ supports [AMOUNT2] objects      </floater.string>      <floater.string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark"/>      <floater.string       name="icon_M" +     translate="false"       value="Parcel_M_Dark"/>      <floater.string       name="icon_R" +     translate="false"       value="Parcel_R_Dark"/>      <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 11459ad0e6..221457ac1f 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -662,6 +662,14 @@           parameter="wear" />      </menu_item_call>      <menu_item_call +     label="Add" +     layout="topleft" +     name="Wearable Add"> +        <menu_item_call.on_click +         function="Inventory.DoToSelected" +         parameter="wear_add" /> +    </menu_item_call> +    <menu_item_call       label="Take Off"       layout="topleft"       name="Take Off"> 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 e645702f93..fa5ca60a19 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 @@ -9,6 +9,13 @@           function="Wearable.Wear" />      </menu_item_call>      <menu_item_call +     label="Add" +     layout="topleft" +     name="wear_add"> +        <on_click +         function="Wearable.Add" /> +    </menu_item_call> +    <menu_item_call       label="Take Off / Detach"       layout="topleft"       name="take_off_or_detach"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 5ead756d20..9af358eff3 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2069,6 +2069,29 @@ Would you be my friend?    </notification>    <notification + icon="alertmodal.tga" + label="Save Wearable" + name="SaveWearableAs" + type="alertmodal"> +    Save item to my inventory as: +    <form name="form"> +      <input name="message" type="text"> +        [DESC] (new) +      </input> +      <button +       default="true" +       index="0" +       name="Offer" +       text="OK"/> +      <button +       index="1" +       name="Cancel" +       text="Cancel"/> +    </form> +  </notification> + + +  <notification     icon="alertmodal.tga"     label="Rename Outfit"     name="RenameOutfit" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 25674a1a39..bb73360e0b 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -46,12 +46,15 @@      <!-- Texture names for rating icons -->      <string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark" />      <string       name="icon_M" +     translate="false"       value="Parcel_M_Dark" />      <string       name="icon_R" +     translate="false"       value="Parcel_R_Dark" />      <button       follows="top|right" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index c6ac7ac862..59f1f6d638 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -95,48 +95,63 @@      <!-- Texture names for parcel permissions icons -->      <string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark" />      <string       name="icon_M" +     translate="false"       value="Parcel_M_Dark" />      <string       name="icon_R" +     translate="false"       value="Parcel_R_Dark" />      <string       name="icon_Voice" +     translate="false"       value="Parcel_Voice_Dark" />      <string       name="icon_VoiceNo" +     translate="false"       value="Parcel_VoiceNo_Dark" />      <string       name="icon_Fly" +     translate="false"       value="Parcel_Fly_Dark" />      <string       name="icon_FlyNo" +     translate="false"       value="Parcel_FlyNo_Dark" />      <string       name="icon_Push" +     translate="false"       value="Parcel_Push_Dark" />      <string       name="icon_PushNo" +     translate="false"       value="Parcel_PushNo_Dark" />      <string       name="icon_Build" +     translate="false"       value="Parcel_Build_Dark" />      <string       name="icon_BuildNo" +     translate="false"       value="Parcel_BuildNo_Dark" />      <string       name="icon_Scripts" +     translate="false"       value="Parcel_Scripts_Dark" />      <string       name="icon_ScriptsNo" +     translate="false"       value="Parcel_ScriptsNo_Dark" />      <string       name="icon_Damage" +     translate="false"       value="Parcel_Damage_Dark" />      <string       name="icon_DamageNo" +     translate="false"       value="Parcel_DamageNo_Dark" />      <button       follows="top|right" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 008aa1acc0..43513e1ab6 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -41,32 +41,35 @@       name="buycurrencylabel">          L$ [AMT]      </panel.string> -    <button +  <panel +    height="18" +    left="-315" +    width="95" +    top="1" +    follows="right|top"  +    name="balance_bg"  +    bg_visible="true" +    background_opaque="true"  +    bg_opaque_image="bevel_background"> +    <text       auto_resize="true"       halign="center" -	 enabled="false"       font="SansSerifSmall" -     follows="right|top" -     image_overlay="" -     image_selected="bevel_background" -     image_unselected="bevel_background" -     image_pressed="bevel_background" +     follows="all"       height="18" -     right="-275" -     label_shadow="false" -     name="buycurrency" -     label_color_disabled="ButtonLabelColor" -     image_color_disabled="White" +     left="0"  +     name="balance"       tool_tip="My Balance" -     pad_left="12" -     pad_right="12"  +     v_pad="4"       top="0" +     wrap="false"  +     value="L$20"        width="40" />      <button       auto_resize="true"       halign="center"       font="SansSerifSmall" -     follows="right|top" +     follows="right|top|bottom"       image_hover_unselected="buy_over"       image_unselected="buy_off"       image_pressed="buy_press" @@ -81,6 +84,7 @@       tool_tip="Click to buy more L$"       top="0"       width="55" /> +  </panel>      <text       type="string"       font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml index a40f65d5d0..74243a4d06 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml @@ -126,9 +126,6 @@ para cubrir esta parcela.  	<floater.string name="no_parcel_selected">  		(No se ha seleccionado una parcela)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Región:  	</text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml index 7c9a31a4c3..b7f8f36f81 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml @@ -124,9 +124,6 @@ prend en charge [AMOUNT2] objets  	<floater.string name="no_parcel_selected">  		(aucune parcelle sélectionnée)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Région :  	</text> diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml index 4001616034..bd29bd676c 100644 --- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="Précédent"/>  	<text name="title" value="Profil du lieu"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml index 598e94166e..731e045019 100644 --- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="Précédent"/>  	<text name="title" value="Profil du lieu"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml index 2e78168209..f3b30f7048 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml @@ -124,9 +124,6 @@ consente [AMOUNT2] oggetti  	<floater.string name="no_parcel_selected">  		(nessun terreno selezionato)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Regione:  	</text> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml index a274e25326..34f9d38de1 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml @@ -124,9 +124,6 @@  	<floater.string name="no_parcel_selected">  		(区画が選定されていません)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		地域:  	</text> diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml index 87477c2651..7fca66f90f 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="戻る"/>  	<text name="title" value="場所のプロフィール"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml index 9de04f0d6a..b897e1d748 100644 --- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="戻る"/>  	<text name="title" value="場所のプロフィール"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml index 3d01129d9b..7b4f459b4e 100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml @@ -125,9 +125,6 @@ używanie Posiadłości żeby sfinalizować ten zakup.  	<floater.string name="no_parcel_selected">  		(Posiadłość nie została wybrana)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml index 73b483acf2..5c5ee3b7a0 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml @@ -124,9 +124,6 @@ contribuídas para cobrir este lote antes da aquisição se completar.  	<floater.string name="no_parcel_selected">  		(nenhum lote selecionado)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Região:  	</text> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c887097575..8c089c0b79 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -355,7 +355,6 @@ class WindowsManifest(ViewerManifest):                  self.path("qtwebkitd4.dll")                  self.path("qtxmlpatternsd4.dll")                  self.path("ssleay32.dll") -                self.path("winmm.dll")                  # For WebKit/Qt plugin runtimes (image format plugins)                  if self.prefix(src="imageformats", dst="imageformats"): | 
