Merged with default tip (Revision b8cd74d2bcc8)

--HG--
branch : Appearance-Misc
meow-7.2.2
Kitty Barnett 2010-09-15 20:25:33 +02:00
commit 410541f04e
11 changed files with 240 additions and 14 deletions

View File

@ -0,0 +1 @@
e304a745887c1ed792051d440a16754310c9d09e

View File

@ -0,0 +1,13 @@
[Appearance/Misc]
- fixed : LLAppearanceMgr::filterWearableItems() doesn't properly filter body parts
- fixed : LLWearableList::processGetAssetReply() creates multiple LLWearable instances for the same asset UUID
-> fix for http://jira.secondlife.com/browse/VWR-20608
- changed : deprecated removeItemFromAvatar() in favour of having LLAppearanceMgr::removeItemFromAvatar() handle it directly/correctly
-> wearables can't be worn/removed in 2.X without the viewer already having an LLWearable instance for it anyway
- added : InitialWearablesLoadedSignal signal which is emitted *once* when the initial wearables are loaded
- fixed : attachments sometimes detach only to instantly get reattached after logon
- added : LegacyMultiAttachmentSupport debug setting to route "secondary attachment points" to the primary attachment point
-> maps secondary attachment point range [39,68] onto [1,30]
-> only dislays "secondary attachment points" correctly for *other* avatars (by design)
- fixed : Add to/Replace Outfit removes newly worn attachments on completion
- fixed : LLWearableBridge::removeAllClothesFromAvatar() doesn't remove all clothing from the avatar

View File

@ -4427,6 +4427,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>LegacyMultiAttachmentSupport</key>
<map>
<key>Comment</key>
<string>Converts legacy "secondary attachment points" to multi-attachments for other avatars</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LimitDragDistance</key>
<map>
<key>Comment</key>

View File

@ -55,6 +55,9 @@
LLAgentWearables gAgentWearables;
BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
bool LLAgentWearables::mInitialWearablesLoaded = false;
// [/SL:KB]
using namespace LLVOAvatarDefines;
@ -2100,9 +2103,23 @@ boost::signals2::connection LLAgentWearables::addLoadedCallback(loaded_callback_
return mLoadedSignal.connect(cb);
}
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
boost::signals2::connection LLAgentWearables::addInitialWearablesLoadedCallback(loaded_callback_t cb)
{
return mInitialWearablesLoadedSignal.connect(cb);
}
// [/SL:KB]
void LLAgentWearables::notifyLoadingStarted()
{
mCOFChangeInProgress = true;
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
if (!mInitialWearablesLoaded)
{
mInitialWearablesLoaded = true;
mInitialWearablesLoadedSignal();
}
// [/SL:KB]
mLoadingStartedSignal();
}

View File

@ -76,6 +76,9 @@ public:
BOOL isWearableCopyable(LLWearableType::EType type, U32 index /*= 0*/) const;
BOOL areWearablesLoaded() const;
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
bool areInitalWearablesLoaded() const { return mInitialWearablesLoaded; }
// [/SL:KB]
bool isCOFChangeInProgress() const { return mCOFChangeInProgress; }
void updateWearablesLoaded();
void checkWearablesLoaded() const;
@ -234,6 +237,9 @@ public:
typedef boost::function<void()> loaded_callback_t;
typedef boost::signals2::signal<void()> loaded_signal_t;
boost::signals2::connection addLoadedCallback(loaded_callback_t cb);
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
boost::signals2::connection addInitialWearablesLoadedCallback(loaded_callback_t cb);
// [/SL:KB]
void notifyLoadingStarted();
void notifyLoadingFinished();
@ -241,6 +247,9 @@ public:
private:
loading_started_signal_t mLoadingStartedSignal; // should be called before wearables are changed
loaded_signal_t mLoadedSignal; // emitted when all agent wearables get loaded
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
loaded_signal_t mInitialWearablesLoadedSignal; // emitted once when the initial wearables are loaded
// [/SL:KB]
//--------------------------------------------------------------------
// Member variables
@ -251,6 +260,9 @@ private:
wearableentry_map_t mWearableDatas;
static BOOL mInitialWearablesUpdateReceived;
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
static bool mInitialWearablesLoaded;
// [/SL:KB]
BOOL mWearablesLoaded;
std::set<LLUUID> mItemsAwaitingWearableUpdate;

View File

