LLAgentWearables Transition (1/1)

This commit is contained in:
Shyotl
2011-06-09 01:35:49 -05:00
parent 858f4d1487
commit c57b97c8df
25 changed files with 2866 additions and 1960 deletions

View File

@@ -105,6 +105,7 @@ set(viewer_SOURCE_FILES
llagentdata.cpp llagentdata.cpp
llagentlanguage.cpp llagentlanguage.cpp
llagentpilot.cpp llagentpilot.cpp
llagentwearables.cpp
llanimstatelabels.cpp llanimstatelabels.cpp
llappviewer.cpp llappviewer.cpp
llassetconverter.cpp llassetconverter.cpp
@@ -579,6 +580,7 @@ set(viewer_HEADER_FILES
llagentdata.h llagentdata.h
llagentlanguage.h llagentlanguage.h
llagentpilot.h llagentpilot.h
llagentwearables.h
llanimstatelabels.h llanimstatelabels.h
llappearance.h llappearance.h
llappviewer.h llappviewer.h

View File

@@ -17,6 +17,7 @@
#include "llviewerprecompiledheaders.h" #include "llviewerprecompiledheaders.h"
#include "cofmgr.h" #include "cofmgr.h"
#include "llagent.h" #include "llagent.h"
#include "llagentwearables.h"
#include "llcommonutils.h" #include "llcommonutils.h"
#include "llerror.h" #include "llerror.h"
#include "llvoavatar.h" #include "llvoavatar.h"
@@ -81,7 +82,7 @@ public:
// Add all currently worn wearables // Add all currently worn wearables
for (S32 idxType = 0; idxType < WT_COUNT; idxType++) for (S32 idxType = 0; idxType < WT_COUNT; idxType++)
{ {
const LLUUID& idItem = gAgent.getWearableItem((EWearableType)idxType); const LLUUID& idItem = gAgentWearables.getWearableItemID((EWearableType)idxType);
if (idItem.isNull()) if (idItem.isNull())
continue; continue;
idItems.push_back(idItem); idItems.push_back(idItem);
@@ -388,7 +389,7 @@ void LLCOFMgr::updateAttachments()
} }
// Don't remove attachments until avatar is fully loaded (should reduce random attaching/detaching/reattaching at log-on) // Don't remove attachments until avatar is fully loaded (should reduce random attaching/detaching/reattaching at log-on)
LLAgent::userUpdateAttachments(items, !pAvatar->isFullyLoaded()); LLAgentWearables::userUpdateAttachments(items, !pAvatar->isFullyLoaded());
} }
// ============================================================================ // ============================================================================
@@ -431,7 +432,7 @@ void LLCOFMgr::onLinkWearableComplete(const LLUUID& idItem)
m_PendingWearableLinks.erase(itPending); m_PendingWearableLinks.erase(itPending);
// It may have been removed already in which case we should remove the COF link // It may have been removed already in which case we should remove the COF link
if (!gAgent.isWearingItem(idItemBase)) if (!gAgentWearables.isWearingItem(idItemBase))
removeCOFItemLinks(idItemBase); removeCOFItemLinks(idItemBase);
} }
@@ -458,7 +459,7 @@ void LLCOFMgr::synchWearables()
uuid_vec_t newItems; uuid_vec_t newItems;
for (S32 idxType = 0; idxType < WT_COUNT; idxType++) for (S32 idxType = 0; idxType < WT_COUNT; idxType++)
{ {
const LLUUID& idItem = gAgent.getWearableItem((EWearableType)idxType); const LLUUID& idItem = gAgentWearables.getWearableItemID((EWearableType)idxType);
if (idItem.isNull()) if (idItem.isNull())
continue; continue;
newItems.push_back(idItem); newItems.push_back(idItem);

File diff suppressed because it is too large Load Diff

View File

@@ -819,7 +819,7 @@ private:
/******************************************************************************** /********************************************************************************
** ** ** **
** Deperciated stuff. Move when ready. ** Depreciated stuff. Move when ready.
**/ **/
public: public:
const LLUUID& getInventoryRootID() const { return mInventoryRootID; } const LLUUID& getInventoryRootID() const { return mInventoryRootID; }
@@ -833,164 +833,8 @@ private:
LLUUID mInventoryRootID; LLUUID mInventoryRootID;
static BOOL mForceTPose; static BOOL mForceTPose;
//--------------------------------------------------------------------
// Wearables
//--------------------------------------------------------------------
public:
void setWearable( LLInventoryItem* new_item, LLWearable* wearable );
static bool onSetWearableDialog( const LLSD& notification, const LLSD& response, LLWearable* wearable );
void setWearableFinal( LLInventoryItem* new_item, LLWearable* new_wearable );
void setWearableOutfit( const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove );
void queryWearableCache();
BOOL isWearableModifiable(EWearableType type); /** DEPRECIATED
BOOL isWearableCopyable(EWearableType type);
BOOL needsReplacement(EWearableType wearableType, S32 remove);
U32 getWearablePermMask(EWearableType type);
LLInventoryItem* getWearableInventoryItem(EWearableType type);
LLWearable* getWearable( EWearableType type ) { return (type < WT_COUNT) ? mWearableEntry[ type ].mWearable : NULL; }
BOOL isWearingItem( const LLUUID& item_id );
LLWearable* getWearableFromWearableItem( const LLUUID& item_id );
const LLUUID& getWearableItem( EWearableType type ) { return (type < WT_COUNT) ? mWearableEntry[ type ].mItemID : LLUUID::null; }
static EWearableType getTEWearableType( S32 te );
static LLUUID getDefaultTEImageID( S32 te );
void copyWearableToInventory( EWearableType type );
void makeNewOutfit(
const std::string& new_folder_name,
const LLDynamicArray<S32>& wearables_to_include,
const LLDynamicArray<S32>& attachments_to_include,
BOOL rename_clothing);
void makeNewOutfitDone(S32 index);
void removeWearable( EWearableType type );
static bool onRemoveWearableDialog(const LLSD& notification, const LLSD& response );
void removeWearableFinal( EWearableType type );
void sendAgentWearablesUpdate();
/**
* @brief Only public because of addWearableToAgentInventoryCallback.
*
* NOTE: Do not call this method unless you are the inventory callback.
* NOTE: This can suffer from race conditions when working on the
* same values for index.
* @param index The index in mWearableEntry.
* @param item_id The inventory item id of the new wearable to wear.
* @param wearable The actual wearable data.
*/
void addWearabletoAgentInventoryDone(
S32 index,
const LLUUID& item_id,
LLWearable* wearable);
void saveWearableAs( EWearableType type, const std::string& new_name, BOOL save_in_lost_and_found );
void saveWearable( EWearableType type, BOOL send_update = TRUE );
void saveAllWearables();
void revertWearable( EWearableType type );
void revertAllWearables();
void setWearableName( const LLUUID& item_id, const std::string& new_name );
void createStandardWearables(BOOL female);
void createStandardWearablesDone(S32 index);
void createStandardWearablesAllDone();
BOOL areWearablesLoaded() { return mWearablesLoaded; }
// statics
static void processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data);
static void userRemoveWearable( void* userdata ); // userdata is EWearableType
static void userRemoveAllClothes( void* userdata ); // userdata is NULL
static void userRemoveAllClothesStep2(BOOL proceed, void* userdata ); // userdata is NULL
static void userRemoveAllAttachments( void* userdata); // userdata is NULL
static BOOL selfHasWearable( void* userdata ); // userdata is EWearableType
// static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
// Not the best way to go about this but other attempts changed far too much LL code to be a viable solution
static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array, bool fAttachOnly = false);
// [/SL:KB]
static void userRemoveMultipleAttachments(llvo_vec_t& llvo_array);
static void userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array);
protected:
// internal wearable functions
void sendAgentWearablesRequest();
static void onInitialWearableAssetArrived(LLWearable* wearable, void* userdata);
void recoverMissingWearable(EWearableType type);
void recoverMissingWearableDone();
void addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb,
LLWearable* wearable, const LLUUID& category_id = LLUUID::null,
BOOL notify = TRUE);
private:
//--------------------------------------------------------------------
// Wearables
//--------------------------------------------------------------------
struct LLWearableEntry
{
LLWearableEntry() : mItemID( LLUUID::null ), mWearable( NULL ) {}
LLUUID mItemID; // ID of the inventory item in the agent's inventory.
LLWearable* mWearable;
};
LLWearableEntry mWearableEntry[ WT_COUNT ];
BOOL mWearablesLoaded;
class createStandardWearablesAllDoneCallback : public LLRefCount
{
protected:
~createStandardWearablesAllDoneCallback();
};
class sendAgentWearablesUpdateCallback : public LLRefCount
{
protected:
~sendAgentWearablesUpdateCallback();
};
class addWearableToAgentInventoryCallback : public LLInventoryCallback
{
public:
enum {
CALL_NONE = 0,
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
CALL_MAKENEWOUTFITDONE = 8
} EType;
/**
* @brief Construct a callback for dealing with the wearables.
*
* Would like to pass the agent in here, but we can't safely
* count on it being around later. Just use gAgent directly.
* @param cb callback to execute on completion (??? unused ???)
* @param index Index for the wearable in the agent
* @param wearable The wearable data.
* @param todo Bitmask of actions to take on completion.
*/
addWearableToAgentInventoryCallback(
LLPointer<LLRefCount> cb,
S32 index,
LLWearable* wearable,
U32 todo = CALL_NONE);
virtual void fire(const LLUUID& inv_item);
private:
S32 mIndex;
LLWearable* mWearable;
U32 mTodo;
LLPointer<LLRefCount> mCB;
};
/** DEPERCIATED
** ** ** **
*******************************************************************************/ *******************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,351 @@
/**
* @file llagentwearables.h
* @brief LLAgentWearables class header file
*
* $LicenseInfo:firstyear=2000&license=viewergpl$
*
* Copyright (c) 2000-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*
*/
#ifndef LL_LLAGENTWEARABLES_H
#define LL_LLAGENTWEARABLES_H
// libraries
#include "llmemory.h"
#include "llui.h"
#include "lluuid.h"
#include "llinventory.h"
// newview
#include "llinventorymodel.h"
#include "llviewerinventory.h"
#include "llvoavatardefines.h"
class LLInventoryItem;
class LLVOAvatar;
class LLWearable;
class LLInitialWearablesFetch;
class LLViewerObject;
class LLTexLayerTemplate;
typedef std::vector<LLViewerObject*> llvo_vec_t;
class LLAgentWearables : public LLInitClass<LLAgentWearables>
{
//--------------------------------------------------------------------
// Constructors / destructors / Initializers
//--------------------------------------------------------------------
public:
friend class LLInitialWearablesFetch;
LLAgentWearables();
virtual ~LLAgentWearables();
void setAvatarObject(LLVOAvatar *avatar);
void createStandardWearables(BOOL female);
void cleanup();
//void dump();
// LLInitClass interface
static void initClass();
protected:
void createStandardWearablesDone(S32 index);
void createStandardWearablesAllDone();
//--------------------------------------------------------------------
// Queries
//--------------------------------------------------------------------
public:
BOOL isWearingItem(const LLUUID& item_id) const;
BOOL isWearableModifiable(EWearableType type) const;
BOOL isWearableModifiable(const LLUUID& item_id) const;
BOOL isWearableCopyable(EWearableType type) const;
BOOL areWearablesLoaded() const { return mWearablesLoaded; };
//void updateWearablesLoaded();
//void checkWearablesLoaded() const;
//bool canMoveWearable(const LLUUID& item_id, bool closer_to_body);
// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.
//bool canWearableBeRemoved(const LLWearable* wearable) const;
//void animateAllWearableParams(F32 delta, BOOL upload_bake);
BOOL needsReplacement(EWearableType wearableType, S32 remove);
U32 getWearablePermMask(EWearableType type) const;
//--------------------------------------------------------------------
// Accessors
//--------------------------------------------------------------------
public:
const LLUUID& getWearableItemID(EWearableType type ) const;
//const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const;
const LLWearable* getWearableFromItemID(const LLUUID& item_id) const;
LLWearable* getWearableFromItemID(const LLUUID& item_id);
//LLWearable* getWearableFromAssetID(const LLUUID& asset_id);
LLInventoryItem* getWearableInventoryItem(EWearableType type);
static BOOL selfHasWearable( void* userdata ); // userdata is EWearableType
LLWearable* getWearable( const EWearableType type );
const LLWearable* getWearable( const EWearableType type ) const;
//const LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/) const;
//LLWearable* getTopWearable(const LLWearableType::EType type);
//LLWearable* getBottomWearable(const LLWearableType::EType type);
//U32 getWearableCount(const LLWearableType::EType type) const;
//U32 getWearableCount(const U32 tex_index) const;
static EWearableType getTEWearableType( S32 te );
static LLUUID getDefaultTEImageID( S32 te );
void copyWearableToInventory( EWearableType type );
static const U32 MAX_CLOTHING_PER_TYPE = 5;
//--------------------------------------------------------------------
// Setters
//--------------------------------------------------------------------
private:
// Low-level data structure setter - public access is via setWearableItem, etc.
//void setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable);
//U32 pushWearable(const LLWearableType::EType type, LLWearable *wearable);
//void wearableUpdated(LLWearable *wearable);
//void popWearable(LLWearable *wearable);
//void popWearable(const LLWearableType::EType type, U32 index);
public:
void setWearableItem(LLInventoryItem* new_item, LLWearable* wearable);
void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
void setWearableName(const LLUUID& item_id, const std::string& new_name);
//void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
//U32 getWearableIndex(LLWearable *wearable);
protected:
void setWearableFinal( LLInventoryItem* new_item, LLWearable* new_wearable );
static bool onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable);
void addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb,
LLWearable* wearable,
const LLUUID& category_id = LLUUID::null,
BOOL notify = TRUE);
/**
* @brief Only public because of addWearableToAgentInventoryCallback.
*
* NOTE: Do not call this method unless you are the inventory callback.
* NOTE: This can suffer from race conditions when working on the
* same values for index.
* @param index The index in mWearableEntry.
* @param item_id The inventory item id of the new wearable to wear.
* @param wearable The actual wearable data.
*/
void addWearabletoAgentInventoryDone(
S32 index,
const LLUUID& item_id,
LLWearable* wearable);
void recoverMissingWearable(EWearableType type);
void recoverMissingWearableDone();
//--------------------------------------------------------------------
// Editing/moving wearables
//--------------------------------------------------------------------
public:
//static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null);
//static void editWearable(const LLUUID& item_id);
//bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body);
//void requestEditingWearable(const LLUUID& item_id);
//void editWearableIfRequested(const LLUUID& item_id);
private:
//LLUUID mItemToEdit;
//--------------------------------------------------------------------
// Removing wearables
//--------------------------------------------------------------------
public:
void removeWearable( EWearableType type );
private:
void removeWearableFinal( EWearableType type );
protected:
static bool onRemoveWearableDialog(const LLSD& notification, const LLSD& response);
static void userRemoveAllClothesStep2(BOOL proceed, void* userdata ); // userdata is NULL
//--------------------------------------------------------------------
// Server Communication
//--------------------------------------------------------------------
public:
// Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant)
static void processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data);
//LLUUID computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index,
// BOOL generate_valid_hash = TRUE);
protected:
void sendAgentWearablesUpdate();
void sendAgentWearablesRequest();
void queryWearableCache();
//void updateServer();
static void onInitialWearableAssetArrived(LLWearable* wearable, void* userdata);
//--------------------------------------------------------------------
// Outfits
//--------------------------------------------------------------------
public:
// Should only be called if we *know* we've never done so before, since users may
// not want the Library outfits to stay in their quick outfit selector and can delete them.
//void populateMyOutfitsFolder();
void makeNewOutfit(
const std::string& new_folder_name,
const LLDynamicArray<S32>& wearables_to_include,
const LLDynamicArray<S32>& attachments_to_include,
BOOL rename_clothing);
private:
void makeNewOutfitDone(S32 index);
//--------------------------------------------------------------------
// Save Wearables
//--------------------------------------------------------------------
public:
void saveWearableAs( EWearableType type, const std::string& new_name, BOOL save_in_lost_and_found );
void saveWearable( EWearableType type, BOOL send_update = TRUE );
void saveAllWearables();
void revertWearable( EWearableType type );
void revertAllWearables();
//--------------------------------------------------------------------
// Static UI hooks
//--------------------------------------------------------------------
public:
static void userRemoveWearable( void* userdata ); // userdata is EWearableType
static void userRemoveAllClothes( void* userdata ); // userdata is NULL
// static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
// Not the best way to go about this but other attempts changed far too much LL code to be a viable solution
static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array, bool fAttachOnly = false);
// [/SL:KB]
static void userRemoveAllAttachments( void* userdata); // userdata is NULLy);
static void userRemoveMultipleAttachments(llvo_vec_t& llvo_array);
static void userRemoveAllAttachments();
static void userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array);
BOOL itemUpdatePending(const LLUUID& item_id) const;
U32 itemUpdatePendingCount() const;
//--------------------------------------------------------------------
// Signals
//--------------------------------------------------------------------
public:
/*typedef boost::function<void()> loading_started_callback_t;
typedef boost::signals2::signal<void()> loading_started_signal_t;
boost::signals2::connection addLoadingStartedCallback(loading_started_callback_t cb);
typedef boost::function<void()> loaded_callback_t;
typedef boost::signals2::signal<void()> loaded_signal_t;
boost::signals2::connection addLoadedCallback(loaded_callback_t cb);
void notifyLoadingStarted();
void notifyLoadingFinished();*/
private:
//--------------------------------------------------------------------
// Member variables
//--------------------------------------------------------------------
struct LLWearableEntry
{
LLWearableEntry() : mItemID( LLUUID::null ), mWearable( NULL ) {}
LLUUID mItemID; // ID of the inventory item in the agent's inventory.
LLWearable* mWearable;
};
LLWearableEntry mWearableEntry[ WT_COUNT ];
BOOL mWearablesLoaded;
//--------------------------------------------------------------------------------
// Support classes
//--------------------------------------------------------------------------------
private:
class createStandardWearablesAllDoneCallback : public LLRefCount
{
protected:
~createStandardWearablesAllDoneCallback();
};
class sendAgentWearablesUpdateCallback : public LLRefCount
{
protected:
~sendAgentWearablesUpdateCallback();
};
class addWearableToAgentInventoryCallback : public LLInventoryCallback
{
public:
enum {
CALL_NONE = 0,
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
CALL_MAKENEWOUTFITDONE = 8
} EType;
/**
* @brief Construct a callback for dealing with the wearables.
*
* Would like to pass the agent in here, but we can't safely
* count on it being around later. Just use gAgent directly.
* @param cb callback to execute on completion (??? unused ???)
* @param index Index for the wearable in the agent
* @param wearable The wearable data.
* @param todo Bitmask of actions to take on completion.
*/
addWearableToAgentInventoryCallback(
LLPointer<LLRefCount> cb,
S32 index,
LLWearable* wearable,
U32 todo = CALL_NONE);
virtual void fire(const LLUUID& inv_item);
private:
S32 mIndex;
LLWearable* mWearable;
U32 mTodo;
LLPointer<LLRefCount> mCB;
};
}; // LLAgentWearables
extern LLAgentWearables gAgentWearables;
//--------------------------------------------------------------------
// Types
//--------------------------------------------------------------------
#endif // LL_AGENTWEARABLES_H

View File

@@ -49,6 +49,7 @@
#include "llgroupmgr.h" #include "llgroupmgr.h"
#include "llagent.h" #include "llagent.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "llwindow.h" #include "llwindow.h"
#include "llviewerstats.h" #include "llviewerstats.h"
#include "llmd5.h" #include "llmd5.h"
@@ -4236,6 +4237,7 @@ void LLAppViewer::disconnectViewer()
// close inventory interface, close all windows // close inventory interface, close all windows
LLInventoryView::cleanup(); LLInventoryView::cleanup();
gAgentWearables.cleanup();
gAgentCamera.cleanup(); gAgentCamera.cleanup();
// Also writes cached agent settings to gSavedSettings // Also writes cached agent settings to gSavedSettings
gAgent.cleanup(); gAgent.cleanup();

View File

@@ -41,6 +41,7 @@
#include "llmorphview.h" #include "llmorphview.h"
#include "llfloatertools.h" #include "llfloatertools.h"
#include "llagent.h" #include "llagent.h"
#include "llagentwearables.h"
#include "lltoolmorph.h" #include "lltoolmorph.h"
#include "llvoavatar.h" #include "llvoavatar.h"
#include "llradiogroup.h" #include "llradiogroup.h"
@@ -587,7 +588,7 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
LLVOAvatar* avatar = gAgent.getAvatarObject(); LLVOAvatar* avatar = gAgent.getAvatarObject();
ESex avatar_sex = avatar->getSex(); ESex avatar_sex = avatar->getSex();
LLViewerInventoryItem* item; LLViewerInventoryItem* item;
item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(mType); item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(mType);
U32 perm_mask = 0x0; U32 perm_mask = 0x0;
BOOL is_complete = FALSE; BOOL is_complete = FALSE;
bool can_export = false; bool can_export = false;
@@ -653,27 +654,27 @@ void LLPanelEditWearable::onBtnTakeOff( void* userdata )
{ {
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
LLWearable* wearable = gAgent.getWearable( self->mType ); LLWearable* wearable = gAgentWearables.getWearable( self->mType );
if( !wearable ) if( !wearable )
{ {
return; return;
} }
gAgent.removeWearable( self->mType ); gAgentWearables.removeWearable( self->mType );
} }
// static // static
void LLPanelEditWearable::onBtnSave( void* userdata ) void LLPanelEditWearable::onBtnSave( void* userdata )
{ {
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
gAgent.saveWearable( self->mType ); gAgentWearables.saveWearable( self->mType );
} }
// static // static
void LLPanelEditWearable::onBtnSaveAs( void* userdata ) void LLPanelEditWearable::onBtnSaveAs( void* userdata )
{ {
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
LLWearable* wearable = gAgent.getWearable( self->getType() ); LLWearable* wearable = gAgentWearables.getWearable( self->getType() );
if( wearable ) if( wearable )
{ {
LLWearableSaveAsDialog* save_as_dialog = new LLWearableSaveAsDialog( wearable->getName(), onSaveAsCommit, self ); LLWearableSaveAsDialog* save_as_dialog = new LLWearableSaveAsDialog( wearable->getName(), onSaveAsCommit, self );
@@ -689,7 +690,7 @@ void LLPanelEditWearable::onSaveAsCommit( LLWearableSaveAsDialog* save_as_dialog
LLVOAvatar* avatar = gAgent.getAvatarObject(); LLVOAvatar* avatar = gAgent.getAvatarObject();
if( avatar ) if( avatar )
{ {
gAgent.saveWearableAs( self->getType(), save_as_dialog->getItemName(), FALSE ); gAgentWearables.saveWearableAs( self->getType(), save_as_dialog->getItemName(), FALSE );
} }
} }
@@ -698,7 +699,7 @@ void LLPanelEditWearable::onSaveAsCommit( LLWearableSaveAsDialog* save_as_dialog
void LLPanelEditWearable::onBtnRevert( void* userdata ) void LLPanelEditWearable::onBtnRevert( void* userdata )
{ {
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
gAgent.revertWearable( self->mType ); gAgentWearables.revertWearable( self->mType );
} }
// static // static
@@ -737,7 +738,7 @@ bool LLPanelEditWearable::onSelectAutoWearOption(const LLSD& notification, const
bool LLPanelEditWearable::textureIsInvisible(ETextureIndex te) bool LLPanelEditWearable::textureIsInvisible(ETextureIndex te)
{ {
if (gAgent.getWearable(mType)) if (gAgentWearables.getWearable(mType))
{ {
LLVOAvatar *avatar = gAgent.getAvatarObject(); LLVOAvatar *avatar = gAgent.getAvatarObject();
if (avatar) if (avatar)
@@ -873,7 +874,7 @@ void LLPanelEditWearable::addTextureDropTarget( ETextureIndex te, const std::str
LLVOAvatar* avatar = gAgent.getAvatarObject(); LLVOAvatar* avatar = gAgent.getAvatarObject();
if (avatar) if (avatar)
{ {
LLWearable* wearable = gAgent.getWearable(mType); LLWearable* wearable = gAgentWearables.getWearable(mType);
if (wearable && mType == WT_ALPHA) if (wearable && mType == WT_ALPHA)
{ {
const LLTextureEntry* current_te = avatar->getTE(te); const LLTextureEntry* current_te = avatar->getTE(te);
@@ -903,7 +904,7 @@ void LLPanelEditWearable::onTextureCommit( LLUICtrl* ctrl, void* userdata )
image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
} }
self->mTextureList[ctrl->getName()] = te; self->mTextureList[ctrl->getName()] = te;
if (gAgent.getWearable(self->mType)) if (gAgentWearables.getWearable(self->mType))
{ {
avatar->setLocTexTE(te, image, TRUE); avatar->setLocTexTE(te, image, TRUE);
avatar->wearableUpdated(self->mType, FALSE); avatar->wearableUpdated(self->mType, FALSE);
@@ -955,14 +956,14 @@ void LLPanelEditWearable::draw()
return; return;
} }
LLWearable* wearable = gAgent.getWearable( mType ); LLWearable* wearable = gAgentWearables.getWearable( mType );
BOOL has_wearable = (wearable != NULL ); BOOL has_wearable = (wearable != NULL );
BOOL is_dirty = isDirty(); BOOL is_dirty = isDirty();
BOOL is_modifiable = FALSE; BOOL is_modifiable = FALSE;
BOOL is_copyable = FALSE; BOOL is_copyable = FALSE;
BOOL is_complete = FALSE; BOOL is_complete = FALSE;
LLViewerInventoryItem* item; LLViewerInventoryItem* item;
item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(mType); item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(mType);
if(item) if(item)
{ {
const LLPermissions& perm = item->getPermissions(); const LLPermissions& perm = item->getPermissions();
@@ -1038,7 +1039,7 @@ void LLPanelEditWearable::draw()
childSetTextArg("title_loading", "[DESC]", std::string(LLWearable::typeToTypeLabel( mType ))); childSetTextArg("title_loading", "[DESC]", std::string(LLWearable::typeToTypeLabel( mType )));
std::string path; std::string path;
const LLUUID& item_id = gAgent.getWearableItem( wearable->getType() ); const LLUUID& item_id = gAgentWearables.getWearableItemID( wearable->getType() );
gInventory.appendPath(item_id, path); gInventory.appendPath(item_id, path);
childSetVisible("path", TRUE); childSetVisible("path", TRUE);
childSetTextArg("path", "[PATH]", path); childSetTextArg("path", "[PATH]", path);
@@ -1051,7 +1052,7 @@ void LLPanelEditWearable::draw()
childSetTextArg("title", "[DESC]", wearable->getName() ); childSetTextArg("title", "[DESC]", wearable->getName() );
std::string path; std::string path;
const LLUUID& item_id = gAgent.getWearableItem( wearable->getType() ); const LLUUID& item_id = gAgentWearables.getWearableItemID( wearable->getType() );
gInventory.appendPath(item_id, path); gInventory.appendPath(item_id, path);
childSetVisible("path", TRUE); childSetVisible("path", TRUE);
childSetTextArg("path", "[PATH]", path); childSetTextArg("path", "[PATH]", path);
@@ -1198,7 +1199,7 @@ void LLPanelEditWearable::setVisible(BOOL visible)
BOOL LLPanelEditWearable::isDirty() const BOOL LLPanelEditWearable::isDirty() const
{ {
LLWearable* wearable = gAgent.getWearable( mType ); LLWearable* wearable = gAgentWearables.getWearable( mType );
if( !wearable ) if( !wearable )
{ {
return FALSE; return FALSE;
@@ -1223,7 +1224,7 @@ void LLPanelEditWearable::onCommitSexChange( LLUICtrl*, void* userdata )
return; return;
} }
if( !gAgent.isWearableModifiable(self->mType)) if( !gAgentWearables.isWearableModifiable(self->mType))
{ {
return; return;
} }
@@ -1933,10 +1934,10 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
for( S32 i=0; i < WT_COUNT; i++ ) for( S32 i=0; i < WT_COUNT; i++ )
{ {
is_modifiable = FALSE; is_modifiable = FALSE;
LLWearable* old_wearable = gAgent.getWearable((EWearableType)i); LLWearable* old_wearable = gAgentWearables.getWearable((EWearableType)i);
if( old_wearable ) if( old_wearable )
{ {
item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i); item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((EWearableType)i);
if(item) if(item)
{ {
const LLPermissions& perm = item->getPermissions(); const LLPermissions& perm = item->getPermissions();
@@ -1957,10 +1958,10 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
for( S32 i=0; i < WT_COUNT; i++ ) for( S32 i=0; i < WT_COUNT; i++ )
{ {
is_modifiable = FALSE; is_modifiable = FALSE;
LLWearable* old_wearable = gAgent.getWearable((EWearableType)i); LLWearable* old_wearable = gAgentWearables.getWearable((EWearableType)i);
if( old_wearable ) if( old_wearable )
{ {
item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i); item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((EWearableType)i);
if(item) if(item)
{ {
const LLPermissions& perm = item->getPermissions(); const LLPermissions& perm = item->getPermissions();
@@ -1985,7 +1986,7 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
void LLFloaterCustomize::onBtnOk( void* userdata ) void LLFloaterCustomize::onBtnOk( void* userdata )
{ {
LLFloaterCustomize* floater = (LLFloaterCustomize*) userdata; LLFloaterCustomize* floater = (LLFloaterCustomize*) userdata;
gAgent.saveAllWearables(); gAgentWearables.saveAllWearables();
LLVOAvatar* avatar = gAgent.getAvatarObject(); LLVOAvatar* avatar = gAgent.getAvatarObject();
if ( avatar ) if ( avatar )
@@ -2012,7 +2013,7 @@ void LLFloaterCustomize::onBtnMakeOutfit( void* userdata )
for( S32 i = 0; i < WT_COUNT; i++ ) for( S32 i = 0; i < WT_COUNT; i++ )
{ {
BOOL enabled = (gAgent.getWearable( (EWearableType) i ) != NULL); BOOL enabled = (gAgentWearables.getWearable( (EWearableType) i ) != NULL);
BOOL selected = (enabled && (WT_SHIRT <= i) && (i < WT_COUNT)); // only select clothing by default BOOL selected = (enabled && (WT_SHIRT <= i) && (i < WT_COUNT)); // only select clothing by default
if (gAgent.isTeen() if (gAgent.isTeen()
&& !edit_wearable_for_teens((EWearableType)i)) && !edit_wearable_for_teens((EWearableType)i))
@@ -2039,7 +2040,7 @@ void LLFloaterCustomize::onMakeOutfitCommit( LLMakeOutfitDialog* dialog, void* u
dialog->getIncludedItems( wearables_to_include, attachments_to_include ); dialog->getIncludedItems( wearables_to_include, attachments_to_include );
gAgent.makeNewOutfit( dialog->getFolderName(), wearables_to_include, attachments_to_include, dialog->getRenameClothing() ); gAgentWearables.makeNewOutfit( dialog->getFolderName(), wearables_to_include, attachments_to_include, dialog->getRenameClothing() );
} }
} }
@@ -2745,13 +2746,13 @@ bool LLFloaterCustomize::onSaveDialog(const LLSD& notification, const LLSD& resp
switch( option ) switch( option )
{ {
case 0: // "Save" case 0: // "Save"
gAgent.saveWearable( cur ); gAgentWearables.saveWearable( cur );
proceed = TRUE; proceed = TRUE;
break; break;
case 1: // "Don't Save" case 1: // "Don't Save"
{ {
gAgent.revertWearable( cur ); gAgentWearables.revertWearable( cur );
proceed = TRUE; proceed = TRUE;
} }
break; break;
@@ -2787,7 +2788,7 @@ void LLFloaterCustomize::fetchInventory()
LLUUID item_id; LLUUID item_id;
for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type) for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
{ {
item_id = gAgent.getWearableItem((EWearableType)type); item_id = gAgentWearables.getWearableItemID((EWearableType)type);
if(item_id.notNull()) if(item_id.notNull())
{ {
ids.push_back(item_id); ids.push_back(item_id);
@@ -2813,7 +2814,7 @@ void LLFloaterCustomize::updateInventoryUI()
panel = mWearablePanelList[i]; panel = mWearablePanelList[i];
if(panel) if(panel)
{ {
item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(panel->getType()); item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(panel->getType());
} }
if(item) if(item)
{ {
@@ -2848,7 +2849,7 @@ void LLFloaterCustomize::updateScrollingPanelUI()
LLPanelEditWearable* panel = mWearablePanelList[sCurrentWearableType]; LLPanelEditWearable* panel = mWearablePanelList[sCurrentWearableType];
if(panel) if(panel)
{ {
LLViewerInventoryItem* item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(panel->getType()); LLViewerInventoryItem* item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(panel->getType());
if(item) if(item)
{ {
U32 perm_mask = item->getPermissions().getMaskOwner(); U32 perm_mask = item->getPermissions().getMaskOwner();

View File

@@ -67,6 +67,7 @@
// We need these because some of the code below relies on things like // We need these because some of the code below relies on things like
// gAgent root folder. Remove them once the abstraction leak is fixed. // gAgent root folder. Remove them once the abstraction leak is fixed.
#include "llagent.h" #include "llagent.h"
#include "llagentwearables.h"
#include "llappviewer.h" #include "llappviewer.h"
///---------------------------------------------------------------------------- ///----------------------------------------------------------------------------
@@ -4688,7 +4689,7 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)
mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
BOOL passed = (0x1 << listener->getInventoryType() & mFilterOps.mFilterTypes || listener->getInventoryType() == LLInventoryType::IT_NONE) BOOL passed = (0x1 << listener->getInventoryType() & mFilterOps.mFilterTypes || listener->getInventoryType() == LLInventoryType::IT_NONE)
&& (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)
&& (mFilterWorn == false || gAgent.isWearingItem(item_id) || && (mFilterWorn == false || gAgentWearables.isWearingItem(item_id) ||
(gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id))) (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id)))
&& ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)
&& (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate);

View File

@@ -41,6 +41,7 @@
#include "cofmgr.h" #include "cofmgr.h"
#include "llagent.h" #include "llagent.h"
#include "llagentwearables.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llcallingcard.h" #include "llcallingcard.h"
#include "llcheckboxctrl.h" // for radio buttons #include "llcheckboxctrl.h" // for radio buttons
@@ -1506,7 +1507,7 @@ BOOL LLFolderBridge::isItemRemovable()
if ((item->getType() == LLAssetType::AT_CLOTHING || if ((item->getType() == LLAssetType::AT_CLOTHING ||
item->getType() == LLAssetType::AT_BODYPART) && !item->getIsLinkType()) item->getType() == LLAssetType::AT_BODYPART) && !item->getIsLinkType())
{ {
if( gAgent.isWearingItem( item->getUUID() ) ) if( gAgentWearables.isWearingItem( item->getUUID() ) )
{ {
return FALSE; return FALSE;
} }
@@ -1660,7 +1661,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if( (item->getType() == LLAssetType::AT_CLOTHING) || if( (item->getType() == LLAssetType::AT_CLOTHING) ||
(item->getType() == LLAssetType::AT_BODYPART) ) (item->getType() == LLAssetType::AT_BODYPART) )
{ {
if( gAgent.isWearingItem( item->getUUID() ) ) if( gAgentWearables.isWearingItem( item->getUUID() ) )
{ {
is_movable = FALSE; // It's generally movable, but not into the trash! is_movable = FALSE; // It's generally movable, but not into the trash!
break; break;
@@ -2845,7 +2846,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{ {
case LLAssetType::AT_CLOTHING: case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART: case LLAssetType::AT_BODYPART:
is_movable = !gAgent.isWearingItem(inv_item->getUUID()); is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
break; break;
case LLAssetType::AT_OBJECT: case LLAssetType::AT_OBJECT:
@@ -4818,7 +4819,7 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, void* userdata )
obj_items.insert(obj_items.end(), obj_items_new.begin(), obj_items_new.end()); obj_items.insert(obj_items.end(), obj_items_new.begin(), obj_items_new.end());
// [/RLVa:KB] // [/RLVa:KB]
LLAgent::userUpdateAttachments(obj_items); LLAgentWearables::userUpdateAttachments(obj_items);
} }
else else
{ {
@@ -4926,7 +4927,7 @@ void wear_inventory_category_on_avatar_step3(LLWearableHoldingPattern* holder, B
if(wearables.count() > 0) if(wearables.count() > 0)
{ {
gAgent.setWearableOutfit(items, wearables, !append); gAgentWearables.setWearableOutfit(items, wearables, !append);
gInventory.notifyObservers(); gInventory.notifyObservers();
} }
@@ -5012,9 +5013,9 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata)
{ {
for(i = 0; i < wearable_count; ++i) for(i = 0; i < wearable_count; ++i)
{ {
// if( gAgent.isWearingItem (item_array.get(i)->getUUID()) ) // if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) )
// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-0.2.2a // [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-0.2.2a
LLWearable* pWearable = gAgent.getWearableFromWearableItem(item_array.get(i)->getLinkedUUID()); LLWearable* pWearable = gAgentWearables.getWearableFromItemID(item_array.get(i)->getLinkedUUID());
if ( (pWearable) && ( (!rlv_handler_t::isEnabled()) || (gRlvWearableLocks.canRemove(pWearable->getType())) ) ) if ( (pWearable) && ( (!rlv_handler_t::isEnabled()) || (gRlvWearableLocks.canRemove(pWearable->getType())) ) )
// [/RLVa:KB] // [/RLVa:KB]
{ {
@@ -5059,9 +5060,9 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata)
BOOL LLWearableBridge::renameItem(const std::string& new_name) BOOL LLWearableBridge::renameItem(const std::string& new_name)
{ {
if( gAgent.isWearingItem( mUUID ) ) if( gAgentWearables.isWearingItem( mUUID ) )
{ {
gAgent.setWearableName( mUUID, new_name ); gAgentWearables.setWearableName( mUUID, new_name );
} }
return LLItemBridge::renameItem(new_name); return LLItemBridge::renameItem(new_name);
} }
@@ -5079,7 +5080,7 @@ BOOL LLWearableBridge::isItemRemovable()
return TRUE; return TRUE;
} }
// <edit> // <edit>
//if(gAgent.isWearingItem(mUUID)) return FALSE; //if(gAgentWearables.isWearingItem(mUUID)) return FALSE;
// </edit> // </edit>
return LLInvFVBridge::isItemRemovable(); return LLInvFVBridge::isItemRemovable();
} }
@@ -5088,7 +5089,7 @@ LLFontGL::StyleFlags LLWearableBridge::getLabelStyle() const
{ {
U8 font = LLFontGL::NORMAL; U8 font = LLFontGL::NORMAL;
if (gAgent.isWearingItem(mUUID)) if (gAgentWearables.isWearingItem(mUUID))
{ {
font |= LLFontGL::BOLD; font |= LLFontGL::BOLD;
} }
@@ -5104,7 +5105,7 @@ LLFontGL::StyleFlags LLWearableBridge::getLabelStyle() const
std::string LLWearableBridge::getLabelSuffix() const std::string LLWearableBridge::getLabelSuffix() const
{ {
if( gAgent.isWearingItem( mUUID ) ) if( gAgentWearables.isWearingItem( mUUID ) )
{ {
return LLItemBridge::getLabelSuffix() + " (worn)"; return LLItemBridge::getLabelSuffix() + " (worn)";
} }
@@ -5133,7 +5134,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
} }
else if ("take_off" == action) else if ("take_off" == action)
{ {
if(gAgent.isWearingItem(mUUID)) if(gAgentWearables.isWearingItem(mUUID))
{ {
LLViewerInventoryItem* item = getItem(); LLViewerInventoryItem* item = getItem();
if (item) if (item)
@@ -5157,7 +5158,7 @@ void LLWearableBridge::openItem()
} }
else if(isAgentInventory()) else if(isAgentInventory())
{ {
if (gAgent.isWearingItem(mUUID)) if (gAgentWearables.isWearingItem(mUUID))
{ {
performAction(NULL, NULL, "take_off"); performAction(NULL, NULL, "take_off");
} }
@@ -5270,7 +5271,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
if(!item || !item->isComplete()) return FALSE; if(!item || !item->isComplete()) return FALSE;
} }
return (!gAgent.isWearingItem(self->mUUID)); return (!gAgentWearables.isWearingItem(self->mUUID));
} }
// Called from menus // Called from menus
@@ -5286,7 +5287,7 @@ void LLWearableBridge::wearOnAvatar()
{ {
// Don't wear anything until initial wearables are loaded, can // Don't wear anything until initial wearables are loaded, can
// destroy clothing items. // destroy clothing items.
if (!gAgent.areWearablesLoaded()) if (!gAgentWearables.areWearablesLoaded())
{ {
LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
return; return;
@@ -5340,7 +5341,7 @@ void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userda
// item->updateAssetOnServer(); // item->updateAssetOnServer();
// wearable = new_wearable; // wearable = new_wearable;
// } // }
gAgent.setWearable(item, wearable); gAgentWearables.setWearableItem(item, wearable);
gInventory.notifyObservers(); gInventory.notifyObservers();
//self->getFolderItem()->refreshFromRoot(); //self->getFolderItem()->refreshFromRoot();
} }
@@ -5359,7 +5360,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data; LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return FALSE; if(!self) return FALSE;
return (gAgent.isWearingItem(self->mUUID)); return (gAgentWearables.isWearingItem(self->mUUID));
} }
// static // static
@@ -5375,7 +5376,7 @@ void LLWearableBridge::onEditOnAvatar(void* user_data)
void LLWearableBridge::editOnAvatar() void LLWearableBridge::editOnAvatar()
{ {
LLUUID linked_id = gInventory.getLinkedItemID(mUUID); LLUUID linked_id = gInventory.getLinkedItemID(mUUID);
LLWearable* wearable = gAgent.getWearableFromWearableItem(linked_id); LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id);
if( wearable ) if( wearable )
{ {
// Set the tab to the right wearable. // Set the tab to the right wearable.
@@ -5395,7 +5396,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data; LLWearableBridge* self = (LLWearableBridge*)user_data;
if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
{ {
return gAgent.isWearingItem( self->mUUID ); return gAgentWearables.isWearingItem( self->mUUID );
} }
return FALSE; return FALSE;
} }
@@ -5405,7 +5406,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
{ {
LLWearableBridge* self = (LLWearableBridge*)user_data; LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return; if(!self) return;
if(gAgent.isWearingItem(self->mUUID)) if(gAgentWearables.isWearingItem(self->mUUID))
{ {
LLViewerInventoryItem* item = self->getItem(); LLViewerInventoryItem* item = self->getItem();
if (item) if (item)
@@ -5427,14 +5428,14 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
if(wearable) if(wearable)
{ {
if (gAgent.isWearingItem(item_id)) if (gAgentWearables.isWearingItem(item_id))
{ {
EWearableType type = wearable->getType(); EWearableType type = wearable->getType();
if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES) ) //&& if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES) ) //&&
//!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
{ {
gAgent.removeWearable( type ); gAgentWearables.removeWearable( type );
} }
} }
} }

View File

@@ -3577,7 +3577,7 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* ite
case LLAssetType::AT_BODYPART: case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING: case LLAssetType::AT_CLOTHING:
if(!gAgent.isWearingItem(item->getUUID())) if(!gAgentWearables.isWearingItem(item->getUUID()))
{ {
allowed = true; allowed = true;
} }

View File

@@ -1986,7 +1986,7 @@ public:
virtual bool operator()(LLInventoryCategory* cat, virtual bool operator()(LLInventoryCategory* cat,
LLInventoryItem* item) LLInventoryItem* item)
{ {
return !gAgent.isWearingItem(item->getUUID()); return !gAgentWearables.isWearingItem(item->getUUID());
} }
}; };

View File

@@ -87,6 +87,7 @@
#include "llagent.h" #include "llagent.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h" #include "llagentpilot.h"
#include "llfloateravatarlist.h" #include "llfloateravatarlist.h"
#include "llfloateravatarpicker.h" #include "llfloateravatarpicker.h"
@@ -2839,7 +2840,7 @@ bool idle_startup()
else else
{ {
// OK to just get the wearables // OK to just get the wearables
if ( gAgent.areWearablesLoaded() ) if ( gAgentWearables.areWearablesLoaded() )
{ {
// We have our clothing, proceed. // We have our clothing, proceed.
//llinfos << "wearables loaded" << llendl; //llinfos << "wearables loaded" << llendl;
@@ -3522,7 +3523,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
// LLFloaterRate::processReputationIndividualReply); // LLFloaterRate::processReputationIndividualReply);
msg->setHandlerFuncFast(_PREHASH_AgentWearablesUpdate, msg->setHandlerFuncFast(_PREHASH_AgentWearablesUpdate,
LLAgent::processAgentInitialWearablesUpdate ); LLAgentWearables::processAgentInitialWearablesUpdate );
msg->setHandlerFunc("ScriptControlChange", msg->setHandlerFunc("ScriptControlChange",
LLAgent::processScriptControlChange ); LLAgent::processScriptControlChange );
@@ -3669,7 +3670,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
has_name); has_name);
if (0 == cat_array.count()) if (0 == cat_array.count())
{ {
gAgent.createStandardWearables(gender); gAgentWearables.createStandardWearables(gender);
} }
else else
{ {
@@ -3794,6 +3795,11 @@ void LLStartUp::setStartupState( EStartupState state )
void reset_login() void reset_login()
{ {
gAgentWearables.cleanup();
gAgentCamera.cleanup();
gAgent.cleanup();
LLWorld::getInstance()->destroyClass();
// OGPX : Save URL history file // OGPX : Save URL history file
// This needs to be done on login failure because it gets read on *every* login attempt // This needs to be done on login failure because it gets read on *every* login attempt
LLURLHistory::saveFile("url_history.xml"); LLURLHistory::saveFile("url_history.xml");

View File

@@ -35,6 +35,7 @@
#include "imageids.h" #include "imageids.h"
#include "llagent.h" #include "llagent.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "llcrc.h" #include "llcrc.h"
#include "lldir.h" #include "lldir.h"
#include "llglheaders.h" #include "llglheaders.h"
@@ -82,7 +83,7 @@ LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar,
mStartTime = LLFrameTimer::getTotalTime(); // Record starting time mStartTime = LLFrameTimer::getTotalTime(); // Record starting time
for( S32 i = 0; i < WT_COUNT; i++ ) for( S32 i = 0; i < WT_COUNT; i++ )
{ {
LLWearable* wearable = gAgent.getWearable( (EWearableType)i); LLWearable* wearable = gAgentWearables.getWearable( (EWearableType)i);
if( wearable ) if( wearable )
{ {
mWearableAssets[i] = wearable->getID(); mWearableAssets[i] = wearable->getID();

View File

@@ -0,0 +1,575 @@
/**
* @file lltexlayerparams.cpp
* @brief Texture layer parameters
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*
*/
#include "llviewerprecompiledheaders.h"
#include "lltexlayerparams.h"
#include "llagentcamera.h"
#include "llimagetga.h"
#include "lltexlayer.h"
#include "llvoavatarself.h"
#include "llwearable.h"
#include "llui.h"
//-----------------------------------------------------------------------------
// LLTexLayerParam
//-----------------------------------------------------------------------------
LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
mTexLayer(layer),
mAvatar(NULL)
{
if (mTexLayer != NULL)
{
mAvatar = mTexLayer->getTexLayerSet()->getAvatar();
}
else
{
llerrs << "LLTexLayerParam constructor passed with NULL reference for layer!" << llendl;
}
}
LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
mTexLayer(NULL)
{
mAvatar = avatar;
}
BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar )
{
LLViewerVisualParam::setInfo(info);
if (add_to_avatar)
{
mAvatar->addVisualParam( this);
}
return TRUE;
}
//-----------------------------------------------------------------------------
// LLTexLayerParamAlpha
//-----------------------------------------------------------------------------
// static
LLTexLayerParamAlpha::param_alpha_ptr_list_t LLTexLayerParamAlpha::sInstances;
// static
void LLTexLayerParamAlpha::dumpCacheByteCount()
{
S32 gl_bytes = 0;
getCacheByteCount( &gl_bytes);
llinfos << "Processed Alpha Texture Cache GL:" << (gl_bytes/1024) << "KB" << llendl;
}
// static
void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)
{
*gl_bytes = 0;
for (param_alpha_ptr_list_t::iterator iter = sInstances.begin();
iter != sInstances.end(); iter++)
{
LLTexLayerParamAlpha* instance = *iter;
LLViewerTexture* tex = instance->mCachedProcessedTexture;
if (tex)
{
S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
if (tex->hasGLTexture())
{
*gl_bytes += bytes;
}
}
}
}
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :
LLTexLayerParam(layer),
mCachedProcessedTexture(NULL),
mNeedsCreateTexture(FALSE),
mStaticImageInvalid(FALSE),
mAvgDistortionVec(1.f, 1.f, 1.f),
mCachedEffectiveWeight(0.f)
{
sInstances.push_front(this);
}
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) :
LLTexLayerParam(avatar),
mCachedProcessedTexture(NULL),
mNeedsCreateTexture(FALSE),
mStaticImageInvalid(FALSE),
mAvgDistortionVec(1.f, 1.f, 1.f),
mCachedEffectiveWeight(0.f)
{
sInstances.push_front(this);
}
LLTexLayerParamAlpha::~LLTexLayerParamAlpha()
{
deleteCaches();
sInstances.remove(this);
}
/*virtual*/ LLViewerVisualParam* LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const
{
LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer);
*new_param = *this;
return new_param;
}
void LLTexLayerParamAlpha::deleteCaches()
{
mStaticImageTGA = NULL; // deletes image
mCachedProcessedTexture = NULL;
mStaticImageRaw = NULL;
mNeedsCreateTexture = FALSE;
}
BOOL LLTexLayerParamAlpha::getMultiplyBlend() const
{
return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend;
}
void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
{
if (mIsAnimating || mTexLayer == NULL)
{
return;
}
F32 min_weight = getMinWeight();
F32 max_weight = getMaxWeight();
F32 new_weight = llclamp(weight, min_weight, max_weight);
U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight);
U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight);
if (cur_u8 != new_u8)
{
mCurWeight = new_weight;
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
{
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures())
{
upload_bake = FALSE;
}
mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
mTexLayer->invalidateMorphMasks();
}
}
}
void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake)
{
// do not animate dummy parameters
if (mIsDummy)
{
setWeight(target_value, upload_bake);
return;
}
mTargetWeight = target_value;
setWeight(target_value, upload_bake);
mIsAnimating = TRUE;
if (mNext)
{
mNext->setAnimationTarget(target_value, upload_bake);
}
}
void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake)
{
if (mNext)
{
mNext->animate(delta, upload_bake);
}
}
BOOL LLTexLayerParamAlpha::getSkip() const
{
if (!mTexLayer)
{
return TRUE;
}
const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar();
if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight)
{
F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
if (is_approx_zero(effective_weight))
{
return TRUE;
}
}
EWearableType type = (EWearableType)getWearableType();
if ((type != WT_INVALID) && !avatar->isWearingWearableType(type))
{
return TRUE;
}
return FALSE;
}
BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
{
BOOL success = TRUE;
if (!mTexLayer)
{
return success;
}
F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
BOOL weight_changed = effective_weight != mCachedEffectiveWeight;
if (getSkip())
{
return success;
}
LLTexLayerParamAlphaInfo *info = (LLTexLayerParamAlphaInfo *)getInfo();
gGL.flush();
if (info->mMultiplyBlend)
{
gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function
}
else
{
gGL.setSceneBlendType(LLRender::BT_ADD); // Addition: approximates a max() function
}
if (!info->mStaticImageFileName.empty() && !mStaticImageInvalid)
{
if (mStaticImageTGA.isNull())
{
// Don't load the image file until we actually need it the first time. Like now.
mStaticImageTGA = LLTexLayerStaticImageList::getInstance()->getImageTGA(info->mStaticImageFileName);
// We now have something in one of our caches
LLTexLayerSet::sHasCaches |= mStaticImageTGA.notNull() ? TRUE : FALSE;
if (mStaticImageTGA.isNull())
{
llwarns << "Unable to load static file: " << info->mStaticImageFileName << llendl;
mStaticImageInvalid = TRUE; // don't try again.
return FALSE;
}
}
const S32 image_tga_width = mStaticImageTGA->getWidth();
const S32 image_tga_height = mStaticImageTGA->getHeight();
if (!mCachedProcessedTexture ||
(mCachedProcessedTexture->getWidth() != image_tga_width) ||
(mCachedProcessedTexture->getHeight() != image_tga_height) ||
(weight_changed))
{
// llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl;
mCachedEffectiveWeight = effective_weight;
if (!mCachedProcessedTexture)
{
mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE);
// We now have something in one of our caches
LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE;
mCachedProcessedTexture->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
}
// Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed.
mStaticImageRaw = NULL;
mStaticImageRaw = new LLImageRaw;
mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight);
mNeedsCreateTexture = TRUE;
}
if (mCachedProcessedTexture)
{
{
// Create the GL texture, and then hang onto it for future use.
if (mNeedsCreateTexture)
{
mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw);
mNeedsCreateTexture = FALSE;
gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP);
}
LLGLSNoAlphaTest gls_no_alpha_test;
gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
gl_rect_2d_simple_tex(width, height);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
stop_glerror();
}
}
// Don't keep the cache for other people's avatars
// (It's not really a "cache" in that case, but the logic is the same)
if (!mAvatar->isSelf())
{
mCachedProcessedTexture = NULL;
}
}
else
{
LLGLDisable no_alpha(GL_ALPHA_TEST);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f(0.f, 0.f, 0.f, effective_weight);
gl_rect_2d_simple(width, height);
}
return success;
}
//-----------------------------------------------------------------------------
// LLTexLayerParamAlphaInfo
//-----------------------------------------------------------------------------
LLTexLayerParamAlphaInfo::LLTexLayerParamAlphaInfo() :
mMultiplyBlend(FALSE),
mSkipIfZeroWeight(FALSE),
mDomain(0.f)
{
}
BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
{
llassert(node->hasName("param") && node->getChildByName("param_alpha"));
if (!LLViewerVisualParamInfo::parseXml(node))
return FALSE;
LLXmlTreeNode* param_alpha_node = node->getChildByName("param_alpha");
if (!param_alpha_node)
{
return FALSE;
}
static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file");
if (param_alpha_node->getFastAttributeString(tga_file_string, mStaticImageFileName))
{
// Don't load the image file until it's actually needed.
}
// else
// {
// llwarns << "<param_alpha> element is missing tga_file attribute." << llendl;
// }
static LLStdStringHandle multiply_blend_string = LLXmlTree::addAttributeString("multiply_blend");
param_alpha_node->getFastAttributeBOOL(multiply_blend_string, mMultiplyBlend);
static LLStdStringHandle skip_if_zero_string = LLXmlTree::addAttributeString("skip_if_zero");
param_alpha_node->getFastAttributeBOOL(skip_if_zero_string, mSkipIfZeroWeight);
static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain");
param_alpha_node->getFastAttributeF32(domain_string, mDomain);
return TRUE;
}
LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) :
LLTexLayerParam(layer),
mAvgDistortionVec(1.f, 1.f, 1.f)
{
}
LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) :
LLTexLayerParam(avatar),
mAvgDistortionVec(1.f, 1.f, 1.f)
{
}
LLTexLayerParamColor::~LLTexLayerParamColor()
{
}
/*virtual*/ LLViewerVisualParam* LLTexLayerParamColor::cloneParam(LLWearable* wearable) const
{
LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer);
*new_param = *this;
return new_param;
}
LLColor4 LLTexLayerParamColor::getNetColor() const
{
const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo();
llassert(info->mNumColors >= 1);
F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight();
S32 index_last = info->mNumColors - 1;
F32 scaled_weight = effective_weight * index_last;
S32 index_start = (S32) scaled_weight;
S32 index_end = index_start + 1;
if (index_start == index_last)
{
return info->mColors[index_last];
}
else
{
F32 weight = scaled_weight - index_start;
const LLColor4 *start = &info->mColors[ index_start ];
const LLColor4 *end = &info->mColors[ index_end ];
return LLColor4((1.f - weight) * start->mV[VX] + weight * end->mV[VX],
(1.f - weight) * start->mV[VY] + weight * end->mV[VY],
(1.f - weight) * start->mV[VZ] + weight * end->mV[VZ],
(1.f - weight) * start->mV[VW] + weight * end->mV[VW]);
}
}
void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)
{
if (mIsAnimating)
{
return;
}
const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo();
F32 min_weight = getMinWeight();
F32 max_weight = getMaxWeight();
F32 new_weight = llclamp(weight, min_weight, max_weight);
U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight);
U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight);
if (cur_u8 != new_u8)
{
mCurWeight = new_weight;
if (info->mNumColors <= 0)
{
// This will happen when we set the default weight the first time.
return;
}
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
{
onGlobalColorChanged(upload_bake);
if (mTexLayer)
{
mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
}
}
// llinfos << "param " << mName << " = " << new_weight << llendl;
}
}
void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake)
{
// set value first then set interpolating flag to ignore further updates
mTargetWeight = target_value;
setWeight(target_value, upload_bake);
mIsAnimating = TRUE;
if (mNext)
{
mNext->setAnimationTarget(target_value, upload_bake);
}
}
void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake)
{
if (mNext)
{
mNext->animate(delta, upload_bake);
}
}
//-----------------------------------------------------------------------------
// LLTexLayerParamColorInfo
//-----------------------------------------------------------------------------
LLTexLayerParamColorInfo::LLTexLayerParamColorInfo() :
mOperation(LLTexLayerParamColor::OP_ADD),
mNumColors(0)
{
}
BOOL LLTexLayerParamColorInfo::parseXml(LLXmlTreeNode *node)
{
llassert(node->hasName("param") && node->getChildByName("param_color"));
if (!LLViewerVisualParamInfo::parseXml(node))
return FALSE;
LLXmlTreeNode* param_color_node = node->getChildByName("param_color");
if (!param_color_node)
{
return FALSE;
}
std::string op_string;
static LLStdStringHandle operation_string = LLXmlTree::addAttributeString("operation");
if (param_color_node->getFastAttributeString(operation_string, op_string))
{
LLStringUtil::toLower(op_string);
if (op_string == "add") mOperation = LLTexLayerParamColor::OP_ADD;
else if (op_string == "multiply") mOperation = LLTexLayerParamColor::OP_MULTIPLY;
else if (op_string == "blend") mOperation = LLTexLayerParamColor::OP_BLEND;
}
mNumColors = 0;
LLColor4U color4u;
for (LLXmlTreeNode* child = param_color_node->getChildByName("value");
child;
child = param_color_node->getNextNamedChild())
{
if ((mNumColors < MAX_COLOR_VALUES))
{
static LLStdStringHandle color_string = LLXmlTree::addAttributeString("color");
if (child->getFastAttributeColor4U(color_string, color4u))
{
mColors[ mNumColors ].setVec(color4u);
mNumColors++;
}
}
}
if (!mNumColors)
{
llwarns << "<param_color> is missing <value> sub-elements" << llendl;
return FALSE;
}
if ((mOperation == LLTexLayerParamColor::OP_BLEND) && (mNumColors != 1))
{
llwarns << "<param_color> with operation\"blend\" must have exactly one <value>" << llendl;
return FALSE;
}
return TRUE;
}

View File

@@ -468,7 +468,7 @@ void LLToolBar::onClickChat(void* user_data)
// static // static
void LLToolBar::onClickAppearance(void*) void LLToolBar::onClickAppearance(void*)
{ {
if (gAgent.areWearablesLoaded()) if (gAgentWearables.areWearablesLoaded())
{ {
gAgentCamera.changeCameraToCustomizeAvatar(); gAgentCamera.changeCameraToCustomizeAvatar();
} }

View File

@@ -1938,7 +1938,7 @@ BOOL LLToolDragAndDrop::isInventoryGiveAcceptable(LLInventoryItem* item)
case LLAssetType::AT_BODYPART: case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING: case LLAssetType::AT_CLOTHING:
// <edit> // <edit>
/*if(!copyable && gAgent.isWearingItem(item->getUUID())) /*if(!copyable && gAgentWearables.isWearingItem(item->getUUID()))
{ {
acceptable = FALSE; acceptable = FALSE;
}*/ }*/
@@ -2038,7 +2038,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
break; break;
case LLAssetType::AT_BODYPART: case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING: case LLAssetType::AT_CLOTHING:
if(gAgent.isWearingItem(item->getUUID())) if(gAgentWearables.isWearingItem(item->getUUID()))
{ {
worn = TRUE; worn = TRUE;
} }
@@ -2559,7 +2559,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
{ {
// Don't wear anything until initial wearables are loaded, can // Don't wear anything until initial wearables are loaded, can
// destroy clothing items. // destroy clothing items.
if (!gAgent.areWearablesLoaded()) if (!gAgentWearables.areWearablesLoaded())
{ {
LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
return ACCEPT_NO; return ACCEPT_NO;
@@ -2654,7 +2654,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
{ {
// Don't wear anything until initial wearables are loaded, can // Don't wear anything until initial wearables are loaded, can
// destroy clothing items. // destroy clothing items.
if (!gAgent.areWearablesLoaded()) if (!gAgentWearables.areWearablesLoaded())
{ {
LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
return ACCEPT_NO; return ACCEPT_NO;

View File

@@ -74,6 +74,7 @@
// newview includes // newview includes
#include "llagent.h" #include "llagent.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "jcfloaterareasearch.h" #include "jcfloaterareasearch.h"
#include "llagentpilot.h" #include "llagentpilot.h"
@@ -2382,7 +2383,7 @@ class LLSelfRemoveAllAttachments : public view_listener_t
{ {
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{ {
LLAgent::userRemoveAllAttachments(NULL); LLAgentWearables::userRemoveAllAttachments(NULL);
return true; return true;
} }
}; };
@@ -3902,7 +3903,7 @@ class LLEditEnableCustomizeAvatar : public view_listener_t
{ {
bool new_value = (gAgent.getAvatarObject() && bool new_value = (gAgent.getAvatarObject() &&
gAgent.getAvatarObject()->isFullyLoaded() && gAgent.getAvatarObject()->isFullyLoaded() &&
gAgent.areWearablesLoaded()); gAgentWearables.areWearablesLoaded());
gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
return true; return true;
} }
@@ -6367,7 +6368,7 @@ class LLShowFloater : public view_listener_t
} }
else if (floater_name == "appearance") else if (floater_name == "appearance")
{ {
if (gAgent.areWearablesLoaded()) if (gAgentWearables.areWearablesLoaded())
{ {
gAgentCamera.changeCameraToCustomizeAvatar(); gAgentCamera.changeCameraToCustomizeAvatar();
} }
@@ -9181,51 +9182,51 @@ class LLEditEnableTakeOff : public view_listener_t
bool new_value = false; bool new_value = false;
if (clothing == "shirt") if (clothing == "shirt")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_SHIRT); new_value = LLAgentWearables::selfHasWearable((void *)WT_SHIRT);
} }
if (clothing == "pants") if (clothing == "pants")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_PANTS); new_value = LLAgentWearables::selfHasWearable((void *)WT_PANTS);
} }
if (clothing == "shoes") if (clothing == "shoes")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_SHOES); new_value = LLAgentWearables::selfHasWearable((void *)WT_SHOES);
} }
if (clothing == "socks") if (clothing == "socks")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_SOCKS); new_value = LLAgentWearables::selfHasWearable((void *)WT_SOCKS);
} }
if (clothing == "jacket") if (clothing == "jacket")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_JACKET); new_value = LLAgentWearables::selfHasWearable((void *)WT_JACKET);
} }
if (clothing == "gloves") if (clothing == "gloves")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_GLOVES); new_value = LLAgentWearables::selfHasWearable((void *)WT_GLOVES);
} }
if (clothing == "undershirt") if (clothing == "undershirt")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_UNDERSHIRT); new_value = LLAgentWearables::selfHasWearable((void *)WT_UNDERSHIRT);
} }
if (clothing == "underpants") if (clothing == "underpants")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_UNDERPANTS); new_value = LLAgentWearables::selfHasWearable((void *)WT_UNDERPANTS);
} }
if (clothing == "skirt") if (clothing == "skirt")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_SKIRT); new_value = LLAgentWearables::selfHasWearable((void *)WT_SKIRT);
} }
if (clothing == "alpha") if (clothing == "alpha")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_ALPHA); new_value = LLAgentWearables::selfHasWearable((void *)WT_ALPHA);
} }
if (clothing == "tattoo") if (clothing == "tattoo")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_TATTOO); new_value = LLAgentWearables::selfHasWearable((void *)WT_TATTOO);
} }
if (clothing == "physics") if (clothing == "physics")
{ {
new_value = LLAgent::selfHasWearable((void *)WT_PHYSICS); new_value = LLAgentWearables::selfHasWearable((void *)WT_PHYSICS);
} }
// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-1.1.3b | OK // [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-1.1.3b | OK
@@ -9248,55 +9249,55 @@ class LLEditTakeOff : public view_listener_t
std::string clothing = userdata.asString(); std::string clothing = userdata.asString();
if (clothing == "shirt") if (clothing == "shirt")
{ {
LLAgent::userRemoveWearable((void*)WT_SHIRT); LLAgentWearables::userRemoveWearable((void*)WT_SHIRT);
} }
else if (clothing == "pants") else if (clothing == "pants")
{ {
LLAgent::userRemoveWearable((void*)WT_PANTS); LLAgentWearables::userRemoveWearable((void*)WT_PANTS);
} }
else if (clothing == "shoes") else if (clothing == "shoes")
{ {
LLAgent::userRemoveWearable((void*)WT_SHOES); LLAgentWearables::userRemoveWearable((void*)WT_SHOES);
} }
else if (clothing == "socks") else if (clothing == "socks")
{ {
LLAgent::userRemoveWearable((void*)WT_SOCKS); LLAgentWearables::userRemoveWearable((void*)WT_SOCKS);
} }
else if (clothing == "jacket") else if (clothing == "jacket")
{ {
LLAgent::userRemoveWearable((void*)WT_JACKET); LLAgentWearables::userRemoveWearable((void*)WT_JACKET);
} }
else if (clothing == "gloves") else if (clothing == "gloves")
{ {
LLAgent::userRemoveWearable((void*)WT_GLOVES); LLAgentWearables::userRemoveWearable((void*)WT_GLOVES);
} }
else if (clothing == "undershirt") else if (clothing == "undershirt")
{ {
LLAgent::userRemoveWearable((void*)WT_UNDERSHIRT); LLAgentWearables::userRemoveWearable((void*)WT_UNDERSHIRT);
} }
else if (clothing == "underpants") else if (clothing == "underpants")
{ {
LLAgent::userRemoveWearable((void*)WT_UNDERPANTS); LLAgentWearables::userRemoveWearable((void*)WT_UNDERPANTS);
} }
else if (clothing == "skirt") else if (clothing == "skirt")
{ {
LLAgent::userRemoveWearable((void*)WT_SKIRT); LLAgentWearables::userRemoveWearable((void*)WT_SKIRT);
} }
else if (clothing == "alpha") else if (clothing == "alpha")
{ {
LLAgent::userRemoveWearable((void*)WT_ALPHA); LLAgentWearables::userRemoveWearable((void*)WT_ALPHA);
} }
else if (clothing == "tattoo") else if (clothing == "tattoo")
{ {
LLAgent::userRemoveWearable((void*)WT_TATTOO); LLAgentWearables::userRemoveWearable((void*)WT_TATTOO);
} }
else if (clothing == "physics") else if (clothing == "physics")
{ {
LLAgent::userRemoveWearable((void*)WT_PHYSICS); LLAgentWearables::userRemoveWearable((void*)WT_PHYSICS);
} }
else if (clothing == "all") else if (clothing == "all")
{ {
LLAgent::userRemoveAllClothes(NULL); LLAgentWearables::userRemoveAllClothes(NULL);
} }
return true; return true;
} }

View File

@@ -43,6 +43,7 @@
#include "cofmgr.h" #include "cofmgr.h"
#include "llagent.h" // Get state values from here #include "llagent.h" // Get state values from here
#include "llagentwearables.h"
#include "llanimationstates.h" #include "llanimationstates.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llviewercontrol.h" #include "llviewercontrol.h"
@@ -780,6 +781,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
{ {
mIsSelf = TRUE; mIsSelf = TRUE;
gAgent.setAvatarObject(this); gAgent.setAvatarObject(this);
gAgentWearables.setAvatarObject(this);
lldebugs << "Marking avatar as self " << id << llendl; lldebugs << "Marking avatar as self " << id << llendl;
} }
else else
@@ -4777,7 +4779,7 @@ void LLVOAvatar::updateVisibility()
if(isSelf()) if(isSelf())
{ {
if( !gAgent.areWearablesLoaded()) if( !gAgentWearables.areWearablesLoaded())
{ {
visible = FALSE; visible = FALSE;
} }

View File

@@ -40,6 +40,7 @@
#include "llagent.h" #include "llagent.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "llassetuploadresponders.h" #include "llassetuploadresponders.h"
#include "llviewerwindow.h" #include "llviewerwindow.h"
#include "llfloatercustomize.h" #include "llfloatercustomize.h"
@@ -782,7 +783,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
if( gFloaterCustomize ) if( gFloaterCustomize )
{ {
LLViewerInventoryItem* item; LLViewerInventoryItem* item;
item = (LLViewerInventoryItem*)gInventory.getItem(gAgent.getWearableItem(mType)); item = (LLViewerInventoryItem*)gInventory.getItem(gAgentWearables.getWearableItemID(mType));
U32 perm_mask = PERM_NONE; U32 perm_mask = PERM_NONE;
BOOL is_complete = FALSE; BOOL is_complete = FALSE;
if(item) if(item)

View File

@@ -35,6 +35,7 @@
#include "llviewerregion.h" #include "llviewerregion.h"
#include "llviewerwindow.h" #include "llviewerwindow.h"
#include "llagentcamera.h" #include "llagentcamera.h"
#include "llagentwearables.h"
#include "rlvhandler.h" #include "rlvhandler.h"
#include "rlvinventory.h" #include "rlvinventory.h"
@@ -740,7 +741,7 @@ bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const
LLUUID idCompositeItem; LLUUID idCompositeItem;
if ((type = LLWearable::typeNameToType(strComposite)) != WT_INVALID) if ((type = LLWearable::typeNameToType(strComposite)) != WT_INVALID)
{ {
idCompositeItem = gAgent.getWearableItem(type); idCompositeItem = gAgentWearables.getWearableItemID(type);
} }
else if ((idxAttachPt = getAttachPointIndex(strComposite, true)) != 0) else if ((idxAttachPt = getAttachPointIndex(strComposite, true)) != 0)
{ {
@@ -840,7 +841,7 @@ bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const
LLViewerInventoryCategory* pFolder; LLViewerInventoryCategory* pFolder;
if ( (!isWearable(wtType)) || if ( (!isWearable(wtType)) ||
( (gAgent.getWearable(wtType)) && (!isRemovable(wtType)) ) || ( (gAgent.getWearable(wtType)) && (!isRemovable(wtType)) ) ||
( (gRlvHandler.getCompositeInfo(gAgent.getWearableItem(wtType), NULL, &pFolder)) && ( (gRlvHandler.getCompositeInfo(gAgentWearables.getWearableItemID(wtType), NULL, &pFolder)) &&
(pFolder->getUUID() != pItem->getParentUUID()) && (!gRlvHandler.canTakeOffComposite(pFolder)) ) ) (pFolder->getUUID() != pItem->getParentUUID()) && (!gRlvHandler.canTakeOffComposite(pFolder)) ) )
{ {
return false; return false;
@@ -2003,7 +2004,7 @@ ERlvCmdRet RlvHandler::onGetOutfit(const RlvCommand& rlvCmd, std::string& strRep
{ {
// We never hide body parts, even if they're "locked" and we're hiding locked layers // We never hide body parts, even if they're "locked" and we're hiding locked layers
// (nor do we hide a layer if the issuing object is the only one that has this layer locked) // (nor do we hide a layer if the issuing object is the only one that has this layer locked)
bool fWorn = (gAgent.getWearable(wtRlvTypes[idxType])) && bool fWorn = (gAgentWearables.getWearable(wtRlvTypes[idxType])) &&
( (!RlvSettings::getHideLockedLayers()) || ( (!RlvSettings::getHideLockedLayers()) ||
(LLAssetType::AT_BODYPART == LLWearable::typeToAssetType(wtRlvTypes[idxType])) || (LLAssetType::AT_BODYPART == LLWearable::typeToAssetType(wtRlvTypes[idxType])) ||
(RlvForceWear::isForceRemovable(wtRlvTypes[idxType], true, rlvCmd.getObjectID())) ); (RlvForceWear::isForceRemovable(wtRlvTypes[idxType], true, rlvCmd.getObjectID())) );
@@ -2031,7 +2032,7 @@ ERlvCmdRet RlvHandler::onGetOutfitNames(const RlvCommand& rlvCmd, std::string& s
switch (rlvCmd.getBehaviourType()) switch (rlvCmd.getBehaviourType())
{ {
case RLV_BHVR_GETOUTFITNAMES: // Every layer that's worn case RLV_BHVR_GETOUTFITNAMES: // Every layer that's worn
fAdd = (gAgent.getWearable(wtType) != NULL); fAdd = (gAgentWearables.getWearable(wtType) != NULL);
break; break;
/* /*
case RLV_BHVR_GETADDOUTFITNAMES: // Every layer that can be worn on (but ignore any locks set by the issuer) case RLV_BHVR_GETADDOUTFITNAMES: // Every layer that can be worn on (but ignore any locks set by the issuer)

View File

@@ -28,6 +28,7 @@
#include "llvoavatar.h" #include "llvoavatar.h"
#include "llwearablelist.h" #include "llwearablelist.h"
#include "llwlparammanager.h" #include "llwlparammanager.h"
#include "llagentwearables.h"
#include "rlvhelper.h" #include "rlvhelper.h"
#include "rlvinventory.h" #include "rlvinventory.h"
@@ -211,7 +212,7 @@ RlvCommandOptionGetPath::RlvCommandOptionGetPath(const RlvCommand& rlvCmd)
if (rlvCmdOption.isWearableType()) // <option> can be a clothing layer if (rlvCmdOption.isWearableType()) // <option> can be a clothing layer
{ {
EWearableType wtType = rlvCmdOption.getWearableType(); EWearableType wtType = rlvCmdOption.getWearableType();
m_idItems.push_back(gAgent.getWearableItem(wtType)); m_idItems.push_back(gAgentWearables.getWearableItemID(wtType));
} }
else if (rlvCmdOption.isAttachmentPoint()) // ... or it can specify an attachment point else if (rlvCmdOption.isAttachmentPoint()) // ... or it can specify an attachment point
{ {
@@ -330,7 +331,7 @@ bool RlvForceWear::isWearingItem(const LLInventoryItem* pItem)
{ {
case LLAssetType::AT_BODYPART: case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING: case LLAssetType::AT_CLOTHING:
return gAgent.isWearingItem(pItem->getUUID()); return gAgentWearables.isWearingItem(pItem->getUUID());
case LLAssetType::AT_OBJECT: case LLAssetType::AT_OBJECT:
return (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->isWearingAttachment(pItem->getUUID())); return (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->isWearingAttachment(pItem->getUUID()));
case LLAssetType::AT_GESTURE: case LLAssetType::AT_GESTURE:
@@ -348,7 +349,7 @@ bool RlvForceWear::isWearingItem(const LLInventoryItem* pItem)
void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAction eAction, EWearFlags eFlags) void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAction eAction, EWearFlags eFlags)
{ {
// [See LLWearableBridge::wearOnAvatar(): don't wear anything until initial wearables are loaded, can destroy clothing items] // [See LLWearableBridge::wearOnAvatar(): don't wear anything until initial wearables are loaded, can destroy clothing items]
if (!gAgent.areWearablesLoaded()) if (!gAgentWearables.areWearablesLoaded())
{ {
LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
return; return;
@@ -397,7 +398,7 @@ void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAc
} }
else else
{ {
const LLWearable* pWearable = gAgent.getWearableFromWearableItem(pItem->getUUID()); const LLWearable* pWearable = gAgentWearables.getWearableFromItemID(pItem->getUUID());
if ( (pWearable) && (isForceRemovable(pWearable, false)) ) if ( (pWearable) && (isForceRemovable(pWearable, false)) )
remWearable(pWearable); remWearable(pWearable);
} }
@@ -552,7 +553,7 @@ bool RlvForceWear::isForceRemovable(const LLWearable* pWearable, bool fCheckComp
(pWearable) && (LLAssetType::AT_CLOTHING == pWearable->getAssetType()) (pWearable) && (LLAssetType::AT_CLOTHING == pWearable->getAssetType())
&& ( (idExcept.isNull()) ? !gRlvWearableLocks.isLockedWearable(pWearable) && ( (idExcept.isNull()) ? !gRlvWearableLocks.isLockedWearable(pWearable)
: !gRlvWearableLocks.isLockedWearableExcept(pWearable, idExcept) ) : !gRlvWearableLocks.isLockedWearableExcept(pWearable, idExcept) )
&& (isStrippable(gAgent.getWearableItem(pWearable->getType()))) && (isStrippable(gAgentWearables.getWearableItemID(pWearable->getType())))
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS #ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
&& ( (!fCheckComposite) || (!RlvSettings::getEnableComposites()) || && ( (!fCheckComposite) || (!RlvSettings::getEnableComposites()) ||
(!gRlvHandler.getCompositeInfo(pWearable->getItemID(), NULL, &pFolder)) || (gRlvHandler.canTakeOffComposite(pFolder)) ) (!gRlvHandler.getCompositeInfo(pWearable->getItemID(), NULL, &pFolder)) || (gRlvHandler.canTakeOffComposite(pFolder)) )
@@ -564,7 +565,7 @@ bool RlvForceWear::isForceRemovable(const LLWearable* pWearable, bool fCheckComp
bool RlvForceWear::isForceRemovable(EWearableType wtType, bool fCheckComposite /*=true*/, const LLUUID& idExcept /*=LLUUID::null*/) bool RlvForceWear::isForceRemovable(EWearableType wtType, bool fCheckComposite /*=true*/, const LLUUID& idExcept /*=LLUUID::null*/)
{ {
// Wearable type can be removed by an RLV command if there's at least one currently worn wearable that can be removed // Wearable type can be removed by an RLV command if there's at least one currently worn wearable that can be removed
if (isForceRemovable(gAgent.getWearable(wtType), fCheckComposite, idExcept)) if (isForceRemovable(gAgentWearables.getWearable(wtType), fCheckComposite, idExcept))
return true; return true;
return false; return false;
} }
@@ -581,7 +582,7 @@ void RlvForceWear::forceRemove(const LLWearable* pWearable)
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS #ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
LLViewerInventoryCategory* pFolder = NULL; LLViewerInventoryCategory* pFolder = NULL;
if ( (RlvSettings::getEnableComposites()) && if ( (RlvSettings::getEnableComposites()) &&
(gRlvHandler.getCompositeInfo(gAgent.getWearableItem(wtType), NULL, &pFolder)) ) (gRlvHandler.getCompositeInfo(gAgentWearables.getWearableItemID(wtType), NULL, &pFolder)) )
{ {
// Wearable belongs to a composite folder so detach the entire folder (if we can take it off) // Wearable belongs to a composite folder so detach the entire folder (if we can take it off)
if (gRlvHandler.canTakeOffComposite(pFolder)) if (gRlvHandler.canTakeOffComposite(pFolder))
@@ -598,7 +599,7 @@ void RlvForceWear::forceRemove(const LLWearable* pWearable)
// Checked: 2010-03-19 (RLVa-1.1.3a) | Added: RLVa-1.2.0a // Checked: 2010-03-19 (RLVa-1.1.3a) | Added: RLVa-1.2.0a
void RlvForceWear::forceRemove(EWearableType wtType) void RlvForceWear::forceRemove(EWearableType wtType)
{ {
forceRemove(gAgent.getWearable(wtType)); forceRemove(gAgentWearables.getWearable(wtType));
} }
// Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a // Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a
@@ -708,7 +709,7 @@ void RlvForceWear::remAttachment(const LLViewerObject* pAttachObj)
// Checked: 2010-08-30 (RLVa-1.1.3b) | Modified: RLVa-1.2.1c // Checked: 2010-08-30 (RLVa-1.1.3b) | Modified: RLVa-1.2.1c
void RlvForceWear::addWearable(const LLViewerInventoryItem* pItem, EWearAction eAction) void RlvForceWear::addWearable(const LLViewerInventoryItem* pItem, EWearAction eAction)
{ {
const LLWearable* pWearable = gAgent.getWearableFromWearableItem(pItem->getLinkedUUID()); const LLWearable* pWearable = gAgentWearables.getWearableFromItemID(pItem->getLinkedUUID());
// When replacing remove all currently worn wearables of this type *unless* the item is currently worn // When replacing remove all currently worn wearables of this type *unless* the item is currently worn
if ( (ACTION_WEAR_REPLACE == eAction) && (!pWearable) ) if ( (ACTION_WEAR_REPLACE == eAction) && (!pWearable) )
forceRemove(pItem->getWearableType()); forceRemove(pItem->getWearableType());
@@ -739,7 +740,7 @@ void RlvForceWear::addWearable(const LLViewerInventoryItem* pItem, EWearAction e
void RlvForceWear::remWearable(const LLWearable* pWearable) void RlvForceWear::remWearable(const LLWearable* pWearable)
{ {
// Remove it from 'm_addWearables' if it's queued for wearing // Remove it from 'm_addWearables' if it's queued for wearing
const LLViewerInventoryItem* pItem = gInventory.getItem(gAgent.getWearableItem(pWearable->getType())); const LLViewerInventoryItem* pItem = gInventory.getItem(gAgentWearables.getWearableItemID(pWearable->getType()));
if ( (pItem) && (isAddWearable(pItem)) ) if ( (pItem) && (isAddWearable(pItem)) )
{ {
addwearables_map_t::iterator itAddWearables = m_addWearables.find(pItem->getWearableType()); addwearables_map_t::iterator itAddWearables = m_addWearables.find(pItem->getWearableType());
@@ -773,7 +774,7 @@ void RlvForceWear::done()
if (m_remWearables.size()) if (m_remWearables.size())
{ {
for (std::list<const LLWearable*>::const_iterator itWearable = m_remWearables.begin(); itWearable != m_remWearables.end(); ++itWearable) for (std::list<const LLWearable*>::const_iterator itWearable = m_remWearables.begin(); itWearable != m_remWearables.end(); ++itWearable)
gAgent.removeWearable((*itWearable)->getType()); gAgentWearables.removeWearable((*itWearable)->getType());
m_remWearables.clear(); m_remWearables.clear();
} }

View File

@@ -142,7 +142,7 @@ void RlvInventory::fetchWornItems()
// Fetch all currently worn clothing layers and body parts // Fetch all currently worn clothing layers and body parts
for (int type = 0; type < WT_COUNT; type++) for (int type = 0; type < WT_COUNT; type++)
{ {
const LLUUID& idItem = gAgent.getWearableItem((EWearableType)type); const LLUUID& idItem = gAgentWearables.getWearableItemID((EWearableType)type);
if (idItem.notNull()) if (idItem.notNull())
idItems.push_back(idItem); idItems.push_back(idItem);
} }

View File

@@ -18,6 +18,7 @@
#include "llattachmentsmgr.h" #include "llattachmentsmgr.h"
#include "llviewerobjectlist.h" #include "llviewerobjectlist.h"
#include "pipeline.h" #include "pipeline.h"
#include "llagentwearables.h"
#include "rlvhelper.h" #include "rlvhelper.h"
#include "rlvlocks.h" #include "rlvlocks.h"
@@ -822,7 +823,7 @@ void RlvWearableLocks::addWearableTypeLock(EWearableType eType, const LLUUID& id
bool RlvWearableLocks::canRemove(EWearableType eType) const bool RlvWearableLocks::canRemove(EWearableType eType) const
{ {
// NOTE: we return TRUE if the wearable type has at least one wearable that can be removed by the user // NOTE: we return TRUE if the wearable type has at least one wearable that can be removed by the user
LLWearable* pWearable = gAgent.getWearable(eType); LLWearable* pWearable = gAgentWearables.getWearable(eType);
if ( (pWearable) && (!isLockedWearable(pWearable)) ) if ( (pWearable) && (!isLockedWearable(pWearable)) )
return true; return true;
return false; return false;
@@ -832,7 +833,7 @@ bool RlvWearableLocks::canRemove(EWearableType eType) const
bool RlvWearableLocks::hasLockedWearable(EWearableType eType) const bool RlvWearableLocks::hasLockedWearable(EWearableType eType) const
{ {
// NOTE: we return TRUE if there is at least 1 non-removable wearable currently worn on this wearable type // NOTE: we return TRUE if there is at least 1 non-removable wearable currently worn on this wearable type
LLWearable* pWearable = gAgent.getWearable(eType); LLWearable* pWearable = gAgentWearables.getWearable(eType);
if ( (pWearable) && (isLockedWearable(pWearable)) ) if ( (pWearable) && (isLockedWearable(pWearable)) )
return true; return true;
return false; return false;

View File

@@ -25,6 +25,7 @@
// //
#include "llagent.h" #include "llagent.h"
#include "llagentwearables.h"
#include "llviewerjointattachment.h" #include "llviewerjointattachment.h"
#include "llviewerobject.h" #include "llviewerobject.h"
#include "llvoavatar.h" #include "llvoavatar.h"
@@ -401,7 +402,7 @@ inline bool RlvWearableLocks::canRemove(const LLInventoryItem* pItem) const
{ {
// The specified item can be removed if its wearable can be removed // The specified item can be removed if its wearable can be removed
RLV_ASSERT( (pItem) && (LLInventoryType::IT_WEARABLE == pItem->getInventoryType()) ); RLV_ASSERT( (pItem) && (LLInventoryType::IT_WEARABLE == pItem->getInventoryType()) );
const LLWearable* pWearable = (pItem) ? gAgent.getWearableFromWearableItem(pItem->getLinkedUUID()) : NULL; const LLWearable* pWearable = (pItem) ? gAgentWearables.getWearableFromItemID(pItem->getLinkedUUID()) : NULL;
return (pWearable) && (!isLockedWearable(pWearable)); return (pWearable) && (!isLockedWearable(pWearable));
} }