SL-20549 Blank no-copy materials are not moved into scripted objects

meow-7.2.2
Andrey Kleshchev 2023-10-31 22:16:27 +02:00 committed by akleshchev
parent f72309a17e
commit 40e568a318
3 changed files with 62 additions and 14 deletions

View File

@ -961,7 +961,9 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
LLNotificationsUtil::add("ErrorMessage", args);
return FALSE;
}
if (hit_obj->getInventoryItemByAsset(item->getAssetUUID()))
// Make sure to verify both id and type since 'null'
// is a shared default for some asset types.
if (hit_obj->getInventoryItemByAsset(item->getAssetUUID(), item->getType()))
{
// if the asset is already in the object's inventory
// then it can always be added to a side.

View File

@ -3498,22 +3498,29 @@ void LLViewerObject::removeInventory(const LLUUID& item_id)
++mExpectedInventorySerialNum;
}
bool LLViewerObject::isAssetInInventory(LLViewerInventoryItem* item)
bool LLViewerObject::isAssetInInventory(LLViewerInventoryItem* item, LLAssetType::EType type)
{
bool result = false;
bool result = false;
if (item)
{
std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
if (item)
{
// For now mPendingInventoryItemsIDs only stores textures and materials
// but if it gets to store more types, it will need to verify type as well
// since null can be a shared default id and it is fine to need a null
// script and a null material simultaneously.
std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL;
bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
result = is_fetched || is_fetching;
}
// null is the default asset for materials and default for scripts
// so need to check type as well
bool is_fetched = getInventoryItemByAsset(item->getAssetUUID(), type) != NULL;
return result;
result = is_fetched || is_fetching;
}
return result;
}
void LLViewerObject::updateMaterialInventory(LLViewerInventoryItem* item, U8 key, bool is_new)
@ -3529,7 +3536,7 @@ void LLViewerObject::updateMaterialInventory(LLViewerInventoryItem* item, U8 key
return;
}
if (isAssetInInventory(item))
if (isAssetInInventory(item, item->getType()))
{
// already there
return;
@ -3672,6 +3679,44 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass
return rv;
}
LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id, LLAssetType::EType type)
{
if (mInventoryDirty)
LL_WARNS() << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << LL_ENDL;
LLViewerInventoryItem* rv = NULL;
if (type == LLAssetType::AT_CATEGORY)
{
// Whatever called this shouldn't be trying to get a folder by asset
// categories don't have assets
llassert(0);
return rv;
}
if (mInventory)
{
LLViewerInventoryItem* item = NULL;
LLInventoryObject::object_list_t::iterator it = mInventory->begin();
LLInventoryObject::object_list_t::iterator end = mInventory->end();
for (; it != end; ++it)
{
LLInventoryObject* obj = *it;
if (obj->getType() == type)
{
// *FIX: gank-ass down cast!
item = (LLViewerInventoryItem*)obj;
if (item->getAssetUUID() == asset_id)
{
rv = item;
break;
}
}
}
}
return rv;
}
void LLViewerObject::updateViewerInventoryAsset(
const LLViewerInventoryItem* item,
const LLUUID& new_asset)

View File

@ -500,6 +500,7 @@ public:
void getInventoryContents(LLInventoryObject::object_list_t& objects);
LLInventoryObject* getInventoryRoot();
LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id, LLAssetType::EType type);
S16 getInventorySerial() const { return mInventorySerialNum; }
// These functions does viewer-side only object inventory modifications
@ -639,7 +640,7 @@ public:
private:
void setObjectCostStale();
bool isAssetInInventory(LLViewerInventoryItem* item);
bool isAssetInInventory(LLViewerInventoryItem* item, LLAssetType::EType type);
ExtraParameter* createNewParameterEntry(U16 param_type);
ExtraParameter* getExtraParameterEntry(U16 param_type) const;