SL-15066 FIXED Wearing an existing, unsaved outfit does not restore correct wearables ordering
parent
5ab76453bb
commit
0cecb09a2f
|
|
@ -2347,6 +2347,52 @@ void LLAppearanceMgr::enforceCOFItemRestrictions(LLPointer<LLInventoryCallback>
|
|||
}
|
||||
}
|
||||
|
||||
bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
|
||||
{
|
||||
if (!item1 || !item2)
|
||||
{
|
||||
LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
return item1->getLinkedUUID() < item2->getLinkedUUID();
|
||||
}
|
||||
|
||||
void get_sorted_base_and_cof_items(LLInventoryModel::item_array_t& cof_item_array, LLInventoryModel::item_array_t& outfit_item_array)
|
||||
{
|
||||
LLUUID base_outfit_id = LLAppearanceMgr::instance().getBaseOutfitUUID();
|
||||
|
||||
if (base_outfit_id.notNull())
|
||||
{
|
||||
LLIsValidItemLink collector;
|
||||
LLInventoryModel::cat_array_t sub_cat_array;
|
||||
|
||||
gInventory.collectDescendents(base_outfit_id,
|
||||
sub_cat_array,
|
||||
outfit_item_array,
|
||||
LLInventoryModel::EXCLUDE_TRASH);
|
||||
|
||||
LLInventoryModel::cat_array_t cof_cats;
|
||||
|
||||
gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), cof_cats, cof_item_array,
|
||||
LLInventoryModel::EXCLUDE_TRASH, collector);
|
||||
|
||||
for (U32 i = 0; i < outfit_item_array.size(); ++i)
|
||||
{
|
||||
LLViewerInventoryItem* linked_item = outfit_item_array.at(i)->getLinkedItem();
|
||||
if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
|
||||
{
|
||||
outfit_item_array.erase(outfit_item_array.begin() + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(cof_item_array.begin(), cof_item_array.end(), sort_by_linked_uuid);
|
||||
std::sort(outfit_item_array.begin(), outfit_item_array.end(), sort_by_linked_uuid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
|
||||
bool enforce_ordering,
|
||||
nullary_func_t post_update_func)
|
||||
|
|
@ -2388,7 +2434,30 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
|
|||
|
||||
if (!validateClothingOrderingInfo())
|
||||
{
|
||||
LL_WARNS() << "Clothing ordering error" << LL_ENDL;
|
||||
|
||||
LLInventoryModel::item_array_t outfit_item_array;
|
||||
LLInventoryModel::item_array_t cof_item_array;
|
||||
get_sorted_base_and_cof_items(cof_item_array, outfit_item_array);
|
||||
|
||||
if (outfit_item_array.size() == cof_item_array.size())
|
||||
{
|
||||
for (U32 i = 0; i < cof_item_array.size(); ++i)
|
||||
{
|
||||
LLViewerInventoryItem *cof_it = cof_item_array.at(i);
|
||||
LLViewerInventoryItem *base_it = outfit_item_array.at(i);
|
||||
|
||||
if (cof_it->getActualDescription() != base_it->getActualDescription())
|
||||
{
|
||||
if (cof_it->getLinkedUUID() == base_it->getLinkedUUID())
|
||||
{
|
||||
cof_it->setDescription(base_it->getActualDescription());
|
||||
gInventory.updateItem(cof_it);
|
||||
}
|
||||
}
|
||||
}
|
||||
LLAppearanceMgr::getInstance()->updateIsDirty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BoolSetter setIsInUpdateAppearanceFromCOF(mIsInUpdateAppearanceFromCOF);
|
||||
|
|
@ -3017,17 +3086,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, LLPointer
|
|||
}
|
||||
}
|
||||
|
||||
bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
|
||||
{
|
||||
if (!item1 || !item2)
|
||||
{
|
||||
LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
return item1->getLinkedUUID() < item2->getLinkedUUID();
|
||||
}
|
||||
|
||||
void LLAppearanceMgr::updateIsDirty()
|
||||
{
|
||||
LLUUID cof = getCOF();
|
||||
|
|
|
|||
Loading…
Reference in New Issue