commit
3b730cef75
|
|
@ -1264,7 +1264,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);
|
||||
|
|
@ -1394,7 +1394,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)
|
||||
|
|
@ -1411,7 +1411,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
|
||||
|
||||
|
|
@ -2040,7 +2040,7 @@ void LLInitialWearablesFetch::processContents()
|
|||
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();
|
||||
|
|
@ -2049,7 +2049,7 @@ void LLInitialWearablesFetch::processContents()
|
|||
{
|
||||
processWearablesMessage();
|
||||
// Create links for attachments that may have arrived before the COF existed.
|
||||
LLAppearanceManager::linkRegisteredAttachments();
|
||||
LLAppearanceManager::instance().linkRegisteredAttachments();
|
||||
}
|
||||
delete this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,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 +171,7 @@ void LLOutfitObserver::done()
|
|||
else
|
||||
{
|
||||
// Wear the inventory category.
|
||||
LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
|
||||
LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -251,7 +251,7 @@ public:
|
|||
|
||||
virtual ~LLUpdateAppearanceOnDestroy()
|
||||
{
|
||||
LLAppearanceManager::updateAppearanceFromCOF();
|
||||
LLAppearanceManager::instance().updateAppearanceFromCOF();
|
||||
}
|
||||
|
||||
/* virtual */ void fire(const LLUUID& inv_item)
|
||||
|
|
@ -296,7 +296,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,7 +323,7 @@ struct LLWearableHoldingPattern
|
|||
items = new_items;
|
||||
}
|
||||
|
||||
void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
|
||||
static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
|
||||
{
|
||||
LLInventoryModel::item_array_t new_dst;
|
||||
std::set<LLUUID> mark_inventory;
|
||||
|
|
@ -361,137 +361,44 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
|
|||
dst = new_dst;
|
||||
}
|
||||
|
||||
/* static */
|
||||
static void 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::instance().updateAgentWearables(holder, append);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
LLAppearanceManager::instance().updateCOF(category,append);
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
|
||||
LLPointer<LLInventoryCallback> cb)
|
||||
{
|
||||
|
|
@ -535,7 +442,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 +460,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 +491,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 +507,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();
|
||||
|
||||
|
|
@ -660,141 +568,6 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
|
|||
|
||||
}
|
||||
|
||||
/* 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())
|
||||
{
|
||||
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());
|
||||
}
|
||||
}
|
||||
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 +608,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
|
|||
// dec_busy_count();
|
||||
}
|
||||
|
||||
/* static */
|
||||
void LLAppearanceManager::updateAppearanceFromCOF()
|
||||
{
|
||||
dumpCat(getCOF(),"COF, start");
|
||||
|
|
@ -903,7 +675,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()
|
|||
LLWearableList::instance().getAsset(found->mAssetID,
|
||||
found->mName,
|
||||
found->mAssetType,
|
||||
LLAppearanceManager::onWearableAssetFetch,
|
||||
onWearableAssetFetch,
|
||||
(void*)holder);
|
||||
}
|
||||
}
|
||||
|
|
@ -916,22 +688,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 +703,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 +766,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 +777,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 +787,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
|
|||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
void LLAppearanceManager::wearOutfitByName(const std::string& name)
|
||||
{
|
||||
llinfos << "Wearing category " << name << llendl;
|
||||
|
|
@ -1084,7 +839,7 @@ 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 )
|
||||
{
|
||||
LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
|
||||
|
|
@ -1138,7 +893,6 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
|
|||
return;
|
||||
}
|
||||
|
||||
/* static */
|
||||
void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update )
|
||||
{
|
||||
#if SUPPORT_ENSEMBLES
|
||||
|
|
@ -1153,7 +907,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 +931,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 +952,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 +964,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,13 +996,12 @@ 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)
|
||||
|
|
@ -1264,13 +1018,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,11 +1037,10 @@ 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;
|
||||
|
|
@ -1300,5 +1052,5 @@ void LLAppearanceManager::linkRegisteredAttachments()
|
|||
gInventory.notifyObservers();
|
||||
}
|
||||
}
|
||||
sRegisteredAttachments.clear();
|
||||
mRegisteredAttachments.clear();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 wearItem(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 wearEnsemble(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
|
||||
|
|
|
|||
|
|
@ -1687,7 +1687,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
// BAP - should skip if dup.
|
||||
if (move_is_into_current_outfit)
|
||||
{
|
||||
LLAppearanceManager::wearEnsemble(inv_cat);
|
||||
LLAppearanceManager::instance().wearEnsemble(inv_cat);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2044,7 +2044,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 +2089,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
|
|||
if(!model) return;
|
||||
LLViewerInventoryCategory* cat = getCategory();
|
||||
if(!cat) return;
|
||||
LLAppearanceManager::wearEnsemble(cat,true);
|
||||
LLAppearanceManager::instance().wearEnsemble(cat,true);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -2404,7 +2404,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 +2730,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
|
||||
|
|
@ -2953,7 +2953,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
|
|||
// BAP - should skip if dup.
|
||||
if (move_is_into_current_outfit)
|
||||
{
|
||||
LLAppearanceManager::wearItem(inv_item);
|
||||
LLAppearanceManager::instance().wearItem(inv_item);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4201,7 +4201,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
|
|||
lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
|
||||
<< " )" << llendl;
|
||||
|
||||
LLAppearanceManager::wearItem(item);
|
||||
LLAppearanceManager::instance().wearItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4762,7 +4762,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();
|
||||
|
|
|
|||
|
|
@ -682,7 +682,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -2630,10 +2630,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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6424,13 +6424,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 );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue