diff options
| author | Eric M. Tulla (BigPapi) <tulla@lindenlab.com> | 2009-11-13 20:34:55 -0500 | 
|---|---|---|
| committer | Eric M. Tulla (BigPapi) <tulla@lindenlab.com> | 2009-11-13 20:34:55 -0500 | 
| commit | cd9c5e5d7062277d34653e19429c2bf3774f9ac9 (patch) | |
| tree | 52873a33ea923e135da1e4e7918320d459ee4dad /indra/newview | |
| parent | 99dcd4f4939087c3b2aea9d09e13d374de9ce137 (diff) | |
| parent | 6f52f1e502cf030ceb4e14963fdda1021ea33023 (diff) | |
merging avatar-pipeline branch into viewer-2-0
Diffstat (limited to 'indra/newview')
47 files changed, 470 insertions, 719 deletions
| diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 3176cf2132..a6664778fb 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -35,10 +35,11 @@  #include "llagent.h"   #include "llagentwearables.h" +#include "llcallbacklist.h"  #include "llfloatercustomize.h"  #include "llfloaterinventory.h"  #include "llinventorybridge.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llnotify.h"  #include "llviewerregion.h" @@ -82,6 +83,8 @@ public:  protected:  	void processWearablesMessage(); +	void processContents(); +	static void onIdle(void *userdata);  };  class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver @@ -1283,7 +1286,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  		LLFolderType::FT_OUTFIT,  		new_folder_name); -	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); +	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL);  #if 0  // BAP - fix to go into rename state automatically after outfit is created.  	LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id); @@ -1413,7 +1416,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem  			const LLUUID &item_id = getWearableItemID(type,i);  			popWearable(type,i);  			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); -			LLAppearanceManager::removeItemLinks(item_id,false); +			LLAppearanceManager::instance().removeItemLinks(item_id,false);  			//queryWearableCache(); // moved below  			if (old_wearable) @@ -1430,7 +1433,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem  		const LLUUID &item_id = getWearableItemID(type,index);  		popWearable(type, index);  		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); -		LLAppearanceManager::removeItemLinks(item_id,false); +		LLAppearanceManager::instance().removeItemLinks(item_id,false);  		//queryWearableCache(); // moved below @@ -2148,19 +2151,42 @@ void LLLibraryOutfitsFetch::contentsDone(void)  	mOutfitsPopulated = true;  } +//-------------------------------------------------------------------- +// InitialWearablesFetch +//  +// This grabs contents from the COF and processes them. +// The processing is handled in idle(), i.e. outside of done(), +// to avoid gInventory.notifyObservers recursion. +//-------------------------------------------------------------------- + +// virtual  void LLInitialWearablesFetch::done()  { -	// No longer need this observer hanging around. +	// Delay processing the actual results of this so it's not handled within +	// gInventory.notifyObservers.  The results will be handled in the next +	// idle tick instead.  	gInventory.removeObserver(this); -	 +	gIdleCallbacks.addFunction(onIdle, this); +} + +// static +void LLInitialWearablesFetch::onIdle(void *data) +{ +	gIdleCallbacks.deleteFunction(onIdle, data); +	LLInitialWearablesFetch *self = reinterpret_cast<LLInitialWearablesFetch*>(data); +	self->processContents(); +} + +void LLInitialWearablesFetch::processContents() +{  	// Fetch the wearable items from the Current Outfit Folder  	LLInventoryModel::cat_array_t cat_array;  	LLInventoryModel::item_array_t wearable_array;  	LLFindWearables is_wearable;  	gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array,   									LLInventoryModel::EXCLUDE_TRASH, is_wearable); -	 -	LLAppearanceManager::setAttachmentInvLinkEnable(true); + +	LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);  	if (wearable_array.count() > 0)  	{  		LLAppearanceManager::instance().updateAppearanceFromCOF(); @@ -2169,7 +2195,7 @@ void LLInitialWearablesFetch::done()  	{  		processWearablesMessage();  		// Create links for attachments that may have arrived before the COF existed. -		LLAppearanceManager::linkRegisteredAttachments(); +		LLAppearanceManager::instance().linkRegisteredAttachments();  	}  	delete this;  } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 0901289dac..80ac9e4085 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,18 +32,20 @@  #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llagentwearables.h"  #include "llappearancemgr.h" -#include "llinventorymodel.h" -#include "llnotifications.h" +#include "llfloatercustomize.h"  #include "llgesturemgr.h"  #include "llinventorybridge.h" -#include "llwearablelist.h" -#include "llagentwearables.h" -#include "llagent.h" +#include "llinventoryobserver.h" +#include "llnotifications.h" +#include "llpanelappearance.h" +#include "llsidetray.h"  #include "llvoavatar.h"  #include "llvoavatarself.h"  #include "llviewerregion.h" -#include "llfloatercustomize.h" +#include "llwearablelist.h"  class LLWearInventoryCategoryCallback : public LLInventoryCallback  { @@ -72,7 +74,7 @@ protected:  		// If the inventory callback manager goes away, we're shutting down, no longer want the callback.  		if( LLInventoryCallbackManager::is_instantiated() )  		{ -			LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); +			LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);  		}  		else  		{ @@ -171,7 +173,7 @@ void LLOutfitObserver::done()  	else  	{  		// Wear the inventory category. -		LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); +		LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);  	}  } @@ -251,7 +253,7 @@ public:  	virtual ~LLUpdateAppearanceOnDestroy()  	{ -		LLAppearanceManager::updateAppearanceFromCOF(); +		LLAppearanceManager::instance().updateAppearanceFromCOF();  	}  	/* virtual */ void fire(const LLUUID& inv_item) @@ -296,7 +298,7 @@ struct LLWearableHoldingPattern  	bool append;  }; -/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items) +static void removeDuplicateItems(LLInventoryModel::item_array_t& items)  {  	LLInventoryModel::item_array_t new_items;  	std::set<LLUUID> items_seen; @@ -323,175 +325,44 @@ struct LLWearableHoldingPattern  	items = new_items;  } -void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) +static void onWearableAssetFetch(LLWearable* wearable, void* data)  { -	LLInventoryModel::item_array_t new_dst; -	std::set<LLUUID> mark_inventory; - -	S32 inventory_dups = 0; +	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; +	bool append = holder->append; -	for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin(); -		  src_pos != src.end(); -		  ++src_pos) -	{ -		LLUUID src_item_id = (*src_pos)->getLinkedUUID(); -		mark_inventory.insert(src_item_id); -	} - -	for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin(); -		  dst_pos != dst.end(); -		  ++dst_pos) +	if(wearable)  	{ -		LLUUID dst_item_id = (*dst_pos)->getLinkedUUID(); - -		if (mark_inventory.find(dst_item_id) == mark_inventory.end()) -		{ -			// Item is not already present in COF. -			new_dst.put(*dst_pos); -			mark_inventory.insert(dst_item_id); -		} -		else +		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); +			 iter != holder->mFoundList.end(); ++iter)  		{ -			inventory_dups++; +			LLFoundData* data = *iter; +			if(wearable->getAssetID() == data->mAssetID) +			{ +				data->mWearable = wearable; +				break; +			}  		}  	} -	llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count() -			<< " inventory dups " << inventory_dups << llendl; -	 -	dst = new_dst; +	holder->mResolved += 1; +	if(holder->mResolved >= (S32)holder->mFoundList.size()) +	{ +		LLAppearanceManager::instance().updateAgentWearables(holder, append); +	}  } -/* static */   LLUUID LLAppearanceManager::getCOF()  {  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  }  // Update appearance from outfit folder. -/* static */   void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)  {  	if (!proceed)  		return; - -#if 1  -	updateCOF(category,append); -#else -	if (append) -	{ -		updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. -	} -	else -	{ -		LLViewerInventoryCategory* catp = gInventory.getCategory(category); -		if (catp->getPreferredType() == LLFolderType::FT_NONE || -			LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) -		{ -			updateCOFFromCategory(category, append);  // append is false - rebuild COF. -		} -		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) -		{ -			rebuildCOFFromOutfit(category); -		} -	} -#endif -} - -// Append to current COF contents by recursively traversing a folder. -/* static */  -void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append) -{ -		// BAP consolidate into one "get all 3 types of descendents" function, use both places. -	LLInventoryModel::item_array_t wear_items; -	LLInventoryModel::item_array_t obj_items; -	LLInventoryModel::item_array_t gest_items; -	bool follow_folder_links = false; -	getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links); - -	// Find all the wearables that are in the category's subtree.	 -	lldebugs << "appendCOFFromCategory()" << llendl; -	if( !wear_items.count() && !obj_items.count() && !gest_items.count()) -	{ -		LLNotifications::instance().add("CouldNotPutOnOutfit"); -		return; -	} -		 -	const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); -	// Processes that take time should show the busy cursor -	//inc_busy_count(); -		 -	LLInventoryModel::cat_array_t cof_cats; -	LLInventoryModel::item_array_t cof_items; -	gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	// Remove duplicates -	if (append) -	{ -		removeDuplicateItems(wear_items, cof_items); -		removeDuplicateItems(obj_items, cof_items); -		removeDuplicateItems(gest_items, cof_items); -	} - -	S32 total_links = gest_items.count() + wear_items.count() + obj_items.count(); - -	if (!append && total_links > 0) -	{ -		purgeCOFBeforeRebuild(category); -	} - -	LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy; -	 -	// Link all gestures in this folder -	if (gest_items.count() > 0) -	{ -		llinfos << "Linking " << gest_items.count() << " gestures" << llendl; -		for (S32 i = 0; i < gest_items.count(); ++i) -		{ -			const LLInventoryItem* gest_item = gest_items.get(i).get(); -			link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id, -								gest_item->getName(), -								LLAssetType::AT_LINK, link_waiter); -		} -	} - -	// Link all wearables -	if(wear_items.count() > 0) -	{ -		llinfos << "Linking " << wear_items.count() << " wearables" << llendl; -		for(S32 i = 0; i < wear_items.count(); ++i) -		{ -			// Populate the current outfit folder with links to the newly added wearables -			const LLInventoryItem* wear_item = wear_items.get(i).get(); -			link_inventory_item(gAgent.getID(),  -								wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. -								current_outfit_id,  -								wear_item->getName(), -								LLAssetType::AT_LINK,  -								link_waiter); -		} -	} - -	// Link all attachments. -	if( obj_items.count() > 0 ) -	{ -		llinfos << "Linking " << obj_items.count() << " attachments" << llendl; -		LLVOAvatar* avatar = gAgent.getAvatarObject(); -		if( avatar ) -		{ -			for(S32 i = 0; i < obj_items.count(); ++i) -			{ -				const LLInventoryItem* obj_item = obj_items.get(i).get(); -				link_inventory_item(gAgent.getID(),  -									obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. -									current_outfit_id,  -									obj_item->getName(), -									LLAssetType::AT_LINK, link_waiter); -			} -		} -	} +	LLAppearanceManager::instance().updateCOF(category,append);  } -/* static */   void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,  											  LLPointer<LLInventoryCallback> cb)  { @@ -535,7 +406,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  		}  	}  } -/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) + +void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)  {  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items; @@ -552,7 +424,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  // Keep the last N wearables of each type.  For viewer 2.0, N is 1 for  // both body parts and clothing items. -/* static */ void LLAppearanceManager::filterWearableItems( +void LLAppearanceManager::filterWearableItems(  	LLInventoryModel::item_array_t& items, S32 max_per_type)  {  	// Divvy items into arrays by wearable type. @@ -583,8 +455,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  }  // Create links to all listed items. -/* static */ void LLAppearanceManager::linkAll(const LLUUID& category, -											   LLInventoryModel::item_array_t& items, +void LLAppearanceManager::linkAll(const LLUUID& category, +								  LLInventoryModel::item_array_t& items,  											   LLPointer<LLInventoryCallback> cb)  {  	for (S32 i=0; i<items.count(); i++) @@ -599,7 +471,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	}  } -/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) +void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  {  	const LLUUID cof = getCOF(); @@ -656,145 +528,17 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	{  		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),  							LLAssetType::AT_LINK_FOLDER, link_waiter); -	} -							   -} - -/* static */  -bool LLAppearanceManager::isMandatoryWearableType(EWearableType type) -{ -	return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES); -} -// For mandatory body parts. -/* static */  -void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found) -{ -	LLInventoryModel::cat_array_t new_cats; -	LLInventoryModel::item_array_t new_items; -	gInventory.collectDescendents(category, new_cats, new_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	std::set<EWearableType> wt_types_found; -	for (S32 i = 0; i < new_items.count(); ++i) -	{ -		LLViewerInventoryItem *itemp = new_items.get(i); -		if (itemp->isWearableType()) -		{ -			EWearableType type = itemp->getWearableType(); -			if (isMandatoryWearableType(type)) -			{ -				types_found.insert(type); -			} -		} -	} -} - -// Remove everything from the COF that we safely can before replacing -// with contents of new category.  This means preserving any mandatory -// body parts that aren't present in the new category, and getting rid -// of everything else. -/* static */  -void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) -{ -	// See which mandatory body types are present in the new category. -	std::set<EWearableType> wt_types_found; -	checkMandatoryWearableTypes(category,wt_types_found); -	 -	LLInventoryModel::cat_array_t cof_cats; -	LLInventoryModel::item_array_t cof_items; -	gInventory.collectDescendents(getCOF(), cof_cats, cof_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	for (S32 i = 0; i < cof_items.count(); ++i) -	{ -		LLViewerInventoryItem *itemp = cof_items.get(i); -		if (itemp->isWearableType()) +		// Update the current outfit name of the appearance sidepanel. +		LLPanelAppearance* panel_appearance = dynamic_cast<LLPanelAppearance *>(LLSideTray::getInstance()->getPanel("panel_appearance")); +		if (panel_appearance)  		{ -			EWearableType type = itemp->getWearableType(); -			if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end())) -			{ -				// Not mandatory or supplied by the new category - OK to delete -				gInventory.purgeObject(cof_items.get(i)->getUUID()); -			} -		} -		else -		{ -			// Not a wearable - always purge -			gInventory.purgeObject(cof_items.get(i)->getUUID()); +			panel_appearance->refreshCurrentLookName(catp->getName());  		}  	} -	gInventory.notifyObservers(); -} - -// Replace COF contents from a given outfit folder. -/* static */  -void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) -{ -	lldebugs << "rebuildCOFFromOutfit()" << llendl; - -	dumpCat(category,"start, source outfit"); -	dumpCat(getCOF(),"start, COF"); - -	// Find all the wearables that are in the category's subtree.	 -	LLInventoryModel::item_array_t items; -	getCOFValidDescendents(category, items); - -	if( items.count() == 0) -	{ -		LLNotifications::instance().add("CouldNotPutOnOutfit"); -		return; -	} - -	// Processes that take time should show the busy cursor -	//inc_busy_count(); - -	//dumpCat(current_outfit_id,"COF before remove:"); - -	//dumpCat(current_outfit_id,"COF after remove:"); - -	purgeCOFBeforeRebuild(category); -	 -	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; -	LLUUID current_outfit_id = getCOF(); -	LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter); - -	//dumpCat(current_outfit_id,"COF after shallow copy:"); - -	// Create a link to the outfit that we wore. -	LLViewerInventoryCategory* catp = gInventory.getCategory(category); -	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) -	{ -		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), -							LLAssetType::AT_LINK_FOLDER, link_waiter); -	} -} - -/* static */ -void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data) -{ -	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; -	bool append = holder->append; -	 -	if(wearable) -	{ -		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); -			 iter != holder->mFoundList.end(); ++iter) -		{ -			LLFoundData* data = *iter; -			if(wearable->getAssetID() == data->mAssetID) -			{ -				data->mWearable = wearable; -				break; -			} -		} -	} -	holder->mResolved += 1; -	if(holder->mResolved >= (S32)holder->mFoundList.size()) -	{ -		LLAppearanceManager::updateAgentWearables(holder, append); -	} +							    } -/* static */  void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)  {  	lldebugs << "updateAgentWearables()" << llendl; @@ -835,7 +579,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,  //	dec_busy_count();  } -/* static */   void LLAppearanceManager::updateAppearanceFromCOF()  {  	dumpCat(getCOF(),"COF, start"); @@ -903,7 +646,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()  			LLWearableList::instance().getAsset(found->mAssetID,  												found->mName,  												found->mAssetType, -												LLAppearanceManager::onWearableAssetFetch, +												onWearableAssetFetch,  												(void*)holder);  		}  	} @@ -916,22 +659,6 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	}  } -/* static */  -void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, -												 LLInventoryModel::item_array_t& items) -{ -	LLInventoryModel::cat_array_t cats; -	LLFindCOFValidItems is_cof_valid; -	bool follow_folder_links = false; -	gInventory.collectDescendentsIf(category, -									cats,  -									items,  -									LLInventoryModel::EXCLUDE_TRASH, -									is_cof_valid,  -									follow_folder_links); -} - -/* static */  void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,  													LLInventoryModel::item_array_t& items,  													LLAssetType::EType type, @@ -947,7 +674,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,  									follow_folder_links);  } -/* static */   void LLAppearanceManager::getUserDescendents(const LLUUID& category,   											 LLInventoryModel::item_array_t& wear_items,  											 LLInventoryModel::item_array_t& obj_items, @@ -1011,7 +737,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b  }  // *NOTE: hack to get from avatar inventory to avatar -/* static */  void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )  {  	// Avoid unintentionally overwriting old wearables.  We have to do @@ -1023,7 +748,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca  	if( gFloaterCustomize )  	{ -		gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append)); +		gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit, +														&LLAppearanceManager::instance(), +														_1, category->getUUID(), append));  	}  	else  	{ @@ -1031,7 +758,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca  	}  } -/* static */  void LLAppearanceManager::wearOutfitByName(const std::string& name)  {  	llinfos << "Wearing category " << name << llendl; @@ -1084,8 +810,8 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor  	return (a->isWearableType() && b->isWearableType() &&  			(a->getWearableType() == b->getWearableType()));  } -/* static */ -void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) + +void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )  {  	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);  	if (!vitem) @@ -1138,8 +864,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )  	return;  } -/* static */ -void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update ) +void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )  {  #if SUPPORT_ENSEMBLES  	// BAP add check for already in COF. @@ -1153,7 +878,6 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update  #endif  } -/* static */  void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)  {  	LLInventoryModel::cat_array_t cat_array; @@ -1178,7 +902,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)  //#define DUMP_CAT_VERBOSE -/* static */  void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)  {  	LLInventoryModel::cat_array_t cats; @@ -1200,7 +923,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)  	llinfos << msg << " count " << items.count() << llendl;  } -/* static */  void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,  										const std::string& msg)  { @@ -1213,15 +935,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it  	llinfos << llendl;  } +LLAppearanceManager::LLAppearanceManager(): +	mAttachmentInvLinkEnabled(false) +{ +} -std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments; -bool LLAppearanceManager::sAttachmentInvLinkEnabled(false); +LLAppearanceManager::~LLAppearanceManager() +{ +} -/* static */  void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)  {  	llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; -	sAttachmentInvLinkEnabled = val; +	mAttachmentInvLinkEnabled = val;  }  void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) @@ -1241,19 +967,18 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)         llinfos << llendl;  } -/* static */  void LLAppearanceManager::registerAttachment(const LLUUID& item_id)  { -       sRegisteredAttachments.insert(item_id); -       //dumpAttachmentSet(sRegisteredAttachments,"after register:"); +       mRegisteredAttachments.insert(item_id); +       //dumpAttachmentSet(mRegisteredAttachments,"after register:"); -	   if (sAttachmentInvLinkEnabled) +	   if (mAttachmentInvLinkEnabled)  	   {  		   LLViewerInventoryItem *item = gInventory.getItem(item_id);  		   if (item)  		   {  			   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); -			   LLAppearanceManager::wearItem(item,false);  // Add COF link for item. +			   LLAppearanceManager::addItemLink(item,false);  // Add COF link for item.  			   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);  			   gInventory.notifyObservers();  		   } @@ -1264,13 +989,12 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)  	   }  } -/* static */  void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)  { -       sRegisteredAttachments.erase(item_id); -       //dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); +       mRegisteredAttachments.erase(item_id); +       //dumpAttachmentSet(mRegisteredAttachments,"after unregister:"); -	   if (sAttachmentInvLinkEnabled) +	   if (mAttachmentInvLinkEnabled)  	   {  		   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");  		   LLAppearanceManager::removeItemLinks(item_id, false); @@ -1284,21 +1008,20 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)  	   }  } -/* static */  void LLAppearanceManager::linkRegisteredAttachments()  { -	for (std::set<LLUUID>::iterator it = sRegisteredAttachments.begin(); -		 it != sRegisteredAttachments.end(); +	for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin(); +		 it != mRegisteredAttachments.end();  		 ++it)  	{  		LLUUID item_id = *it;  		LLViewerInventoryItem *item = gInventory.getItem(item_id);  		if (item)  		{ -			wearItem(item, false); +			addItemLink(item, false);  			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);  			gInventory.notifyObservers();  		}  	} -	sRegisteredAttachments.clear(); +	mRegisteredAttachments.clear();  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 7dea16b6cf..88d3320d1f 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -42,66 +42,71 @@ struct LLWearableHoldingPattern;  class LLAppearanceManager: public LLSingleton<LLAppearanceManager>  { +	friend class LLSingleton<LLAppearanceManager>; +	  public: -	static void updateAppearanceFromCOF(); -	static bool needToSaveCOF(); -	static void changeOutfit(bool proceed, const LLUUID& category, bool append); -	static void updateCOF(const LLUUID& category, bool append = false); -	static void updateCOFFromCategory(const LLUUID& category, bool append); -	static void rebuildCOFFromOutfit(const LLUUID& category); -	static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); -	static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); -	static void wearOutfitByName(const std::string& name); -	static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, -									LLPointer<LLInventoryCallback> cb); +	void updateAppearanceFromCOF(); +	bool needToSaveCOF(); +	void updateCOF(const LLUUID& category, bool append = false); +	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); +	void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); +	void wearOutfitByName(const std::string& name); +	void changeOutfit(bool proceed, const LLUUID& category, bool append);  	// Add COF link to individual item. -	static void wearItem(LLInventoryItem* item, bool do_update = true); +	void addItemLink(LLInventoryItem* item, bool do_update = true);  	// Add COF link to ensemble folder. -	static void wearEnsemble(LLInventoryCategory* item, bool do_update = true); -	static LLUUID getCOF(); +	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); + +	// Copy all items in a category. +	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, +							 LLPointer<LLInventoryCallback> cb); + +	// Find the Current Outfit folder. +	LLUUID getCOF();  	// Remove COF entries -	static void removeItemLinks(const LLUUID& item_id, bool do_update = true); +	void removeItemLinks(const LLUUID& item_id, bool do_update = true); + +	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);  	// For debugging - could be moved elsewhere. -	static void dumpCat(const LLUUID& cat_id, const std::string& msg); -	static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); -	static void unregisterAttachment(const LLUUID& item_id); -	static void registerAttachment(const LLUUID& item_id); -	static void setAttachmentInvLinkEnable(bool val); -	static void linkRegisteredAttachments(); +	void dumpCat(const LLUUID& cat_id, const std::string& msg); +	void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); + +	// Attachment link management +	void unregisterAttachment(const LLUUID& item_id); +	void registerAttachment(const LLUUID& item_id); +	void setAttachmentInvLinkEnable(bool val); +	void linkRegisteredAttachments(); + +protected: +	LLAppearanceManager(); +	~LLAppearanceManager();  private: -	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); -	static void linkAll(const LLUUID& category, + +	void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); +	void linkAll(const LLUUID& category,  						LLInventoryModel::item_array_t& items,  						LLPointer<LLInventoryCallback> cb); -	static void getDescendentsOfAssetType(const LLUUID& category,  +	void getDescendentsOfAssetType(const LLUUID& category,   										  LLInventoryModel::item_array_t& items,  										  LLAssetType::EType type,  										  bool follow_folder_links); -	static void getCOFValidDescendents(const LLUUID& category,  -									   LLInventoryModel::item_array_t& items); -									    -	static void getUserDescendents(const LLUUID& category,  +	void getUserDescendents(const LLUUID& category,   								   LLInventoryModel::item_array_t& wear_items,  								   LLInventoryModel::item_array_t& obj_items,  								   LLInventoryModel::item_array_t& gest_items,  								   bool follow_folder_links); -	static void onWearableAssetFetch(LLWearable* wearable, void* data); -	static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); -	static bool isMandatoryWearableType(EWearableType type); -	static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found); -	static void purgeCOFBeforeRebuild(const LLUUID& category); -	static void purgeCategory(const LLUUID& category, bool keep_outfit_links); -	static std::set<LLUUID> sRegisteredAttachments; -	static bool sAttachmentInvLinkEnabled; +	void purgeCategory(const LLUUID& category, bool keep_outfit_links); +	std::set<LLUUID> mRegisteredAttachments; +	bool mAttachmentInvLinkEnabled;  };  #define SUPPORT_ENSEMBLES 0 diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 4d85ecb97c..38843c7221 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -40,7 +40,7 @@  #include "llfloaterbuycurrency.h"  #include "llfilepicker.h"  #include "llnotify.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "llpermissionsflags.h" diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index e8812d87ee..0b10255c2f 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -51,7 +51,7 @@  #include "llagent.h"  #include "llbutton.h" -//#include "llinventory.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  #include "llnotify.h"  #include "llresmgr.h" diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index e90d13f9d5..20a324c67c 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@  #include "lluictrl.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index cefd7a3808..c8df6c6135 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -230,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,  		if (obj->getType() == LLAssetType::AT_CATEGORY)  			continue; -		// Skip root folders, so we know we have inventory items only -		if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY)  -			continue; -  		// Skip the mysterious blank InventoryObject   		if (obj->getType() == LLAssetType::AT_NONE)  			continue; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 32802f6a20..a99d0c918d 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -187,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		if (asset_type == LLAssetType::AT_CATEGORY)  			continue; -		// Skip root folders, so we know we have inventory items only -		if (asset_type == LLAssetType::AT_ROOT_CATEGORY)  -			continue; -  		LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));  		inv_type = inv_item->getInventoryType(); @@ -286,7 +282,7 @@ void LLFloaterBuyContents::onClickBuy()  	// Put the items where we put new folders.  	LLUUID category_id; -	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY); +	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);  	// *NOTE: doesn't work for multiple object buy, which UI does not  	// currently support sale info is used for verification only, if diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index ca0ba96a08..854d02873a 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -98,7 +98,7 @@ void LLFloaterGesture::done()  		// we load only gesture folder without childred.  		LLInventoryModel::cat_array_t* categories;  		LLInventoryModel::item_array_t* items; -		folder_ref_t unloaded_folders; +		LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;  		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;  		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);  		if (categories->empty()) diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 9d047bf1cf..e7819d2a03 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -39,6 +39,7 @@  #include "llfloater.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lldarray.h"  class LLScrollContainer; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 928126bff9..e0d4a59d9d 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -44,6 +44,7 @@  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llavataractions.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  #include "lllineeditor.h"  //#include "llspinctrl.h" diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 3c3dfb760e..9854d2594b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -422,10 +422,17 @@ void LLFloaterTools::refresh()  	LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());  	childSetTextArg("prim_count", "[COUNT]", prim_count_string); +	// calculate selection rendering cost +	std::string prim_cost_string; +	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); +	childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string); + +  	// disable the object and prim counts if nothing selected  	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();  	childSetEnabled("obj_count", have_selection);  	childSetEnabled("prim_count", have_selection); +	childSetEnabled("RenderingCost", have_selection);  	// Refresh child tabs  	mPanelPermissions->refresh(); @@ -556,6 +563,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	mBtnEdit	->setToggleState( edit_visible );  	mRadioGroupEdit->setVisible( edit_visible ); +	childSetVisible("RenderingCost", edit_visible || focus_visible || move_visible);  	if (mCheckSelectIndividual)  	{ @@ -964,6 +972,27 @@ void LLFloaterTools::onClickGridOptions()  	//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);  } +S32 LLFloaterTools::calcRenderCost() +{ +	S32 cost = 0; +	for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin(); +		  selection_iter != LLSelectMgr::getInstance()->getSelection()->end(); +		  ++selection_iter) +	{ +		LLSelectNode *select_node = *selection_iter; +		if (select_node) +		{ +			LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject(); +			if (viewer_volume) +			{ +				cost += viewer_volume->getRenderCost(); +			} +		} +	} + +	return cost; +} +  // static  void LLFloaterTools::setEditTool(void* tool_pointer)  { diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index a3e0cac034..05a88a31d3 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -121,6 +121,7 @@ private:  	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);  	static void setObjectType( LLPCode pcode );  	void onClickGridOptions(); +	S32 calcRenderCost();  public:  	LLButton		*mBtnFocus; diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7d2eb98111..85847e5fce 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -51,6 +51,7 @@  #include "llfloaterreg.h"		// getTypedInstance()  #include "llfocusmgr.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarklist.h"  #include "lllineeditor.h"  #include "llregionhandle.h" diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 60ece75cea..473d0be912 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -34,6 +34,8 @@  #include "lldarray.h"	// JAMESDEBUG convert to std::vector  #include "llfoldertype.h"  #include "llfontgl.h"	// just for StyleFlags enum +#include "llinventorytype.h" +#include "llpermissionsflags.h"  #include "llpointer.h" diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 5db35d5f70..d39a17ca3b 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -38,7 +38,6 @@  #include "llfoldervieweventlistener.h"  #include "llinventorybridge.h"	// for LLItemBridge in LLInventorySort::operator()  #include "llinventoryfilter.h" -#include "llinventorymodel.h"	// *TODO: make it take a pointer to an inventory-model interface  #include "llviewercontrol.h"	// gSavedSettings  #include "llviewerwindow.h"		// Argh, only for setCursor() diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 481b75cf73..23d9436fa6 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -33,6 +33,7 @@  #include "llviewerprecompiledheaders.h"  #include "llinventory.h" +#include "llinventoryobserver.h"  #include "lltrans.h"  #include "llfriendcard.h" diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 7c3b742780..094ca13798 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -38,7 +38,7 @@  #include <vector>  #include "llassetstorage.h"	// LLAssetType -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llsingleton.h"  #include "llviewerinventory.h" diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 1bc9297bba..d7be09efa9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -892,7 +892,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,  			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
  			break;
  		case LLAssetType::AT_CATEGORY:
 -		case LLAssetType::AT_ROOT_CATEGORY:
  			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
  			{
  				// Create a link folder handler instead.
 @@ -1687,7 +1686,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  				// BAP - should skip if dup.
  				if (move_is_into_current_outfit)
  				{
 -					LLAppearanceManager::wearEnsemble(inv_cat);
 +					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
  				}
  				else
  				{
 @@ -2044,7 +2043,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)  				    mContentsCount)
  				{
  					gInventory.removeObserver(this);
 -					LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE);
 +					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
  					delete this;
  				}
  			}
 @@ -2089,7 +2088,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model  		if(!model) return;
  		LLViewerInventoryCategory* cat = getCategory();
  		if(!cat) return;
 -		LLAppearanceManager::wearEnsemble(cat,true);
 +		LLAppearanceManager::instance().addEnsembleLink(cat,true);
  		return;
  	}
  #endif
 @@ -2337,7 +2336,7 @@ void LLFolderBridge::pasteLinkFromClipboard()  			{
  				link_inventory_item(
  					gAgent.getID(),
 -					item->getUUID(),
 +					item->getLinkedUUID(),
  					parent_id,
  					item->getName(),
  					LLAssetType::AT_LINK,
 @@ -2404,7 +2403,7 @@ void LLFolderBridge::folderOptionsMenu()  		{
  			mItems.push_back(std::string("Wear As Ensemble"));
  		}
 -		mItems.push_back(std::string("Take Off Items"));
 +		mItems.push_back(std::string("Remove From Outfit"));
  	}
  	hide_context_entries(*mMenu, mItems, disabled_items);
  }
 @@ -2730,7 +2729,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)  	// BAP - was:
  	// wear_inventory_category_on_avatar( cat, append );
 -	LLAppearanceManager::wearInventoryCategory( cat, FALSE, append );
 +	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
  }
  // helper stuff
 @@ -2847,10 +2846,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		BOOL is_movable = TRUE;
  		switch( inv_item->getActualType() )
  		{
 -		case LLAssetType::AT_ROOT_CATEGORY:
 -			is_movable = FALSE;
 -			break;
 -
  		case LLAssetType::AT_CATEGORY:
  			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
  			break;
 @@ -2953,16 +2948,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				// BAP - should skip if dup.
  				if (move_is_into_current_outfit)
  				{
 -					LLAppearanceManager::wearItem(inv_item);
 +					LLAppearanceManager::instance().addItemLink(inv_item);
  				}
  				else
  				{
  					LLPointer<LLInventoryCallback> cb = NULL;
  					link_inventory_item(
  						gAgent.getID(),
 -						inv_item->getUUID(),
 +						inv_item->getLinkedUUID(),
  						mUUID,
 -						std::string(),
 +						inv_item->getName(),
  						LLAssetType::AT_LINK,
  						cb);
  				}
 @@ -3889,16 +3884,11 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model  			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
  		}
  		// this object might have been selected, so let the selection manager know it's gone now
 -		LLViewerObject *found_obj =
 -			gObjectList.findObject(item->getUUID());
 +		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
  		if (found_obj)
  		{
  			LLSelectMgr::getInstance()->remove(found_obj);
  		}
 -		else
 -		{
 -			llwarns << "object not found - ignoring" << llendl;
 -		}
  	}
  	else LLItemBridge::performAction(folder, model, action);
  }
 @@ -4053,7 +4043,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		LLInventoryItem* item = getItem();
  		if (item && item->getIsLinkType())
  		{
 -			items.push_back(std::string("Goto Link"));
 +			items.push_back(std::string("Find Original"));
  		}
  		items.push_back(std::string("Properties"));
 @@ -4206,7 +4196,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )  		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
  				 << " )" << llendl;
 -		LLAppearanceManager::wearItem(item);
 +		LLAppearanceManager::instance().addItemLink(item);
  	}
  }
 @@ -4325,10 +4315,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  				{
  					LLSelectMgr::getInstance()->remove(found_obj);
  				}
 -				else
 -				{
 -					llwarns << "object not found, ignoring" << llendl;
 -				}
  			}
  		}
 @@ -4493,7 +4479,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		if (item && item->getIsLinkType())
  		{
 -			items.push_back(std::string("Goto Link"));
 +			items.push_back(std::string("Find Original"));
  		}
  		items.push_back(std::string("Properties"));
 @@ -4771,7 +4757,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,  	}
  	// Find and remove this item from the COF.
 -	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
 +	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
  	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
  	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
  		 iter != items.end();
 @@ -5157,7 +5143,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	}
  	else
  	{
 -		items.push_back(std::string("Goto Link"));
 +		items.push_back(std::string("Find Original"));
  		items.push_back(std::string("Delete"));
  		if (!isItemRemovable())
  		{
 diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3ffeb55d6c..4c7b0a0517 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -33,14 +33,16 @@  #ifndef LL_LLINVENTORYBRIDGE_H  #define LL_LLINVENTORYBRIDGE_H -#include "llfloaterproperties.h" -#include "llwearable.h" -#include "llviewercontrol.h"  #include "llcallingcard.h" -#include "llinventorymodel.h" +#include "llfloaterproperties.h"  #include "llfoldervieweventlistener.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llviewercontrol.h" +#include "llwearable.h"  class LLInventoryPanel; +class LLInventoryModel;  class LLMenuGL;  enum EInventoryIcon diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0d0cc7dea8..38a417f1a2 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -31,40 +31,25 @@   */  #include "llviewerprecompiledheaders.h" -  #include "llinventorymodel.h" -#include "llassetstorage.h" -#include "llcrc.h" -#include "lldir.h" -#include "llsys.h" -#include "llxfermanager.h" -#include "message.h" -  #include "llagent.h"  #include "llagentwearables.h" -#include "llfloater.h" -#include "llfocusmgr.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h" -#include "llviewerfoldertype.h" -#include "llviewerinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventoryobserver.h" +#include "llwindow.h" +#include "llviewercontrol.h" +#include "llpreview.h"   #include "llviewermessage.h" +#include "llviewerfoldertype.h"  #include "llviewerwindow.h" -#include "llviewerregion.h"  #include "llappviewer.h" -#include "lldbstrings.h" -#include "llviewerstats.h" -#include "llmutelist.h" -#include "llnotifications.h" +#include "llviewerregion.h"  #include "llcallbacklist.h" -#include "llpreview.h" -#include "llviewercontrol.h"  #include "llvoavatarself.h" -#include "llsdutil.h" -#include <deque>  //#define DIFF_INVENTORY_FILES  #ifdef DIFF_INVENTORY_FILES @@ -341,7 +326,7 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo  const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const  {  	const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); -	if(LLFolderType::FT_CATEGORY == preferred_type) +	if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)  	{  		return root_id;  	} @@ -886,7 +871,8 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)  // Delete a particular inventory object by ID.  void LLInventoryModel::deleteObject(const LLUUID& id)  { -	purgeLinkedObjects(id); +	// Disabling this; let users manually purge linked objects. +	// purgeLinkedObjects(id);  	lldebugs << "LLInventoryModel::deleteObject()" << llendl;  	LLPointer<LLInventoryObject> obj = getObject(id);  	if(obj) @@ -923,13 +909,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id)  		}  		addChangedMask(LLInventoryObserver::REMOVE, id);  		obj = NULL; // delete obj +		gInventory.notifyObservers();  	}  }  // Delete a particular inventory item by ID, and remove it from the server.  void LLInventoryModel::purgeObject(const LLUUID &id)  { -	lldebugs << "LLInventoryModel::purgeObject()" << llendl; +	lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl;  	LLPointer<LLInventoryObject> obj = getObject(id);  	if(obj)  	{ @@ -2463,7 +2450,7 @@ void LLInventoryModel::buildParentChildMap()  			{  				cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));  			} -			else if(LLFolderType::FT_CATEGORY == pref) +			else if(LLFolderType::FT_ROOT_INVENTORY == pref)  			{  				// it's the root  				cat->setParent(LLUUID::null); @@ -3343,7 +3330,7 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)  		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.  		if (gInventory.getItem(titem->getUUID()))  		{ -			llinfos << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl; +			lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;  			continue;  		}  		gInventory.updateItem(titem); diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 9a15deab81..aa4ffb392f 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -46,11 +46,6 @@  #include <string>  #include <vector> -// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly  -// include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on -// llinventorymodel.h. -#include "llinventoryobserver.h"  -  class LLInventoryObserver;  class LLInventoryObject;  class LLInventoryItem; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 97f90ac845..3a8b8bdf9e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -38,55 +38,16 @@  // Seraph TODO: Remove unnecessary headers
 -// library includes
  #include "llagent.h"
  #include "llagentwearables.h"
 -#include "llcallingcard.h"
 -#include "llfloaterreg.h"
 -#include "llsdserialize.h"
 -#include "llfiltereditor.h"
 -#include "llspinctrl.h"
 -#include "llui.h"
 -#include "message.h"
 -
 -// newview includes
  #include "llappearancemgr.h"
 -#include "llappviewer.h"
 -#include "llfirstuse.h"
 -#include "llfloaterchat.h"
 -#include "llfloatercustomize.h"
 -#include "llfocusmgr.h"
 -#include "llfolderview.h"
 -#include "llgesturemgr.h"
 -#include "lliconctrl.h"
 +#include "llfloaterreg.h"
  #include "llimview.h"
  #include "llinventorybridge.h"
 -#include "llinventoryclipboard.h"
 -#include "llinventorymodel.h"
 -#include "lllineeditor.h"
 -#include "llmenugl.h"
 -#include "llpreviewanim.h"
 -#include "llpreviewgesture.h"
 -#include "llpreviewnotecard.h"
 -#include "llpreviewscript.h"
 -#include "llpreviewsound.h"
 -#include "llpreviewtexture.h"
 -#include "llresmgr.h"
 -#include "llscrollbar.h"
  #include "llscrollcontainer.h"
 -#include "llselectmgr.h"
 -#include "lltabcontainer.h"
 -#include "lltooldraganddrop.h"
 -#include "lluictrlfactory.h"
  #include "llviewerfoldertype.h"
 -#include "llviewerinventory.h"
 -#include "llviewermessage.h"
 -#include "llviewerobjectlist.h"
 -#include "llviewerregion.h"
 -#include "llviewerwindow.h"
 -#include "llvoavatarself.h"
 -#include "llwearablelist.h"
  #include "llimfloater.h"
 +#include "llvoavatarself.h"
  static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
 @@ -303,7 +264,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  		return;
  	}
 -	if(mask & LLInventoryObserver::LABEL)
 +	if (mask & LLInventoryObserver::LABEL)
  	{
  		handled = true;
  		// label change - empty out the display name for each object
 @@ -328,9 +289,15 @@ void LLInventoryPanel::modelChanged(U32 mask)  			}
  		}
  	}
 -	if((mask & (LLInventoryObserver::STRUCTURE
 -				| LLInventoryObserver::ADD
 -				| LLInventoryObserver::REMOVE)) != 0)
 +
 +	// We don't really care which of these masks the item is actually flagged with, since the masks
 +	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
 +	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
 +	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
 +	// resynchronized.
 +	if (mask & (LLInventoryObserver::STRUCTURE |
 +				LLInventoryObserver::ADD |
 +				LLInventoryObserver::REMOVE))
  	{
  		handled = true;
  		// Record which folders are open by uuid.
 @@ -347,74 +314,56 @@ void LLInventoryPanel::modelChanged(U32 mask)  				LLInventoryObject* model_item = model->getObject(*id_it);
  				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 -				if (model_item)
 +				// Item exists in memory but a UI element hasn't been created for it.
 +				if (model_item && !view_item)
  				{
 -					if (!view_item)
 +					// Add the UI element for this item.
 +					buildNewViews(*id_it);
 +					// Select any newly created object that has the auto rename at top of folder root set.
 +					if(mFolders->getRoot()->needsAutoRename())
  					{
 -						// this object was just created, need to build a view for it
 -						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
 -						{
 -							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
 -						}
 -						buildNewViews(*id_it);
 -						
 -						// select any newly created object
 -						// that has the auto rename at top of folder
 -						// root set
 -						if(mFolders->getRoot()->needsAutoRename())
 -						{
 -							setSelection(*id_it, FALSE);
 -						}
 +						setSelection(*id_it, FALSE);
  					}
 -					else
 -					{
 -						// this object was probably moved, check its parent
 -						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
 -						{
 -							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
 -						}
 +				}
 -						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
 +				// This item already exists in both memory and UI.  It was probably moved
 +				// around in the panel's directory structure (i.e. reparented).
 +				if (model_item && view_item)
 +				{
 +					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
 -						// added check against NULL for cases when Inventory panel contains startFolder.
 -						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
 -						// this check is a fix for bug EXT-1859.
 -						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
 +					// Item has been moved.
 +					if (view_item->getParentFolder() != new_parent)
 +					{
 +						if (new_parent != NULL)
  						{
 +							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
  							view_item->getParentFolder()->extractItem(view_item);
  							view_item->addToFolder(new_parent, mFolders);
  						}
 -/*
 -						 on the other side in case Inventory Panel has content of the any folder
 -						 it is possible that item moved to some folder which is absent in current
 -						 Panel. For ex. removing item (via moving to trash).
 -						 In this case we need to check if new parent is other then inventory start folder
 -						 and simply remove its View from the hierarchy.
 -						 See details in EXT-2098.
 -*/
 -						// So, let check if item was moved into folder out of this Inventory Panel.
 -						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
 -						{
 -							view_item->getParentFolder()->extractItem(view_item);
 -						}
 -					}
 -				}
 -				else
 -				{
 -					if (view_item)
 -					{
 -						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
 +						else 
  						{
 -							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
 +							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that 
 +							// doesn't include trash).  Just remove the item's UI.
 +							view_item->destroyView();
  						}
 -						// item in view but not model, need to delete view
 -						view_item->destroyView();
  					}
  					else
  					{
 -						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
 +						// Hmm, we got an ADD/REMOVE/STRUCTURE notification for this item but there's nothing to be done to it.
 +						llwarns << "Notification triggered for item that isn't changing.  "
 +								<< "Operation: ( mask: " << mask << " panel name: " << mStartFolderString << " ) "
 +								<< "Item: [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
 +						
  					}
  				}
 +
 +				// This item has been removed from memory, but its associated UI element still exists.
 +				if (!model_item && view_item)
 +				{
 +					// Remove the item's UI.
 +					view_item->destroyView();
 +				}
  			}
  		}
  	}
 @@ -697,7 +646,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc  {
  	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
  	const LLInventoryObject *obj = gInventory.getObject(obj_id);
 -	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
 +	if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
  	{
  		return;
  	}
 diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8fe317a292..7e35cfa04c 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -45,7 +45,7 @@  #include "lltooltip.h"  // newview includes -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarkactions.h"  #include "lllandmarklist.h"  #include "lllocationhistory.h" diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 9cd949c9cc..00502341fc 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -43,6 +43,7 @@  #include "llparticipantlist.h"  #include "llimview.h"  #include "llvoicechannel.h" +#include "llsidetray.h"  void LLPanelChatControlPanel::onCallButtonClicked()  { @@ -158,7 +159,8 @@ void LLPanelIMControlPanel::onAddFriendButtonClicked()  void LLPanelIMControlPanel::onShareButtonClicked()  { -	// *TODO: Implement +	LLSD key; +	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);  }  void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 29e9baa6cf..fbc0f09c50 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -35,7 +35,8 @@  #define LL_LLPANELMAININVENTORY_H
  #include "llpanel.h"
 -#include "llinventorymodel.h"
 +#include "llinventoryobserver.h"
 +
  #include "llfolderview.h"
  class LLFolderViewItem;
 diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index ca87ebf5a2..1f5ffb7335 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -54,6 +54,7 @@  #include "llfriendcard.h"  #include "llgroupactions.h"  #include "llgrouplist.h" +#include "llinventoryobserver.h"  #include "llpanelpeoplemenus.h"  #include "llrecentpeople.h"  #include "llviewercontrol.h"		// for gSavedSettings diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 506c135ca6..3b9f7f9882 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -37,7 +37,7 @@  #include "llresizehandle.h"  #include "llpointer.h"  #include "lluuid.h" -#include "llinventorymodel.h"	// LLInventoryObserver +#include "llinventoryobserver.h"  #include <map>  class LLInventoryItem; diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a00f580e32..28a409d3ee 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -41,7 +41,6 @@  #include "lliconctrl.h"  #include "llframetimer.h" -  class LLMessageSystem;  class LLTextEditor;  class LLButton; @@ -52,6 +51,7 @@ struct 	LLEntryAndEdCore;  class LLMenuBarGL;  class LLFloaterScriptSearch;  class LLKeywordToken; +class LLViewerInventoryItem;  // Inner, implementation class.  LLPreviewScript and LLLiveLSLEditor each own one of these.  class LLScriptEdCore : public LLPanel diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 9d2960fbed..a3efea7b7e 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -41,6 +41,7 @@  #include "llfloaterreg.h"
  #include "llgroupactions.h"
  #include "llinventorymodel.h"
 +#include "llinventoryobserver.h"
  #include "lllineeditor.h"
  #include "llradiogroup.h"
  #include "llviewercontrol.h"
 diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 70dc04f575..7711f3c733 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -673,6 +673,24 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para  	return NULL;  } +LLPanel*	LLSideTray::getPanel		(const std::string& panel_name) +{ +	child_vector_const_iter_t child_it; +	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) +	{ +		LLView* view = (*child_it)->findChildView(panel_name,true); +		if(view) +		{ +			LLPanel* panel = dynamic_cast<LLPanel*>(view); +			if(panel) +			{ +				return panel; +			} +		} +	} +	return NULL; +} +  // *TODO: Eliminate magic constants.  static const S32	fake_offset = 132;  static const S32	fake_top_offset = 18; diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 8b30199c45..54652c1108 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -36,8 +36,8 @@  #include "llpanel.h"  #include "string" -class LLSideTrayTab;  class LLAccordionCtrl; +class LLSideTrayTab;  // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions   // while disconnecting viewer in LLAppViewer::disconnectViewer(). @@ -97,6 +97,11 @@ public:      LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params);  	/* +	 * get the panel (don't show it or do anything else with it) +	 */ +    LLPanel*	getPanel		(const std::string& panel_name); + +	/*       * collapse SideBar, hiding visible tab and moving tab buttons       * to the right corner of the screen       */ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 696b0d9af1..d36ff1605e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2633,10 +2633,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  	}  	else  	{ -		LLAppearanceManager::wearOutfitByName(outfit_folder_name); +		LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name);  	} -	LLAppearanceManager::wearOutfitByName(gestures); -	LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER); +	LLAppearanceManager::instance().wearOutfitByName(gestures); +	LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);  	// This is really misnamed -- it means we have started loading  	// an outfit/shape that will give the avatar a gender eventually. JC diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index de00ca8420..5f7c2f5080 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -48,7 +48,7 @@  #include "llfoldervieweventlistener.h"  #include "llinventory.h"  #include "llinventoryfunctions.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "lllineeditor.h" diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 959cb3f182..fbd86d0edf 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -2508,7 +2508,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  		if(drop)  		{  		    BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE ); -			LLAppearanceManager::wearInventoryCategory(category, false, append); +			LLAppearanceManager::instance().wearInventoryCategory(category, false, append);  		}  		return ACCEPT_YES_MULTI;  	} @@ -2516,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  	{  		if(drop)  		{ -			LLAppearanceManager::wearInventoryCategory(category, true, false); +			LLAppearanceManager::instance().wearInventoryCategory(category, true, false);  		}  		return ACCEPT_YES_MULTI;  	} diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 1a61717658..407cc23d0d 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -55,6 +55,7 @@  #include "llhudtext.h"  #include "llhudview.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarklist.h"  #include "llsky.h"  #include "llui.h" diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp index c974171c2c..b382ff6306 100644 --- a/indra/newview/llviewerassettype.cpp +++ b/indra/newview/llviewerassettype.cpp @@ -71,7 +71,6 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()  	addEntry(LLViewerAssetType::AT_OBJECT, 				new ViewerAssetEntry(DAD_OBJECT));  	addEntry(LLViewerAssetType::AT_NOTECARD, 			new ViewerAssetEntry(DAD_NOTECARD));  	addEntry(LLViewerAssetType::AT_CATEGORY, 			new ViewerAssetEntry(DAD_CATEGORY)); -	addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, 		new ViewerAssetEntry(DAD_ROOT_CATEGORY));  	addEntry(LLViewerAssetType::AT_LSL_TEXT, 			new ViewerAssetEntry(DAD_SCRIPT));  	addEntry(LLViewerAssetType::AT_LSL_BYTECODE, 		new ViewerAssetEntry(DAD_NONE));  	addEntry(LLViewerAssetType::AT_TEXTURE_TGA, 		new ViewerAssetEntry(DAD_NONE)); diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 384538364f..6aabcb11b8 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -109,8 +109,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()  	addEntry(LLFolderType::FT_CLOTHING, 			new ViewerFolderEntry("Clothing",				"inv_folder_clothing.tga"));  	addEntry(LLFolderType::FT_OBJECT, 				new ViewerFolderEntry("Objects",				"inv_folder_object.tga"));  	addEntry(LLFolderType::FT_NOTECARD, 			new ViewerFolderEntry("Notecards",				"inv_folder_notecard.tga")); -	addEntry(LLFolderType::FT_CATEGORY, 			new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga")); -	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new ViewerFolderEntry("Inventory",				"")); +	addEntry(LLFolderType::FT_ROOT_INVENTORY, 		new ViewerFolderEntry("My Inventory",			""));  	addEntry(LLFolderType::FT_LSL_TEXT, 			new ViewerFolderEntry("Scripts",				"inv_folder_script.tga"));  	addEntry(LLFolderType::FT_BODYPART, 			new ViewerFolderEntry("Body Parts",				"inv_folder_bodypart.tga"));  	addEntry(LLFolderType::FT_TRASH, 				new ViewerFolderEntry("Trash",					"inv_folder_trash.tga")); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 728fb7c616..68a9aaef75 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3879,8 +3879,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object,  	InventoryObjectList::const_iterator inv_end = inventory->end();  	for ( ; inv_it != inv_end; ++inv_it)  	{ -		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY) -		   && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY)) +		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))  		{  			LLInventoryObject* obj = *inv_it;  			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj); @@ -6424,13 +6423,13 @@ void handle_selected_texture_info(void*)  void handle_test_male(void*)  { -	LLAppearanceManager::wearOutfitByName("Male Shape & Outfit"); +	LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");  	//gGestureList.requestResetFromServer( TRUE );  }  void handle_test_female(void*)  { -	LLAppearanceManager::wearOutfitByName("Female Shape & Outfit"); +	LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");  	//gGestureList.requestResetFromServer( FALSE );  } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 200ecbc6d6..0153116887 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -89,6 +89,7 @@  #include "llhudeffecttrail.h"  #include "llhudmanager.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "llmenugl.h" @@ -4836,8 +4837,7 @@ void container_inventory_arrived(LLViewerObject* object,  		InventoryObjectList::const_iterator end = inventory->end();  		for ( ; it != end; ++it)  		{ -			if ((*it)->getType() != LLAssetType::AT_CATEGORY && -				(*it)->getType() != LLAssetType::AT_ROOT_CATEGORY) +			if ((*it)->getType() != LLAssetType::AT_CATEGORY)  			{  				LLInventoryObject* obj = (LLInventoryObject*)(*it);  				LLInventoryItem* item = (LLInventoryItem*)(obj); @@ -4872,8 +4872,7 @@ void container_inventory_arrived(LLViewerObject* object,  		// one actual object  		InventoryObjectList::iterator it = inventory->begin(); -		if ((*it)->getType() == LLAssetType::AT_CATEGORY || -			(*it)->getType() == LLAssetType::AT_ROOT_CATEGORY) +		if ((*it)->getType() == LLAssetType::AT_CATEGORY)  		{  			++it;  		} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1054223dcf..90a79698f6 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1015,7 +1015,10 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)  		}  		// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues -		gAgent.changeCameraToDefault(); +		if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) +		{ +			gAgent.changeCameraToDefault(); +		}  		send_agent_pause(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 62ac8adad0..b6c1ee2f11 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f;  // Helper functions  //-----------------------------------------------------------------------------  static F32 calc_bouncy_animation(F32 x); -static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures);  //-----------------------------------------------------------------------------  // LLVOAvatar() @@ -7637,9 +7636,17 @@ void LLVOAvatar::idleUpdateRenderCost()  		return;  	} -	U32 shame = 1; +	U32 shame = 0; -	std::set<LLUUID> textures; +	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) +	{ +		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +		ETextureIndex tex_index = baked_dict->mTextureIndex; +		if (isTextureVisible(tex_index)) +		{ +			shame +=20; +		} +	}  	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();   		 iter != mAttachmentPoints.end(); @@ -7660,15 +7667,13 @@ void LLVOAvatar::idleUpdateRenderCost()  					const LLVOVolume* volume = drawable->getVOVolume();  					if (volume)  					{ -						shame += calc_shame(volume, textures); +						shame += volume->getRenderCost();  					}  				}  			}  		}  	} -	shame += textures.size() * 5; -  	setDebugText(llformat("%d", shame));  	F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);  	F32 red = llmin((F32) shame/1024.f, 1.f); @@ -7713,110 +7718,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const  } -U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures) -{ -	if (!volume) -	{ -		return 0; -	} - -	U32 shame = 0; - -	U32 invisi = 0; -	U32 shiny = 0; -	U32 glow = 0; -	U32 alpha = 0; -	U32 flexi = 0; -	U32 animtex = 0; -	U32 particles = 0; -	U32 scale = 0; -	U32 bump = 0; -	U32 planar = 0; -	 -	if (volume->isFlexible()) -	{ -		flexi = 1; -	} -	if (volume->isParticleSource()) -	{ -		particles = 1; -	} - -	const LLVector3& sc = volume->getScale(); -	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; - -	const LLDrawable* drawablep = volume->mDrawable; - -	if (volume->isSculpted()) -	{ -		const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT); -		LLUUID sculpt_id = sculpt_params->getSculptTexture(); -		textures.insert(sculpt_id); -	} - -	for (S32 i = 0; i < drawablep->getNumFaces(); ++i) -	{ -		const LLFace* face = drawablep->getFace(i); -		const LLTextureEntry* te = face->getTextureEntry(); -		const LLViewerTexture* img = face->getTexture(); - -		textures.insert(img->getID()); - -		if (face->getPoolType() == LLDrawPool::POOL_ALPHA) -		{ -			alpha++; -		} -		else if (img->getPrimaryFormat() == GL_ALPHA) -		{ -			invisi = 1; -		} - -		if (te) -		{ -			if (te->getBumpmap()) -			{ -				bump = 1; -			} -			if (te->getShiny()) -			{ -				shiny = 1; -			} -			if (te->getGlow() > 0.f) -			{ -				glow = 1; -			} -			if (face->mTextureMatrix != NULL) -			{ -				animtex++; -			} -			if (te->getTexGen()) -			{ -				planar++; -			} -		} -	} - -	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; - -	LLViewerObject::const_child_list_t& child_list = volume->getChildren(); -	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -		 iter != child_list.end();  -		 ++iter) -	{ -		const LLViewerObject* child_objectp = *iter; -		const LLDrawable* child_drawablep = child_objectp->mDrawable; -		if (child_drawablep) -		{ -			const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); -			if (child_volumep) -			{ -				shame += calc_shame(child_volumep, textures); -			} -		} -	} - -	return shame; -}  //virtual  S32 LLVOAvatar::getTexImageSize() const diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 185274d40d..711e9f90fc 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -487,18 +487,10 @@ BOOL LLVOAvatarSelf::buildMenus()  		}  		// add in requested order to pie menu, inserting separators as necessary -		S32 cur_pie_slice = 0;  		for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();  			 attach_it != attachment_pie_menu_map.end(); ++attach_it)  		{ -			S32 requested_pie_slice = attach_it->first;  			S32 attach_index = attach_it->second; -			while (cur_pie_slice < requested_pie_slice) -			{ -				gAttachBodyPartPieMenus[group]->addSeparator(); -				gDetachBodyPartPieMenus[group]->addSeparator(); -				cur_pie_slice++; -			}  			LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);  			if (attachment) @@ -520,7 +512,6 @@ BOOL LLVOAvatarSelf::buildMenus()  				item_params.on_enable.parameter = attach_index;  				item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  				gDetachBodyPartPieMenus[group]->addChild(item); -				cur_pie_slice++;  			}  		}  	} @@ -1039,7 +1030,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view  	if (attachment->isObjectAttached(viewer_object))  	{  		const LLUUID& attachment_id = viewer_object->getItemID(); -		LLAppearanceManager::registerAttachment(attachment_id); +		LLAppearanceManager::instance().registerAttachment(attachment_id);  	}  	return attachment; @@ -1078,7 +1069,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)  		}  		else  		{ -			LLAppearanceManager::unregisterAttachment(attachment_id); +			LLAppearanceManager::instance().unregisterAttachment(attachment_id);  		}  		return TRUE; @@ -1587,7 +1578,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const  			llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;  #endif  		} -		else if (local_tex_obj->getImage() != NULL) +		else if (local_tex_obj && local_tex_obj->getImage() != NULL)  		{  			if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)  			{ diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2def905bbb..e5531a1497 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2541,6 +2541,107 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const  	return mDrawable->getWorldMatrix();  } +U32 LLVOVolume::getRenderCost() const +{ +	U32 shame = 0; + +	U32 invisi = 0; +	U32 shiny = 0; +	U32 glow = 0; +	U32 alpha = 0; +	U32 flexi = 0; +	U32 animtex = 0; +	U32 particles = 0; +	U32 scale = 0; +	U32 bump = 0; +	U32 planar = 0; + +	if (isFlexible()) +	{ +		flexi = 1; +	} +	if (isParticleSource()) +	{ +		particles = 1; +	} + +	const LLVector3& sc = getScale(); +	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; + +	const LLDrawable* drawablep = mDrawable; + +	if (isSculpted()) +	{ +		const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); +		LLUUID sculpt_id = sculpt_params->getSculptTexture(); +		shame += 5; +	} + +	for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +	{ +		const LLFace* face = drawablep->getFace(i); +		const LLTextureEntry* te = face->getTextureEntry(); +		const LLViewerTexture* img = face->getTexture(); + +		shame += 5; + +		if (face->getPoolType() == LLDrawPool::POOL_ALPHA) +		{ +			alpha++; +		} +		else if (img->getPrimaryFormat() == GL_ALPHA) +		{ +			invisi = 1; +		} + +		if (te) +		{ +			if (te->getBumpmap()) +			{ +				bump = 1; +			} +			if (te->getShiny()) +			{ +				shiny = 1; +			} +			if (te->getGlow() > 0.f) +			{ +				glow = 1; +			} +			if (face->mTextureMatrix != NULL) +			{ +				animtex++; +			} +			if (te->getTexGen()) +			{ +				planar++; +			} +		} +	} + +	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; + +	LLViewerObject::const_child_list_t& child_list = getChildren(); +	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); +		 iter != child_list.end();  +		 ++iter) +	{ +		const LLViewerObject* child_objectp = *iter; +		const LLDrawable* child_drawablep = child_objectp->mDrawable; +		if (child_drawablep) +		{ +			const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); +			if (child_volumep) +			{ +				shame += child_volumep->getRenderCost(); +			} +		} +	} + +	return shame; + +} +  //static  void LLVOVolume::preUpdateGeom()  { diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 10fc8865fc..fb543efc04 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -120,7 +120,7 @@ public:  	const LLMatrix4&	getRelativeXform() const				{ return mRelativeXform; }  	const LLMatrix3&	getRelativeXformInvTrans() const		{ return mRelativeXformInvTrans; }  	/*virtual*/	const LLMatrix4	getRenderMatrix() const; - +				U32 	getRenderCost() const;  	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,   										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index c5c97e7649..e37dffd526 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -831,6 +831,7 @@ void LLWearable::addVisualParam(LLVisualParam *param)  	}  	param->setIsDummy(FALSE);  	mVisualParamIndexMap[param->getID()] = param; +	mSavedVisualParamMap[param->getID()] = param->getDefaultWeight();  }  void LLWearable::setVisualParams() @@ -933,11 +934,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload  void LLWearable::revertValues()  {  	//update saved settings so wearable is no longer dirty +	// non-driver params first  	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)  	{  		S32 id = iter->first;  		F32 value = iter->second; -		setVisualParamWeight(id, value, TRUE); +		LLVisualParam *param = getVisualParam(id); +		if(param &&  !dynamic_cast<LLDriverParam*>(param) ) +		{ +			setVisualParamWeight(id, value, TRUE); +		} +	} + +	//then driver params +	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) +	{ +		S32 id = iter->first; +		F32 value = iter->second; +		LLVisualParam *param = getVisualParam(id); +		if(param &&  dynamic_cast<LLDriverParam*>(param) ) +		{ +			setVisualParamWeight(id, value, TRUE); +		} +	} + +	// make sure that saved values are sane +	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) +	{ +		S32 id = iter->first; +		LLVisualParam *param = getVisualParam(id); +		if( param ) +		{ +			mSavedVisualParamMap[id] = param->getWeight(); +		}  	}  	syncImages(mSavedTEMap, mTEMap); diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 8b6ab4e4d8..b65a49eaed 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -356,9 +356,9 @@           parameter="restore" />      </menu_item_call>      <menu_item_call -     label="Goto Link" +     label="Find Original"       layout="topleft" -     name="Goto Link"> +     name="Find Original">          <menu_item_call.on_click           function="Inventory.DoToSelected"           parameter="goto" /> @@ -434,9 +434,9 @@      <menu_item_separator       layout="topleft" />      <menu_item_call -     label="Take Off Items" +     label="Remove From Outfit"       layout="topleft" -     name="Take Off Items"> +     name="Remove From Outfit">          <menu_item_call.on_click           function="Inventory.DoToSelected"           parameter="removefromoutfit" /> | 