@ -292,8 +292,13 @@ public:
private:
found_list_t mFoundList;
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512
/*
LLInventoryModel::item_array_t mObjItems;
LLInventoryModel::item_array_t mGestItems;
*/
// [/SL:KB]
typedef std::set<S32> type_set_t;
type_set_t mTypesToRecover;
type_set_t mTypesToLink;
@ -358,6 +363,9 @@ void LLWearableHoldingPattern::eraseTypeToRecover(LLWearableType::EType type)
mTypesToRecover.erase(type);
}
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-06-19 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512
/*
void LLWearableHoldingPattern::setObjItems(const LLInventoryModel::item_array_t& items)
{
mObjItems = items;
@ -367,6 +375,8 @@ void LLWearableHoldingPattern::setGestItems(const LLInventoryModel::item_array_t
{
mGestItems = items;
}
*/
// [/SL:KB]
bool LLWearableHoldingPattern::isFetchCompleted()
{
@ -436,6 +446,9 @@ void LLWearableHoldingPattern::onAllComplete()
}
// Activate all gestures in this folder
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512
/*
if (mGestItems.count() > 0)
{
llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
@ -453,17 +466,28 @@ void LLWearableHoldingPattern::onAllComplete()
gInventory.notifyObservers();
}
}
*/
// [/SL:KB]
// Update wearables.
llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
LLAppearanceMgr::instance().updateAgentWearables(this, false);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512
/*
// Update attachments to match those requested.
if (isAgentAvatarValid())
// if (isAgentAvatarValid())
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-08-14 (Catznip-2.1.2a) | Modified: Catznip-2.1.1d
// Don't update attachments until initial wearables have loaded (should reduce random attaching/detaching/reattaching at log-on)
if ( (isAgentAvatarValid()) && (gAgentWearables.areInitalWearablesLoaded()) )
// [/SL:KB]
{
llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
LLAgentWearables::userUpdateAttachments(mObjItems);
}
*/
// [/SL:KB]
if (isFetchCompleted() && isMissingCompleted())
{
@ -1360,7 +1384,11 @@ void LLAppearanceMgr::filterWearableItems(
S32 size = items_by_type[i].size();
if (size <= 0)
continue;
S32 start_index = llmax(0,size-max_per_type);
// S32 start_index = llmax(0,size-max_per_type);
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-05-11 (Catznip-2.1.2a) | Added: Catznip-2.0.0h
S32 start_index =
llmax(0, size - ((LLAssetType::AT_BODYPART == LLWearableType::getAssetType((LLWearableType::EType)i)) ? 1 : max_per_type));
// [/SL:KB[
for (S32 j = start_index; j<size; j++)
{
items.push_back(items_by_type[i][j]);
@ -1689,6 +1717,29 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
remove_non_link_items(obj_items);
remove_non_link_items(gest_items);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-08-31 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Include attachments which should be in COF but don't have their link created yet
if (isAgentAvatarValid())
{
uuid_vec_t::iterator itPendingObjLink = mPendingObjLinks.begin();
while (itPendingObjLink != mPendingObjLinks.end())
{
const LLUUID& idItem = *itPendingObjLink;
if (!gAgentAvatarp->isWearingAttachment(idItem))
{
itPendingObjLink = mPendingObjLinks.erase(itPendingObjLink);
continue;
}
LLViewerInventoryItem* pItem = gInventory.getItem(idItem);
if (pItem)
obj_items.push_back(pItem);
++itPendingObjLink;
}
}
// [/SL:KB]
dumpItemArray(wear_items,"asset_dump: wear_item");
dumpItemArray(obj_items,"asset_dump: obj_item");
@ -1701,11 +1752,49 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
//preparing the list of wearables in the correct order for LLAgentWearables
sortItemsByActualDescription(wear_items);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512 [code below copied from LLWearableHoldingPattern::pollCompletion()]
// Activate all gestures in this folder
if (gest_items.count() > 0)
{
llinfos << "Activating " << gest_items.count() << " gestures" << llendl;
LLGestureMgr::instance().activateGestures(gest_items);
// Update the inventory item labels to reflect the fact
// they are active.
LLViewerInventoryCategory* catp =
gInventory.getCategory(LLAppearanceMgr::instance().getCOF());
if (catp)
{
gInventory.updateCategory(catp);
gInventory.notifyObservers();
}
}
// Update attachments to match those requested.
// if (isAgentAvatarValid())
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-08-14 (Catznip-2.1.2a) | Modified: Catznip-2.1.1d
// Don't update attachments until initial wearables have loaded (should reduce random attaching/detaching/reattaching at log-on)
if ( (isAgentAvatarValid()) && (gAgentWearables.areInitalWearablesLoaded()) )
// [/SL:KB]
{
llinfos << "Updating " << obj_items.count() << " attachments" << llendl;
LLAgentWearables::userUpdateAttachments(obj_items);
}
// [/SL:KB]
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
// Fix for http://jira.secondlife.com/browse/VWR-18512
/*
holder->setObjItems(obj_items);
holder->setGestItems(gest_items);
*/
// [/SL:KB]
// Note: can't do normal iteration, because if all the
// wearables can be resolved immediately, then the
@ -2508,11 +2597,27 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
switch (item_to_remove->getType())
{
case LLAssetType::AT_CLOTHING:
if (get_is_item_worn(id_to_remove))
// if (get_is_item_worn(id_to_remove))
// {
// //*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future
// LLWearableBridge::removeItemFromAvatar(item_to_remove);
// }
// [SL:KB] - Patch: Appearance-RemoveWearableFromAvatar | Checked: 2010-08-13 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
{
//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future
LLWearableBridge::removeItemFromAvatar(item_to_remove);
/*const*/ LLWearable* pWearable = gAgentWearables.getWearableFromItemID(item_to_remove->getLinkedUUID());
if ( (pWearable) && (LLAssetType::AT_BODYPART != pWearable->getAssetType()) )
{
U32 idxWearable = gAgentWearables.getWearableIndex(pWearable);
if (idxWearable < LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
gAgentWearables.removeWearable(pWearable->getType(), false, idxWearable);
LLAppearanceMgr::instance().removeCOFItemLinks(item_to_remove->getLinkedUUID(), false);
gInventory.notifyObservers();
}
}
}
// [/SL:KB]
break;
case LLAssetType::AT_OBJECT:
LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID());
@ -2685,7 +2790,11 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
// we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
// it will trigger gAgentWariables.notifyLoadingFinished()
// But it is not acceptable solution. See EXT-7777
LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
// LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-08-31 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
mPendingObjLinks.push_back(item_id);
LLAppearanceMgr::addCOFItemLink(item_id, false, new LLRegisterAttachmentCallback()); // Add COF link for item.
// [/SL:KB]
}
else
{

View File

@ -217,6 +217,19 @@ private:
std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-08-31 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
public:
void onRegisterAttachmentComplete(const LLUUID& idItem)
{
const LLUUID& idItemBase = gInventory.getLinkedItemID(idItem);
uuid_vec_t::iterator itPendingObjLink = std::find(mPendingObjLinks.begin(), mPendingObjLinks.end(), idItemBase);
if (itPendingObjLink != mPendingObjLinks.end())
mPendingObjLinks.erase(itPendingObjLink);
}
private:
uuid_vec_t mPendingObjLinks;
// [/SL:KB]
//////////////////////////////////////////////////////////////////////////////////
// Item-specific convenience functions
public:
@ -243,6 +256,19 @@ private:
bool mUpdateBaseOrder;
};
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-08-31 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
class LLRegisterAttachmentCallback : public LLInventoryCallback
{
public:
LLRegisterAttachmentCallback() {}
/*virtual*/ ~LLRegisterAttachmentCallback() {}
/*virtual*/ void fire(const LLUUID& idItem)
{
LLAppearanceMgr::instance().onRegisterAttachmentComplete(idItem);
}
};
// [/SL:KB]
#define SUPPORT_ENSEMBLES 0

View File

@ -4327,11 +4327,16 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
continue;
if (get_is_item_worn(item->getUUID()))
{
/*
LLWearableList::instance().getAsset(item->getAssetUUID(),
item->getName(),
item->getType(),
LLWearableBridge::onRemoveFromAvatarArrived,
new OnRemoveStruct(item->getLinkedUUID()));
*/
// [SL:KB] - Patch: Appearance-RemoveWearableFromAvatar | Checked: 2010-08-13 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
LLAppearanceMgr::instance().removeItemFromAvatar(item->getUUID());
// [/SL:KB]
}
}
}
@ -4562,6 +4567,7 @@ void LLWearableBridge::wearAddOnAvatar()
}
// static
/*
void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata )
{
LLUUID* item_id = (LLUUID*) userdata;
@ -4585,9 +4591,11 @@ void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userda
}
delete item_id;
}
*/
// static
// BAP remove the "add" code path once everything is fully COF-ified.
/*
void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata )
{
LLUUID* item_id = (LLUUID*) userdata;
@ -4612,6 +4620,7 @@ void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* use
}
delete item_id;
}
*/
// static
BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
@ -4649,6 +4658,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
}
// static
/*
void LLWearableBridge::onRemoveFromAvatar(void* user_data)
{
LLWearableBridge* self = (LLWearableBridge*)user_data;
@ -4667,8 +4677,10 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
}
}
}
*/
// static
/*
void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
void* userdata)
{
@ -4696,6 +4708,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
delete on_remove_struct;
}
*/
// static
void LLWearableBridge::removeAllClothesFromAvatar()
@ -4706,7 +4719,10 @@ void LLWearableBridge::removeAllClothesFromAvatar()
if (itype == LLWearableType::WT_SHAPE || itype == LLWearableType::WT_SKIN || itype == LLWearableType::WT_HAIR || itype == LLWearableType::WT_EYES)
continue;
for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index)
// for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index)
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-09-04 (Catznip-2.1.2a) | Added: Catznip-2.1.2a
for (S32 index = gAgentWearables.getWearableCount((LLWearableType::EType)itype)-1; index >= 0 ; --index)
// [/SL:KB]
{
LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
gAgentWearables.getWearableInventoryItem((LLWearableType::EType)itype, index));
@ -4732,11 +4748,16 @@ void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item)
{
if (item)
{
/*
LLWearableList::instance().getAsset(item->getAssetUUID(),
item->getName(),
item->getType(),
LLWearableBridge::onRemoveFromAvatarArrived,
new OnRemoveStruct(item->getUUID()));
*/
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-08-13 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
LLAppearanceMgr::instance().removeItemFromAvatar(item->getUUID());
// [/SL:KB]
}
}

View File

@ -470,10 +470,10 @@ public:
static void onWearOnAvatar( void* userdata ); // Access to wearOnAvatar() from menu
static BOOL canWearOnAvatar( void* userdata );
static void onWearOnAvatarArrived( LLWearable* wearable, void* userdata );
// static void onWearOnAvatarArrived( LLWearable* wearable, void* userdata );
void wearOnAvatar();
static void onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata );
// static void onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata );
void wearAddOnAvatar();
static BOOL canEditOnAvatar( void* userdata ); // Access to editOnAvatar() from menu
@ -481,8 +481,8 @@ public:
void editOnAvatar();
static BOOL canRemoveFromAvatar( void* userdata );
static void onRemoveFromAvatar( void* userdata );
static void onRemoveFromAvatarArrived( LLWearable* wearable, void* userdata );
// static void onRemoveFromAvatar( void* userdata );
// static void onRemoveFromAvatarArrived( LLWearable* wearable, void* userdata );
static void removeItemFromAvatar(LLViewerInventoryItem *item);
static void removeAllClothesFromAvatar();
void removeFromAvatar();

View File

@ -5576,7 +5576,13 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi
if (!attachment)
{
llwarns << "Object attachment point invalid: " << attachmentID << llendl;
attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
// attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
// [SL:KB] - Patch: Appearance-LegacyMultiAttachment | Checked: 2010-08-28 (Catznip-2.1.2a) | Added: Catznip2.1.2a
S32 idxAttachPt = 1;
if ( (!isSelf()) && (gSavedSettings.getBOOL("LegacyMultiAttachmentSupport")) && (attachmentID > 38) && (attachmentID <= 68) )
idxAttachPt = attachmentID - 38;
attachment = get_if_there(mAttachmentPoints, idxAttachPt, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
// [/SL:KB]
}
return attachment;

View File

@ -95,8 +95,18 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
{
BOOL isNewWearable = FALSE;
LLWearableArrivedData* data = (LLWearableArrivedData*) userdata;
LLWearable* wearable = NULL; // NULL indicates failure
// LLWearable* wearable = NULL; // NULL indicates failure
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-08-13 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
LLWearable* wearable = get_if_there(LLWearableList::instance().mList, uuid, (LLWearable*)NULL);
if (wearable)
{
if(data->mCallback)
data->mCallback(wearable, data->mUserdata);
delete data;
return;
}
// [/SL:KB]
if( !filename )
{
LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL;