diff options
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 178 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 7 | 
2 files changed, 102 insertions, 83 deletions
| diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 2c166b6001..45f57d2c82 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1338,90 +1338,113 @@ void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false)  	}  } -bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, -									   bool do_update, -									   bool replace, -									   LLPointer<LLInventoryCallback> cb) +void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, +                                        bool do_update, +                                        bool replace, +                                        LLPointer<LLInventoryCallback> cb)  { +    bool first = true; -	if (item_id_to_wear.isNull()) return false; +    LLInventoryObject::const_object_list_t items_to_link; -	// *TODO: issue with multi-wearable should be fixed: -	// in this case this method will be called N times - loading started for each item -	// and than N times will be called - loading completed for each item. -	// That means subscribers will be notified that loading is done after first item in a batch is worn. -	// (loading indicator disappears for example before all selected items are worn) -	// Have not fix this issue for 2.1 because of stability reason. EXT-7777. +    for (uuid_vec_t::const_iterator it = item_ids_to_wear.begin(); +         it != item_ids_to_wear.end(); +         ++it) +    { +        replace = first && replace; +        first = false; -	// Disabled for now because it is *not* acceptable to call updateAppearanceFromCOF() multiple times -//	gAgentWearables.notifyLoadingStarted(); +        const LLUUID& item_id_to_wear = *it; -	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear); -	if (!item_to_wear) return false; +        if (item_id_to_wear.isNull()) continue; -	if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) -	{ -		LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,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; -	} -	else if (isLinkedInCOF(item_to_wear->getUUID())) // EXT-84911 -	{ -		return false; -	} +        LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear); +        if (!item_to_wear) continue; -	switch (item_to_wear->getType()) -	{ -		case LLAssetType::AT_CLOTHING: -		if (gAgentWearables.areWearablesLoaded()) -		{ -			if (!cb && do_update) -			{ -				cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear); -			} -			LLWearableType::EType type = item_to_wear->getWearableType(); -			S32 wearable_count = gAgentWearables.getWearableCount(type); -			if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type)) -			{ -				LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), -																   wearable_count-1); -				removeCOFItemLinks(item_id, cb); -			} +        if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) +        { +            LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace)); +            copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(), cb); +            continue; +        }  +        else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID())) +        { +            continue; // 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"); +            continue; +        } +        else if (isLinkedInCOF(item_to_wear->getUUID())) // EXT-84911 +        { +            continue; +        } -			addCOFItemLink(item_to_wear, cb); -		}  -		break; +        switch (item_to_wear->getType()) +        { +            case LLAssetType::AT_CLOTHING: +            { +                if (gAgentWearables.areWearablesLoaded()) +                { +                    if (!cb && do_update) +                    { +                        cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear); +                    } +                    LLWearableType::EType type = item_to_wear->getWearableType(); +                    S32 wearable_count = gAgentWearables.getWearableCount(type); +                    if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type)) +                    { +                        LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), +                                                                           wearable_count-1); +                        removeCOFItemLinks(item_id, cb); +                    } +                     +                    items_to_link.push_back(item_to_wear); +                }  +            } +            break; -		case LLAssetType::AT_BODYPART: -		// TODO: investigate wearables may not be loaded at this point EXT-8231 -		 -		// 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. -		removeCOFLinksOfType(item_to_wear->getWearableType()); -		if (!cb && do_update) -		{ -			cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear); -		} -		addCOFItemLink(item_to_wear, cb); -		break; +            case LLAssetType::AT_BODYPART: +            { +                // TODO: investigate wearables may not be loaded at this point EXT-8231 +                 +                // 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. +                removeCOFLinksOfType(item_to_wear->getWearableType()); +                if (!cb && do_update) +                { +                    cb = new LLUpdateAppearanceAndEditWearableOnDestroy(item_id_to_wear); +                } +                items_to_link.push_back(item_to_wear); +            } +            break; +                 +            case LLAssetType::AT_OBJECT: +            { +                rez_attachment(item_to_wear, NULL, replace); +            } +            break; -		case LLAssetType::AT_OBJECT: -		rez_attachment(item_to_wear, NULL, replace); -		break; +            default: continue; +        } +    } -		default: return false;; -	} +    // Batch up COF link creation - more efficient if using AIS. +    if (items_to_link.size()) +    { +        link_inventory_array(getCOF(), items_to_link, cb);  +    } +} -	return true; +void LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, +									   bool do_update, +									   bool replace, +									   LLPointer<LLInventoryCallback> cb) +{ +    uuid_vec_t ids; +    ids.push_back(item_id_to_wear); +    wearItemsOnAvatar(ids, do_update, replace, cb);  }  // Update appearance from outfit folder. @@ -4127,16 +4150,7 @@ void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb)  void wear_multiple(const uuid_vec_t& ids, bool replace)  {  	LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy; -	 -	bool first = true; -	uuid_vec_t::const_iterator it; -	for (it = ids.begin(); it != ids.end(); ++it) -	{ -		// if replace is requested, the first item worn will replace the current top -		// item, and others will be added. -		LLAppearanceMgr::instance().wearItemOnAvatar(*it,false,first && replace,cb); -		first = false; -	} +    LLAppearanceMgr::instance().wearItemsOnAvatar(ids, false, replace, cb);  }  // SLapp for easy-wearing of a stock (library) avatar diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 10d97bb8cb..0e9967175b 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -121,8 +121,13 @@ public:  	// find the UUID of the currently worn outfit (Base Outfit)  	const LLUUID getBaseOutfitUUID(); +    void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, +                                        bool do_update, +                                        bool replace, +                                        LLPointer<LLInventoryCallback> cb = NULL); +  	// Wear/attach an item (from a user's inventory) on the agent -	bool wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update, bool replace = false, +	void wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update, bool replace = false,  						  LLPointer<LLInventoryCallback> cb = NULL);  	// Update the displayed outfit name in UI. | 
