diff options
121 files changed, 2841 insertions, 1423 deletions
| diff --git a/autobuild.xml b/autobuild.xml index a8203bb643..1430ccac1b 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -244,9 +244,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>322dd6c45c384d454ae14ef127984a4e</string> +              <string>ee1e3e1a18e7b123e69516e9725d5bbc</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/65457/612879/bugsplat-1.0.7.546418-darwin64-546418.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69791/674226/bugsplat-1.0.7.550056-darwin64-550056.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -256,9 +256,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>010a0e73c0fddaa2316411803fad8e69</string> +              <string>4682feb72e972e0790615de7046877ee</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/65456/612876/bugsplat-3.6.0.8.546418-windows-546418.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69789/674221/bugsplat-3.6.0.4.550056-windows-550056.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -268,16 +268,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>7e8530762e7b50663708a888c23b8780</string> +              <string>e8be5b56ebee7e3f9ce5c212f90dc70c</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/65455/612874/bugsplat-3.6.0.8.546418-windows64-546418.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69790/674223/bugsplat-3.6.0.4.550056-windows64-550056.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>3.6.0.8.546418</string> +        <string>3.6.0.4.550056</string>        </map>        <key>colladadom</key>        <map> @@ -480,10 +480,12 @@ then        fi        # Run upload extensions +      # Ex: bugsplat        if [ -d ${build_dir}/packages/upload-extensions ]; then            for extension in ${build_dir}/packages/upload-extensions/*.sh; do                begin_section "Upload Extension $extension"                . $extension +              [ $? -eq 0 ] || fatal "Upload of extension $extension failed"                end_section "Upload Extension $extension"            done        fi diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index f7fbb6fda1..4d36759167 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -175,6 +175,7 @@ LLXmlTree LLAvatarAppearance::sXMLTree;  LLXmlTree LLAvatarAppearance::sSkeletonXMLTree;  LLAvatarSkeletonInfo* LLAvatarAppearance::sAvatarSkeletonInfo = NULL;  LLAvatarAppearance::LLAvatarXmlInfo* LLAvatarAppearance::sAvatarXmlInfo = NULL; +LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* LLAvatarAppearance::sAvatarDictionary = NULL;  LLAvatarAppearance::LLAvatarAppearance(LLWearableData* wearable_data) : @@ -202,7 +203,7 @@ LLAvatarAppearance::LLAvatarAppearance(LLWearableData* wearable_data) :  		mBakedTextureDatas[i].mIsLoaded = false;  		mBakedTextureDatas[i].mIsUsed = false;  		mBakedTextureDatas[i].mMaskTexName = 0; -		mBakedTextureDatas[i].mTextureIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((LLAvatarAppearanceDefines::EBakedTextureIndex)i); +		mBakedTextureDatas[i].mTextureIndex = sAvatarDictionary->bakedToLocalTextureIndex((LLAvatarAppearanceDefines::EBakedTextureIndex)i);  	}  } @@ -215,8 +216,8 @@ void LLAvatarAppearance::initInstance()  	mRoot = createAvatarJoint();  	mRoot->setName( "mRoot" ); -	for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +	for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = sAvatarDictionary->getMeshEntries().begin(); +		 iter != sAvatarDictionary->getMeshEntries().end();  		 ++iter)  	{  		const EMeshIndex mesh_index = iter->first; @@ -261,8 +262,8 @@ void LLAvatarAppearance::initInstance()  	//-------------------------------------------------------------------------  	// associate baked textures with meshes  	//------------------------------------------------------------------------- -	for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +	for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator iter = sAvatarDictionary->getMeshEntries().begin(); +		 iter != sAvatarDictionary->getMeshEntries().end();  		 ++iter)  	{  		const EMeshIndex mesh_index = iter->first; @@ -336,6 +337,12 @@ void LLAvatarAppearance::initClass()  //static  void LLAvatarAppearance::initClass(const std::string& avatar_file_name_arg, const std::string& skeleton_file_name_arg)  { +    // init dictionary (don't repeat on second login attempt) +    if (!sAvatarDictionary) +    { +        sAvatarDictionary = new LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary(); +    } +  	std::string avatar_file_name;      if (!avatar_file_name_arg.empty()) @@ -453,7 +460,8 @@ void LLAvatarAppearance::initClass(const std::string& avatar_file_name_arg, cons  void LLAvatarAppearance::cleanupClass()  {  	delete_and_clear(sAvatarXmlInfo); -	// *TODO: What about sAvatarSkeletonInfo ??? +    delete_and_clear(sAvatarDictionary); +    delete_and_clear(sAvatarSkeletonInfo);  	sSkeletonXMLTree.cleanup();  	sXMLTree.cleanup();  } @@ -999,7 +1007,7 @@ BOOL LLAvatarAppearance::loadAvatar()  	{  		LLAvatarXmlInfo::LLAvatarMorphInfo *info = *iter; -		EBakedTextureIndex baked = LLAvatarAppearanceDictionary::findBakedByRegionName(info->mRegion);  +		EBakedTextureIndex baked = sAvatarDictionary->findBakedByRegionName(info->mRegion);  		if (baked != BAKED_NUM_INDICES)  		{  			LLVisualParam* morph_param; @@ -1135,8 +1143,8 @@ BOOL LLAvatarAppearance::loadMeshNodes()  			switch(lod)  			  case 0:  				mesh = &mHairMesh0; */ -		for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator mesh_iter = LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().begin(); -			 mesh_iter != LLAvatarAppearanceDictionary::getInstance()->getMeshEntries().end(); +		for (LLAvatarAppearanceDictionary::MeshEntries::const_iterator mesh_iter = sAvatarDictionary->getMeshEntries().begin(); +			 mesh_iter != sAvatarDictionary->getMeshEntries().end();  			 ++mesh_iter)  		{  			const EMeshIndex mesh_index = mesh_iter->first; @@ -1264,8 +1272,8 @@ BOOL LLAvatarAppearance::loadLayersets()  			// scan baked textures and associate the layerset with the appropriate one  			EBakedTextureIndex baked_index = BAKED_NUM_INDICES; -			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -				 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +				 baked_iter != sAvatarDictionary->getBakedTextures().end();  				 ++baked_iter)  			{  				const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h index 6a4dbf3726..d16aeccf0d 100644 --- a/indra/llappearance/llavatarappearance.h +++ b/indra/llappearance/llavatarappearance.h @@ -255,6 +255,7 @@ public:  public:  	virtual void	updateMeshTextures() = 0;  	virtual void	dirtyMesh() = 0; // Dirty the avatar mesh +	static const LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary *getDictionary() { return sAvatarDictionary; }  protected:  	virtual void	dirtyMesh(S32 priority) = 0; // Dirty the avatar mesh, with priority @@ -263,6 +264,9 @@ protected:  	polymesh_map_t 									mPolyMeshes;  	avatar_joint_list_t								mMeshLOD; +    // mesh entries and backed textures +    static LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* sAvatarDictionary; +  /**                    Meshes   **                                                                            **   *******************************************************************************/ diff --git a/indra/llappearance/llavatarappearancedefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp index c72943bb82..9398ce3822 100644 --- a/indra/llappearance/llavatarappearancedefines.cpp +++ b/indra/llappearance/llavatarappearancedefines.cpp @@ -258,19 +258,17 @@ LLAvatarAppearanceDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,  	}  } -// static -ETextureIndex LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index) +ETextureIndex LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index) const  { -	return LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(index)->mTextureIndex; +	return getBakedTexture(index)->mTextureIndex;  } -// static  EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByRegionName(std::string name)  {  	U8 index = 0;  	while (index < BAKED_NUM_INDICES)  	{ -		const BakedEntry *be = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index); +		const BakedEntry *be = getBakedTexture((EBakedTextureIndex) index);  		if (be && be->mName.compare(name) == 0)  		{  			// baked texture found @@ -282,16 +280,15 @@ EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByRegionName(std::stri  	return BAKED_NUM_INDICES;  } -// static   EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByImageName(std::string name)  {  	U8 index = 0;  	while (index < BAKED_NUM_INDICES)  	{ -		const BakedEntry *be = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index); +		const BakedEntry *be = getBakedTexture((EBakedTextureIndex) index);  		if (be)  		{ -			const TextureEntry *te = LLAvatarAppearanceDictionary::getInstance()->getTexture(be->mTextureIndex); +			const TextureEntry *te = getTexture(be->mTextureIndex);  			if (te && te->mDefaultImageName.compare(name) == 0)  			{  				// baked texture found @@ -304,10 +301,9 @@ EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByImageName(std::strin  	return BAKED_NUM_INDICES;  } -// static -LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIndex index ) +LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIndex index ) const  { -	return getInstance()->getTexture(index)->mWearableType; +	return getTexture(index)->mWearableType;  }  // static diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h index 5663d24293..8968187531 100644 --- a/indra/llappearance/llavatarappearancedefines.h +++ b/indra/llappearance/llavatarappearancedefines.h @@ -143,13 +143,14 @@ typedef std::vector<LLWearableType::EType> wearables_vec_t;  //   // This holds const data - it is initialized once and the contents never change after that.  //------------------------------------------------------------------------ -class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictionary> +class LLAvatarAppearanceDictionary  {  	//--------------------------------------------------------------------  	// Constructors and Destructors  	//-------------------------------------------------------------------- -	LLSINGLETON(LLAvatarAppearanceDictionary); -	virtual ~LLAvatarAppearanceDictionary(); +public: +	LLAvatarAppearanceDictionary(); +	~LLAvatarAppearanceDictionary();  private:  	void createAssociations(); @@ -235,14 +236,14 @@ public:  	//--------------------------------------------------------------------  public:  	// Convert from baked texture to associated texture; e.g. BAKED_HEAD -> TEX_HEAD_BAKED -	static ETextureIndex 		bakedToLocalTextureIndex(EBakedTextureIndex t); +	ETextureIndex 		bakedToLocalTextureIndex(EBakedTextureIndex t) const;  	// find a baked texture index based on its name -	static EBakedTextureIndex 	findBakedByRegionName(std::string name); -	static EBakedTextureIndex 	findBakedByImageName(std::string name); +	EBakedTextureIndex 	findBakedByRegionName(std::string name); +	EBakedTextureIndex 	findBakedByImageName(std::string name);  	// Given a texture entry, determine which wearable type owns it. -	static LLWearableType::EType 		getTEWearableType(ETextureIndex index); +	LLWearableType::EType 		getTEWearableType(ETextureIndex index) const;  	static BOOL							isBakedImageId(const LLUUID& id);  	static EBakedTextureIndex			assetIdToBakedTextureIndex(const LLUUID& id); diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index c90b11ae71..e5039141de 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -728,8 +728,8 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)  			/* if ("upper_shirt" == local_texture_name)  				mLocalTexture = TEX_UPPER_SHIRT; */  			mLocalTexture = TEX_NUM_INDICES; -			for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -				 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +			for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +				 iter != LLAvatarAppearance::getDictionary()->getTextures().end();  				 iter++)  			{  				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; @@ -979,7 +979,7 @@ LLWearableType::EType LLTexLayerInterface::getWearableType() const  		return type;  	} -	return LLAvatarAppearanceDictionary::getTEWearableType(te); +	return LLAvatarAppearance::getDictionary()->getTEWearableType(te);  }  LLTexLayerInterface::ERenderPass LLTexLayerInterface::getRenderPass() const diff --git a/indra/llappearance/llwearable.cpp b/indra/llappearance/llwearable.cpp index 6079913a8e..28a36e6e41 100644 --- a/indra/llappearance/llwearable.cpp +++ b/indra/llappearance/llwearable.cpp @@ -183,7 +183,7 @@ void LLWearable::createVisualParams(LLAvatarAppearance *avatarp)  void LLWearable::createLayers(S32 te, LLAvatarAppearance *avatarp)  {  	LLTexLayerSet *layer_set = NULL; -	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)te); +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearance::getDictionary()->getTexture((ETextureIndex)te);  	if (texture_dict && texture_dict->mIsUsedByBakedTexture)  	{  		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; @@ -606,7 +606,7 @@ void LLWearable::syncImages(te_map_t &src, te_map_t &dst)  	// Deep copy of src (copies only those tes that are current, filling in defaults where needed)  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator iter = src.find(te);  			LLUUID image_id; diff --git a/indra/llappearance/llwearabledata.cpp b/indra/llappearance/llwearabledata.cpp index 2bf3b9085b..66cc4f3766 100644 --- a/indra/llappearance/llwearabledata.cpp +++ b/indra/llappearance/llwearabledata.cpp @@ -339,7 +339,7 @@ U32 LLWearableData::getWearableCount(const LLWearableType::EType type) const  U32 LLWearableData::getWearableCount(const U32 tex_index) const  { -	const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((LLAvatarAppearanceDefines::ETextureIndex)tex_index); +	const LLWearableType::EType wearable_type = LLAvatarAppearance::getDictionary()->getTEWearableType((LLAvatarAppearanceDefines::ETextureIndex)tex_index);  	return getWearableCount(wearable_type);  } @@ -349,7 +349,7 @@ LLUUID LLWearableData::computeBakedTextureHash(LLAvatarAppearanceDefines::EBaked  	LLUUID hash_id;  	bool hash_computed = false;  	LLMD5 hash; -	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index); +	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearance::getDictionary()->getBakedTexture(baked_index);  	for (U8 i=0; i < baked_dict->mWearables.size(); i++)  	{ diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 7bea8e9f9c..ba31290c24 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -567,16 +567,9 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)  		// Use the viewer-based thread-safe API which has a  		// fast/safe check for proxy enable.  Would like to  		// encapsulate this someway... -		if (LLProxy::instanceExists()) -		{ -			// Make sure proxy won't be initialized from here, -			// it might conflict with LLStartUp::startLLProxy() -			LLProxy::getInstance()->applyProxySettings(mCurlHandle); -		} -		else -		{ -			LL_WARNS() << "Proxy is not initialized!" << LL_ENDL; -		} +		// Make sure proxy won't be getInstance() from here, +		// it is not thread safe +		LLProxy::applyProxySettings(mCurlHandle);  	}  	else if (gpolicy.mHttpProxy.size()) @@ -817,6 +810,7 @@ size_t HttpOpRequest::readCallback(void * data, size_t size, size_t nmemb, void  	const size_t do_size((std::min)(req_size, body_size - op->mCurlBodyPos));  	const size_t read_size(op->mReqBody->read(op->mCurlBodyPos, static_cast<char *>(data), do_size)); +    // FIXME: singleton's instance() is Thread unsafe! Even if stats accumulators inside are.      HTTPStats::instance().recordDataUp(read_size);      op->mCurlBodyPos += read_size;  	return read_size; diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 7a0c8cd8f5..aed8943439 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -583,29 +583,39 @@ static void bilinear_scale(const U8 *src, U32 srcW, U32 srcH, U32 srcCh, U32 src  // LLImage  //--------------------------------------------------------------------------- -LLImage::LLImage(bool use_new_byte_range, S32 minimal_reverse_byte_range_percent) +//static +std::string LLImage::sLastErrorMessage; +LLMutex* LLImage::sMutex = NULL; +bool LLImage::sUseNewByteRange = false; +S32  LLImage::sMinimalReverseByteRangePercent = 75; + +//static +void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_percent)  { -    mMutex = new LLMutex(); -    mUseNewByteRange = use_new_byte_range; -    mMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent; +	sUseNewByteRange = use_new_byte_range; +    sMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent; +	sMutex = new LLMutex();  } -LLImage::~LLImage() +//static +void LLImage::cleanupClass()  { -    delete mMutex; -    mMutex = NULL; +	delete sMutex; +	sMutex = NULL;  } -const std::string& LLImage::getLastErrorMessage() +//static +const std::string& LLImage::getLastError()  {  	static const std::string noerr("No Error"); -	return mLastErrorMessage.empty() ? noerr : mLastErrorMessage; +	return sLastErrorMessage.empty() ? noerr : sLastErrorMessage;  } -void LLImage::setLastErrorMessage(const std::string& message) +//static +void LLImage::setLastError(const std::string& message)  { -	LLMutexLock m(mMutex); -	mLastErrorMessage = message; +	LLMutexLock m(sMutex); +	sLastErrorMessage = message;  }  //--------------------------------------------------------------------------- diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 9f8d061293..f66b1666d7 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -30,7 +30,6 @@  #include "lluuid.h"  #include "llstring.h"  #include "llpointer.h" -#include "llsingleton.h"  #include "lltrace.h"  const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2 @@ -88,26 +87,25 @@ typedef enum e_image_codec  //============================================================================  // library initialization class +// LLImage is frequently used in threads so do not convert it to LLSingleton -class LLImage : public LLParamSingleton<LLImage> +class LLImage  { -	LLSINGLETON(LLImage, bool use_new_byte_range = false, S32 minimal_reverse_byte_range_percent = 75); -	~LLImage();  public: +	static void initClass(bool use_new_byte_range = false, S32 minimal_reverse_byte_range_percent = 75); +	static void cleanupClass(); -	const std::string& getLastErrorMessage(); -	static const std::string& getLastError() { return getInstance()->getLastErrorMessage(); }; -	void setLastErrorMessage(const std::string& message); -	static void setLastError(const std::string& message) { getInstance()->setLastErrorMessage(message); } - -	bool useNewByteRange() { return mUseNewByteRange; } -	S32  getReverseByteRangePercent() { return mMinimalReverseByteRangePercent; } - -private: -	LLMutex* mMutex; -	std::string mLastErrorMessage; -	bool mUseNewByteRange; -	S32  mMinimalReverseByteRangePercent; +	static const std::string& getLastError(); +	static void setLastError(const std::string& message); +	 +	static bool useNewByteRange() { return sUseNewByteRange; } +	static S32  getReverseByteRangePercent() { return sMinimalReverseByteRangePercent; } +	 +protected: +	static LLMutex* sMutex; +	static std::string sLastErrorMessage; +	static bool sUseNewByteRange; +    static S32  sMinimalReverseByteRangePercent;  };  //============================================================================ diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 71cab0554d..4bff21610f 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -281,7 +281,7 @@ S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 r  	S32 bytes;  	S32 new_bytes = (S32) (sqrt((F32)(w*h))*(F32)(comp)*rate*1000.f/layer_factor);  	S32 old_bytes = (S32)((F32)(w*h*comp)*rate); -	bytes = (LLImage::getInstance()->useNewByteRange() && (new_bytes < old_bytes) ? new_bytes : old_bytes); +	bytes = (LLImage::useNewByteRange() && (new_bytes < old_bytes) ? new_bytes : old_bytes);  	bytes = llmax(bytes, calcHeaderSizeJ2C());  	return bytes;  } @@ -322,7 +322,7 @@ S32 LLImageJ2C::calcDiscardLevelBytes(S32 bytes)  	{  		S32 bytes_needed = calcDataSize(discard_level);  		// Use TextureReverseByteRange percent (see settings.xml) of the optimal size to qualify as correct rendering for the given discard level -		if (bytes >= (bytes_needed*LLImage::getInstance()->getReverseByteRangePercent()/100)) +		if (bytes >= (bytes_needed*LLImage::getReverseByteRangePercent()/100))  		{  			break;  		} diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 024afc109c..0f336a072f 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -244,7 +244,7 @@ public:  	LLInventoryCategory(const LLInventoryCategory* other);  	void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy  protected: -	~LLInventoryCategory(); +	virtual ~LLInventoryCategory();  	//--------------------------------------------------------------------  	// Accessors And Mutators diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 7da53bf8c8..e085fa6ada 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -5241,9 +5241,9 @@ public:  					LLVCacheTriangleData* tri = *iter;  					if (tri->mActive)  					{ -						tri->mScore = tri->mVertex[0]->mScore; -						tri->mScore += tri->mVertex[1]->mScore; -						tri->mScore += tri->mVertex[2]->mScore; +						tri->mScore = tri->mVertex[0] ? tri->mVertex[0]->mScore : 0; +						tri->mScore += tri->mVertex[1] ? tri->mVertex[1]->mScore : 0; +						tri->mScore += tri->mVertex[2] ? tri->mVertex[2]->mScore : 0;  						if (!mBestTriangle || mBestTriangle->mScore < tri->mScore)  						{ diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index fbd65cc67b..7380df041d 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -285,12 +285,27 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, const LLAvatarName&  		return;  	} +    bool updated_account = true; // assume obsolete value for new arrivals by default + +    std::map<LLUUID, LLAvatarName>::iterator it = mCache.find(agent_id); +    if (it != mCache.end() +        && (*it).second.getAccountName() == av_name.getAccountName()) +    { +        updated_account = false; +    } +  	// Add to the cache  	mCache[agent_id] = av_name;  	// Suppress request from the queue  	mPendingQueue.erase(agent_id); +	// notify mute list about changes +    if (updated_account && mAccountNameChangedCallback) +    { +        mAccountNameChangedCallback(agent_id, av_name); +    } +  	// Signal everyone waiting on this name  	signal_map_t::iterator sig_it =	mSignalMap.find(agent_id);  	if (sig_it != mSignalMap.end()) @@ -303,6 +318,8 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, const LLAvatarName&  		delete signal;  		signal = NULL;  	} + +  }  void LLAvatarNameCache::requestNamesViaCapability() diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index ba89d569f3..549d1703fa 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -42,6 +42,7 @@ class LLAvatarNameCache : public LLSingleton<LLAvatarNameCache>  	~LLAvatarNameCache();  public:  	typedef boost::signals2::signal<void (void)> use_display_name_signal_t; +	typedef boost::function<void (const LLUUID id, const LLAvatarName& av_name)> account_name_changed_callback_t;  	// Import/export the name cache to file.  	bool importFile(std::istream& istr); @@ -103,6 +104,8 @@ public:  	void addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb); +    void setAccountNameChangedCallback(const account_name_changed_callback_t& cb) { mAccountNameChangedCallback = cb; } +  private:      // Handle name response off network.      void processName(const LLUUID& agent_id, @@ -141,6 +144,7 @@ private:  private:      use_display_name_signal_t mUseDisplayNamesSignal; +    account_name_changed_callback_t mAccountNameChangedCallback;      // Cache starts in a paused state until we can determine if the      // current region supports display names. diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp index 86bcfe6881..749e599c66 100644 --- a/indra/llmessage/llproxy.cpp +++ b/indra/llmessage/llproxy.cpp @@ -40,6 +40,7 @@  // incoming packet just to do a simple bool test. The getter for this  // member is also static  bool LLProxy::sUDPProxyEnabled = false; +LLProxy* LLProxy::sProxyInstance = NULL;  // Some helpful TCP static functions.  static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataout, apr_size_t outlen, char * datain, apr_size_t maxinlen); // Do a TCP data handshake @@ -60,11 +61,21 @@ LLProxy::LLProxy():  LLProxy::~LLProxy()  { -	if (ll_apr_is_initialized()) -	{ -		stopSOCKSProxy(); -		disableHTTPProxy(); -	} +    if (ll_apr_is_initialized()) +    { +        // locks mutex +        stopSOCKSProxy(); +        disableHTTPProxy(); +    } +    // The primary safety of sProxyInstance is the fact that by the +    // point SUBSYSTEM_CLEANUP(LLProxy) gets called, nothing should +    // be capable of using proxy +    sProxyInstance = NULL; +} + +void LLProxy::initSingleton() +{ +    sProxyInstance = this;  }  /** @@ -424,28 +435,28 @@ void LLProxy::cleanupClass()  void LLProxy::applyProxySettings(CURL* handle)  {  	// Do a faster unlocked check to see if we are supposed to proxy. -	if (mHTTPProxyEnabled) +	if (sProxyInstance && sProxyInstance->mHTTPProxyEnabled)  	{ -		// We think we should proxy, lock the proxy mutex. -		LLMutexLock lock(&mProxyMutex); +		// We think we should proxy, lock the proxy mutex. sProxyInstance is not protected by mutex +		LLMutexLock lock(&sProxyInstance->mProxyMutex);  		// Now test again to verify that the proxy wasn't disabled between the first check and the lock. -		if (mHTTPProxyEnabled) +		if (sProxyInstance->mHTTPProxyEnabled)  		{ -            LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXY, mHTTPProxy.getIPString().c_str()), CURLOPT_PROXY); -            LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYPORT, mHTTPProxy.getPort()), CURLOPT_PROXYPORT); +			LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXY, sProxyInstance->mHTTPProxy.getIPString().c_str()), CURLOPT_PROXY); +			LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYPORT, sProxyInstance->mHTTPProxy.getPort()), CURLOPT_PROXYPORT); -			if (mProxyType == LLPROXY_SOCKS) +			if (sProxyInstance->mProxyType == LLPROXY_SOCKS)  			{ -                LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5), CURLOPT_PROXYTYPE); -				if (mAuthMethodSelected == METHOD_PASSWORD) +				LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5), CURLOPT_PROXYTYPE); +				if (sProxyInstance->mAuthMethodSelected == METHOD_PASSWORD)  				{ -					std::string auth_string = mSocksUsername + ":" + mSocksPassword; -                    LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYUSERPWD, auth_string.c_str()), CURLOPT_PROXYUSERPWD); +					std::string auth_string = sProxyInstance->mSocksUsername + ":" + sProxyInstance->mSocksPassword; +					LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYUSERPWD, auth_string.c_str()), CURLOPT_PROXYUSERPWD);  				}  			}  			else  			{ -                LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP), CURLOPT_PROXYTYPE); +				LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP), CURLOPT_PROXYTYPE);  			}  		}  	} diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h index a1ffa9e5d5..25f6977e14 100644 --- a/indra/llmessage/llproxy.h +++ b/indra/llmessage/llproxy.h @@ -226,6 +226,8 @@ class LLProxy: public LLSingleton<LLProxy>  	LLSINGLETON(LLProxy);  	LOG_CLASS(LLProxy); +    /*virtual*/ void initSingleton(); +  public:  	// Static check for enabled status for UDP packets. Call from main thread only.  	static bool isSOCKSProxyEnabled() { return sUDPProxyEnabled; } @@ -251,7 +253,7 @@ public:  	// Apply the current proxy settings to a curl request. Doesn't do anything if mHTTPProxyEnabled is false.  	// Safe to call from any thread. -	void applyProxySettings(CURL* handle); +	static void applyProxySettings(CURL* handle);  	// Start a connection to the SOCKS 5 proxy. Call from main thread only.  	S32 startSOCKSProxy(LLHost host); @@ -344,6 +346,10 @@ private:  	/*###########################################################################################  	END OF SHARED MEMBERS  	###########################################################################################*/ + +    // A hack to get arround getInstance() and capture_dependency() which are unsafe to use inside threads +    // set/reset on init/cleanup, strictly for use in applyProxySettings +    static LLProxy* sProxyInstance;  };  #endif diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index eb6cb1b503..7d18bae947 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -152,8 +152,18 @@ void LLPluginProcessParent::shutdown()      mapInstances_t::iterator it;      for (it = sInstances.begin(); it != sInstances.end(); ++it)      { -        (*it).second->setState(STATE_GOODBYE); -        (*it).second->idle(); +        EState state = (*it).second->mState; +        if (state != STATE_CLEANUP +            || state != STATE_EXITING +            || state != STATE_DONE +            || state != STATE_ERROR) +        { +            (*it).second->setState(STATE_GOODBYE); +        } +        if (state != STATE_DONE) +        { +            (*it).second->idle(); +        }      }      sInstances.clear();  } diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index d2aa3d8dc6..dfa29fb539 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -1472,7 +1472,8 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do  			std::string lookingForJoint = (*jointIt).c_str();  			//Look for the joint xform that we extracted from the skeleton, using the jointIt as the key  			//and store it in the alternate bind matrix -			if ( mJointMap.find( lookingForJoint ) != mJointMap.end() ) +			if (mJointMap.find(lookingForJoint) != mJointMap.end() +				&& model->mSkinInfo.mInvBindMatrix.size() > i)  			{  				LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];  				newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() ); diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp index a219ac1450..a1bfc4edd9 100644 --- a/indra/llprimitive/llmaterial.cpp +++ b/indra/llprimitive/llmaterial.cpp @@ -28,6 +28,8 @@  #include "llmaterial.h" +#include "../llrender/llglheaders.h" +  /**   * Materials cap parameters   */ @@ -105,6 +107,8 @@ LLMaterial::LLMaterial()      , mSpecularLightExponent(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT)      , mEnvironmentIntensity(LLMaterial::DEFAULT_ENV_INTENSITY)      , mDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) +    , mDiffuseFormatPrimary(GL_RGBA) +    , mDiffuseBaked(false)      , mAlphaMaskCutoff(0)  {  } @@ -311,6 +315,20 @@ void LLMaterial::setEnvironmentIntensity(U8 intensity)      mEnvironmentIntensity = intensity;  } +U8 LLMaterial::getDiffuseAlphaModeRender() const +{ +    if (mDiffuseBaked +        || mDiffuseFormatPrimary == GL_RGBA +        || mDiffuseFormatPrimary == GL_ALPHA) +    { +        return mDiffuseAlphaMode; +    } +    else +    { +        return DIFFUSE_ALPHA_MODE_NONE; +    } +} +  U8 LLMaterial::getDiffuseAlphaMode() const  {      return mDiffuseAlphaMode; @@ -321,6 +339,26 @@ void LLMaterial::setDiffuseAlphaMode(U8 alpha_mode)      mDiffuseAlphaMode = alpha_mode;  } +U32 LLMaterial::getDiffuseFormatPrimary() const +{ +    return mDiffuseFormatPrimary; +} + +void LLMaterial::setDiffuseFormatPrimary(U32 format_primary) +{ +    mDiffuseFormatPrimary = format_primary; +} + +bool LLMaterial::getIsDiffuseBaked() const +{ +    return mDiffuseBaked; +} + +void LLMaterial::setDiffuseBaked(bool baked) +{ +    mDiffuseBaked = baked; +} +  U8 LLMaterial::getAlphaMaskCutoff() const  {      return mAlphaMaskCutoff; @@ -437,7 +475,7 @@ U32 LLMaterial::getShaderMask(U32 alpha_mode)      }      else      { -        ret = getDiffuseAlphaMode(); +        ret = getDiffuseAlphaModeRender();      }      llassert(ret < SHADER_COUNT); diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index d58b7ee812..1207917568 100644 --- a/indra/llprimitive/llmaterial.h +++ b/indra/llprimitive/llmaterial.h @@ -115,8 +115,17 @@ public:      void        setSpecularLightExponent(U8 exponent);      U8          getEnvironmentIntensity() const;      void        setEnvironmentIntensity(U8 intensity); + +    // getDiffuseAlphaModeRender takes into account if image supports alpha +    // and returns value apropriate for render +    // getDiffuseAlphaMode() returns value as is +    U8          getDiffuseAlphaModeRender() const;      U8          getDiffuseAlphaMode() const;      void        setDiffuseAlphaMode(U8 alpha_mode); +    U32         getDiffuseFormatPrimary() const; +    void        setDiffuseFormatPrimary(U32 format_primary); +    bool        getIsDiffuseBaked() const; +    void        setDiffuseBaked(bool baked);      U8          getAlphaMaskCutoff() const;      void        setAlphaMaskCutoff(U8 cutoff); @@ -147,6 +156,8 @@ protected:      U8          mSpecularLightExponent;      U8          mEnvironmentIntensity;      U8          mDiffuseAlphaMode; +    U32         mDiffuseFormatPrimary; // value from texture, LLGLenum, is not included in fromLLSD/asLLSD +    bool        mDiffuseBaked; // is not included in fromLLSD/asLLSD      U8          mAlphaMaskCutoff;  }; diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index dbe71e2882..33a33af160 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -45,6 +45,7 @@ bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc);  bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node);  const std::string MACOSX_FONT_PATH_LIBRARY = "/Library/Fonts/"; +const std::string MACOSX_FONT_SUPPLEMENTAL = "Supplemental/";  LLFontDescriptor::LLFontDescriptor():  	mStyle(0) @@ -473,6 +474,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)  		font_paths.push_back(sys_path + *file_name_it);  #if LL_DARWIN  		font_paths.push_back(MACOSX_FONT_PATH_LIBRARY + *file_name_it); +		font_paths.push_back(MACOSX_FONT_PATH_LIBRARY + MACOSX_FONT_SUPPLEMENTAL + *file_name_it); +		font_paths.push_back(sys_path +  MACOSX_FONT_SUPPLEMENTAL + *file_name_it);  #endif  		bool is_ft_collection = (std::find(ft_collection_list.begin(), ft_collection_list.end(), *file_name_it) != ft_collection_list.end()); diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 604fb4e946..ee02a90b54 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -965,6 +965,80 @@ std::string LLGLManager::getRawGLString()  	return gl_string;  } +void LLGLManager::asLLSD(LLSD& info) +{ +	// Currently these are duplicates of fields in "system". +	info["gpu_vendor"] = mGLVendorShort; +	info["gpu_version"] = mDriverVersionVendorString; +	info["opengl_version"] = mGLVersionString; + +	info["vram"] = mVRAM; + +	// Extensions used by everyone +	info["has_multitexture"] = mHasMultitexture; +	info["has_ati_mem_info"] = mHasATIMemInfo; +	info["has_nvx_mem_info"] = mHasNVXMemInfo; +	info["num_texture_units"] = mNumTextureUnits; +	info["has_mip_map_generation"] = mHasMipMapGeneration; +	info["has_compressed_textures"] = mHasCompressedTextures; +	info["has_framebuffer_object"] = mHasFramebufferObject; +	info["max_samples"] = mMaxSamples; +	info["has_blend_func_separate"] = mHasBlendFuncSeparate; + +	// ARB Extensions +	info["has_vertex_buffer_object"] = mHasVertexBufferObject; +	info["has_vertex_array_object"] = mHasVertexArrayObject; +	info["has_sync"] = mHasSync; +	info["has_map_buffer_range"] = mHasMapBufferRange; +	info["has_flush_buffer_range"] = mHasFlushBufferRange; +	info["has_pbuffer"] = mHasPBuffer; +	info["has_shader_objects"] = mHasShaderObjects; +	info["has_vertex_shader"] = mHasVertexShader; +	info["has_fragment_shader"] = mHasFragmentShader; +	info["num_texture_image_units"] =  mNumTextureImageUnits; +	info["has_occlusion_query"] = mHasOcclusionQuery; +	info["has_timer_query"] = mHasTimerQuery; +	info["has_occlusion_query2"] = mHasOcclusionQuery2; +	info["has_point_parameters"] = mHasPointParameters; +	info["has_draw_buffers"] = mHasDrawBuffers; +	info["has_depth_clamp"] = mHasDepthClamp; +	info["has_texture_rectangle"] = mHasTextureRectangle; +	info["has_texture_multisample"] = mHasTextureMultisample; +	info["has_transform_feedback"] = mHasTransformFeedback; +	info["max_sample_mask_words"] = mMaxSampleMaskWords; +	info["max_color_texture_samples"] = mMaxColorTextureSamples; +	info["max_depth_texture_samples"] = mMaxDepthTextureSamples; +	info["max_integer_samples"] = mMaxIntegerSamples; + +	// Other extensions. +	info["has_anisotropic"] = mHasAnisotropic; +	info["has_arb_env_combine"] = mHasARBEnvCombine; +	info["has_cube_map"] = mHasCubeMap; +	info["has_debug_output"] = mHasDebugOutput; +	info["has_srgb_texture"] = mHassRGBTexture; +	info["has_srgb_framebuffer"] = mHassRGBFramebuffer; +    info["has_texture_srgb_decode"] = mHasTexturesRGBDecode; + +	// Vendor-specific extensions +	info["is_ati"] = mIsATI; +	info["is_nvidia"] = mIsNVIDIA; +	info["is_intel"] = mIsIntel; +	info["is_gf2or4mx"] = mIsGF2or4MX; +	info["is_gf3"] = mIsGF3; +	info["is_gf_gfx"] = mIsGFFX; +	info["ati_offset_vertical_lines"] = mATIOffsetVerticalLines; +	info["ati_old_driver"] = mATIOldDriver; + +	// Other fields +	info["has_requirements"] = mHasRequirements; +	info["has_separate_specular_color"] = mHasSeparateSpecularColor; +	info["debug_gpu"] = mDebugGPU; +	info["max_vertex_range"] = mGLMaxVertexRange; +	info["max_index_range"] = mGLMaxIndexRange; +	info["max_texture_size"] = mGLMaxTextureSize; +	info["gl_renderer"] = mGLRenderer; +} +  void LLGLManager::shutdownGL()  {  	if (mInited) diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 91ef4e9102..966c4b3c77 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -165,6 +165,8 @@ public:  	void printGLInfoString();  	void getGLInfo(LLSD& info); +	void asLLSD(LLSD& info); +  	// In ALL CAPS  	std::string mGLVendor;  	std::string mGLVendorShort; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 3b6a49735e..0151d20128 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1386,6 +1386,15 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S  		return FALSE;  	} +	if (mHasExplicitFormat &&  +		((mFormatPrimary == GL_RGBA && mComponents < 4) || +		 (mFormatPrimary == GL_RGB  && mComponents < 3))) + +	{ +		LL_WARNS()  << "Incorrect format: " << std::hex << mFormatPrimary << " components: " << (U32)mComponents <<  LL_ENDL;		 +		mHasExplicitFormat = FALSE; +	} +  	if( !mHasExplicitFormat )  	{          switch (mComponents) diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 4f3d7eed0a..61ddc8d59b 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -133,6 +133,7 @@ public:  	S32  getMipBytes(S32 discard_level = -1) const;  	BOOL getBoundRecently() const;  	BOOL isJustBound() const; +	BOOL getHasExplicitFormat() const { return mHasExplicitFormat; }  	LLGLenum getPrimaryFormat() const { return mFormatPrimary; }  	LLGLenum getFormatType() const { return mFormatType; } @@ -197,7 +198,7 @@ private:  	U16 mPickMaskWidth;  	U16 mPickMaskHeight;  	S8 mUseMipMaps; -	S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents) +	BOOL mHasExplicitFormat; // If false (default), GL format is f(mComponents)  	S8 mAutoGenMips;  	BOOL mIsMask; diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h index 70ab006fd6..8c01784071 100644 --- a/indra/llrender/llrender2dutils.h +++ b/indra/llrender/llrender2dutils.h @@ -32,6 +32,7 @@  #include "llpointer.h"		// LLPointer<>  #include "llrect.h" +#include "llsingleton.h"  #include "llglslshader.h"  class LLColor4;  diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index abb043f428..e9c980ad9a 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -303,12 +303,10 @@ void LLFloater::initFloater(const Params& p)  		mButtonsEnabled[BUTTON_CLOSE] = TRUE;  	} -	// Help button: '?' -	if ( !mHelpTopic.empty() ) -	{ -		mButtonsEnabled[BUTTON_HELP] = TRUE; -	} - +	// Help button: '?'  +	//SL-14050 Disable all Help question marks +	mButtonsEnabled[BUTTON_HELP] = FALSE; +	  	// Minimize button only for top draggers  	if ( !mDragOnLeft && mCanMinimize )  	{ diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp index ea106b5fae..e95cc12520 100644 --- a/indra/llui/llfolderviewmodel.cpp +++ b/indra/llui/llfolderviewmodel.cpp @@ -29,6 +29,160 @@  #include "llfolderviewmodel.h"  #include "lltrans.h" +// LLFolderViewModelItemCommon + +LLFolderViewModelItemCommon::LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model) +    : mSortVersion(-1), +    mPassedFilter(true), +    mPassedFolderFilter(true), +    mStringMatchOffsetFilter(std::string::npos), +    mStringFilterSize(0), +    mFolderViewItem(NULL), +    mLastFilterGeneration(-1), +    mLastFolderFilterGeneration(-1), +    mMarkedDirtyGeneration(-1), +    mMostFilteredDescendantGeneration(-1), +    mParent(NULL), +    mRootViewModel(root_view_model) +{ +    mChildren.clear(); //??? +} + +LLFolderViewModelItemCommon::~LLFolderViewModelItemCommon() +{ +    // Children don't belong to model, but to LLFolderViewItem, just mark them as having no parent +    std::for_each(mChildren.begin(), mChildren.end(), [](LLFolderViewModelItem* c) {c->setParent(NULL); }); + +    // Don't leave dead pointer in parent +    if (mParent) +    { +        mParent->removeChild(this); +    } +} + +void LLFolderViewModelItemCommon::dirtyFilter() +{ +    if (mMarkedDirtyGeneration < 0) +    { +        mMarkedDirtyGeneration = mLastFilterGeneration; +    } +    mLastFilterGeneration = -1; +    mLastFolderFilterGeneration = -1; + +    // bubble up dirty flag all the way to root +    if (mParent) +    { +        mParent->dirtyFilter(); +    } +} + +void LLFolderViewModelItemCommon::dirtyDescendantsFilter() +{ +    mMostFilteredDescendantGeneration = -1; +    if (mParent) +    { +        mParent->dirtyDescendantsFilter(); +    } +} + +//virtual +void LLFolderViewModelItemCommon::addChild(LLFolderViewModelItem* child) +{ +    // Avoid duplicates: bail out if that child is already present in the list +    // Note: this happens when models are created before views +    child_list_t::const_iterator iter; +    for (iter = mChildren.begin(); iter != mChildren.end(); iter++) +    { +        if (child == *iter) +        { +            return; +        } +    } +    mChildren.push_back(child); +    child->setParent(this); +    dirtyFilter(); +    requestSort(); +} + +//virtual +void LLFolderViewModelItemCommon::removeChild(LLFolderViewModelItem* child) +{ +    mChildren.remove(child); +    child->setParent(NULL); +    dirtyDescendantsFilter(); +    dirtyFilter(); +} + +//virtual +void LLFolderViewModelItemCommon::clearChildren() +{ +    // As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects +    // This is different and not equivalent to calling removeChild() on each child +    std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); +    mChildren.clear(); +    dirtyDescendantsFilter(); +    dirtyFilter(); +} + +void LLFolderViewModelItemCommon::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset /*= std::string::npos*/, std::string::size_type string_size /*= 0*/) +{ +    mPassedFilter = passed; +    mLastFilterGeneration = filter_generation; +    mStringMatchOffsetFilter = string_offset; +    mStringFilterSize = string_size; +    mMarkedDirtyGeneration = -1; +} + +void LLFolderViewModelItemCommon::setPassedFolderFilter(bool passed, S32 filter_generation) +{ +    mPassedFolderFilter = passed; +    mLastFolderFilterGeneration = filter_generation; +} + +//virtual +bool LLFolderViewModelItemCommon::potentiallyVisible() +{ +    return passedFilter() // we've passed the filter +        || (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet +        || descendantsPassedFilter(); +} + +//virtual +bool LLFolderViewModelItemCommon::passedFilter(S32 filter_generation /*= -1*/) +{ +    if (filter_generation < 0) +    { +        filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); +    } +    bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation); +    bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation); +    return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation)); +} + +//virtual +bool LLFolderViewModelItemCommon::descendantsPassedFilter(S32 filter_generation /*= -1*/) +{ +    if (filter_generation < 0) +    { +        filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); +    } +    return mMostFilteredDescendantGeneration >= filter_generation; +} + +// LLFolderViewModelCommon + +LLFolderViewModelCommon::LLFolderViewModelCommon() +    : mTargetSortVersion(0), +    mFolderView(NULL) +{} + +//virtual +void LLFolderViewModelCommon::requestSortAll() +{ +    // sort everything +    mTargetSortVersion++; +} +  bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item)  {  	return item->getSortVersion() < mTargetSortVersion; diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 84a1539094..ba8733c86d 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -38,7 +38,6 @@ enum EInventorySortGroup  	SG_ITEM  }; -class LLFontGL;  class LLInventoryModel;  class LLMenuGL;  class LLUIImage; @@ -231,134 +230,43 @@ protected:  class LLFolderViewModelItemCommon : public LLFolderViewModelItem  {  public: -	LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model) -	:	mSortVersion(-1), -		mPassedFilter(true), -		mPassedFolderFilter(true), -		mStringMatchOffsetFilter(std::string::npos), -		mStringFilterSize(0), -		mFolderViewItem(NULL), -		mLastFilterGeneration(-1), -		mLastFolderFilterGeneration(-1), -		mMarkedDirtyGeneration(-1), -		mMostFilteredDescendantGeneration(-1), -		mParent(NULL), -		mRootViewModel(root_view_model) -	{ -		mChildren.clear(); -	} +    LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model); +    virtual ~LLFolderViewModelItemCommon() override; -	void requestSort() { mSortVersion = -1; } -	S32 getSortVersion() { return mSortVersion; } -	void setSortVersion(S32 version) { mSortVersion = version;} +	void requestSort() override { mSortVersion = -1; } +	S32 getSortVersion() override { return mSortVersion; } +	void setSortVersion(S32 version) override { mSortVersion = version;} -	S32	getLastFilterGeneration() const { return mLastFilterGeneration; } +	S32	getLastFilterGeneration() const override { return mLastFilterGeneration; }  	S32	getLastFolderFilterGeneration() const { return mLastFolderFilterGeneration; } -	S32	getMarkedDirtyGeneration() const { return mMarkedDirtyGeneration; } -	void dirtyFilter() -	{ -		if(mMarkedDirtyGeneration < 0) -		{ -			mMarkedDirtyGeneration = mLastFilterGeneration; -		} -		mLastFilterGeneration = -1; -		mLastFolderFilterGeneration = -1; - -		// bubble up dirty flag all the way to root -		if (mParent) -		{ -			mParent->dirtyFilter(); -		}	 -	} -	void dirtyDescendantsFilter() -	{ -		mMostFilteredDescendantGeneration = -1; -		if (mParent) -		{ -			mParent->dirtyDescendantsFilter(); -		} -	} -	bool hasFilterStringMatch(); -	std::string::size_type getFilterStringOffset(); -	std::string::size_type getFilterStringSize(); +	S32	getMarkedDirtyGeneration() const override { return mMarkedDirtyGeneration; } +    void dirtyFilter() override; +    void dirtyDescendantsFilter() override; +	bool hasFilterStringMatch() override; +	std::string::size_type getFilterStringOffset() override; +	std::string::size_type getFilterStringSize() override;  	typedef std::list<LLFolderViewModelItem*> child_list_t; -	virtual void addChild(LLFolderViewModelItem* child)  -	{ -		mChildren.push_back(child); -		child->setParent(this);  -		dirtyFilter(); -		requestSort(); -	} -	virtual void removeChild(LLFolderViewModelItem* child)  -	{  -		mChildren.remove(child);  -		child->setParent(NULL); -		dirtyDescendantsFilter(); -		dirtyFilter(); -	} +    virtual void addChild(LLFolderViewModelItem* child) override; +    virtual void removeChild(LLFolderViewModelItem* child) override; -	virtual void clearChildren() -	{ -		// As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects -		// This is different and not equivalent to calling removeChild() on each child -		std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); -		mChildren.clear(); -		dirtyDescendantsFilter(); -		dirtyFilter(); -	} +    virtual void clearChildren();  	child_list_t::const_iterator getChildrenBegin() const { return mChildren.begin(); }  	child_list_t::const_iterator getChildrenEnd() const { return mChildren.end(); }  	child_list_t::size_type getChildrenCount() const { return mChildren.size(); } -	void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) -	{ -		mPassedFilter = passed; -		mLastFilterGeneration = filter_generation; -		mStringMatchOffsetFilter = string_offset; -		mStringFilterSize = string_size; -		mMarkedDirtyGeneration = -1; -	} - -	void setPassedFolderFilter(bool passed, S32 filter_generation) -	{ -		mPassedFolderFilter = passed; -		mLastFolderFilterGeneration = filter_generation; -	} - -	virtual bool potentiallyVisible() -	{ -		return passedFilter() // we've passed the filter -			|| (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet -			|| descendantsPassedFilter(); -	} - -	virtual bool passedFilter(S32 filter_generation = -1)  -	{  -		if (filter_generation < 0) -        { -			filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); -        } -		bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation); -		bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation); -		return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation)); -	} - -	virtual bool descendantsPassedFilter(S32 filter_generation = -1) -	{  -		if (filter_generation < 0) -        { -            filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); -        } -		return mMostFilteredDescendantGeneration >= filter_generation; -	} +    void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) override; +    void setPassedFolderFilter(bool passed, S32 filter_generation) override; +    virtual bool potentiallyVisible() override; +    virtual bool passedFilter(S32 filter_generation = -1) override; +    virtual bool descendantsPassedFilter(S32 filter_generation = -1) override;  protected: -	virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; } -	virtual bool hasParent() { return mParent != NULL; } +	virtual void setParent(LLFolderViewModelItem* parent) override { mParent = parent; } +	virtual bool hasParent() override { return mParent != NULL; }  	S32							mSortVersion;  	bool						mPassedFilter; @@ -375,7 +283,7 @@ protected:  	LLFolderViewModelItem*		mParent;  	LLFolderViewModelInterface& mRootViewModel; -	void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;} +	void setFolderViewItem(LLFolderViewItem* folder_view_item) override { mFolderViewItem = folder_view_item;}  	LLFolderViewItem*		mFolderViewItem;  }; @@ -384,20 +292,15 @@ protected:  class LLFolderViewModelCommon : public LLFolderViewModelInterface  {  public: -	LLFolderViewModelCommon() -	:	mTargetSortVersion(0), -		mFolderView(NULL) -	{} +    LLFolderViewModelCommon(); -	virtual void requestSortAll() -	{ -		// sort everything -		mTargetSortVersion++; -	} -	virtual std::string getStatusText(); -	virtual void filter(); +    virtual ~LLFolderViewModelCommon() override {} + +    virtual void requestSortAll() override; +	virtual std::string getStatusText() override; +	virtual void filter() override; -	void setFolderView(LLFolderView* folder_view) { mFolderView = folder_view;} +	void setFolderView(LLFolderView* folder_view) override { mFolderView = folder_view;}  protected:  	bool needsSort(class LLFolderViewModelItem* item); @@ -421,7 +324,7 @@ public:  		mFilter(filter)  	{} -	virtual ~LLFolderViewModel()  +	virtual ~LLFolderViewModel() override  	{  		delete mSorter;  		mSorter = NULL; @@ -439,8 +342,8 @@ public:  	// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,  	// this method needs to be overloaded and return the relevant fetch status. -	virtual bool contentsReady()					{ return true; } -	virtual bool isFolderComplete(LLFolderViewFolder* folder)					{ return true; } +	virtual bool contentsReady() override						{ return true; } +	virtual bool isFolderComplete(LLFolderViewFolder* folder) override { return true; }  	struct ViewModelCompare  	{ @@ -461,7 +364,7 @@ public:  		const SortType& mSorter;  	}; -	void sort(LLFolderViewFolder* folder) +	void sort(LLFolderViewFolder* folder) override  	{  		if (needsSort(folder->getViewModelItem()))  		{ diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 5568a84494..c2698fa648 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -79,7 +79,7 @@ const U32 LEFT_PAD_PIXELS = 3;  const U32 LEFT_WIDTH_PIXELS = 15;  const U32 LEFT_PLAIN_PIXELS = LEFT_PAD_PIXELS + LEFT_WIDTH_PIXELS; -const U32 RIGHT_PAD_PIXELS = 2; +const U32 RIGHT_PAD_PIXELS = 7;  const U32 RIGHT_WIDTH_PIXELS = 15;  const U32 RIGHT_PLAIN_PIXELS = RIGHT_PAD_PIXELS + RIGHT_WIDTH_PIXELS; @@ -95,7 +95,7 @@ const std::string SEPARATOR_NAME("separator");  const std::string VERTICAL_SEPARATOR_LABEL( "|" );  const std::string LLMenuGL::BOOLEAN_TRUE_PREFIX( "\xE2\x9C\x94" ); // U+2714 HEAVY CHECK MARK -const std::string LLMenuGL::BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE +const std::string LLMenuGL::BRANCH_SUFFIX( "\xe2\x96\xb8" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE  const std::string LLMenuGL::ARROW_UP  ("^^^^^^^");  const std::string LLMenuGL::ARROW_DOWN("vvvvvvv"); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 367c6c3c5b..dc525517bf 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1381,18 +1381,34 @@ BOOL LLScrollListCtrl::setSelectedByValue(const LLSD& value, BOOL selected)  	for (iter = mItemList.begin(); iter != mItemList.end(); iter++)  	{  		LLScrollListItem* item = *iter; -		if (item->getEnabled() && (item->getValue().asString() == value.asString())) -		{ -			if (selected) -			{ -				selectItem(item); -			} -			else -			{ -				deselectItem(item); -			} -			found = TRUE; -			break; +		if (item->getEnabled()) +		{ +            if (value.isBinary()) +            { +                if (item->getValue().isBinary()) +                { +                    LLSD::Binary data1 = value.asBinary(); +                    LLSD::Binary data2 = item->getValue().asBinary(); +                    found = std::equal(data1.begin(), data1.end(), data2.begin()) ? TRUE : FALSE; +                } +            } +            else +            { +                found = item->getValue().asString() == value.asString() ? TRUE : FALSE; +            } + +            if (found) +            { +                if (selected) +                { +                    selectItem(item); +                } +                else +                { +                    deselectItem(item); +                } +                break; +            }  		}  	} diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index e6835f73fb..a69c0eb008 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1481,4 +1481,43 @@ void LLUrlEntryExperienceProfile::onExperienceDetails( const LLSD& experience_de      callObservers(experience_details[LLExperienceCache::EXPERIENCE_ID].asString(), name, LLStringUtil::null);  } +// +// LLUrlEntryEmail Describes an IPv6 address +// +LLUrlEntryIPv6::LLUrlEntryIPv6() +	: LLUrlEntryBase() +{ +	mHostPath = "https?://\\[([a-f0-9:]+:+)+[a-f0-9]+]"; +	mPattern = boost::regex(mHostPath + "(:\\d{1,5})?(/\\S*)?", +		boost::regex::perl | boost::regex::icase); +	mMenuName = "menu_url_http.xml"; +	mTooltip = LLTrans::getString("TooltipHttpUrl"); +} +std::string LLUrlEntryIPv6::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ +	boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); +	boost::match_results<std::string::const_iterator> matches; + +	if (boost::regex_search(url, matches, regex)) +	{ +		return  url.substr(0, matches[0].length()); +	} +	else +	{ +		return url; +	} +} + +std::string LLUrlEntryIPv6::getQuery(const std::string &url) const +{ +	boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); +	boost::match_results<std::string::const_iterator> matches; + +	return boost::regex_replace(url, regex, ""); +} + +std::string LLUrlEntryIPv6::getUrl(const std::string &string) const +{ +	return string; +} diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 78c149d9fd..0a0c247a6a 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -513,5 +513,18 @@ public:  	/*virtual*/ std::string getUrl(const std::string &string) const;  }; +/// +/// LLUrlEntryEmail Describes an IPv6 address +/// +class LLUrlEntryIPv6 : public LLUrlEntryBase +{ +public: +	LLUrlEntryIPv6(); +	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getQuery(const std::string &url) const; + +	std::string mHostPath; +};  #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index ba6fa1e2e9..321a0ec5b9 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -79,6 +79,7 @@ LLUrlRegistry::LLUrlRegistry()  	mUrlEntrySLLabel = new LLUrlEntrySLLabel();  	registerUrl(mUrlEntrySLLabel);  	registerUrl(new LLUrlEntryEmail()); +	registerUrl(new LLUrlEntryIPv6());  }  LLUrlRegistry::~LLUrlRegistry() diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 3c34fd269e..4a4fdb72e3 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -903,4 +903,38 @@ namespace tut  				  "and even no www something lindenlab.com",  				  "");  	} + +	template<> template<> +	void object::test<16>() +	{ +		// +		// test LLUrlEntryIPv6 +		// +		LLUrlEntryIPv6 url; + +		// Regex tests. +		testRegex("match urls with a protocol", url, +			"this url should match http://[::1]", +			"http://[::1]"); + +		testRegex("match urls with a protocol and query", url, +			"this url should match http://[::1]/file.mp3", +			"http://[::1]/file.mp3"); + +		testRegex("match urls with a protocol", url, +			"this url should match http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]", +			"http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]"); + +		testRegex("match urls with port", url, +			"let's specify some port http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080", +			"http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080"); + +		testRegex("don't match urls w/o protocol", url, +			"looks like an url something [2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d] but no https prefix", +			""); + +		testRegex("don't match incorrect urls", url, +			"http://[ 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d ]", +			""); +	}  } diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index a05ba8cbba..f1113acd5f 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -168,6 +168,10 @@ public:  	// Get system UI size based on DPI (for 96 DPI UI size should be 1.0)  	virtual F32 getSystemUISize() { return 1.0; } + +    // windows only DirectInput8 for joysticks +    virtual void* getDirectInput8() { return NULL; }; +    virtual bool getInputDevices(U32 device_type_filter, void * devices_callback, void* userdata) { return false; };  protected:  	LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);  	virtual ~LLWindow(); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index bef0ae76a8..e8abb9f31a 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -59,6 +59,9 @@  #include <dinput.h>  #include <Dbt.h.> +#include <InitGuid.h> // needed for llurlentry test to build on some systems +#pragma comment(lib, "dxguid.lib") // needed for llurlentry test to build on some systems +#pragma comment(lib, "dinput8")  const S32	MAX_MESSAGE_PER_UPDATE = 20;  const S32	BITS_PER_PIXEL = 32; @@ -76,6 +79,7 @@ const F32	ICON_FLASH_TIME = 0.5f;  extern BOOL gDebugWindowProc;  LPWSTR gIconResource = IDI_APPLICATION; +LPDIRECTINPUT8 gDirectInput8;  LLW32MsgCallback gAsyncMsgCallback = NULL; @@ -482,6 +486,21 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  	mhInstance = GetModuleHandle(NULL);  	mWndProc = NULL; +    // Init Direct Input - needed for joystick / Spacemouse + +    LPDIRECTINPUT8 di8_interface; +    HRESULT status = DirectInput8Create( +        mhInstance, // HINSTANCE hinst, +        DIRECTINPUT_VERSION, // DWORD dwVersion, +        IID_IDirectInput8, // REFIID riidltf, +        (LPVOID*)&di8_interface, // LPVOID * ppvOut, +        NULL                     // LPUNKNOWN punkOuter +        ); +    if (status == DI_OK) +    { +        gDirectInput8 = di8_interface; +    } +  	mSwapMethod = SWAP_METHOD_UNDEFINED;  	// No WPARAM yet. @@ -4185,6 +4204,28 @@ void LLWindowWin32::setDPIAwareness()  	}  } +void* LLWindowWin32::getDirectInput8() +{ +    return &gDirectInput8; +} + +bool LLWindowWin32::getInputDevices(U32 device_type_filter, void * di8_devices_callback, void* userdata) +{ +    if (gDirectInput8 != NULL) +    { +        // Enumerate devices +        HRESULT status = gDirectInput8->EnumDevices( +            (DWORD) device_type_filter,        // DWORD dwDevType, +            (LPDIENUMDEVICESCALLBACK)di8_devices_callback,  // LPDIENUMDEVICESCALLBACK lpCallback, // BOOL DIEnumDevicesCallback( LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef ) // BOOL CALLBACK DinputDevice::DevicesCallback +            (LPVOID*)userdata, // LPVOID pvRef +            DIEDFL_ATTACHEDONLY       // DWORD dwFlags +            ); + +        return status == DI_OK; +    } +    return false; +} +  F32 LLWindowWin32::getSystemUISize()  {  	F32 scale_value = 1.f; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 9cd16eb993..ee0df570e9 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -116,6 +116,9 @@ public:  	static std::vector<std::string> getDynamicFallbackFontList();  	static void setDPIAwareness(); + +    /*virtual*/ void* getDirectInput8(); +    /*virtual*/ bool getInputDevices(U32 device_type_filter, void * di8_devices_callback, void* userdata);  protected:  	LLWindowWin32(LLWindowCallbacks* callbacks,  		const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,  diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 80a414d00f..ead8634df4 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -641,6 +641,24 @@ LLSD LLControlGroup::getLLSD(const std::string& name)  	return get<LLSD>(name);  } +LLSD LLControlGroup::asLLSD(bool diffs_only) +{ +	// Dump all stored values as LLSD +	LLSD result = LLSD::emptyArray(); +	for (ctrl_name_table_t::iterator iter = mNameTable.begin(); +		 iter != mNameTable.end(); iter++) +	{ +		LLControlVariable *control = iter->second; +		if (!control || control->isType(TYPE_STRING) || (diffs_only && control->isDefault())) +		{ +			continue; +		} +		const std::string& name = iter->first; +		result[name] = getLLSD(name); +	} +	return result; +} +  BOOL LLControlGroup::controlExists(const std::string& name)  {  	ctrl_name_table_t::iterator iter = mNameTable.find(name); diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 99946607f4..19508becc3 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -242,6 +242,8 @@ public:  	LLColor4	getColor4(const std::string& name);  	LLColor3	getColor3(const std::string& name); +	LLSD		asLLSD(bool diffs_only); +	  	// generic getter  	template<typename T> T get(const std::string& name)  	{ diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 52dc4744f2..c0166f158e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -812,6 +812,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>FramePerSecondLimit</key> +    <map> +      <key>Comment</key> +      <string>Controls upper limit of frames per second</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>120</integer> +    </map>      <key>BackgroundYieldTime</key>      <map>        <key>Comment</key> @@ -5231,6 +5242,17 @@        <key>Value</key>        <string />      </map> +  <key>JoystickDeviceUUID</key> +  <map> +    <key>Comment</key> +    <string>Preffered device ID.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>String</string> +    <key>Value</key> +    <string /> +  </map>      <key>JoystickMouselookYaw</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index e7e9404ded..68f2ddeb08 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -877,6 +877,18 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal  	return mParcelChangedSignal.connect(cb);  } +// static +void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id) +{ +    LLViewerRegion* region = gAgent.getRegion(); +    if (region && region->getRegionID() == region_id) +    { +        region->requestSimulatorFeatures(); +        LLAppViewer::instance()->updateNameLookupUrl(); +    } +} + +  //-----------------------------------------------------------------------------  // setRegion()  //----------------------------------------------------------------------------- @@ -923,10 +935,11 @@ void LLAgent::setRegion(LLViewerRegion *regionp)              if (regionp->capabilitiesReceived())              {                  regionp->requestSimulatorFeatures(); +                LLAppViewer::instance()->updateNameLookupUrl();              }              else              { -                regionp->setCapabilitiesReceivedCallback(boost::bind(&LLViewerRegion::requestSimulatorFeatures, regionp)); +                regionp->setCapabilitiesReceivedCallback(LLAgent::capabilityReceivedCallback);              }  		} diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index f72378f654..d46c99db8c 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -254,6 +254,8 @@ public:  	boost::signals2::connection     addParcelChangedCallback(parcel_changed_callback_t);  private: +	static void capabilityReceivedCallback(const LLUUID ®ion_id); +  	typedef boost::signals2::signal<void()> parcel_changed_signal_t;  	parcel_changed_signal_t		mParcelChangedSignal; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e5c505501e..e8a3305645 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1957,7 +1957,7 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)  }  // Moved from LLWearableList::ContextMenu for wider utility. -bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) +bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const  {  	// TODO: investigate wearables may not be loaded at this point EXT-8231 @@ -1967,7 +1967,7 @@ bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids)  	// Count given clothes (by wearable type) and objects.  	for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)  	{ -		LLViewerInventoryItem* item = gInventory.getItem(*it); +		const LLViewerInventoryItem* item = gInventory.getItem(*it);  		if (!item)  		{  			return false; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c274a8b049..8a55a848db 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -101,7 +101,7 @@ public:  	bool getCanReplaceCOF(const LLUUID& outfit_cat_id);      // Can we add all referenced items to the avatar? -    bool canAddWearables(const uuid_vec_t& item_ids); +    bool canAddWearables(const uuid_vec_t& item_ids) const;  	// Copy all items in a category.  	void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 515d6ffc14..ff45fd0f61 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -286,7 +286,7 @@ extern BOOL gHiDPISupport;  ////////////////////////////////////////////////////////////  // All from the last globals push... -F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() +F32 gSimLastTime; // Used in LLAppViewer::init and send_viewer_stats()  F32 gSimFrames;  BOOL gShowObjectUpdates = FALSE; @@ -691,7 +691,8 @@ LLAppViewer::LLAppViewer()  	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),  	mFastTimerLogThread(NULL),  	mSettingsLocationList(NULL), -	mIsFirstRun(false) +	mIsFirstRun(false), +	mMinMicroSecPerFrame(0.f)  {  	if(NULL != sInstance)  	{ @@ -1274,6 +1275,10 @@ bool LLAppViewer::init()  	joystick = LLViewerJoystick::getInstance();  	joystick->setNeedsReset(true); +	/*----------------------------------------------------------------------*/ + +	gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2)); +	onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));  	return true;  } @@ -1493,6 +1498,21 @@ bool LLAppViewer::doFrame()  				display(); +				static U64 last_call = 0; +				if (!gTeleportDisplay) +				{ +					// Frame/draw throttling, controlled by FramePerSecondLimit +					U64 elapsed_time = LLTimer::getTotalTime() - last_call; +					if (elapsed_time < mMinMicroSecPerFrame) +					{ +						LL_RECORD_BLOCK_TIME(FTM_SLEEP); +						// llclamp for when time function gets funky +						U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6); +						micro_sleep(sleep_time, 0); +					} +				} +				last_call = LLTimer::getTotalTime(); +  				pingMainloopTimeout("Main:Snapshot");  				LLFloaterSnapshot::update(); // take snapshots  					LLFloaterOutfitSnapshot::update(); @@ -2065,6 +2085,7 @@ bool LLAppViewer::cleanup()  	LLUIImageList::getInstance()->cleanUp();  	// This should eventually be done in LLAppViewer +	SUBSYSTEM_CLEANUP(LLImage);  	SUBSYSTEM_CLEANUP(LLVFSThread);  	SUBSYSTEM_CLEANUP(LLLFSThread); @@ -2108,6 +2129,7 @@ bool LLAppViewer::cleanup()  		LLWeb::loadURLExternal( gLaunchFileOnQuit, false );  		LL_INFOS() << "File launched." << LL_ENDL;  	} +	// make sure nothing uses applyProxySettings by this point.  	LL_INFOS() << "Cleaning up LLProxy." << LL_ENDL;  	SUBSYSTEM_CLEANUP(LLProxy);      LLCore::LLHttp::cleanup(); @@ -2163,7 +2185,7 @@ bool LLAppViewer::initThreads()  {  	static const bool enable_threads = true; -	LLImage::initParamSingleton(gSavedSettings.getBOOL("TextureNewByteRange"),gSavedSettings.getS32("TextureReverseByteRange")); +	LLImage::initClass(gSavedSettings.getBOOL("TextureNewByteRange"),gSavedSettings.getS32("TextureReverseByteRange"));  	LLVFSThread::initClass(enable_threads && false);  	LLLFSThread::initClass(enable_threads && false); @@ -3967,7 +3989,9 @@ void LLAppViewer::requestQuit()  		gFloaterView->closeAllChildren(true);  	} -	send_stats(); +	// Send preferences once, when exiting +	bool include_preferences = true; +	send_viewer_stats(include_preferences);  	gLogoutTimer.reset();  	mQuitRequested = true; @@ -4766,7 +4790,8 @@ void LLAppViewer::idle()  		if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)  		{  			LL_INFOS() << "Transmitting sessions stats" << LL_ENDL; -			send_stats(); +			bool include_preferences = false; +			send_viewer_stats(include_preferences);  			viewer_stats_timer.reset();  		} @@ -5177,11 +5202,56 @@ void LLAppViewer::sendLogoutRequest()  	}  } +void LLAppViewer::updateNameLookupUrl() +{ +    LLViewerRegion* region = gAgent.getRegion(); +    if (!region || !region->capabilitiesReceived()) +    { +        return; +    } + +    LLAvatarNameCache *name_cache = LLAvatarNameCache::getInstance(); +    bool had_capability = LLAvatarNameCache::getInstance()->hasNameLookupURL(); +    std::string name_lookup_url; +    name_lookup_url.reserve(128); // avoid a memory allocation below +    name_lookup_url = region->getCapability("GetDisplayNames"); +    bool have_capability = !name_lookup_url.empty(); +    if (have_capability) +    { +        // we have support for display names, use it +        U32 url_size = name_lookup_url.size(); +        // capabilities require URLs with slashes before query params: +        // https://<host>:<port>/cap/<uuid>/?ids=<blah> +        // but the caps are granted like: +        // https://<host>:<port>/cap/<uuid> +        if (url_size > 0 && name_lookup_url[url_size - 1] != '/') +        { +            name_lookup_url += '/'; +        } +        name_cache->setNameLookupURL(name_lookup_url); +    } +    else +    { +        // Display names not available on this region +        name_cache->setNameLookupURL(std::string()); +    } + +    // Error recovery - did we change state? +    if (had_capability != have_capability) +    { +        // name tags are persistant on screen, so make sure they refresh +        LLVOAvatar::invalidateNameTags(); +    } +} +  void LLAppViewer::idleNameCache()  {  	// Neither old nor new name cache can function before agent has a region  	LLViewerRegion* region = gAgent.getRegion(); -	if (!region) return; +    if (!region) +    { +        return; +    }  	// deal with any queued name requests and replies.  	gCacheName->processPending(); @@ -5189,47 +5259,12 @@ void LLAppViewer::idleNameCache()  	// Can't run the new cache until we have the list of capabilities  	// for the agent region, and can therefore decide whether to use  	// display names or fall back to the old name system. -	if (!region->capabilitiesReceived()) return; - -	// Agent may have moved to a different region, so need to update cap URL -	// for name lookups.  Can't do this in the cap grant code, as caps are -	// granted to neighbor regions before the main agent gets there.  Can't -	// do it in the move-into-region code because cap not guaranteed to be -	// granted yet, for example on teleport. -	LLAvatarNameCache *name_cache = LLAvatarNameCache::getInstance(); -	bool had_capability = LLAvatarNameCache::getInstance()->hasNameLookupURL(); -	std::string name_lookup_url; -	name_lookup_url.reserve(128); // avoid a memory allocation below -	name_lookup_url = region->getCapability("GetDisplayNames"); -	bool have_capability = !name_lookup_url.empty(); -	if (have_capability) -	{ -		// we have support for display names, use it -	    U32 url_size = name_lookup_url.size(); -	    // capabilities require URLs with slashes before query params: -	    // https://<host>:<port>/cap/<uuid>/?ids=<blah> -	    // but the caps are granted like: -	    // https://<host>:<port>/cap/<uuid> -	    if (url_size > 0 && name_lookup_url[url_size-1] != '/') -	    { -		    name_lookup_url += '/'; -	    } -		name_cache->setNameLookupURL(name_lookup_url); -	} -	else -	{ -		// Display names not available on this region -		name_cache->setNameLookupURL( std::string() ); -	} - -	// Error recovery - did we change state? -	if (had_capability != have_capability) -	{ -		// name tags are persistant on screen, so make sure they refresh -		LLVOAvatar::invalidateNameTags(); -	} +    if (!region->capabilitiesReceived()) +    { +        return; +    } -	name_cache->idle(); +    LLAvatarNameCache::getInstance()->idle();  }  // @@ -5431,6 +5466,19 @@ void LLAppViewer::disconnectViewer()  	LLUrlEntryParcel::setDisconnected(gDisconnected);  } +bool LLAppViewer::onChangeFrameLimit(LLSD const & evt) +{ +	if (evt.asInteger() > 0) +	{ +		mMinMicroSecPerFrame = (U64)(1000000.0f / F32(evt.asInteger())); +	} +	else +	{ +		mMinMicroSecPerFrame = 0; +	} +	return false; +} +  void LLAppViewer::forceErrorLLError()  {     	LL_ERRS() << "This is a deliberate llerror" << LL_ENDL; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 8f0f54de3b..eaebc896d0 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -205,7 +205,9 @@ public:  	// llcorehttp init/shutdown/config information.  	LLAppCoreHttp & getAppCoreHttp()			{ return mAppCoreHttp; } -	 + +    void updateNameLookupUrl(); +  protected:  	virtual bool initWindow(); // Initialize the viewer's window.  	virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system @@ -255,6 +257,8 @@ private:      void sendLogoutRequest();      void disconnectViewer(); +	bool onChangeFrameLimit(LLSD const & evt); +  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base.  	static LLAppViewer* sInstance;  @@ -311,7 +315,10 @@ private:  	// llcorehttp library init/shutdown helper  	LLAppCoreHttp mAppCoreHttp; -    bool mIsFirstRun; +        bool mIsFirstRun; +	U64 mMinMicroSecPerFrame; // frame throttling + +  };  // consts from viewer.h diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index df94e337da..d4fc1fe64d 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -603,6 +603,11 @@ bool LLCurrencyUIManager::bought()  	return impl.mBought;  } +void LLCurrencyUIManager::clearError() +{ +	impl.clearError(); +} +  bool LLCurrencyUIManager::hasError()  {  	return impl.mError; diff --git a/indra/newview/llcurrencyuimanager.h b/indra/newview/llcurrencyuimanager.h index 3f37db8db1..7c05acbb05 100644 --- a/indra/newview/llcurrencyuimanager.h +++ b/indra/newview/llcurrencyuimanager.h @@ -80,6 +80,8 @@ public:  	bool buying();		// are we in the process of buying?  	bool bought();		// did the buy() transaction complete successfully +	void clearError(); +  	bool hasError();  	std::string errorMessage();  	std::string errorURI(); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 87772d9eb6..17b5fde947 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -2120,7 +2120,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)              if (mat)              {                 -                switch (LLMaterial::eDiffuseAlphaMode(mat->getDiffuseAlphaMode())) +                switch (LLMaterial::eDiffuseAlphaMode(mat->getDiffuseAlphaModeRender()))                  {                      case LLMaterial::DIFFUSE_ALPHA_MODE_MASK:                      { @@ -2258,7 +2258,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  				sVertexProgram->uniform4f(LLShaderMgr::SPECULAR_COLOR, col.mV[0], col.mV[1], col.mV[2], spec);  				sVertexProgram->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, env); -				if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +				if (mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  				{                      F32 cutoff = mat->getAlphaMaskCutoff()/255.f;  					sVertexProgram->setMinimumAlpha(cutoff); diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index e56ed92d9e..a8780d6365 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -1668,6 +1668,17 @@ void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader)  void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo, LLSettingsBase::Seconds transition)  { +    if (!gAgent.getRegion()) +    { +        return; +    } +    // mRegionId id can be null, no specification as to why and if it's valid so check valid ids only +    if (gAgent.getRegion()->getRegionID() != envinfo->mRegionId && envinfo->mRegionId.notNull()) +    { +        LL_INFOS("ENVIRONMENT") << "Requested environmend region id: " << envinfo->mRegionId << " agent is on: " << gAgent.getRegion()->getRegionID() << LL_ENDL; +        return; +    } +      if (envinfo->mParcelId == INVALID_PARCEL_ID)      {          // the returned info applies to an entire region. diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index 299fffd9ab..4b5fd8a758 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -166,6 +166,14 @@ namespace Details  //          LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> result = "  //              << LLSDXMLStreamer(result) << LL_ENDL; +            if (gDisconnected) +            { +                // Lost connection or disconnected during quit, don't process sim/region update +                // messages, they might populate some cleaned up classes (LLWorld, region and object list) +                LL_INFOS("LLEventPollImpl") << "Dropping event messages" << LL_ENDL; +                break; +            } +              LLSD httpResults = result["http_result"];              LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -210,7 +218,7 @@ namespace Details                      llcoro::suspendUntilTimeout(waitToRetry); -                    if (mDone) +                    if (mDone || gDisconnected)                          break;                      LL_INFOS("LLEventPollImpl") << "<" << counter << "> About to retry request." << LL_ENDL;                      continue; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 4a802ad9aa..01d8b6775b 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1165,7 +1165,7 @@ bool LLFace::canRenderAsMask()  	}  	LLMaterial* mat = te->getMaterialParams(); -	if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) +	if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)  	{  		return false;  	} @@ -1412,7 +1412,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			}  			else  			{ -				if (!mat || mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +				if (!mat || mat->getDiffuseAlphaModeRender() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  				{  					shiny_in_alpha = true;  				} diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index 8e654a53c4..ebb73fc1f7 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -55,7 +55,7 @@ BOOL LLFloaterAvatarTextures::postBuild()  {  	for (U32 i=0; i < TEX_NUM_INDICES; i++)  	{ -		const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(ETextureIndex(i))->mName; +		const std::string tex_name = LLAvatarAppearance::getDictionary()->getTexture(ETextureIndex(i))->mName;  		mTextures[i] = getChild<LLTextureCtrl>(tex_name);  	}  	mTitle = getTitle(); @@ -77,7 +77,7 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,  								 ETextureIndex te)  {  	LLUUID id = IMG_DEFAULT_AVATAR; -	const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture(te); +	const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearance::getDictionary()->getTexture(te);  	if (tex_entry && tex_entry->mIsLocalTexture)  	{  		if (avatarp->isSelf()) @@ -165,14 +165,14 @@ void LLFloaterAvatarTextures::onClickDump(void* data)  			const LLTextureEntry* te = avatarp->getTE(i);  			if (!te) continue; -			const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)(i)); +			const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearance::getDictionary()->getTexture((ETextureIndex)(i));  			if (!tex_entry)  				continue;  			if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))  			{  				LLUUID id = IMG_DEFAULT_AVATAR; -				LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType((ETextureIndex)i); +				LLWearableType::EType wearable_type = LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex)i);  				if (avatarp->isSelf())  				{  					LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, 0); diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 25348474a1..1751d54b5a 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -184,6 +184,7 @@ void LLFloaterBuyCurrencyUI::updateUI()  		args["TITLE"] = getString("info_cannot_buy");  		args["MESSAGE"] = mManager.errorMessage();  		LLNotificationsUtil::add("CouldNotBuyCurrency", args); +		mManager.clearError();  		closeFloater();  	}  	else diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 2a05f82f94..c6e9069d09 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -454,19 +454,23 @@ void LLFloaterIMContainer::idleUpdate()          const LLConversationItem *current_session = getCurSelectedViewModelItem();          if (current_session)          { -            // Update moderator options visibility -            LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); -            LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); -            bool is_moderator = isGroupModerator(); -            bool can_ban = haveAbilityToBan(); -            while (current_participant_model != end_participant_model) +            if (current_session->getType() == LLConversationItem::CONV_SESSION_GROUP)              { -                LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); -                participant_model->setModeratorOptionsVisible(is_moderator); -                participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); - -                current_participant_model++; +                // Update moderator options visibility +                LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); +                LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); +                bool is_moderator = isGroupModerator(); +                bool can_ban = haveAbilityToBan(); +                while (current_participant_model != end_participant_model) +                { +                    LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); +                    participant_model->setModeratorOptionsVisible(is_moderator); +                    participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); + +                    current_participant_model++; +                }              } +              // Update floater's title as required by the currently selected session or use the default title              LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());              setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle); diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp index 2b672bc890..93a26f31cc 100644 --- a/indra/newview/llfloaterjoystick.cpp +++ b/indra/newview/llfloaterjoystick.cpp @@ -40,7 +40,17 @@  #include "llviewercontrol.h"  #include "llappviewer.h"  #include "llviewerjoystick.h" +#include "llviewerwindow.h" +#include "llwindow.h"  #include "llcheckboxctrl.h" +#include "llcombobox.h" + +#if LL_WINDOWS && !LL_MESA_HEADLESS +// Require DirectInput version 8 +#define DIRECTINPUT_VERSION 0x0800 + +#include <dinput.h> +#endif  static LLTrace::SampleStatHandle<>	sJoystickAxis0("Joystick axis 0"),  									sJoystickAxis1("Joystick axis 1"), @@ -58,8 +68,33 @@ static LLTrace::SampleStatHandle<>* sJoystickAxes[6] =  	&sJoystickAxis5  }; + +#if LL_WINDOWS && !LL_MESA_HEADLESS + +BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVOID pvRef) +{ +    // Note: If a single device can function as more than one DirectInput +    // device type, it is enumerated as each device type that it supports. +    // Capable of detecting devices like Oculus Rift +    if (device_instance_ptr && pvRef) +    { +        std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName)); +        S32 size = sizeof(GUID); +        LLSD::Binary data; //just an std::vector +        data.resize(size); +        memcpy(&data[0], &device_instance_ptr->guidInstance /*POD _GUID*/, size); + +        LLFloaterJoystick * floater = (LLFloaterJoystick*)pvRef; +        LLSD value = data; +        floater->addDevice(product_name, value); +    } +    return DIENUM_CONTINUE; +} +#endif +  LLFloaterJoystick::LLFloaterJoystick(const LLSD& data) -	: LLFloater(data) +	: LLFloater(data), +    mHasDeviceList(false)  {      if (!LLViewerJoystick::getInstance()->isJoystickInitialized())      { @@ -71,14 +106,13 @@ LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)  void LLFloaterJoystick::draw()  { -	bool joystick_inited = LLViewerJoystick::getInstance()->isJoystickInitialized(); -	getChildView("enable_joystick")->setEnabled(joystick_inited); -	getChildView("joystick_type")->setEnabled(joystick_inited); -	std::string desc = LLViewerJoystick::getInstance()->getDescription(); -	if (desc.empty()) desc = getString("NoDevice"); -	getChild<LLUICtrl>("joystick_type")->setValue(desc); - -	LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); +    LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); +    bool joystick_inited = joystick->isJoystickInitialized(); +    if (joystick_inited != mHasDeviceList) +    { +        refreshListOfDevices(); +    } +  	for (U32 i = 0; i < 6; i++)  	{  		F32 value = joystick->getJoystickAxis(i); @@ -115,8 +149,8 @@ BOOL LLFloaterJoystick::postBuild()  		}  	} -	mCheckJoystickEnabled = getChild<LLCheckBoxCtrl>("enable_joystick"); -	childSetCommitCallback("enable_joystick",onCommitJoystickEnabled,this); +	mJoysticksCombo = getChild<LLComboBox>("joystick_combo"); +	childSetCommitCallback("joystick_combo",onCommitJoystickEnabled,this);  	mCheckFlycamEnabled = getChild<LLCheckBoxCtrl>("JoystickFlycamEnabled");  	childSetCommitCallback("JoystickFlycamEnabled",onCommitJoystickEnabled,this); @@ -125,6 +159,7 @@ BOOL LLFloaterJoystick::postBuild()  	childSetAction("ok_btn", onClickOK, this);  	refresh(); +	refreshListOfDevices();  	return TRUE;  } @@ -141,6 +176,7 @@ void LLFloaterJoystick::apply()  void LLFloaterJoystick::initFromSettings()  {  	mJoystickEnabled = gSavedSettings.getBOOL("JoystickEnabled"); +	mJoystickId = gSavedSettings.getLLSD("JoystickDeviceUUID");  	mJoystickAxis[0] = gSavedSettings.getS32("JoystickAxis0");  	mJoystickAxis[1] = gSavedSettings.getS32("JoystickAxis1"); @@ -210,12 +246,80 @@ void LLFloaterJoystick::initFromSettings()  void LLFloaterJoystick::refresh()  {  	LLFloater::refresh(); +  	initFromSettings();  } +void LLFloaterJoystick::addDevice(std::string &name, LLSD& value) +{ +    mJoysticksCombo->add(name, value, ADD_BOTTOM, 1); +} + +void LLFloaterJoystick::refreshListOfDevices() +{ +    mJoysticksCombo->removeall(); +    std::string no_device = getString("JoystickDisabled"); +    LLSD value = LLSD::Integer(0); +    addDevice(no_device, value); + +    mHasDeviceList = false; +     +    // di8_devices_callback callback is immediate and happens in scope of getInputDevices() +#if LL_WINDOWS && !LL_MESA_HEADLESS +    // space navigator is marked as DI8DEVCLASS_GAMECTRL in ndof lib +    U32 device_type = DI8DEVCLASS_GAMECTRL; +    void* callback = &di8_list_devices_callback; +#else +    // MAC doesn't support device search yet +    // On MAC there is an ndof_idsearch and it is possible to specify product +    // and manufacturer in NDOF_Device for ndof_init_first to pick specific one +    U32 device_type = 0; +    void* callback = NULL; +#endif +    if (gViewerWindow->getWindow()->getInputDevices(device_type, callback, this)) +    { +        mHasDeviceList = true; +    } + +    bool is_device_id_set = LLViewerJoystick::getInstance()->isDeviceUUIDSet(); + +    if (LLViewerJoystick::getInstance()->isJoystickInitialized() && +        (!mHasDeviceList || !is_device_id_set)) +    { +#if LL_WINDOWS && !LL_MESA_HEADLESS +        LL_WARNS() << "NDOF connected to device without using SL provided handle" << LL_ENDL; +#endif +        std::string desc = LLViewerJoystick::getInstance()->getDescription(); +        if (!desc.empty()) +        { +            LLSD value = LLSD::Integer(0); +            addDevice(desc, value); +            mHasDeviceList = true; +        } +    } + +    if (gSavedSettings.getBOOL("JoystickEnabled") && mHasDeviceList) +    { +        if (is_device_id_set) +        { +            LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID(); +            mJoysticksCombo->selectByValue(guid); +        } +        else +        { +            mJoysticksCombo->selectByValue(LLSD::Integer(1)); +        } +    } +    else +    { +        mJoysticksCombo->selectByValue(LLSD::Integer(0)); +    } +} +  void LLFloaterJoystick::cancel()  {  	gSavedSettings.setBOOL("JoystickEnabled", mJoystickEnabled); +	gSavedSettings.setLLSD("JoystickDeviceUUID", mJoystickId);  	gSavedSettings.setS32("JoystickAxis0", mJoystickAxis[0]);  	gSavedSettings.setS32("JoystickAxis1", mJoystickAxis[1]); @@ -285,7 +389,21 @@ void LLFloaterJoystick::cancel()  void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)  {  	LLFloaterJoystick* self = (LLFloaterJoystick*)joy_panel; -	BOOL joystick_enabled = self->mCheckJoystickEnabled->get(); + +    LLSD value = self->mJoysticksCombo->getValue(); +    bool joystick_enabled = true; +    if (value.isInteger()) +    { +        // ndof already has a device selected, we are just setting it enabled or disabled +        joystick_enabled = value.asInteger(); +    } +    else +    { +        LLViewerJoystick::getInstance()->initDevice(value); +        // else joystick is enabled, because combobox holds id of device +        joystick_enabled = true; +    } +    gSavedSettings.setBOOL("JoystickEnabled", joystick_enabled);  	BOOL flycam_enabled = self->mCheckFlycamEnabled->get();  	if (!joystick_enabled || !flycam_enabled) @@ -297,6 +415,12 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)  			joystick->toggleFlycam();  		}  	} + +    std::string device_id = LLViewerJoystick::getInstance()->getDeviceUUIDString(); +    gSavedSettings.setString("JoystickDeviceUUID", device_id); +    LL_DEBUGS("Joystick") << "Selected " << device_id << " as joystick." << LL_ENDL; + +    self->refreshListOfDevices();  }  void LLFloaterJoystick::onClickRestoreSNDefaults(void *joy_panel) diff --git a/indra/newview/llfloaterjoystick.h b/indra/newview/llfloaterjoystick.h index a1b5951389..1d46efd3f6 100644 --- a/indra/newview/llfloaterjoystick.h +++ b/indra/newview/llfloaterjoystick.h @@ -31,6 +31,7 @@  #include "llstatview.h"  class LLCheckBoxCtrl; +class LLComboBox;  class LLFloaterJoystick : public LLFloater  { @@ -45,8 +46,11 @@ public:  	virtual void draw();  	static  void setSNDefaults(); +    void addDevice(std::string &name, LLSD& value); +  protected: +	void refreshListOfDevices();  	void onClose(bool app_quitting);  	void onClickCloseBtn(bool app_quitting); @@ -65,6 +69,7 @@ private:  private:  	// Device prefs  	bool mJoystickEnabled; +	LLSD mJoystickId;  	S32 mJoystickAxis[7];  	bool m3DCursor;  	bool mAutoLeveling; @@ -85,8 +90,10 @@ private:  	F32 mFlycamFeathering;  	// Controls that can disable the flycam -	LLCheckBoxCtrl	*mCheckJoystickEnabled;  	LLCheckBoxCtrl	*mCheckFlycamEnabled; +	LLComboBox		*mJoysticksCombo; + +    bool mHasDeviceList;  	// stats view   	LLStatBar* mAxisStatsBar[6]; diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 3ab8fed2c6..127055459d 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -129,23 +129,14 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)  	switch(item->getType())  	{  	case LLAssetType::AT_OBJECT: -		if (get_is_item_worn(item->getUUID())) -		{ -			acceptable = false; -		} -		break;  	case LLAssetType::AT_BODYPART:  	case LLAssetType::AT_CLOTHING:  		{ -			BOOL copyable = false; -			if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; - -			if (!copyable && get_is_item_worn(item->getUUID())) +			if (get_is_item_worn(item->getUUID()))  			{ -				// worn no-copy items can't be transfered, -				// but it is valid to transfer a copy of a worn item  				acceptable = false;  			} +			break;  		}  		break;  	default: diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index d17bb982e1..c91e705d03 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2694,6 +2694,14 @@ void LLIMMgr::addMessage(  	bool new_session = !hasSession(new_session_id);  	if (new_session)  	{ +		// Group chat session was initiated by muted resident, do not start this session viewerside +		// do not send leave msg either, so we are able to get group messages from other participants +		if ((IM_SESSION_INVITE == dialog) && gAgent.isInGroup(new_session_id) && +			LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !from_linden) +		{ +			return; +		} +  		LLAvatarName av_name;  		if (LLAvatarNameCache::get(other_participant_id, &av_name) && !name_is_setted)  		{ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e9aaca13eb..d35d8456be 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -7665,13 +7665,12 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ  	disable_context_entries_if_present(menu, disabled_items);  } -bool LLFolderViewGroupedItemBridge::canWearSelected(uuid_vec_t item_ids) +bool LLFolderViewGroupedItemBridge::canWearSelected(const uuid_vec_t& item_ids) const  {  	for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)  	{ -		LLViewerInventoryItem* item = gInventory.getItem(*it); -		LLAssetType::EType asset_type = item->getType(); -		if (!item || (asset_type >= LLAssetType::AT_COUNT) || (asset_type <= LLAssetType::AT_NONE)) +		const LLViewerInventoryItem* item = gInventory.getItem(*it); +		if (!item || (item->getType() >= LLAssetType::AT_COUNT) || (item->getType() <= LLAssetType::AT_NONE))  		{  			return false;  		} diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index fce7ade661..9af8664388 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -760,7 +760,7 @@ class LLFolderViewGroupedItemBridge: public LLFolderViewGroupedItemModel  public:      LLFolderViewGroupedItemBridge();      virtual void groupFilterContextMenu(folder_view_item_deque& selected_items, LLMenuGL& menu); -    bool canWearSelected(uuid_vec_t item_ids); +    bool canWearSelected(const uuid_vec_t& item_ids) const;  };  #endif // LL_LLINVENTORYBRIDGE_H diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index d069aa3223..7a0ea8b668 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2442,16 +2442,19 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root  	{  		bool open_multi_preview = true; -		for (std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) +		if ("open" == action)  		{ -			LLFolderViewItem* folder_item = *set_iter; -			if (folder_item) +			for (std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter)  			{ -				LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(folder_item->getViewModelItem()); -				if (!bridge || !bridge->isMultiPreviewAllowed()) +				LLFolderViewItem* folder_item = *set_iter; +				if (folder_item)  				{ -					open_multi_preview = false; -					break; +					LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(folder_item->getViewModelItem()); +					if (!bridge || !bridge->isMultiPreviewAllowed()) +					{ +						open_multi_preview = false; +						break; +					}  				}  			}  		} diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index fd418afd2c..83195e9e3f 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -296,7 +296,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	LLButton::Params maturity_button = p.maturity_button;  	mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button);  	addChild(mMaturityButton); -	mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this));  	LLButton::Params for_sale_button = p.for_sale_button;  	for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip"); @@ -663,11 +662,6 @@ void LLLocationInputCtrl::onAgentParcelChange()  	refresh();  } -void LLLocationInputCtrl::onMaturityButtonClicked() -{ -	LLUI::getInstance()->mHelpImpl->showTopic(mMaturityHelpTopic); -} -  void LLLocationInputCtrl::onRegionBoundaryCrossed()  {  	createNavMeshStatusListenerForCurrentRegion(); diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index da71bab6c1..79dbe17982 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -160,7 +160,6 @@ private:  	void					onForSaleButtonClicked();  	void					onAddLandmarkButtonClicked();  	void					onAgentParcelChange(); -	void					onMaturityButtonClicked();  	void                    onRegionBoundaryCrossed();  	void                    onNavMeshStatusChange(const LLPathfindingNavMeshStatus &pNavMeshStatus);  	// callbacks diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 64df449c26..8a10a38b37 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -169,6 +169,14 @@ LLMuteList::LLMuteList() :  	gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1,  											 _PREHASH_UseCachedMuteList, processUseCachedMuteList,  											 static_cast<void**>(NULL))); + +    // make sure mute list's instance gets initialized before we start any name requests +    LLAvatarNameCache::getInstance()->setAccountNameChangedCallback([this](const LLUUID& id, const LLAvatarName& av_name) +        { +            // it would be better to just pass LLAvatarName instead of doing unnesssesary copies +            // but this way is just more convinient +            onAccountNameChanged(id, av_name.getUserName()); +        });  }  //----------------------------------------------------------------------------- @@ -179,6 +187,11 @@ LLMuteList::~LLMuteList()  } +void LLMuteList::cleanupSingleton() +{ +    LLAvatarNameCache::getInstance()->setAccountNameChangedCallback(NULL); +} +  BOOL LLMuteList::isLinden(const std::string& name) const  {  	std::string username = boost::replace_all_copy(name, ".", " "); @@ -232,8 +245,8 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)          LL_WARNS() << "Trying to self; ignored" << LL_ENDL;  		return FALSE;  	} -	 -	S32 mute_list_limit = gSavedSettings.getS32("MuteListLimit"); + +	static LLCachedControl<S32> mute_list_limit(gSavedSettings, "MuteListLimit", 1000);  	if (getMutes().size() >= mute_list_limit)  	{  		LL_WARNS() << "Mute limit is reached; ignored" << LL_ENDL; @@ -358,6 +371,10 @@ void LLMuteList::updateAdd(const LLMute& mute)  	msg->addU32("MuteFlags", mute.mFlags);  	gAgent.sendReliableMessage(); +    if (!mIsLoaded) +    { +        LL_WARNS() << "Added elements to non-initialized block list" << LL_ENDL; +    }  	mIsLoaded = TRUE; // why is this here? -MG  } @@ -412,7 +429,6 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)  		// Must be after erase.  		notifyObserversDetailed(localmute); -		setLoaded();  // why is this here? -MG  	}  	else  	{ @@ -426,7 +442,6 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)  			mLegacyMutes.erase(legacy_it);  			// Must be after erase.  			notifyObserversDetailed(mute); -			setLoaded(); // why is this here? -MG  		}  	} @@ -584,6 +599,19 @@ BOOL LLMuteList::loadFromFile(const std::string& filename)  	}  	fclose(fp);  	setLoaded(); + +    // server does not maintain up-to date account names (not display names!) +    // in this list, so it falls to viewer. +    pending_names_t::iterator iter = mPendingAgentNameUpdates.begin(); +    pending_names_t::iterator end = mPendingAgentNameUpdates.end(); +    while (iter != end) +    { +        // this will send updates to server, make sure mIsLoaded is set +        onAccountNameChanged(iter->first, iter->second); +        iter++; +    } +    mPendingAgentNameUpdates.clear(); +  	return TRUE;  } @@ -767,6 +795,48 @@ void LLMuteList::onFileMuteList(void** user_data, S32 error_code, LLExtStat ext_  	delete local_filename_and_path;  } +void LLMuteList::onAccountNameChanged(const LLUUID& id, const std::string& username) +{ +    if (mIsLoaded) +    { +        LLMute mute(id, username, LLMute::AGENT); +        mute_set_t::iterator mute_it = mMutes.find(mute); +        if (mute_it != mMutes.end() +            && mute_it->mName != mute.mName +            && mute_it->mType == LLMute::AGENT) // just in case, it is std::set, not map +        { +            // existing mute, but name changed, copy data +            mute.mFlags = mute_it->mFlags; + +            // erase old variant +            mMutes.erase(mute_it); + +            // (re)add the mute entry. +            { +                std::pair<mute_set_t::iterator, bool> result = mMutes.insert(mute); +                if (result.second) +                { +                    LL_INFOS() << "Muting " << mute.mName << " id " << mute.mID << " flags " << mute.mFlags << LL_ENDL; +                    updateAdd(mute); +                    // Do not notify observers here, observers do not know or need to handle name changes +                    // Example: block list considers notifyObserversDetailed as a selection update; +                    // Various chat/voice statuses care only about id and flags +                    // Since apropriate update time for account names is considered to be in 'hours' it is +                    // fine not to update UI (will be fine after restart or couple other changes) + +                } +            } +        } +    } +    else +    { +        // Delay update until we load file +        // Ex: Buddies list can arrive too early since we prerequest +        // names from Buddies list before we load blocklist +        mPendingAgentNameUpdates[id] = username; +    } +} +  void LLMuteList::addObserver(LLMuteListObserver* observer)  {  	mObservers.insert(observer); diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index f2fcf3dbb3..0d426fbd48 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -73,6 +73,7 @@ class LLMuteList : public LLSingleton<LLMuteList>  {  	LLSINGLETON(LLMuteList);  	~LLMuteList(); +	/*virtual*/ void cleanupSingleton();  public:  	// reasons for auto-unmuting a resident  	enum EAutoReason  @@ -131,6 +132,7 @@ private:  	static void processUseCachedMuteList(LLMessageSystem* msg, void**);  	static void onFileMuteList(void** user_data, S32 code, LLExtStat ext_status); +	void onAccountNameChanged(const LLUUID& id, const std::string& username);  private:  	struct compare_by_name @@ -155,7 +157,9 @@ private:  	};  	typedef std::set<LLMute, compare_by_id> mute_set_t;  	mute_set_t mMutes; -	 +	typedef std::map<LLUUID, std::string> pending_names_t; +	pending_names_t mPendingAgentNameUpdates; +  	typedef std::set<std::string> string_set_t;  	string_set_t mLegacyMutes; diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 3bae0cebfb..116b23e595 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -54,6 +54,7 @@  #include "lltrans.h"  #include "llviewerassettype.h"  #include "llviewerinventory.h" +#include "llviewermenu.h"  #include "llviewerobject.h"  #include "llviewerregion.h"  #include "llviewerwindow.h" @@ -82,6 +83,7 @@ BOOL LLPanelContents::postBuild()  	childSetAction("button new script",&LLPanelContents::onClickNewScript, this);  	childSetAction("button permissions",&LLPanelContents::onClickPermissions, this); +	childSetAction("btn_reset_scripts", &LLPanelContents::onClickResetScripts, this);  	mPanelInventoryObject = getChild<LLPanelObjectInventory>("contents_inventory"); @@ -106,6 +108,7 @@ void LLPanelContents::getState(LLViewerObject *objectp )  	if( !objectp )  	{  		getChildView("button new script")->setEnabled(FALSE); +		getChildView("btn_reset_scripts")->setEnabled(FALSE);  		return;  	} @@ -125,6 +128,8 @@ void LLPanelContents::getState(LLViewerObject *objectp )  		((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)  			|| (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))); +	getChildView("btn_reset_scripts")->setEnabled(editable); +  	getChildView("button permissions")->setEnabled(!objectp->isPermanentEnforced());  	mPanelInventoryObject->setEnabled(!objectp->isPermanentEnforced());  } @@ -206,3 +211,9 @@ void LLPanelContents::onClickPermissions(void *userdata)  	LLPanelContents* self = (LLPanelContents*)userdata;  	gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterReg::showInstance("bulk_perms"));  } + +// static +void LLPanelContents::onClickResetScripts(void *userdata) +{ +	handle_selected_script_action("reset"); +} diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index 6ecc78afa0..5b1a57de42 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -53,6 +53,7 @@ public:  	static void		onClickNewScript(void*);  	static void		onClickPermissions(void*); +	static void		onClickResetScripts(void*);      // Key suffix for "tentative" fields      static const char* TENTATIVE_SUFFIX; diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 7373c7412c..c63d04cd55 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -201,9 +201,12 @@ std::string build_notice_date(const U32& the_time)  		time(&t);  	} -	std::string dateStr = "["+LLTrans::getString("LTimeMthNum")+"]/[" -								+LLTrans::getString("LTimeDay")+"]/[" -								+LLTrans::getString("LTimeYear")+"]"; +	std::string dateStr = "["+ LLTrans::getString("LTimeYear") + "]/[" +								+ LLTrans::getString("LTimeMthNum") + "]/[" +								+ LLTrans::getString("LTimeDay") + "] [" +								+ LLTrans::getString("LTimeHour") + "]:[" +								+ LLTrans::getString("LTimeMin") + "]:[" +								+ LLTrans::getString("LTimeSec") + "]";  	LLSD substitution;  	substitution["datetime"] = (S32) t;  	LLStringUtil::format (dateStr, substitution); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index a19182b01e..4f60703488 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1337,8 +1337,10 @@ void LLPanelLogin::onSelectServer()  	switch (index)  	{  	case 0: // last location +        LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST)); +        break;  	case 1: // home location -		// do nothing - these are grid-agnostic locations +        LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));  		break;  	default: diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 02cd22c307..fbc1b80857 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -165,6 +165,7 @@ BOOL LLPanelMainInventory::postBuild()  		recent_items_panel->setSinceLogoff(TRUE);  		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);  		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); +		recent_items_panel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS);  		LLInventoryFilter& recent_filter = recent_items_panel->getFilter();  		recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));  		recent_filter.setEmptyLookupMessage("InventoryNoMatchingRecentItems"); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 1d87aa6f5d..dd1130aeba 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1282,6 +1282,7 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type  	//e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE  	applyListViewFilter(static_cast<EListViewItemType>(LVIT_SHAPE + type)); +	mWearableItemsList->setMenuWearableType(type);  }  static void update_status_widget_rect(LLView * widget, S32 right_border) diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index ef16427713..3e770958da 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -972,13 +972,45 @@ void LLPanelPermissions::refresh()  	getChildView("clickaction")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);  } +// Shorten name if it doesn't fit into max_pixels of two lines +void shorten_name(std::string &name, const LLStyle::Params& style_params, S32 max_pixels) +{ +    const LLFontGL* font = style_params.font(); + +    LLWString wline = utf8str_to_wstring(name); +    // panel supports two lines long names +    S32 segment_length = font->maxDrawableChars(wline.c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); +    if (segment_length == wline.length()) +    { +        // no work needed +        return; +    } + +    S32 first_line_length = segment_length; +    segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), max_pixels, wline.length(), LLFontGL::ANYWHERE); +    if (segment_length + first_line_length == wline.length()) +    { +        // no work needed +        return; +    } + +    // name does not fit, cut it, add ... +    const LLWString dots_pad(utf8str_to_wstring(std::string("...."))); +    S32 elipses_width = font->getWidthF32(dots_pad.c_str()); +    segment_length = font->maxDrawableChars(wline.substr(first_line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE); + +    name = name.substr(0, segment_length + first_line_length) + std::string("..."); +} +  void LLPanelPermissions::updateOwnerName(const LLUUID& owner_id, const LLAvatarName& owner_name, const LLStyle::Params& style_params)  {  	if (mOwnerCacheConnection.connected())  	{  		mOwnerCacheConnection.disconnect();  	} -	mLabelOwnerName->setText(owner_name.getCompleteName(), style_params); +	std::string name = owner_name.getCompleteName(); +	shorten_name(name, style_params, mLabelOwnerName->getLocalRect().getWidth()); +	mLabelOwnerName->setText(name, style_params);  }  void LLPanelPermissions::updateCreatorName(const LLUUID& creator_id, const LLAvatarName& creator_name, const LLStyle::Params& style_params) @@ -987,7 +1019,9 @@ void LLPanelPermissions::updateCreatorName(const LLUUID& creator_id, const LLAva  	{  		mCreatorCacheConnection.disconnect();  	} -	mLabelCreatorName->setText(creator_name.getCompleteName(), style_params); +	std::string name = creator_name.getCompleteName(); +	shorten_name(name, style_params, mLabelCreatorName->getLocalRect().getWidth()); +	mLabelCreatorName->setText(name, style_params);  }  // static diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 7a68d1e270..5e81fa6402 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -544,9 +544,6 @@ void LLScriptEdCore::initMenu()  	menuItem = getChild<LLMenuItemCallGL>("Go to line...");  	menuItem->setClickCallback(boost::bind(&LLFloaterGotoLine::show, this)); -	menuItem = getChild<LLMenuItemCallGL>("Help..."); -	menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnHelp, this)); -  	menuItem = getChild<LLMenuItemCallGL>("Keyword Help...");  	menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnDynamicHelp, this)); @@ -882,11 +879,6 @@ bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLS  	return false;  } -void LLScriptEdCore::onBtnHelp() -{ -	LLUI::getInstance()->mHelpImpl->showTopic(HELP_LSL_PORTAL_TOPIC); -} -  void LLScriptEdCore::onBtnDynamicHelp()  {  	LLFloater* live_help_floater = mLiveHelpHandle.get(); diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 74e4c00d43..3cf22a0e6e 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -144,7 +144,6 @@ public:  	void 			setItemRemoved(bool script_removed){mScriptRemoved = script_removed;};  private: -	void		onBtnHelp();  	void		onBtnDynamicHelp();  	void		onBtnUndoChanges(); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9d8be4b2fe..1e91da529c 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -401,7 +401,7 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,  	{  		const U32 ext_length = 3;  		std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length); - +		LLStringUtil::toLower(extension);  		// We only support saving in PNG or TGA format  		LLPointer<LLImageFormatted> image;  		if(extension == "png") diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 3e3ab3a676..416848f9af 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -431,9 +431,10 @@ void LLProgressView::initLogos()      // 108x41      icon_width = 74; +    icon_height = default_height;      loadLogo(temp_str + "vivox_logo.png",          image_codec, -        LLRect(texture_start_x, texture_start_y + default_height, texture_start_x + icon_width, texture_start_y), +        LLRect(texture_start_x, texture_start_y + icon_height, texture_start_x + icon_width, texture_start_y),          default_clip,          default_clip);  } diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 6211d0ce3b..d0e313bfdb 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -52,7 +52,8 @@ const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;  const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit  const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)  const S32 TEXTURE_FAST_CACHE_ENTRY_OVERHEAD = sizeof(S32) * 4; //w, h, c, level -const S32 TEXTURE_FAST_CACHE_ENTRY_SIZE = 16 * 16 * 4 + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD; +const S32 TEXTURE_FAST_CACHE_DATA_SIZE = 16 * 16 * 4; +const S32 TEXTURE_FAST_CACHE_ENTRY_SIZE = TEXTURE_FAST_CACHE_DATA_SIZE + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD;  const F32 TEXTURE_LAZY_PURGE_TIME_LIMIT = .004f; // 4ms. Would be better to autoadjust, but there is a major cache rework in progress.  class LLTextureCacheWorker : public LLWorkerClass @@ -2068,7 +2069,9 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d  		}  		S32 image_size = head[0] * head[1] * head[2]; -		if(!image_size) //invalid +        if(image_size <= 0 +           || image_size > TEXTURE_FAST_CACHE_DATA_SIZE +           || head[3] < 0) //invalid  		{  			closeFastCache();  			return NULL; @@ -2090,46 +2093,6 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d  	return raw;  } -#if LL_WINDOWS - -static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific - -U32 exception_dupe_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop) -{ -    if (code == STATUS_MSC_EXCEPTION) -    { -        // C++ exception, go on -        return EXCEPTION_CONTINUE_SEARCH; -    } -    else -    { -        // handle it -        return EXCEPTION_EXECUTE_HANDLER; -    } -} - -//due to unwinding -void dupe(LLPointer<LLImageRaw> &raw) -{ -    raw = raw->duplicate(); -} - -void logExceptionDupplicate(LLPointer<LLImageRaw> &raw) -{ -    __try -    { -        dupe(raw); -    } -    __except (exception_dupe_filter(GetExceptionCode(), GetExceptionInformation())) -    { -        // convert to C++ styled exception -        char integer_string[32]; -        sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode()); -        throw std::exception(integer_string); -    } -} -#endif -  //return the fast cache location  bool LLTextureCache::writeToFastCache(LLUUID image_id, S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)  { @@ -2146,8 +2109,9 @@ bool LLTextureCache::writeToFastCache(LLUUID image_id, S32 id, LLPointer<LLImage  	c = raw->getComponents();  	S32 i = 0 ; -	 -	while(((w >> i) * (h >> i) * c) > TEXTURE_FAST_CACHE_ENTRY_SIZE - TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) + +	// Search for a discard level that will fit into fast cache +	while(((w >> i) * (h >> i) * c) > TEXTURE_FAST_CACHE_DATA_SIZE)  	{  		++i ;  	} diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 1c4187d30f..7a0f69fed5 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -423,8 +423,8 @@ void LLAvatarTexBar::draw()  	LLColor4 color;  	U32 line_num = 1; -	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearance::getDictionary()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearance::getDictionary()->getBakedTextures().end();  		 ++baked_iter)  	{  		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index d53cc3f745..bc07821ccd 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -316,24 +316,25 @@ bool LLResourceUploadInfo::findAssetTypeOfExtension(const std::string& exten, LL  bool LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(const std::string& exten, LLAssetType::EType& asset_type, U32& codec, bool bulk_upload)  {  	bool succ = false; - -    codec = LLImageBase::getCodecFromExtension(exten); +	std::string exten_lc(exten); +	LLStringUtil::toLower(exten_lc); +	codec = LLImageBase::getCodecFromExtension(exten_lc);  	if (codec != IMG_CODEC_INVALID)  	{  		asset_type = LLAssetType::AT_TEXTURE;   		succ = true;  	} -	else if (exten == "wav") +	else if (exten_lc == "wav")  	{  		asset_type = LLAssetType::AT_SOUND;   		succ = true;  	} -	else if (exten == "anim") +	else if (exten_lc == "anim")  	{  		asset_type = LLAssetType::AT_ANIMATION;   		succ = true;  	} -	else if (!bulk_upload && (exten == "bvh")) +	else if (!bulk_upload && (exten_lc == "bvh"))  	{  		asset_type = LLAssetType::AT_ANIMATION;  		succ = true; diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index 491ad7e3b2..e35cb26ce1 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -36,10 +36,19 @@  #include "lltoolmgr.h"  #include "llselectmgr.h"  #include "llviewermenu.h" +#include "llviewerwindow.h" +#include "llwindow.h"  #include "llagent.h"  #include "llagentcamera.h"  #include "llfocusmgr.h" +#if LL_WINDOWS && !LL_MESA_HEADLESS +// Require DirectInput version 8 +#define DIRECTINPUT_VERSION 0x0800 + +#include <dinput.h> +#endif +  // ----------------------------------------------------------------------------  // Constants @@ -62,6 +71,7 @@ F32  LLViewerJoystick::sDelta[] = {0,0,0,0,0,0,0};  #define MAX_SPACENAVIGATOR_INPUT  3000.0f  #define MAX_JOYSTICK_INPUT_VALUE  MAX_SPACENAVIGATOR_INPUT +  #if LIB_NDOF  std::ostream& operator<<(std::ostream& out, NDOF_Device* ptr)  { @@ -99,6 +109,126 @@ std::ostream& operator<<(std::ostream& out, NDOF_Device* ptr)  }  #endif // LIB_NDOF + +#if LL_WINDOWS && !LL_MESA_HEADLESS +// this should reflect ndof and set axises, see ndofdev_win.cpp from ndof package +BOOL CALLBACK EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE* inst, VOID* user_data) +{ +    if (inst->dwType & DIDFT_AXIS) +    { +        LPDIRECTINPUTDEVICE8 device = *((LPDIRECTINPUTDEVICE8 *)user_data); +        DIPROPRANGE diprg; +        diprg.diph.dwSize = sizeof(DIPROPRANGE); +        diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); +        diprg.diph.dwHow = DIPH_BYID; +        diprg.diph.dwObj = inst->dwType; // specify the enumerated axis + +        // Set the range for the axis +        diprg.lMin = (long)-MAX_JOYSTICK_INPUT_VALUE; +        diprg.lMax = (long)+MAX_JOYSTICK_INPUT_VALUE; +        HRESULT hr = device->SetProperty(DIPROP_RANGE, &diprg.diph); + +        if (FAILED(hr)) +        { +            return DIENUM_STOP; +        } +    } + +    return DIENUM_CONTINUE; +} + +BOOL CALLBACK di8_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVOID pvRef) +{ +    // Note: If a single device can function as more than one DirectInput +    // device type, it is enumerated as each device type that it supports. +    // Capable of detecting devices like Oculus Rift +    if (device_instance_ptr) +    { +        std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName)); + +        LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID(); + +        bool init_device = false; +        if (guid.isBinary()) +        { +            std::vector<U8> bin_bucket = guid.asBinary(); +            init_device = memcmp(&bin_bucket[0], &device_instance_ptr->guidInstance, sizeof(GUID)) == 0; +        } +        else +        { +            // It might be better to init space navigator here, but if system doesn't has one, +            // ndof will pick a random device, it is simpler to pick first device now to have an id +            init_device = true; +        } + +        if (init_device) +        { +            LL_DEBUGS("Joystick") << "Found and attempting to use device: " << product_name << LL_ENDL; +            LPDIRECTINPUT8       di8_interface = *((LPDIRECTINPUT8 *)gViewerWindow->getWindow()->getDirectInput8()); +            LPDIRECTINPUTDEVICE8 device = NULL; + +            HRESULT status = di8_interface->CreateDevice( +                device_instance_ptr->guidInstance, // REFGUID rguid, +                &device,                           // LPDIRECTINPUTDEVICE * lplpDirectInputDevice, +                NULL                               // LPUNKNOWN pUnkOuter +                ); + +            if (status == DI_OK) +            { +                // prerequisite for aquire() +                LL_DEBUGS("Joystick") << "Device created" << LL_ENDL; +                status = device->SetDataFormat(&c_dfDIJoystick); // c_dfDIJoystick2 +            } + +            if (status == DI_OK) +            { +                // set properties +                LL_DEBUGS("Joystick") << "Format set" << LL_ENDL; +                status = device->EnumObjects(EnumObjectsCallback, &device, DIDFT_ALL); +            } + +            if (status == DI_OK) +            { +                LL_DEBUGS("Joystick") << "Properties updated" << LL_ENDL; + +                S32 size = sizeof(GUID); +                LLSD::Binary data; //just an std::vector +                data.resize(size); +                memcpy(&data[0], &device_instance_ptr->guidInstance /*POD _GUID*/, size); +                LLViewerJoystick::getInstance()->initDevice(&device, product_name, LLSD(data)); +                return DIENUM_STOP; +            } +        } +        else +        { +            LL_DEBUGS("Joystick") << "Found device: " << product_name << LL_ENDL; +        } +    } +    return DIENUM_CONTINUE; +} + +// Windows guids +// This is GUID2 so teoretically it can be memcpy copied into LLUUID +void guid_from_string(GUID &guid, const std::string &input) +{ +    CLSIDFromString(utf8str_to_utf16str(input).c_str(), &guid); +} + +std::string string_from_guid(const GUID &guid) +{ +    OLECHAR* guidString; //wchat +    StringFromCLSID(guid, &guidString); + +    // use guidString... + +    std::string res = utf16str_to_utf8str(llutf16string(guidString)); +    // ensure memory is freed +    ::CoTaskMemFree(guidString); + +    return res; +} +#endif +  // -----------------------------------------------------------------------------  void LLViewerJoystick::updateEnabled(bool autoenable)  { @@ -108,7 +238,8 @@ void LLViewerJoystick::updateEnabled(bool autoenable)  	}  	else  	{ -		if (isLikeSpaceNavigator() && autoenable) +		// autoenable if user specifically chose this device +		if (autoenable && (isLikeSpaceNavigator() || isDeviceUUIDSet()))   		{  			gSavedSettings.setBOOL("JoystickEnabled", TRUE );  		} @@ -144,7 +275,7 @@ NDOF_HotPlugResult LLViewerJoystick::HotPlugAddCallback(NDOF_Device *dev)  	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());  	if (joystick->mDriverState == JDS_UNINITIALIZED)  	{ -		LL_INFOS("joystick") << "HotPlugAddCallback: will use device:" << LL_ENDL; +		LL_INFOS("Joystick") << "HotPlugAddCallback: will use device:" << LL_ENDL;  		ndof_dump(stderr, dev);  		joystick->mNdofDev = dev;  		joystick->mDriverState = JDS_INITIALIZED; @@ -162,7 +293,7 @@ void LLViewerJoystick::HotPlugRemovalCallback(NDOF_Device *dev)  	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());  	if (joystick->mNdofDev == dev)  	{ -		LL_INFOS("joystick") << "HotPlugRemovalCallback: joystick->mNdofDev="  +        LL_INFOS("Joystick") << "HotPlugRemovalCallback: joystick->mNdofDev="  				<< joystick->mNdofDev << "; removed device:" << LL_ENDL;  		ndof_dump(stderr, dev);  		joystick->mDriverState = JDS_UNINITIALIZED; @@ -189,6 +320,8 @@ LLViewerJoystick::LLViewerJoystick()  	// factor in bandwidth? bandwidth = gViewerStats->mKBitStat  	mPerfScale = 4000.f / gSysCPU.getMHz(); // hmm.  why? + +    mLastDeviceUUID = LLSD::Integer(1);  }  // ----------------------------------------------------------------------------- @@ -207,12 +340,14 @@ void LLViewerJoystick::init(bool autoenable)  	static bool libinit = false;  	mDriverState = JDS_INITIALIZING; +    loadDeviceIdFromSettings(); +  	if (libinit == false)  	{  		// Note: The HotPlug callbacks are not actually getting called on Windows  		if (ndof_libinit(HotPlugAddCallback,   						 HotPlugRemovalCallback,  -						 NULL)) +						 gViewerWindow->getWindow()->getDirectInput8()))  		{  			mDriverState = JDS_UNINITIALIZED;  		} @@ -229,39 +364,33 @@ void LLViewerJoystick::init(bool autoenable)  	if (libinit)  	{  		if (mNdofDev) -		{ -			LL_DEBUGS("joystick") << "ndof_create() returned: " << mNdofDev << LL_ENDL; -			// Different joysticks will return different ranges of raw values. -			// Since we want to handle every device in the same uniform way,  -			// we initialize the mNdofDev struct and we set the range  -			// of values we would like to receive.  -			//  -			// HACK: On Windows, libndofdev passes our range to DI with a  -			// SetProperty call. This works but with one notable exception, the -			// SpaceNavigator, who doesn't seem to care about the SetProperty -			// call. In theory, we should handle this case inside libndofdev.  -			// However, the range we're setting here is arbitrary anyway,  -			// so let's just use the SpaceNavigator range for our purposes.  -			mNdofDev->axes_min = (long)-MAX_JOYSTICK_INPUT_VALUE; -			mNdofDev->axes_max = (long)+MAX_JOYSTICK_INPUT_VALUE; - -			// libndofdev could be used to return deltas.  Here we choose to -			// just have the absolute values instead. -			mNdofDev->absolute = 1; - -			LL_DEBUGS("joystick") << "ndof_init_first() received: " << mNdofDev << LL_ENDL; -			// init & use the first suitable NDOF device found on the USB chain -			if (ndof_init_first(mNdofDev, NULL)) -			{ -				mDriverState = JDS_UNINITIALIZED; -				LL_WARNS("joystick") << "ndof_init_first FAILED" << LL_ENDL; -				ndof_dump_list(stderr); -			} -			else -			{ -				mDriverState = JDS_INITIALIZED; -			} -			LL_DEBUGS("joystick") << "ndof_init_first() left: " << mNdofDev << LL_ENDL; +        { +            // di8_devices_callback callback is immediate and happens in scope of getInputDevices() +#if LL_WINDOWS && !LL_MESA_HEADLESS +            // space navigator is marked as DI8DEVCLASS_GAMECTRL in ndof lib +            U32 device_type = DI8DEVCLASS_GAMECTRL; +            void* callback = &di8_devices_callback; +#else +            // MAC doesn't support device search yet +            // On MAC there is an ndof_idsearch and it is possible to specify product +            // and manufacturer in NDOF_Device for ndof_init_first to pick specific one +            U32 device_type = 0; +            void* callback = NULL; +#endif +            if (!gViewerWindow->getWindow()->getInputDevices(device_type, callback, NULL)) +            { +                LL_INFOS("Joystick") << "Failed to gather devices from window. Falling back to ndof's init" << LL_ENDL; +                // Failed to gather devices from windows, init first suitable one +                mLastDeviceUUID = LLSD(); +                void *preffered_device = NULL; +                initDevice(preffered_device); +            } + +            if (mDriverState == JDS_INITIALIZING) +            { +                LL_INFOS("Joystick") << "Found no matching joystick devices." << LL_ENDL; +                mDriverState = JDS_UNINITIALIZED; +            }  		}  		else  		{ @@ -300,11 +429,92 @@ void LLViewerJoystick::init(bool autoenable)  		// No device connected, don't change any settings  	} -	LL_INFOS("joystick") << "ndof: mDriverState=" << mDriverState << "; mNdofDev="  +	LL_INFOS("Joystick") << "ndof: mDriverState=" << mDriverState << "; mNdofDev="   			<< mNdofDev << "; libinit=" << libinit << LL_ENDL;  #endif  } +void LLViewerJoystick::initDevice(LLSD &guid) +{ +#if LIB_NDOF +    mLastDeviceUUID = guid; + +#if LL_WINDOWS && !LL_MESA_HEADLESS +    // space navigator is marked as DI8DEVCLASS_GAMECTRL in ndof lib +    U32 device_type = DI8DEVCLASS_GAMECTRL; +    void* callback = &di8_devices_callback; +#else +    // MAC doesn't support device search yet +    // On MAC there is an ndof_idsearch and it is possible to specify product +    // and manufacturer in NDOF_Device for ndof_init_first to pick specific one +    U32 device_type = 0; +    void* callback = NULL; +#endif + +    mDriverState = JDS_INITIALIZING;  +    if (!gViewerWindow->getWindow()->getInputDevices(device_type, callback, NULL)) +    { +        LL_INFOS("Joystick") << "Failed to gather devices from window. Falling back to ndof's init" << LL_ENDL; +        // Failed to gather devices from windows, init first suitable one +        void *preffered_device = NULL; +        mLastDeviceUUID = LLSD(); +        initDevice(preffered_device); +    } + +    if (mDriverState == JDS_INITIALIZING) +    { +        LL_INFOS("Joystick") << "Found no matching joystick devices." << LL_ENDL; +        mDriverState = JDS_UNINITIALIZED; +    } +#endif +} + +void LLViewerJoystick::initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid) +{ +#if LIB_NDOF +    mLastDeviceUUID = guid; + +    strncpy(mNdofDev->product, name.c_str(), sizeof(mNdofDev->product)); +    mNdofDev->manufacturer[0] = '\0'; + +    initDevice(preffered_device); +#endif +} + +void LLViewerJoystick::initDevice(void * preffered_device /* LPDIRECTINPUTDEVICE8* */) +{ +#if LIB_NDOF +    // Different joysticks will return different ranges of raw values. +    // Since we want to handle every device in the same uniform way,  +    // we initialize the mNdofDev struct and we set the range  +    // of values we would like to receive.  +    //  +    // HACK: On Windows, libndofdev passes our range to DI with a  +    // SetProperty call. This works but with one notable exception, the +    // SpaceNavigator, who doesn't seem to care about the SetProperty +    // call. In theory, we should handle this case inside libndofdev.  +    // However, the range we're setting here is arbitrary anyway,  +    // so let's just use the SpaceNavigator range for our purposes.  +    mNdofDev->axes_min = (long)-MAX_JOYSTICK_INPUT_VALUE; +    mNdofDev->axes_max = (long)+MAX_JOYSTICK_INPUT_VALUE; + +    // libndofdev could be used to return deltas.  Here we choose to +    // just have the absolute values instead. +    mNdofDev->absolute = 1; +    // init & use the first suitable NDOF device found on the USB chain +    // On windows preffered_device needs to be a pointer to LPDIRECTINPUTDEVICE8 +    if (ndof_init_first(mNdofDev, preffered_device)) +    { +        mDriverState = JDS_UNINITIALIZED; +        LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL; +    } +    else +    { +        mDriverState = JDS_INITIALIZED; +    } +#endif +} +  // -----------------------------------------------------------------------------  void LLViewerJoystick::terminate()  { @@ -314,7 +524,7 @@ void LLViewerJoystick::terminate()          ndof_libcleanup(); // frees alocated memory in mNdofDev          mDriverState = JDS_UNINITIALIZED;          mNdofDev = NULL; -        LL_INFOS("joystick") << "Terminated connection with NDOF device." << LL_ENDL; +        LL_INFOS("Joystick") << "Terminated connection with NDOF device." << LL_ENDL;      }  #endif  } @@ -1105,6 +1315,74 @@ void LLViewerJoystick::scanJoystick()  }  // ----------------------------------------------------------------------------- +bool LLViewerJoystick::isDeviceUUIDSet() +{ +#if LL_WINDOWS && !LL_MESA_HEADLESS +    // for ease of comparison and to dial less with platform specific variables, we store id as LLSD binary +    return mLastDeviceUUID.isBinary(); +#else +    return false; +#endif +} + +LLSD LLViewerJoystick::getDeviceUUID() +{ +    return mLastDeviceUUID; +} + +std::string LLViewerJoystick::getDeviceUUIDString() +{ +#if LL_WINDOWS && !LL_MESA_HEADLESS +    // Might be simpler to just convert _GUID into string everywhere, store and compare as string +    if (mLastDeviceUUID.isBinary()) +    { +        S32 size = sizeof(GUID); +        LLSD::Binary data = mLastDeviceUUID.asBinary(); +        GUID guid; +        memcpy(&guid, &data[0], size); +        return string_from_guid(guid); +    } +    else +    { +        return std::string(); +    } +#else +    return std::string(); +    // return mLastDeviceUUID; +#endif +} + +void LLViewerJoystick::loadDeviceIdFromSettings() +{ +#if LL_WINDOWS && !LL_MESA_HEADLESS +    // We can't save binary data to gSavedSettings, somebody editing the file will corrupt it, +    // so _GUID data gets converted to string (we probably can convert it to LLUUID with memcpy) +    // and here we need to convert it back to binary from string +    std::string device_string = gSavedSettings.getString("JoystickDeviceUUID"); +    if (device_string.empty()) +    { +        mLastDeviceUUID = LLSD(); +    } +    else +    { +        LL_DEBUGS("Joystick") << "Looking for device by id: " << device_string << LL_ENDL; +        GUID guid; +        guid_from_string(guid, device_string); +        S32 size = sizeof(GUID); +        LLSD::Binary data; //just an std::vector +        data.resize(size); +        memcpy(&data[0], &guid /*POD _GUID*/, size); +        // We store this data in LLSD since LLSD is versatile and will be able to handle both GUID2 +        // and any data MAC will need for device selection +        mLastDeviceUUID = LLSD(data); +    } +#else +    mLastDeviceUUID = LLSD(); +    //mLastDeviceUUID = gSavedSettings.getLLSD("JoystickDeviceUUID"); +#endif +} + +// -----------------------------------------------------------------------------  std::string LLViewerJoystick::getDescription()  {  	std::string res; @@ -1145,7 +1423,7 @@ void LLViewerJoystick::setSNDefaults()  #endif  	//gViewerWindow->alertXml("CacheWillClear"); -	LL_INFOS("joystick") << "restoring SpaceNavigator defaults..." << LL_ENDL; +	LL_INFOS("Joystick") << "restoring SpaceNavigator defaults..." << LL_ENDL;  	gSavedSettings.setS32("JoystickAxis0", 1); // z (at)  	gSavedSettings.setS32("JoystickAxis1", 0); // x (slide) diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h index 016b435ee8..782c523d4f 100644 --- a/indra/newview/llviewerjoystick.h +++ b/indra/newview/llviewerjoystick.h @@ -50,6 +50,9 @@ class LLViewerJoystick : public LLSingleton<LLViewerJoystick>  public:  	void init(bool autoenable); +	void initDevice(LLSD &guid); +	void initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/); +	void initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid);  	void terminate();  	void updateStatus(); @@ -68,8 +71,11 @@ public:  	void setOverrideCamera(bool val);  	bool toggleFlycam();  	void setSNDefaults(); +	bool isDeviceUUIDSet(); +	LLSD getDeviceUUID(); //unconverted, OS dependent value wrapped into LLSD, for comparison/search +	std::string getDeviceUUIDString(); // converted readable value for settings  	std::string getDescription(); -	 +  protected:  	void updateEnabled(bool autoenable);  	void handleRun(F32 inc); @@ -80,6 +86,7 @@ protected:  	void agentYaw(F32 yaw_inc);  	void agentJump();  	void resetDeltas(S32 axis[]); +	void loadDeviceIdFromSettings();  #if LIB_NDOF  	static NDOF_HotPlugResult HotPlugAddCallback(NDOF_Device *dev);  	static void HotPlugRemovalCallback(NDOF_Device *dev); @@ -95,6 +102,7 @@ private:  	bool					mCameraUpdated;  	bool 					mOverrideCamera;  	U32						mJoystickRun; +	LLSD					mLastDeviceUUID; // _GUID as U8 binary map, integer 1 for no device/ndof's device  	static F32				sLastDelta[7];  	static F32				sDelta[7]; diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 10099eda5b..ba80eeb6b6 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -340,15 +340,6 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)  			clearFocus();  		} -		 -		if ( KEY_F1 == key && LLUI::getInstance()->mHelpImpl && mMediaControls.get()) -		{ -			std::string help_topic; -			if (mMediaControls.get()->findHelpTopic(help_topic)) -			{ -				LLUI::getInstance()->mHelpImpl->showTopic(help_topic); -			} -		}  	}  	return true; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 4890867f29..590f3619b4 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -185,11 +185,15 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"  LLMenuGL* gAttachSubMenu = NULL;  LLMenuGL* gDetachSubMenu = NULL;  LLMenuGL* gTakeOffClothes = NULL; +LLMenuGL* gDetachAvatarMenu = NULL; +LLMenuGL* gDetachHUDAvatarMenu = NULL;  LLContextMenu* gAttachScreenPieMenu = NULL;  LLContextMenu* gAttachPieMenu = NULL;  LLContextMenu* gAttachBodyPartPieMenus[9];  LLContextMenu* gDetachPieMenu = NULL;  LLContextMenu* gDetachScreenPieMenu = NULL; +LLContextMenu* gDetachAttSelfMenu = NULL; +LLContextMenu* gDetachHUDAttSelfMenu = NULL;  LLContextMenu* gDetachBodyPartPieMenus[9];  // @@ -444,6 +448,9 @@ void init_menus()  	gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(  		"menu_attachment_other.xml", gMenuHolder, registry); +	gDetachHUDAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self HUD", true); +	gDetachAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self", true); +  	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(  		"menu_land.xml", gMenuHolder, registry); @@ -500,6 +507,9 @@ void init_menus()  	gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);  	gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE); +	gDetachAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach", true); +	gDetachHUDAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach HUD", true); +  	// Don't display the Memory console menu if the feature is turned off  	LLMenuItemCheckGL *memoryMenu = gMenuBarView->getChild<LLMenuItemCheckGL>("Memory", TRUE);  	if (memoryMenu) @@ -676,19 +686,6 @@ class LLAdvancedCheckHUDInfo : public view_listener_t  }; -////////////// -// FLYING   // -////////////// - -class LLAdvancedAgentFlyingInfo : public view_listener_t -{ -	bool handleEvent(const LLSD&) -	{ -		return gAgent.getFlying(); -	} -}; - -  ///////////////////////  // CLEAR GROUP CACHE //  /////////////////////// @@ -3742,6 +3739,35 @@ bool enable_sitdown_self()  	return show_sitdown_self() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();  } +class LLSelfToggleSitStand : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		if (isAgentAvatarValid()) +		{ +			if (gAgentAvatarp->isSitting()) +			{ +				gAgent.standUp(); +			} +			else +			{ +				gAgent.sitDown(); +			} +		} +		return true; +	} +}; + +bool enable_sit_stand() +{ +	return enable_sitdown_self() || enable_standup_self(); +} + +bool enable_fly_land() +{ +	return gAgent.getFlying() || LLAgent::enableFlying(); +} +  class LLCheckPanelPeopleTab : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -4144,7 +4170,7 @@ void handle_reset_view()  		// switching to outfit selector should automagically save any currently edited wearable  		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));  	} -	 +	gAgentCamera.setFocusOnAvatar(TRUE, FALSE, FALSE);  	reset_view_final( TRUE );  	LLFloaterCamera::resetCameraMode();  } @@ -7242,58 +7268,62 @@ class LLToolsSelectedScriptAction : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		std::string action = userdata.asString(); -		bool mono = false; -		std::string msg, name; -		std::string title; -		if (action == "compile mono") -		{ -			name = "compile_queue"; -			mono = true; -			msg = "Recompile"; -			title = LLTrans::getString("CompileQueueTitle"); -		} -		if (action == "compile lsl") -		{ -			name = "compile_queue"; -			msg = "Recompile"; -			title = LLTrans::getString("CompileQueueTitle"); -		} -		else if (action == "reset") -		{ -			name = "reset_queue"; -			msg = "Reset"; -			title = LLTrans::getString("ResetQueueTitle"); -		} -		else if (action == "start") -		{ -			name = "start_queue"; -			msg = "SetRunning"; -			title = LLTrans::getString("RunQueueTitle"); -		} -		else if (action == "stop") -		{ -			name = "stop_queue"; -			msg = "SetRunningNot"; -			title = LLTrans::getString("NotRunQueueTitle"); -		} -		LLUUID id; id.generate(); -		 -		LLFloaterScriptQueue* queue =LLFloaterReg::getTypedInstance<LLFloaterScriptQueue>(name, LLSD(id)); -		if (queue) -		{ -			queue->setMono(mono); -			queue_actions(queue, msg); -			queue->setTitle(title); -		} -		else -		{ -			LL_WARNS() << "Failed to generate LLFloaterScriptQueue with action: " << action << LL_ENDL; -		} +		handle_selected_script_action(userdata.asString());  		return true;  	}  }; +void handle_selected_script_action(const std::string& action) +{ +	bool mono = false; +	std::string msg, name; +	std::string title; +	if (action == "compile mono") +	{ +		name = "compile_queue"; +		mono = true; +		msg = "Recompile"; +		title = LLTrans::getString("CompileQueueTitle"); +	} +	if (action == "compile lsl") +	{ +		name = "compile_queue"; +		msg = "Recompile"; +		title = LLTrans::getString("CompileQueueTitle"); +	} +	else if (action == "reset") +	{ +		name = "reset_queue"; +		msg = "Reset"; +		title = LLTrans::getString("ResetQueueTitle"); +	} +	else if (action == "start") +	{ +		name = "start_queue"; +		msg = "SetRunning"; +		title = LLTrans::getString("RunQueueTitle"); +	} +	else if (action == "stop") +	{ +		name = "stop_queue"; +		msg = "SetRunningNot"; +		title = LLTrans::getString("NotRunQueueTitle"); +	} +	LLUUID id; id.generate(); + +	LLFloaterScriptQueue* queue = LLFloaterReg::getTypedInstance<LLFloaterScriptQueue>(name, LLSD(id)); +	if (queue) +	{ +		queue->setMono(mono); +		queue_actions(queue, msg); +		queue->setTitle(title); +	} +	else +	{ +		LL_WARNS() << "Failed to generate LLFloaterScriptQueue with action: " << action << LL_ENDL; +	} +} +  void handle_selected_texture_info(void*)  {  	for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin(); @@ -7898,7 +7928,7 @@ void handle_grab_baked_texture(void* data)  	if(folder_id.notNull())  	{  		std::string name; -		name = "Baked " + LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture"; +		name = "Baked " + LLAvatarAppearance::getDictionary()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture";  		LLUUID item_id;  		item_id.generate(); @@ -8924,7 +8954,7 @@ void initialize_menus()  	// Agent  	commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); -	enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying)); +	enable.add("Agent.enableFlyLand", boost::bind(&enable_fly_land));  	commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));  	commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));  	commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2)); @@ -8972,9 +9002,6 @@ void initialize_menus()  	view_listener_t::addMenu(new LLViewStatusDoNotDisturb(), "View.Status.CheckDoNotDisturb");  	view_listener_t::addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); -	// Me > Movement -	view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); -  	//Communicate Nearby chat  	view_listener_t::addMenu(new LLCommunicateNearbyChat(), "Communicate.NearbyChat"); @@ -9238,11 +9265,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdminOnSaveState(), "Admin.OnSaveState");  	// Self context menu -	view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp"); -	enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self)); -	view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown"); -	enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));  -	enable.add("Self.ShowSitDown", boost::bind(&show_sitdown_self)); +	view_listener_t::addMenu(new LLSelfToggleSitStand(), "Self.ToggleSitStand"); +	enable.add("Self.EnableSitStand", boost::bind(&enable_sit_stand));  	view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");  	view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 0f63c8cf58..1420db0940 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -112,6 +112,7 @@ void handle_object_edit();  void handle_attachment_edit(const LLUUID& inv_item_id);  void handle_attachment_touch(const LLUUID& inv_item_id);  bool enable_attachment_touch(const LLUUID& inv_item_id); +void handle_selected_script_action(const std::string& action);  void handle_buy_land(); @@ -188,10 +189,14 @@ extern LLContextMenu		*gMenuMuteParticle;  extern LLMenuGL* gAttachSubMenu;  extern LLMenuGL* gDetachSubMenu;  extern LLMenuGL* gTakeOffClothes; +extern LLMenuGL* gDetachAvatarMenu; +extern LLMenuGL* gDetachHUDAvatarMenu;  extern LLContextMenu* gAttachScreenPieMenu;  extern LLContextMenu* gDetachScreenPieMenu; +extern LLContextMenu* gDetachHUDAttSelfMenu;  extern LLContextMenu* gAttachPieMenu;  extern LLContextMenu* gDetachPieMenu; +extern LLContextMenu* gDetachAttSelfMenu;  extern LLContextMenu* gAttachBodyPartPieMenus[9];  extern LLContextMenu* gDetachBodyPartPieMenus[9]; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d43442d69d..865ac2bb7b 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -686,11 +686,12 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  		bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot");  		bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); -		if (gSavedSettings.getBOOL("HighResSnapshot")) +		BOOL high_res = gSavedSettings.getBOOL("HighResSnapshot"); +		if (high_res)  		{  			width *= 2;  			height *= 2; -			// not compatible wirh UI/HUD +			// not compatible with UI/HUD  			render_ui = false;  			render_hud = false;  		} @@ -702,7 +703,9 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  									   FALSE,  									   render_ui,  									   render_hud, -									   FALSE)) +									   FALSE, +									   LLSnapshotModel::SNAPSHOT_TYPE_COLOR, +									   high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side  		{  			LLPointer<LLImageFormatted> formatted;              LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 34d5dd5663..458fc3b13d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5736,8 +5736,9 @@ void process_script_question(LLMessageSystem *msg, void **user_data)  	// so we'll reuse the same namespace for both throttle types.  	std::string throttle_name = owner_name;  	std::string self_name; -	LLAgentUI::buildFullname( self_name ); -	if( owner_name == self_name ) +	LLAgentUI::buildFullname( self_name ); // does not include ' Resident' +	std::string clean_owner_name = LLCacheName::cleanFullName(owner_name); // removes ' Resident' +	if( clean_owner_name == self_name )  	{  		throttle_name = taskid.getString();  	} @@ -5772,7 +5773,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data)  		S32 count = 0;  		LLSD args;  		args["OBJECTNAME"] = object_name; -		args["NAME"] = LLCacheName::cleanFullName(owner_name); +		args["NAME"] = clean_owner_name;  		S32 known_questions = 0;  		bool has_not_only_debit = questions ^ SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_DEBIT].permbit;  		// check the received permission flags against each permission diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 5c99e693d2..6ccf38cd27 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -291,6 +291,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)          LL_INFOS("AppInit", "Capabilities") << "Requesting seed from " << url                                               << " region name " << regionp->getName() +                                            << " region id " << regionp->getRegionID()                                              << " handle " << regionp->getHandle()                                              << " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL;  		LL_DEBUGS("AppInit", "Capabilities") << "Capabilities requested: " << capabilityNames << LL_ENDL; @@ -406,7 +407,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)          LLSD capabilityNames = LLSD::emptyArray();          buildCapabilityNames(capabilityNames); -        LL_INFOS("AppInit", "Capabilities") << "Requesting second Seed from " << url << LL_ENDL; +        LL_INFOS("AppInit", "Capabilities") << "Requesting second Seed from " << url << " for region " << regionp->getRegionID() << LL_ENDL;          regionp = NULL;          result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames); @@ -2222,7 +2223,7 @@ void LLViewerRegion::requestSimulatorFeatures()              LLCoros::instance().launch("LLViewerRegionImpl::requestSimulatorFeatureCoro",                                         boost::bind(&LLViewerRegionImpl::requestSimulatorFeatureCoro, mImpl, url, getHandle())); -        LL_INFOS("AppInit", "SimulatorFeatures") << "Launching " << coroname << " requesting simulator features from " << url << LL_ENDL; +        LL_INFOS("AppInit", "SimulatorFeatures") << "Launching " << coroname << " requesting simulator features from " << url << " for region " << getRegionID() << LL_ENDL;      }      else      { @@ -3029,7 +3030,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	if (getCapability("Seed") == url)      {	  		setCapabilityDebug("Seed", url); -		LL_WARNS("CrossingCaps") <<  "Received duplicate seed capability, posting to seed " << +		LL_WARNS("CrossingCaps") <<  "Received duplicate seed capability for " << getRegionID() << ", posting to seed " <<  				url	<< LL_ENDL;  		//Instead of just returning we build up a second set of seed caps and compare them  @@ -3050,7 +3051,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)          LLCoros::instance().launch("LLViewerRegionImpl::requestBaseCapabilitiesCoro",          boost::bind(&LLViewerRegionImpl::requestBaseCapabilitiesCoro, mImpl, getHandle())); -    LL_INFOS("AppInit", "Capabilities") << "Launching " << coroname << " requesting seed capabilities from " << url << LL_ENDL; +    LL_INFOS("AppInit", "Capabilities") << "Launching " << coroname << " requesting seed capabilities from " << url << " for region " << getRegionID() << LL_ENDL;  }  S32 LLViewerRegion::getNumSeedCapRetries() diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index f7ded00318..7533c0c789 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -60,6 +60,7 @@  #include "llviewernetwork.h"  #include "llmeshrepository.h" //for LLMeshRepository::sBytesReceived  #include "llsdserialize.h" +#include "llsdutil.h"  #include "llcorehttputil.h"  #include "llvoicevivox.h" @@ -425,7 +426,7 @@ void update_statistics()   * If you move stats around here, make the corresponding changes in   * those locations, too.   */ -void send_stats() +void send_viewer_stats(bool include_preferences)  {  	// IW 9/23/02 I elected not to move this into LLViewerStats  	// because it depends on too many viewer.cpp globals. @@ -513,6 +514,8 @@ void send_stats()  	system["gpu_version"] = gGLManager.mDriverVersionVendorString;  	system["opengl_version"] = gGLManager.mGLVersionString; +	gGLManager.asLLSD(system["gl"]); +  	S32 shader_level = 0;  	if (LLPipeline::sRenderDeferred)  	{ @@ -617,10 +620,25 @@ void send_stats()  	body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");  	body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames"); -	 + +	// Preferences +	if (include_preferences) +	{ +		bool diffs_only = true; // only log preferences that differ from default +		body["preferences"]["settings"] = gSavedSettings.asLLSD(diffs_only); +		body["preferences"]["settings_per_account"] = gSavedPerAccountSettings.asLLSD(diffs_only); +	} +  	body["MinimalSkin"] = false; +  	LL_INFOS("LogViewerStatsPacket") << "Sending viewer statistics: " << body << LL_ENDL; +	if (debugLoggingEnabled("LogViewerStatsPacket")) +	{ +		std::string filename("viewer_stats_packet.xml"); +		llofstream of(filename.c_str()); +		LLSDSerialize::toPrettyXML(body,of); +	}  	// The session ID token must never appear in logs  	body["session_id"] = gAgentSessionID; diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index d8d92d61d3..04870e0c26 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -294,7 +294,7 @@ static const F32 SEND_STATS_PERIOD = 300.0f;  // The following are from (older?) statistics code found in appviewer.  void update_statistics(); -void send_stats(); +void send_viewer_stats(bool include_preferences);  extern LLFrameTimer gTextureTimer;  extern U32Bytes	gTotalTextureData; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index bd83a61e5b..20a22ba45e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1544,6 +1544,26 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)  		return FALSE;  	} +    if (mGLTexturep->getHasExplicitFormat()) +    { +        LLGLenum format = mGLTexturep->getPrimaryFormat(); +        S8 components = mRawImage->getComponents(); +        if ((format == GL_RGBA && components < 4) +            || (format == GL_RGB && components < 3)) +        { +            LL_WARNS() << "Can't create a texture " << mID << ": invalid image format " << std::hex << format << " vs components " << (U32)components << LL_ENDL; +            // Was expecting specific format but raw texture has insufficient components for +            // such format, using such texture will result in crash or will display wrongly +            // if we change format. Texture might be corrupted server side, so just set as +            // missing and clear cashed texture (do not cause reload loop, will retry&recover +            // during new session) +            setIsMissingAsset(); +            destroyRawImage(); +            LLAppViewer::getTextureCache()->removeFromCache(mID); +            return FALSE; +        } +    } +  	res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel);  	notifyAboutCreatingTexture(); diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp index 2d7a0f920f..232b7c384d 100644 --- a/indra/newview/llviewerwearable.cpp +++ b/indra/newview/llviewerwearable.cpp @@ -178,7 +178,7 @@ BOOL LLViewerWearable::isOldVersion() const  	S32 te_count = 0;  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			te_count++;  			if( !is_in_map(mTEMap, te ) ) @@ -230,7 +230,7 @@ BOOL LLViewerWearable::isDirty() const  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator current_iter = mTEMap.find(te);  			if(current_iter != mTEMap.end()) @@ -276,7 +276,7 @@ void LLViewerWearable::setTexturesToDefaults()  {  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			LLUUID id = getDefaultTextureImageID((ETextureIndex) te);  			LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id ); @@ -300,7 +300,7 @@ void LLViewerWearable::setTexturesToDefaults()  // virtual  LLUUID LLViewerWearable::getDefaultTextureImageID(ETextureIndex index) const  { -	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearance::getDictionary()->getTexture(index);  	const std::string &default_image_name = texture_dict ? texture_dict->mDefaultImageName : "";  	if (default_image_name == "")  	{ @@ -331,7 +331,7 @@ void LLViewerWearable::writeToAvatar(LLAvatarAppearance *avatarp)  	// Pull texture entries  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator iter = mTEMap.find(te);  			LLUUID image_id; @@ -424,7 +424,7 @@ void LLViewerWearable::copyDataFrom(const LLViewerWearable* src)  	// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed)  	for (S32 te = 0; te < TEX_NUM_INDICES; te++)  	{ -		if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) +		if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex) te) == mType)  		{  			te_map_t::const_iterator iter = src->mTEMap.find(te);  			LLUUID image_id; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index e901245f92..e282905a1c 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -137,7 +137,7 @@ private:  }; -static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024; // max snapshot image size 6144 * 6144 +static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 7680; // max snapshot image size 7680 * 7680 UHDTV2  class LLViewerWindow : public LLWindowCallbacks  { diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 0aee4a3398..b205823820 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -573,7 +573,6 @@ private:  //-----------------------------------------------------------------------------  // Static Data  //----------------------------------------------------------------------------- -LLAvatarAppearanceDictionary *LLVOAvatar::sAvatarDictionary = NULL;  S32 LLVOAvatar::sFreezeCounter = 0;  U32 LLVOAvatar::sMaxNonImpostors = 12; // overridden based on graphics setting  F32 LLVOAvatar::sRenderDistance = 256.f; @@ -1025,15 +1024,15 @@ void LLVOAvatar::dumpBakedStatus()  		{  			LL_CONT << " Unbaked ("; -			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -				 iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +			for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator iter = LLAvatarAppearance::getDictionary()->getBakedTextures().begin(); +				 iter != LLAvatarAppearance::getDictionary()->getBakedTextures().end();  				 ++iter)  			{  				const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = iter->second;  				const ETextureIndex index = baked_dict->mTextureIndex;  				if (!inst->isTextureDefined(index))  				{ -					LL_CONT << " " << (LLAvatarAppearanceDictionary::getInstance()->getTexture(index) ? LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mName : ""); +					LL_CONT << " " << (LLAvatarAppearance::getDictionary()->getTexture(index) ? LLAvatarAppearance::getDictionary()->getTexture(index)->mName : "");  				}  			}  			LL_CONT << " ) " << inst->getUnbakedPixelAreaRank(); @@ -1119,6 +1118,7 @@ void LLVOAvatar::initClass()      LLJoint::setDebugJointNames(gSavedSettings.getString("DebugAvatarJoints"));  	LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged); +  } @@ -5188,7 +5188,7 @@ void LLVOAvatar::collectLocalTextureUUIDs(std::set<LLUUID>& ids) const  {  	for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)  	{ -		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index); +		LLWearableType::EType wearable_type = LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex)texture_index);  		U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);  		LLViewerFetchedTexture *imagep = NULL; @@ -5197,7 +5197,7 @@ void LLVOAvatar::collectLocalTextureUUIDs(std::set<LLUUID>& ids) const  			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE);  			if (imagep)  			{ -				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index); +				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearance::getDictionary()->getTexture((ETextureIndex)texture_index);  				if (texture_dict && texture_dict->mIsLocalTexture)  				{  					ids.insert(imagep->getID()); @@ -5331,7 +5331,7 @@ void LLVOAvatar::updateTextures()  	mHasGrey = FALSE; // debug  	for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)  	{ -		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index); +		LLWearableType::EType wearable_type = LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex)texture_index);  		U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);  		const LLTextureEntry *te = getTE(texture_index); @@ -5354,7 +5354,7 @@ void LLVOAvatar::updateTextures()  			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE);  			if (imagep)  			{ -				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index); +				const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearance::getDictionary()->getTexture((ETextureIndex)texture_index);  				const EBakedTextureIndex baked_index = texture_dict ? texture_dict->mBakedTextureIndex : EBakedTextureIndex::BAKED_NUM_INDICES;  				if (texture_dict && texture_dict->mIsLocalTexture)  				{ @@ -5529,7 +5529,7 @@ const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid)  		return url;  	} -	const LLAvatarAppearanceDictionary::TextureEntry* texture_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)te); +	const LLAvatarAppearanceDictionary::TextureEntry* texture_entry = LLAvatarAppearance::getDictionary()->getTexture((ETextureIndex)te);  	if (texture_entry != NULL)  	{  		url = appearance_service_url + "texture/" + getID().asString() + "/" + texture_entry->mDefaultImageName + "/" + uuid.asString(); @@ -7564,8 +7564,8 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const  			break; // Do nothing  	} -	for (LLAvatarAppearanceDictionary::Textures::const_iterator tex_iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 tex_iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator tex_iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +		 tex_iter != LLAvatarAppearance::getDictionary()->getTextures().end();  		 ++tex_iter)  	{  		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = tex_iter->second; @@ -7578,7 +7578,7 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const  			if (texture_dict->mIsUsedByBakedTexture)  			{  				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; -				return isTextureDefined(LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); +				return isTextureDefined(LLAvatarAppearance::getDictionary()->getBakedTexture(baked_index)->mTextureIndex);  			}  			return FALSE;  		} @@ -8324,8 +8324,8 @@ void LLVOAvatar::updateMeshTextures()  	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = -			 LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +			 LLAvatarAppearance::getDictionary()->getBakedTextures().begin(); +		 baked_iter != LLAvatarAppearance::getDictionary()->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first; @@ -8503,7 +8503,7 @@ void LLVOAvatar::releaseComponentTextures()  	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  	{ -		const LLAvatarAppearanceDictionary::BakedEntry * bakedDicEntry = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +		const LLAvatarAppearanceDictionary::BakedEntry * bakedDicEntry = LLAvatarAppearance::getDictionary()->getBakedTexture((EBakedTextureIndex)baked_index);  		// skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID  		if (!isTextureDefined(bakedDicEntry->mTextureIndex)  			&& ( (baked_index != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) )) @@ -8522,8 +8522,8 @@ void LLVOAvatar::releaseComponentTextures()  void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const  {	  	LL_DEBUGS("Avatar") << avString() << (isSelf() ? "Self: " : "Other: ") << context << LL_ENDL; -	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +		 iter != LLAvatarAppearance::getDictionary()->getTextures().end();  		 ++iter)  	{  		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; @@ -9272,8 +9272,8 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture  					 self->mBakedTextureDatas[BAKED_HEAD].mTexLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);  					 maskData->mLastDiscardLevel = discard_level; */  			BOOL found_texture_id = false; -			for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -				 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +			for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +				 iter != LLAvatarAppearance::getDictionary()->getTextures().end();  				 ++iter)  			{ @@ -9404,7 +9404,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  			}  			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = -				LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +				LLAvatarAppearance::getDictionary()->getBakedTexture((EBakedTextureIndex)i);  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter) @@ -9539,7 +9539,7 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  				for (U8 te = 0; te < TEX_NUM_INDICES; te++)  				{ -					if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) +					if (LLAvatarAppearance::getDictionary()->getTEWearableType((ETextureIndex)te) == type)  					{  						// MULTIPLE_WEARABLES: extend to multiple wearables?  						LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); @@ -10450,7 +10450,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  		for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  		{  		    const LLAvatarAppearanceDictionary::BakedEntry *baked_dict -				= LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +				= LLAvatarAppearance::getDictionary()->getBakedTexture((EBakedTextureIndex)baked_index);  			ETextureIndex tex_index = baked_dict->mTextureIndex;  			if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))  			{ @@ -10515,8 +10515,8 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  			}  			// print any avatar textures we didn't already know about -		    for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -			 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +		    for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +			 iter != LLAvatarAppearance::getDictionary()->getTextures().end();  				 ++iter)  			{  			    const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; @@ -10631,7 +10631,7 @@ BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index)  {  	return (index < 0 || index >= TEX_NUM_INDICES)  		? false -		: LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsLocalTexture; +		: LLAvatarAppearance::getDictionary()->getTexture(index)->mIsLocalTexture;  }  // static @@ -10639,15 +10639,15 @@ BOOL LLVOAvatar::isIndexBakedTexture(ETextureIndex index)  {  	return (index < 0 || index >= TEX_NUM_INDICES)  		? false -		: LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsBakedTexture; +		: LLAvatarAppearance::getDictionary()->getTexture(index)->mIsBakedTexture;  }  const std::string LLVOAvatar::getBakedStatusForPrintout() const  {  	std::string line; -	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearance::getDictionary()->getTextures().begin(); +		 iter != LLAvatarAppearance::getDictionary()->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index cfb007cbc9..79f31ba5b5 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -677,9 +677,6 @@ public:  public:  	static BOOL 	isIndexLocalTexture(LLAvatarAppearanceDefines::ETextureIndex i);  	static BOOL 	isIndexBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i); -private: -	static const LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary *getDictionary() { return sAvatarDictionary; } -	static LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* sAvatarDictionary;  	//--------------------------------------------------------------------  	// Messaging diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index aea12380e8..66233a860e 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -465,6 +465,8 @@ BOOL LLVOAvatarSelf::buildMenus()  		if (gDetachBodyPartPieMenus[i])  		{  			gDetachPieMenu->appendContextSubMenu( gDetachBodyPartPieMenus[i] ); +			gDetachAttSelfMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]); +			gDetachAvatarMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]);  		}  		else  		{ @@ -493,12 +495,14 @@ BOOL LLVOAvatarSelf::buildMenus()  					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  					gDetachPieMenu->addChild(item); -						 +					gDetachAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params)); +					gDetachAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));  					break;  				}  			}  		}  	} +	  	// add screen attachments  	for (attachment_map_t::iterator iter = mAttachmentPoints.begin();  @@ -532,6 +536,8 @@ BOOL LLVOAvatarSelf::buildMenus()  			item_params.on_enable.parameter = iter->first;  			item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  			gDetachScreenPieMenu->addChild(item); +			gDetachHUDAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params)); +			gDetachHUDAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));  		}  	} @@ -1079,8 +1085,8 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)  //-----------------------------------------------------------------------------  void LLVOAvatarSelf::wearableUpdated(LLWearableType::EType type)  { -	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; @@ -1277,7 +1283,7 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id)  U32 LLVOAvatarSelf::getNumWearables(LLAvatarAppearanceDefines::ETextureIndex i) const  { -	LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i); +	LLWearableType::EType type = sAvatarDictionary->getTEWearableType(i);  	return gAgentWearables.getWearableCount(type);  } @@ -1388,8 +1394,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* laye  {  	/* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)  	   return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ -	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first; @@ -1402,7 +1408,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* laye  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ @@ -1432,13 +1438,13 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset  	{  		if (layerset == mBakedTextureDatas[i].mTexLayerSet)  		{ -			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = sAvatarDictionary->getBakedTexture((EBakedTextureIndex)i);  			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  				 local_tex_iter != baked_dict->mLocalTextures.end();  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ @@ -1465,13 +1471,13 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = sAvatarDictionary->getBakedTexture((EBakedTextureIndex)i);  		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  			 local_tex_iter != baked_dict->mLocalTextures.end();  			 ++local_tex_iter)  		{  			const ETextureIndex tex_index = *local_tex_iter; -			const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +			const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  			const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  			for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  			{ @@ -1493,7 +1499,7 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex t  	BOOL isDefined = TRUE;  	if (isIndexLocalTexture(type))  	{ -		const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(type); +		const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(type);  		const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  		if (index >= wearable_count)  		{ @@ -1710,7 +1716,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  			LL_ERRS() << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << LL_ENDL;  			return;  		} -		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(type); +		LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(type);  		if (!gAgentWearables.getViewerWearable(wearable_type,index))  		{  			// no wearable is loaded, cannot set the texture. @@ -1787,8 +1793,8 @@ void LLVOAvatarSelf::dumpLocalTextures() const  	/* ETextureIndex baked_equiv[] = {  	   TEX_UPPER_BAKED,  	   if (isTextureDefined(baked_equiv[i])) */ -	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = sAvatarDictionary->getTextures().begin(); +		 iter != sAvatarDictionary->getTextures().end();  		 ++iter)  	{  		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; @@ -1796,7 +1802,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const  			continue;  		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; -		const ETextureIndex baked_equiv = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex; +		const ETextureIndex baked_equiv = sAvatarDictionary->getBakedTexture(baked_index)->mTextureIndex;  		const std::string &name = texture_dict->mName;  		const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(iter->first, 0); @@ -2031,8 +2037,8 @@ const std::string LLVOAvatarSelf::verboseDebugDumpLocalTextureDataInfo(const LLV  {  	std::ostringstream outbuf;  	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = -			 LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +			 sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first; @@ -2045,9 +2051,9 @@ const std::string LLVOAvatarSelf::verboseDebugDumpLocalTextureDataInfo(const LLV  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(tex_index)->mName; +				const std::string tex_name = sAvatarDictionary->getTexture(tex_index)->mName;  				outbuf << "  tex_index " << (S32) tex_index << " name " << tex_name << "\n"; -				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				if (wearable_count > 0)  				{ @@ -2091,8 +2097,8 @@ const std::string LLVOAvatarSelf::verboseDebugDumpLocalTextureDataInfo(const LLV  void LLVOAvatarSelf::dumpAllTextures() const  {  	std::string vd_text = "Local textures per baked index and wearable:\n"; -	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; @@ -2113,8 +2119,8 @@ const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTe  	/* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)  	   return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ -	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const EBakedTextureIndex baked_index = baked_iter->first; @@ -2127,7 +2133,7 @@ const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTe  				 ++local_tex_iter)  			{  				const ETextureIndex tex_index = *local_tex_iter; -				const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +				const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				if (wearable_count > 0)  				{ @@ -2154,14 +2160,14 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ -		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +		const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = sAvatarDictionary->getBakedTexture((EBakedTextureIndex)i);  		BOOL is_texture_final = TRUE;  		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();  			 local_tex_iter != baked_dict->mLocalTextures.end();  			 ++local_tex_iter)  		{  			const ETextureIndex tex_index = *local_tex_iter; -			const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); +			const LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(tex_index);  			const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  			for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  			{ @@ -2341,7 +2347,7 @@ const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) c  {  	if (canGrabBakedTexture(baked_index))  	{ -		ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index); +		ETextureIndex tex_index = sAvatarDictionary->bakedToLocalTextureIndex(baked_index);  		if (tex_index == TEX_NUM_INDICES)  		{  			return LLUUID::null; @@ -2353,7 +2359,7 @@ const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) c  BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  { -	ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index); +	ETextureIndex tex_index = sAvatarDictionary->bakedToLocalTextureIndex(baked_index);  	if (tex_index == TEX_NUM_INDICES)  	{  		return FALSE; @@ -2372,13 +2378,13 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  	// baked texture.  We don't want people copying people's  	// work via baked textures. -	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index); +	const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = sAvatarDictionary->getBakedTexture(baked_index);  	for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin();  		 iter != baked_dict->mLocalTextures.end();  		 ++iter)  	{  		const ETextureIndex t_index = (*iter); -		LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(t_index); +		LLWearableType::EType wearable_type = sAvatarDictionary->getTEWearableType(t_index);  		U32 count = gAgentWearables.getWearableCount(wearable_type);  		LL_DEBUGS() << "Checking index " << (U32) t_index << " count: " << count << LL_ENDL; @@ -2466,7 +2472,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 wearable_index) const  { -	LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i); +	LLWearableType::EType type = sAvatarDictionary->getTEWearableType(i);  	LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, wearable_index);  	if (wearable)  	{ @@ -2540,8 +2546,8 @@ void LLVOAvatarSelf::outputRezDiagnostics() const  		LL_DEBUGS("Avatar") << "\t\t (" << i << ") \t" << (S32)mDebugBakedTextureTimes[i][0] << " / " << (S32)mDebugBakedTextureTimes[i][1] << LL_ENDL;  	} -	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); -		 baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); +	for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = sAvatarDictionary->getBakedTextures().begin(); +		 baked_iter != sAvatarDictionary->getBakedTextures().end();  		 ++baked_iter)  	{  		const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; @@ -2607,7 +2613,7 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )  		case LOCTEX_UPPER_SHIRT:  			if( mUpperBodyLayerSet )  				mUpperBodyLayerSet->requestUpdate(); */ -	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); +	const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = sAvatarDictionary->getTexture(index);  	if (!texture_dict)  		return;  	if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture) @@ -2625,7 +2631,7 @@ LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const                 case TEX_HEAD_BAKED:                 case TEX_HEAD_BODYPAINT:                         return mHeadLayerSet; */ -       const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); +       const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = sAvatarDictionary->getTexture(index);         if (texture_dict && texture_dict->mIsUsedByBakedTexture)         {                 const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; @@ -2711,8 +2717,8 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  {  	LLUUID texture_id[TEX_NUM_INDICES];  	// pack away current TEs to make sure we don't send them out -	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = sAvatarDictionary->getTextures().begin(); +		 iter != sAvatarDictionary->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; @@ -2728,8 +2734,8 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  	bool success = packTEMessage(mesgsys);  	// unpack TEs to make sure we don't re-trigger a bake -	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); -		 iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); +	for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = sAvatarDictionary->getTextures().begin(); +		 iter != sAvatarDictionary->getTextures().end();  		 ++iter)  	{  		const ETextureIndex index = iter->first; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 492d37edba..9d54b67ec9 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -695,6 +695,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)  	LL_RECORD_BLOCK_TIME(FTM_VOLUME_TEXTURES);  	// Update the pixel area of all faces +    if (mDrawable.isNull()) +    { +        return; +    } +  	if(!forced)  	{  		if(!isVisible()) @@ -2296,50 +2301,34 @@ bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture)  	std::pair<mmap_UUID_MAP_t::iterator, mmap_UUID_MAP_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID()); -	typedef std::map<U8, LLMaterialPtr> map_te_material; -	map_te_material new_material; - -	for(mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it) -	{ -		LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); +    bool refresh_materials = false; -		//here we just interesting in DIFFUSE_MAP only! -		if(NULL != cur_material.get() && LLRender::DIFFUSE_MAP == range_it->second.map && GL_RGBA != texture->getPrimaryFormat()) -		{ //ok let's check the diffuse mode -			switch(cur_material->getDiffuseAlphaMode()) -			{ -			case LLMaterial::DIFFUSE_ALPHA_MODE_BLEND: -			case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE: -			case LLMaterial::DIFFUSE_ALPHA_MODE_MASK: -				{ //uups... we have non 32 bit texture with LLMaterial::DIFFUSE_ALPHA_MODE_* => LLMaterial::DIFFUSE_ALPHA_MODE_NONE - -					LLMaterialPtr mat = NULL; -					map_te_material::iterator it = new_material.find(range_it->second.te); -					if(new_material.end() == it) { -						mat = new LLMaterial(cur_material->asLLSD()); -						new_material.insert(map_te_material::value_type(range_it->second.te, mat)); -					} else { -						mat = it->second; -					} - -					mat->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); - -				} break; -			} //switch -		} //if -	} //for +    // RGB textures without alpha channels won't work right with alpha, +    // we provide format to material for material to decide when to drop alpha +    for (mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it) +    { +        LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); +        if (cur_material.notNull() +            && LLRender::DIFFUSE_MAP == range_it->second.map) +        { +            U32 format = texture->getPrimaryFormat(); +            if (format != cur_material->getDiffuseFormatPrimary()) +            { +                cur_material->setDiffuseFormatPrimary(format); +                refresh_materials = true; +            } +        } +    } //for -	//setup new materials -	for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) -	{ -		LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); -		LLViewerObject::setTEMaterialParams(it->first, it->second); -	} +    if (refresh_materials) +    { +        LLViewerObject::refreshMaterials(); +    }  	//clear wait-list -	mWaitingTextureInfo.erase(range.first, range.second); +    mWaitingTextureInfo.erase(range.first, range.second); -	return 0 != new_material.size(); +	return refresh_materials;  }  bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture) @@ -2349,184 +2338,84 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture)  	std::pair<mmap_UUID_MAP_t::iterator, mmap_UUID_MAP_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID());  	if(range.first == range.second) return false; -	typedef std::map<U8, LLMaterialPtr> map_te_material; -	map_te_material new_material; -	 +    bool refresh_materials = false; +  	for(mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it)  	{  		LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te);  		if (cur_material.isNull())  			continue; -		switch(range_it->second.map) -		{ -		case LLRender::DIFFUSE_MAP: -			{ -				if(LLMaterial::DIFFUSE_ALPHA_MODE_NONE != cur_material->getDiffuseAlphaMode()) -				{ //missing texture + !LLMaterial::DIFFUSE_ALPHA_MODE_NONE => LLMaterial::DIFFUSE_ALPHA_MODE_NONE -					LLMaterialPtr mat = NULL; -					map_te_material::iterator it = new_material.find(range_it->second.te); -					if(new_material.end() == it) { -						mat = new LLMaterial(cur_material->asLLSD()); -						new_material.insert(map_te_material::value_type(range_it->second.te, mat)); -					} else { -						mat = it->second; -					} - -					mat->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); -				} -			} break; -		case LLRender::NORMAL_MAP: -			{ //missing texture => reset material texture id -				LLMaterialPtr mat = NULL; -				map_te_material::iterator it = new_material.find(range_it->second.te); -				if(new_material.end() == it) { -					mat = new LLMaterial(cur_material->asLLSD()); -					new_material.insert(map_te_material::value_type(range_it->second.te, mat)); -				} else { -					mat = it->second; -				} - -				mat->setNormalID(LLUUID::null); -			} break; -		case LLRender::SPECULAR_MAP: -			{ //missing texture => reset material texture id -				LLMaterialPtr mat = NULL; -				map_te_material::iterator it = new_material.find(range_it->second.te); -				if(new_material.end() == it) { -					mat = new LLMaterial(cur_material->asLLSD()); -					new_material.insert(map_te_material::value_type(range_it->second.te, mat)); -				} else { -					mat = it->second; -				} - -				mat->setSpecularID(LLUUID::null); -			} break; -		case LLRender::NUM_TEXTURE_CHANNELS: -				//nothing to do, make compiler happy -			break; -		} //switch -	} //for +        if (range_it->second.map == LLRender::DIFFUSE_MAP) +        { +            LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); +            if (cur_material.notNull() +                && LLRender::DIFFUSE_MAP == range_it->second.map) +            { +                if (0 != cur_material->getDiffuseFormatPrimary()) +                { +                    cur_material->setDiffuseFormatPrimary(0); +                    refresh_materials = true; +                } +            } +        } +    } //for -	//setup new materials -	for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) -	{ -		LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), it->second); -		LLViewerObject::setTEMaterialParams(it->first, it->second); -	} +    if (refresh_materials) +    { +        LLViewerObject::refreshMaterials(); +    }  	//clear wait-list  	mWaitingTextureInfo.erase(range.first, range.second); -	return 0 != new_material.size(); +    return refresh_materials;  }  S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)  { -	LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams); - -	if(pMaterialParams) -	{ //check all of them according to material settings - -		LLViewerTexture *img_diffuse = getTEImage(te); -		LLViewerTexture *img_normal = getTENormalMap(te); -		LLViewerTexture *img_specular = getTESpecularMap(te); - -		llassert(NULL != img_diffuse); - -		LLMaterialPtr new_material = NULL; - -		//diffuse -		if(NULL != img_diffuse) -		{ //guard -			if(0 == img_diffuse->getPrimaryFormat() && !img_diffuse->isMissingAsset()) -			{ //ok here we don't have information about texture, let's belief and leave material settings -			  //but we remember this case -				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(img_diffuse->getID(), material_info(LLRender::DIFFUSE_MAP, te))); -			} -			else -			{ -				bool bSetDiffuseNone = false; -				if(img_diffuse->isMissingAsset()) -				{ -					bSetDiffuseNone = true; -				} -				else -				{ -					switch(pMaterialParams->getDiffuseAlphaMode()) -					{ -					case LLMaterial::DIFFUSE_ALPHA_MODE_BLEND: -					case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE: -					case LLMaterial::DIFFUSE_ALPHA_MODE_MASK: -						{ //all of them modes available only for 32 bit textures -							LLTextureEntry* tex_entry = getTE(te); -							bool bIsBakedImageId = false; -							if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID())) -							{ -								bIsBakedImageId = true; -							} -							if (GL_RGBA != img_diffuse->getPrimaryFormat() && !bIsBakedImageId) -							{ -								bSetDiffuseNone = true; -							} -						} break; -					} -				} //else - - -				if(bSetDiffuseNone) -				{ //upps... we should substitute this material with LLMaterial::DIFFUSE_ALPHA_MODE_NONE -					new_material = new LLMaterial(pMaterialParams->asLLSD()); -					new_material->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); -				} -			} -		} - -		//normal -		if(LLUUID::null != pMaterialParams->getNormalID()) -		{ -			if(img_normal && img_normal->isMissingAsset() && img_normal->getID() == pMaterialParams->getNormalID()) -			{ -				if(!new_material) { -					new_material = new LLMaterial(pMaterialParams->asLLSD()); -				} -				new_material->setNormalID(LLUUID::null); -			} -			else if(NULL == img_normal || 0 == img_normal->getPrimaryFormat()) -			{ //ok here we don't have information about texture, let's belief and leave material settings -				//but we remember this case -				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(pMaterialParams->getNormalID(), material_info(LLRender::NORMAL_MAP,te))); -			} - -		} +    LLMaterialPtr material = pMaterialParams; +    if (material.notNull()) +    { +        LLTextureEntry* tex_entry = getTE(te); +        bool is_baked = tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID()); +        material->setDiffuseBaked(is_baked); -		//specular -		if(LLUUID::null != pMaterialParams->getSpecularID()) -		{ -			if(img_specular && img_specular->isMissingAsset() && img_specular->getID() == pMaterialParams->getSpecularID()) -			{ -				if(!new_material) { -					new_material = new LLMaterial(pMaterialParams->asLLSD()); -				} -				new_material->setSpecularID(LLUUID::null); -			} -			else if(NULL == img_specular || 0 == img_specular->getPrimaryFormat()) -			{ //ok here we don't have information about texture, let's belief and leave material settings -				//but we remember this case -				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(pMaterialParams->getSpecularID(), material_info(LLRender::SPECULAR_MAP, te))); -			} -		} +        LLViewerTexture *img_diffuse = getTEImage(te); +        llassert(NULL != img_diffuse); -		if(new_material) { -			pMaterial = new_material; -			LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), pMaterial); -		} +        //diffuse +        if (!is_baked && NULL != img_diffuse) +        { +            if (0 == img_diffuse->getPrimaryFormat() && !img_diffuse->isMissingAsset()) +            { +                // we don't have information about this texture, wait for it +                mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(img_diffuse->getID(), material_info(LLRender::DIFFUSE_MAP, te))); +                // Temporary assume RGBA image +                material->setDiffuseFormatPrimary(GL_RGBA); +            } +            else +            { +                if (img_diffuse->isMissingAsset()) +                { +                    material->setDiffuseFormatPrimary(0); +                } +                else +                { +                    material->setDiffuseFormatPrimary(img_diffuse->getPrimaryFormat()); +                } +            } +        } +        else +        { +            material->setDiffuseFormatPrimary(0); +        }  	} -	S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial); +    S32 res = LLViewerObject::setTEMaterialParams(te, material); -	LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterial) ? pMaterial->asLLSD() : LLSD("null")) << " res " << res +    LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((material) ? material->asLLSD() : LLSD("null")) << " res " << res  							 << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )  							 << LL_ENDL;  	setChanged(ALL_CHANGED); @@ -4593,7 +4482,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&  					LLMaterial* mat = te->getMaterialParams();  					if (mat)  					{ -						U8 mode = mat->getDiffuseAlphaMode(); +						U8 mode = mat->getDiffuseAlphaModeRender();  						if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE  							|| mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE @@ -5239,7 +5128,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  			}  			draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f); -			draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode(); +			draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaModeRender();  			draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset());  		}  		else  @@ -5601,7 +5490,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						if (mat && LLPipeline::sRenderDeferred)  						{ -							U8 alpha_mode = mat->getDiffuseAlphaMode(); +							U8 alpha_mode = mat->getDiffuseAlphaModeRender();  							bool is_alpha = type == LLDrawPool::POOL_ALPHA &&  								(alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND || @@ -5630,7 +5519,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						else if (mat)  						{							  							bool is_alpha = type == LLDrawPool::POOL_ALPHA; -							U8 mode = mat->getDiffuseAlphaMode(); +							U8 mode = mat->getDiffuseAlphaModeRender();  							bool can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||  												mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE; @@ -6528,7 +6417,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  			bool can_be_shiny = true;  			if (mat)  			{ -				U8 mode = mat->getDiffuseAlphaMode(); +				U8 mode = mat->getDiffuseAlphaModeRender();  				can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||  								mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE;  			} @@ -6550,7 +6439,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  				//  				if (te->getFullbright())  				{ -					if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +					if (mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  					{  						if (opaque)  						{ @@ -6635,7 +6524,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  			}  			else if (mat)  			{ -				U8 mode = mat->getDiffuseAlphaMode(); +				U8 mode = mat->getDiffuseAlphaModeRender();                  is_alpha = (is_alpha || (mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)); @@ -6734,7 +6623,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  				}  				else if (fullbright || bake_sunlight)  				{ //fullbright -					if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +					if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  					{  						registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);  					} @@ -6756,7 +6645,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  					else  					{ //all around simple  						llassert(mask & LLVertexBuffer::MAP_NORMAL); -						if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +						if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  						{ //material alpha mask can be respected in non-deferred  							registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK);  						} diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index e7f62e77b4..9acc0f8d2f 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -640,6 +640,7 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)  :	LLInventoryItemsList(p)  {  	setSortOrder(E_SORT_BY_TYPE_LAYER, false); +	mMenuWearableType = LLWearableType::WT_NONE;  	mIsStandalone = p.standalone;  	if (mIsStandalone)  	{ @@ -731,10 +732,15 @@ void LLWearableItemsList::onRightClick(S32 x, S32 y)  	getSelectedUUIDs(selected_uuids);  	if (selected_uuids.empty())  	{ -		return; +		if ((mMenuWearableType != LLWearableType::WT_NONE) && (size() == 0)) +		{ +			ContextMenu::instance().show(this, mMenuWearableType, x, y); +		} +	} +	else +	{ +		ContextMenu::instance().show(this, selected_uuids, x, y);  	} - -	ContextMenu::instance().show(this, selected_uuids, x, y);  }  void LLWearableItemsList::setSortOrder(ESortOrder sort_order, bool sort_now) @@ -785,6 +791,46 @@ void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_ve  	mParent = NULL; // to avoid dereferencing an invalid pointer  } +void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y) +{ +	mParent = dynamic_cast<LLWearableItemsList*>(spawning_view); +	LLContextMenu* menup = mMenuHandle.get(); +	if (menup) +	{ +		//preventing parent (menu holder) from deleting already "dead" context menus on exit +		LLView* parent = menup->getParent(); +		if (parent) +		{ +			parent->removeChild(menup); +		} +		delete menup; +		mUUIDs.clear(); +	} + +	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; +    registrar.add("Wearable.CreateNew", boost::bind(createNewWearableByType, w_type)); +	menup = createFromFile("menu_wearable_list_item.xml"); +	if (!menup) +	{ +		LL_WARNS() << "Context menu creation failed" << LL_ENDL; +		return; +	} +	setMenuItemVisible(menup, "create_new", true); +	setMenuItemEnabled(menup, "create_new", true); +	setMenuItemVisible(menup, "wearable_attach_to", false); +	setMenuItemVisible(menup, "wearable_attach_to_hud", false); + +	std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getTypeName(w_type)); +	LLMenuItemGL* menu_item = menup->getChild<LLMenuItemGL>("create_new"); +	menu_item->setLabel(new_label); + +	mMenuHandle = menup->getHandle(); +	menup->show(x, y); +	LLMenuGL::showPopup(spawning_view, menup, x, y); + +	mParent = NULL; // to avoid dereferencing an invalid pointer +} +  // virtual  LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  { @@ -1014,4 +1060,10 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)  	LLAgentWearables::createWearable(item->getWearableType(), true);  } +// static +void LLWearableItemsList::ContextMenu::createNewWearableByType(LLWearableType::EType type) +{ +	LLAgentWearables::createWearable(type, true); +} +  // EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index f3182ed163..ba8488b237 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -415,6 +415,8 @@ public:  	public:  		/*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); +		void show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y); +  	protected:  		enum {  			MASK_CLOTHING		= 0x01, @@ -431,6 +433,7 @@ public:  		static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);  		static void updateMask(U32& mask, LLAssetType::EType at);  		static void createNewWearable(const LLUUID& item_id); +		static void createNewWearableByType(LLWearableType::EType type);  		LLWearableItemsList*	mParent;  	}; @@ -469,6 +472,8 @@ public:  	void setSortOrder(ESortOrder sort_order, bool sort_now = true); +	void setMenuWearableType(LLWearableType::EType type) { mMenuWearableType = type; } +  protected:  	friend class LLUICtrlFactory;  	LLWearableItemsList(const LLWearableItemsList::Params& p); @@ -479,6 +484,8 @@ protected:  	bool mWornIndicationEnabled;  	ESortOrder		mSortOrder; + +	LLWearableType::EType mMenuWearableType;  };  #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 644934d1d8..c07a640ddf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1677,7 +1677,7 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima  	if (alpha && mat)  	{ -		switch (mat->getDiffuseAlphaMode()) +		switch (mat->getDiffuseAlphaModeRender())  		{  			case 1:  				alpha = true; // Material's alpha mode is set to blend.  Toss it into the alpha draw pool. @@ -6562,7 +6562,7 @@ void LLPipeline::enableLightsDynamic()  		{  			gPipeline.enableLightsAvatar();  		} -		else if (gAgentAvatarp->mSpecialRenderMode >= 1)  // anim preview +		else if (gAgentAvatarp->mSpecialRenderMode == 2)  // anim preview  		{  			gPipeline.enableLightsAvatarEdit(LLColor4(0.7f, 0.6f, 0.3f, 1.f));  		} diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 92c5d8bcbe..3df2683ca8 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -14,7 +14,7 @@   help_topic="avatar"   save_rect="true"   save_visibility="true" - title="CHOOSE AN AVATAR" + title="COMPLETE AVATARS"   width="700">      <web_browser        top="25" diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml index 3dfdf8e1a5..7d2cea1fe5 100644 --- a/indra/newview/skins/default/xui/en/floater_joystick.xml +++ b/indra/newview/skins/default/xui/en/floater_joystick.xml @@ -8,27 +8,32 @@   title="JOYSTICK CONFIGURATION"   width="569">      <floater.string -     name="NoDevice"> -        no device detected +     name="JoystickDisabled"> +        None      </floater.string> -    <check_box -     bottom="38" -     height="10" -     control_name="JoystickEnabled" -     halign="left" -     label="Enable Joystick:" +    <text +     type="string"       layout="topleft" +     follows="left|top" +     halign="left" +     height="12" +     top="22"       left="14" -     name="enable_joystick" -     width="60" /> -    <text -     bottom="32" +     width="50" +     mouse_opaque="false" +     name="joystick_lbl"> +      Joystick: +    </text> +    <combo_box +     allow_text_entry="false" +     follows="left|top"       layout="topleft" -     left="120" -     name="joystick_type" -     width="380" /> +     name="joystick_combo" +     top="19" +     left_pad="4" +     width="300"/>      <spinner -     bottom="48" +     bottom="56"       height="10"       control_name="JoystickAxis1"       decimal_digits="0" @@ -42,7 +47,7 @@       name="JoystickAxis1"       width="140" />      <spinner -     bottom="48" +     bottom_delta="0"       height="10"            control_name="JoystickAxis2"       decimal_digits="0" @@ -56,7 +61,7 @@       name="JoystickAxis2"       width="140" />      <spinner -     bottom="48" +     bottom_delta="0"       height="10"            control_name="JoystickAxis0"       decimal_digits="0" @@ -70,7 +75,7 @@       name="JoystickAxis0"       width="140" />      <spinner -     bottom="68" +     bottom="76"       height="10"            control_name="JoystickAxis4"       decimal_digits="0" @@ -84,7 +89,7 @@       name="JoystickAxis4"       width="140" />      <spinner -     bottom="68" +     bottom_delta="0"       height="10"            control_name="JoystickAxis5"       decimal_digits="0" @@ -98,7 +103,7 @@       name="JoystickAxis5"       width="140" />      <spinner -     bottom="68" +     bottom_delta="0"       height="10"            control_name="JoystickAxis3"       decimal_digits="0" @@ -112,7 +117,7 @@       name="JoystickAxis3"       width="140" />      <spinner -     bottom="88" +     bottom="96"       height="10"            control_name="JoystickAxis6"       decimal_digits="0" @@ -162,12 +167,12 @@       left="37"       mouse_opaque="false"       name="Control Modes:" -     top="110" +     top="118"       width="102">          Control Modes:      </text>      <check_box -     bottom="127" +     bottom="134"       height="10"            control_name="JoystickAvatarEnabled"       halign="center" @@ -177,7 +182,7 @@       name="JoystickAvatarEnabled"       width="60" />      <check_box -     bottom="127" +     bottom_delta="0"       height="10"            control_name="JoystickBuildEnabled"       halign="center" @@ -187,7 +192,7 @@       name="JoystickBuildEnabled"       width="60" />      <check_box -     bottom="127" +     bottom_delta="0"       height="10"            control_name="JoystickFlycamEnabled"       halign="center" @@ -203,7 +208,7 @@       left="359"       name="axis_view"       show_label="true" -     top="135" +     top="143"       width="200">          <stat_bar           bar_max="2" @@ -266,7 +271,7 @@      <text       type="string"       length="1" -     bottom="144" +     bottom="152"       halign="right"       layout="topleft"       left="3" @@ -275,7 +280,7 @@          X Scale      </text>      <spinner -     bottom="144" +     bottom_delta="0"       height="10"            control_name="AvatarAxisScale1"       decimal_digits="2" @@ -287,7 +292,7 @@       name="AvatarAxisScale1"       width="56" />      <spinner -     bottom="144" +     bottom_delta="0"       height="10"            control_name="BuildAxisScale1"       decimal_digits="2" @@ -299,7 +304,7 @@       name="BuildAxisScale1"       width="56" />      <spinner -     bottom="144" +     bottom_delta="0"       height="10"            control_name="FlycamAxisScale1"       decimal_digits="2" @@ -313,7 +318,7 @@      <text       type="string"       length="1" -     bottom="164" +     bottom="172"       halign="right"       layout="topleft"       left="3" @@ -322,7 +327,7 @@          Y Scale      </text>      <spinner -     bottom="164" +     bottom_delta="0"       height="10"            control_name="AvatarAxisScale2"       decimal_digits="2" @@ -334,7 +339,7 @@       name="AvatarAxisScale2"       width="56" />      <spinner -     bottom="164" +     bottom_delta="0"       height="10"            control_name="BuildAxisScale2"       decimal_digits="2" @@ -346,7 +351,7 @@       name="BuildAxisScale2"       width="56" />      <spinner -     bottom="164" +     bottom_delta="0"       height="10"            control_name="FlycamAxisScale2"       decimal_digits="2" @@ -360,7 +365,7 @@      <text       type="string"       length="1" -     bottom="184" +     bottom="192"       halign="right"       layout="topleft"       left="3" @@ -369,7 +374,7 @@          Z Scale      </text>      <spinner -     bottom="184" +     bottom_delta="0"       height="10"            control_name="AvatarAxisScale0"       decimal_digits="2" @@ -381,7 +386,7 @@       name="AvatarAxisScale0"       width="56" />      <spinner -     bottom="184" +     bottom_delta="0"       height="10"            control_name="BuildAxisScale0"       decimal_digits="2" @@ -393,7 +398,7 @@       name="BuildAxisScale0"       width="56" />      <spinner -     bottom="184" +     bottom_delta="0"       height="10"            control_name="FlycamAxisScale0"       decimal_digits="2" @@ -407,7 +412,7 @@      <text       type="string"       length="1" -     bottom="204" +     bottom="212"       halign="right"       layout="topleft"       left="3" @@ -416,7 +421,7 @@          Pitch Scale      </text>      <spinner -     bottom="204" +     bottom_delta="0"       height="10"            control_name="AvatarAxisScale4"       decimal_digits="2" @@ -428,7 +433,7 @@       name="AvatarAxisScale4"       width="56" />      <spinner -     bottom="204" +     bottom_delta="0"       height="10"            control_name="BuildAxisScale4"       decimal_digits="2" @@ -440,7 +445,7 @@       name="BuildAxisScale4"       width="56" />      <spinner -     bottom="204" +     bottom_delta="0"       height="10"            control_name="FlycamAxisScale4"       decimal_digits="2" @@ -454,7 +459,7 @@      <text       type="string"       length="1" -     bottom="224" +     bottom="232"       halign="right"       layout="topleft"       left="3" @@ -463,7 +468,7 @@          Yaw Scale      </text>      <spinner -     bottom="224" +     bottom_delta="0"       height="10"       control_name="AvatarAxisScale5"       decimal_digits="2" @@ -475,7 +480,7 @@       name="AvatarAxisScale5"       width="56" />      <spinner -     bottom="224" +     bottom_delta="0"       height="10"       control_name="BuildAxisScale5"       decimal_digits="2" @@ -487,7 +492,7 @@       name="BuildAxisScale5"       width="56" />      <spinner -     bottom="224" +     bottom_delta="0"       height="10"       control_name="FlycamAxisScale5"       decimal_digits="2" @@ -501,7 +506,7 @@      <text       type="string"       length="1" -     bottom="244" +     bottom="252"       halign="right"       layout="topleft"       left="3" @@ -510,7 +515,7 @@          Roll Scale      </text>      <spinner -     bottom="244" +     bottom_delta="0"       height="10"       control_name="BuildAxisScale3"       decimal_digits="2" @@ -522,7 +527,7 @@       name="BuildAxisScale3"       width="56" />      <spinner -     bottom="244" +     bottom_delta="0"       height="10"       control_name="FlycamAxisScale3"       decimal_digits="2" @@ -536,7 +541,7 @@      <text       type="string"       length="1" -     bottom="274" +     bottom="282"       halign="right"       layout="topleft"       left="3" @@ -545,7 +550,7 @@          X Dead Zone      </text>      <spinner -     bottom="274" +     bottom_delta="0"       height="10"       control_name="AvatarAxisDeadZone1"       decimal_digits="2" @@ -556,7 +561,7 @@       name="AvatarAxisDeadZone1"       width="56" />      <spinner -     bottom="274" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone1"       decimal_digits="2" @@ -567,7 +572,7 @@       name="BuildAxisDeadZone1"       width="56" />      <spinner -     bottom="274" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone1"       decimal_digits="2" @@ -580,7 +585,7 @@      <text       type="string"       length="1" -     bottom="294" +     bottom="302"       halign="right"       layout="topleft"       left="3" @@ -589,7 +594,7 @@          Y Dead Zone      </text>      <spinner -     bottom="294" +     bottom_delta="0"       height="10"            control_name="AvatarAxisDeadZone2"       decimal_digits="2" @@ -600,7 +605,7 @@       name="AvatarAxisDeadZone2"       width="56" />      <spinner -     bottom="294" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone2"       decimal_digits="2" @@ -611,7 +616,7 @@       name="BuildAxisDeadZone2"       width="56" />      <spinner -     bottom="294" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone2"       decimal_digits="2" @@ -624,7 +629,7 @@      <text       type="string"       length="1" -     bottom="314" +     bottom="322"       halign="right"       layout="topleft"       left="3" @@ -633,7 +638,7 @@          Z Dead Zone      </text>      <spinner -     bottom="314" +     bottom_delta="0"       height="10"       control_name="AvatarAxisDeadZone0"       decimal_digits="2" @@ -644,7 +649,7 @@       name="AvatarAxisDeadZone0"       width="56" />      <spinner -     bottom="314" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone0"       decimal_digits="2" @@ -655,7 +660,7 @@       name="BuildAxisDeadZone0"       width="56" />      <spinner -     bottom="314" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone0"       decimal_digits="2" @@ -668,7 +673,7 @@      <text       type="string"       length="1" -     bottom="334" +     bottom="342"       halign="right"       layout="topleft"       left="2" @@ -677,7 +682,7 @@          Pitch Dead Zone      </text>      <spinner -     bottom="334" +     bottom_delta="0"       height="10"       control_name="AvatarAxisDeadZone4"       decimal_digits="2" @@ -688,7 +693,7 @@       name="AvatarAxisDeadZone4"       width="56" />      <spinner -     bottom="334" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone4"       decimal_digits="2" @@ -699,7 +704,7 @@       name="BuildAxisDeadZone4"       width="56" />      <spinner -     bottom="334" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone4"       decimal_digits="2" @@ -712,7 +717,7 @@      <text       type="string"       length="1" -     bottom="354" +     bottom="362"       halign="right"       layout="topleft"       left="3" @@ -721,7 +726,7 @@          Yaw Dead Zone      </text>      <spinner -     bottom="354" +     bottom_delta="0"       height="10"       control_name="AvatarAxisDeadZone5"       decimal_digits="2" @@ -732,7 +737,7 @@       name="AvatarAxisDeadZone5"       width="56" />      <spinner -     bottom="354" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone5"       decimal_digits="2" @@ -743,7 +748,7 @@       name="BuildAxisDeadZone5"       width="56" />      <spinner -     bottom="354" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone5"       decimal_digits="2" @@ -756,7 +761,7 @@      <text       type="string"       length="1" -     bottom="374" +     bottom="382"       halign="right"       layout="topleft"       left="3" @@ -765,7 +770,7 @@          Roll Dead Zone      </text>      <spinner -     bottom="374" +     bottom_delta="0"       height="10"       control_name="BuildAxisDeadZone3"       decimal_digits="2" @@ -776,7 +781,7 @@       name="BuildAxisDeadZone3"       width="56" />      <spinner -     bottom="374" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone3"       decimal_digits="2" @@ -789,7 +794,7 @@      <text       type="string"       length="1" -     bottom="402" +     bottom="410"       halign="right"       layout="topleft"       left="3" @@ -810,7 +815,7 @@       min_val="1"       name="AvatarFeathering"       show_text="false" -     top="402" +     top="410"       width="73" />      <slider       control_name="BuildFeathering" @@ -845,7 +850,7 @@      <text       type="string"       length="1" -     bottom="430" +     bottom="438"       halign="right"       layout="topleft"       left="3" @@ -854,7 +859,7 @@          Zoom Scale      </text>      <spinner -     bottom="430" +     bottom_delta="0"       height="10"       control_name="FlycamAxisScale6"       decimal_digits="2" @@ -868,7 +873,7 @@      <text       type="string"       length="1" -     bottom="450" +     bottom="458"       halign="right"       layout="topleft"       left="3" @@ -877,7 +882,7 @@          Zoom Dead Zone      </text>      <spinner -     bottom="450" +     bottom_delta="0"       height="10"       control_name="FlycamAxisDeadZone6"       decimal_digits="2" @@ -894,7 +899,7 @@       layout="topleft"       left="359"       name="SpaceNavigatorDefaults" -     top="429" +     top="437"       width="200" />      <button       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml index fdea7a821a..35ad87ceb0 100644 --- a/indra/newview/skins/default/xui/en/floater_my_appearance.xml +++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml @@ -11,7 +11,7 @@    save_rect="true"    single_instance="true"    reuse_instance="true" -  title="APPEARANCE" +  title="AVATAR"    min_height="440"    min_width="333"    width="333"> diff --git a/indra/newview/skins/default/xui/en/floater_my_scripts.xml b/indra/newview/skins/default/xui/en/floater_my_scripts.xml index 3b0b6723c7..ee6defce9d 100644 --- a/indra/newview/skins/default/xui/en/floater_my_scripts.xml +++ b/indra/newview/skins/default/xui/en/floater_my_scripts.xml @@ -7,7 +7,7 @@   layout="topleft"   name="myscripts"   save_rect="true" - title="My Scripts" + title="ATTACHMENT SCRIPTS"   min_width="620"   width="620">    <panel diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 0abee2ff80..1377bad6cf 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2575,13 +2575,22 @@ even though the user gets a free copy.               border_visible="true"               bevel_style="in"               follows="left|top|right" -             height="325" +             height="300"               layout="topleft"               left="10"               name="contents_inventory"               top="50"               width="275" /> -		</panel> +            <button +             follows="left|bottom" +             height="23" +             label="Reset Scripts" +             layout="topleft" +             left="10" +             name="btn_reset_scripts" +             bottom="-1" +             width="118" /> +       </panel>          </tab_container>  	<panel  	 follows="left|top" diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index 38f4b7715f..7ad692038e 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -173,16 +173,13 @@            parameter="avatar_render_settings" />        </menu_item_call>        </context_menu> -  <menu_item_separator -       layout="topleft" name="Impostor seperator"/> -    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 59faf6a9f5..856bf4ce73 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -4,28 +4,7 @@   name="Attachment Pie">      <menu_item_call       enabled="false" -     label="Touch" -     layout="topleft" -     name="Attachment Object Touch"> -        <menu_item_call.on_click -         function="Object.Touch" /> -        <menu_item_call.on_enable -         function="Object.EnableTouch" -         name="EnableTouch"/> -    </menu_item_call> -    <!--menu_item_call -     label="Stand Up" -     layout="topleft" -     name="Stand Up"> -        <menu_item_call.on_click -         function="Self.StandUp" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableStandUp" /> -    </menu_item_call--> -    <menu_item_call -     enabled="false" -     label="Edit" +     label="Edit item"       layout="topleft"       name="Edit...">          <menu_item_call.on_click @@ -35,7 +14,7 @@      </menu_item_call>      <menu_item_call       enabled="false" -     label="Detach" +     label="Detach item"       layout="topleft"       name="Detach">          <menu_item_call.on_click @@ -43,39 +22,29 @@          <menu_item_call.on_enable           function="Attachment.EnableDetach" />      </menu_item_call> -  <menu_item_separator -    layout="topleft" /> -      <menu_item_call -     label="Sit Down" +     enabled="false" +     label="Touch item"       layout="topleft" -     name="Sit Down Here"> +     name="Attachment Object Touch">          <menu_item_call.on_click -         function="Self.SitDown" -         parameter="" /> +         function="Object.Touch" />          <menu_item_call.on_enable -         function="Self.EnableSitDown" /> +         function="Object.EnableTouch" +         name="EnableTouch"/>      </menu_item_call> +    <menu_item_separator +     layout="topleft" />    <menu_item_call -label="Stand Up" -layout="topleft" -name="Stand Up"> -    <menu_item_call.on_click -     function="Self.StandUp" -     parameter="" /> -    <menu_item_call.on_enable -     function="Self.EnableStandUp" /> -  </menu_item_call> -  <menu_item_call -  label="My Appearance" +  label="Outfits..."    name="Change Outfit">      <menu_item_call.on_click       function="CustomizeAvatar" />      <menu_item_call.on_enable       function="Edit.EnableCustomizeAvatar" />    </menu_item_call> -  <menu_item_call label="Edit My Outfit" +  <menu_item_call label="Current outfit..."  layout="topleft"  name="Edit Outfit">      <menu_item_call.on_click @@ -83,7 +52,7 @@ name="Edit Outfit">      <menu_item_call.on_enable       function="Edit.EnableCustomizeAvatar" />    </menu_item_call> -  <menu_item_call label="Edit My Shape" +  <menu_item_call label="Shape..."      layout="topleft"      name="Edit My Shape">      <menu_item_call.on_click @@ -91,7 +60,7 @@ name="Edit Outfit">      <menu_item_call.on_enable       function="Edit.EnableEditShape" />    </menu_item_call> -  <menu_item_call label="Hover Height" +  <menu_item_call label="Hover height..."       layout="topleft"       name="Hover Height">       <menu_item_call.on_click @@ -99,42 +68,224 @@ name="Edit Outfit">       <menu_item_call.on_enable        function="Edit.EnableHoverHeight" />    </menu_item_call> -  <menu_item_call label="Reset Skeleton" +  <context_menu +  label="Take Off" +  layout="topleft" +  name="Take Off >"> +    <context_menu +     label="Clothes" +     layout="topleft" +     name="Clothes >"> +      <menu_item_call +       enabled="false" +       label="Shirt"         layout="topleft" -       name="Reset Skeleton"> -       <menu_item_call.on_click -        function="Avatar.ResetSkeleton" /> -  </menu_item_call> -  <menu_item_call label="Reset Skeleton And Animations" +       name="Shirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Pants"         layout="topleft" -       name="Reset Skeleton And Animations"> -       <menu_item_call.on_click -        function="Avatar.ResetSkeletonAndAnimations" /> -  </menu_item_call> - +       name="Pants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="pants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="pants" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Skirt" +       layout="topleft" +       name="Skirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="skirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="skirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Shoes" +       layout="topleft" +       name="Shoes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shoes" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shoes" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Socks" +       layout="topleft" +       name="Socks"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="socks" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="socks" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Jacket" +       layout="topleft" +       name="Jacket"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="jacket" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="jacket" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Gloves" +       layout="topleft" +       name="Gloves"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="gloves" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="gloves" /> +      </menu_item_call> +      <menu_item_call +            enabled="false" +            label="Undershirt" +            layout="topleft" +            name="Self Undershirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="undershirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="undershirt" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Underpants" +        layout="topleft" +        name="Self Underpants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="underpants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="underpants" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Tattoo" +        layout="topleft" +        name="Self Tattoo"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="tattoo" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="tattoo" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Physics" +        layout="topleft" +        name="Self Physics"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="physics" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="physics" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Alpha" +        layout="topleft" +        name="Self Alpha"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="alpha" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="alpha" /> +      </menu_item_call> +      <menu_item_separator +       layout="topleft" /> +      <menu_item_call +       label="All Clothes" +       layout="topleft" +       name="All Clothes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="all" /> +      </menu_item_call> +    </context_menu> +    <context_menu +     label="HUD" +     layout="topleft" +     name="Detach Self HUD" /> +    <context_menu +     label="Detach" +     layout="topleft" +     name="Detach Self" /> +    <menu_item_call +     label="Detach All" +     layout="topleft" +     name="Detach All"> +      <menu_item_call.on_click +       function="Self.RemoveAllAttachments" +       parameter="" /> +      <menu_item_call.on_enable +       function="Self.EnableRemoveAllAttachments" /> +    </menu_item_call> +  </context_menu> +  <menu_item_separator/>    <menu_item_call -    label="My Friends" +    label="Sit / stand"      layout="topleft" -    name="Friends..."> +    name="Sit stand">      <menu_item_call.on_click -     function="SideTray.PanelPeopleTab" -     parameter="friends_panel" /> +     function="Self.ToggleSitStand"/> +    <menu_item_call.on_enable +     function="Self.EnableSitStand" />    </menu_item_call>    <menu_item_call -   label="My Groups" -   layout="topleft" -   name="Groups..."> +     label="Fly / land" +     name="Fly land">      <menu_item_call.on_click -     function="SideTray.PanelPeopleTab" -     parameter="groups_panel" /> +     function="Agent.toggleFlying" /> +    <menu_item_call.on_enable +     function="Agent.enableFlyLand" />    </menu_item_call>    <menu_item_call -    label="My Profile" -    layout="topleft" -    name="Profile..."> +     label="Stop animations" +     name="Stop Animating My Avatar">      <menu_item_call.on_click -     function="ShowAgentProfile" -     parameter="agent" /> +     function="Tools.StopAllAnimations" /> +  </menu_item_call> +  <menu_item_separator/> +  <menu_item_call label="Reset skeleton" +       layout="topleft" +       name="Reset Skeleton"> +       <menu_item_call.on_click +        function="Avatar.ResetSkeleton" /> +  </menu_item_call> +  <menu_item_call label="Reset skeleton and animations" +       layout="topleft" +       name="Reset Skeleton And Animations"> +       <menu_item_call.on_click +        function="Avatar.ResetSkeletonAndAnimations" />    </menu_item_call>    <menu_item_call   label="Debug Textures" @@ -152,27 +303,13 @@ name="Edit Outfit">              <menu_item_call.on_visible               function="Advanced.EnableAppearanceToXML"/>      </menu_item_call> -  <menu_item_separator -  layout="topleft" /> -  <menu_item_call - enabled="false" - label="Drop" - layout="topleft" - name="Drop"> -    <menu_item_call.on_click -     function="Attachment.Drop" /> -    <menu_item_call.on_enable -     function="Attachment.EnableDrop" /> -  </menu_item_call> -  <menu_item_separator -       layout="topleft" />    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index f9fb847910..acbb9b860d 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -165,16 +165,13 @@        </menu_item_call>        </context_menu> -  <menu_item_separator  -    layout="topleft"  name="Impostor seperator"/> -    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 9e181d0b6d..a46d9aed55 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -3,209 +3,7 @@   layout="topleft"   name="Self Pie">      <menu_item_call -     label="Sit Down" -     layout="topleft" -     name="Sit Down Here"> -        <menu_item_call.on_click -         function="Self.SitDown" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableSitDown" /> -    </menu_item_call> -    <menu_item_call -     label="Stand Up" -     layout="topleft" -     name="Stand Up"> -        <menu_item_call.on_click -         function="Self.StandUp" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableStandUp" /> -    </menu_item_call> -    <context_menu -     label="Take Off" -     layout="topleft" -     name="Take Off >"> -        <context_menu -         label="Clothes" -         layout="topleft" -         name="Clothes >"> -            <menu_item_call -             enabled="false" -             label="Shirt" -             layout="topleft" -             name="Shirt"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="shirt" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="shirt" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Pants" -             layout="topleft" -             name="Pants"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="pants" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="pants" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Skirt" -             layout="topleft" -             name="Skirt"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="skirt" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="skirt" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Shoes" -             layout="topleft" -             name="Shoes"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="shoes" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="shoes" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Socks" -             layout="topleft" -             name="Socks"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="socks" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="socks" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Jacket" -             layout="topleft" -             name="Jacket"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="jacket" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="jacket" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Gloves" -             layout="topleft" -             name="Gloves"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="gloves" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="gloves" /> -            </menu_item_call> -           <menu_item_call -                 enabled="false" -                 label="Undershirt" -                 layout="topleft" -                 name="Self Undershirt"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="undershirt" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="undershirt" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Underpants" -                 layout="topleft" -                 name="Self Underpants"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="underpants" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="underpants" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Tattoo" -                 layout="topleft" -                 name="Self Tattoo"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="tattoo" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="tattoo" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Physics" -                 layout="topleft" -                 name="Self Physics"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="physics" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="physics" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Alpha" -                 layout="topleft" -                 name="Self Alpha"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="alpha" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="alpha" /> -                </menu_item_call> -                <menu_item_separator -                 layout="topleft" /> -                <menu_item_call -                 label="All Clothes" -                 layout="topleft" -                 name="All Clothes"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="all" /> -                </menu_item_call> -        </context_menu> -        <context_menu -         label="HUD" -         layout="topleft" -         name="Object Detach HUD" /> -        <context_menu -         label="Detach" -         layout="topleft" -         name="Object Detach" /> -        <menu_item_call -         label="Detach All" -         layout="topleft" -         name="Detach All"> -            <menu_item_call.on_click -             function="Self.RemoveAllAttachments" -             parameter="" /> -            <menu_item_call.on_enable -             function="Self.EnableRemoveAllAttachments" /> -        </menu_item_call> -    </context_menu> -     <menu_item_call -     label="My Appearance" +     label="Outfits..."       layout="topleft"       name="Chenge Outfit">          <menu_item_call.on_click @@ -213,7 +11,7 @@          <menu_item_call.on_enable           function="Edit.EnableCustomizeAvatar" />      </menu_item_call> -    <menu_item_call label="Edit My Outfit"  +    <menu_item_call label="Current outfit..."       layout="topleft"      name="Edit Outfit">         <menu_item_call.on_click @@ -221,7 +19,7 @@         <menu_item_call.on_enable          function="Edit.EnableCustomizeAvatar" />     </menu_item_call> -    <menu_item_call label="Edit My Shape"  +    <menu_item_call label="Shape..."       layout="topleft"      name="Edit My Shape">         <menu_item_call.on_click @@ -229,7 +27,7 @@         <menu_item_call.on_enable          function="Edit.EnableEditShape" />     </menu_item_call> -   <menu_item_call label="Hover Height" +   <menu_item_call label="Hover height..."       layout="topleft"       name="Hover Height">       <menu_item_call.on_click @@ -237,42 +35,225 @@       <menu_item_call.on_enable        function="Edit.EnableHoverHeight" />     </menu_item_call> -   <menu_item_call label="Reset Skeleton" +  <context_menu +    label="Take Off" +    layout="topleft" +    name="Take Off >"> +    <context_menu +     label="Clothes" +     layout="topleft" +     name="Clothes >"> +      <menu_item_call +       enabled="false" +       label="Shirt" +       layout="topleft" +       name="Shirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Pants" +       layout="topleft" +       name="Pants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="pants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="pants" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Skirt" +       layout="topleft" +       name="Skirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="skirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="skirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Shoes" +       layout="topleft" +       name="Shoes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shoes" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shoes" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Socks" +       layout="topleft" +       name="Socks"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="socks" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="socks" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Jacket" +       layout="topleft" +       name="Jacket"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="jacket" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="jacket" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Gloves" +       layout="topleft" +       name="Gloves"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="gloves" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="gloves" /> +      </menu_item_call> +      <menu_item_call +            enabled="false" +            label="Undershirt" +            layout="topleft" +            name="Self Undershirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="undershirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="undershirt" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Underpants" +        layout="topleft" +        name="Self Underpants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="underpants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="underpants" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Tattoo" +        layout="topleft" +        name="Self Tattoo"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="tattoo" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="tattoo" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Physics" +        layout="topleft" +        name="Self Physics"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="physics" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="physics" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Alpha" +        layout="topleft" +        name="Self Alpha"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="alpha" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="alpha" /> +      </menu_item_call> +      <menu_item_separator +       layout="topleft" /> +      <menu_item_call +       label="All Clothes" +       layout="topleft" +       name="All Clothes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="all" /> +      </menu_item_call> +    </context_menu> +    <context_menu +     label="HUD" +     layout="topleft" +     name="Object Detach HUD" /> +    <context_menu +     label="Detach" +     layout="topleft" +     name="Object Detach" /> +    <menu_item_call +     label="Detach All" +     layout="topleft" +     name="Detach All"> +      <menu_item_call.on_click +       function="Self.RemoveAllAttachments" +       parameter="" /> +      <menu_item_call.on_enable +       function="Self.EnableRemoveAllAttachments" /> +    </menu_item_call> +  </context_menu> +  <menu_item_separator/> +  <menu_item_call +    label="Sit / stand" +    layout="topleft" +    name="Sit stand"> +      <menu_item_call.on_click +       function="Self.ToggleSitStand"/> +      <menu_item_call.on_enable +       function="Self.EnableSitStand" /> +  </menu_item_call> +  <menu_item_call +     label="Fly / land" +     name="Fly land"> +      <menu_item_call.on_click +       function="Agent.toggleFlying" /> +      <menu_item_call.on_enable +       function="Agent.enableFlyLand" /> +  </menu_item_call> +  <menu_item_call +     label="Stop animations" +     name="Stop Animating My Avatar"> +        <menu_item_call.on_click +         function="Tools.StopAllAnimations" /> +  </menu_item_call> +  <menu_item_separator/> +  <menu_item_call label="Reset skeleton"       layout="topleft"       name="Reset Skeleton">       <menu_item_call.on_click        function="Avatar.ResetSkeleton" /> -   </menu_item_call> -  <menu_item_call label="Reset Skeleton And Animations" +  </menu_item_call> +  <menu_item_call label="Reset skeleton and animations"         layout="topleft"         name="Reset Skeleton And Animations">         <menu_item_call.on_click          function="Avatar.ResetSkeletonAndAnimations" />    </menu_item_call> -   <menu_item_call -     label="My Friends" -     layout="topleft" -     name="Friends..."> -        <menu_item_call.on_click -         function="SideTray.PanelPeopleTab" -         parameter="friends_panel" /> -    </menu_item_call> -    <menu_item_call -     label="My Groups" -     layout="topleft" -     name="Groups..."> -        <menu_item_call.on_click -         function="SideTray.PanelPeopleTab" -         parameter="groups_panel" /> -    </menu_item_call> -   <menu_item_call -     label="My Profile" -     layout="topleft" -     name="Profile..."> -        <menu_item_call.on_click -         function="ShowAgentProfile" -         parameter="agent" /> -    </menu_item_call>      <menu_item_call  		 label="Debug Textures"           name="Debug..."> @@ -289,8 +270,6 @@              <menu_item_call.on_visible               function="Advanced.EnableAppearanceToXML"/>      </menu_item_call> -  <menu_item_separator -       layout="topleft" />    <menu_item_call       enabled="false"       label="Block Particle Owner" @@ -298,7 +277,7 @@      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 5fa1847d1b..270e267fd4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -15,24 +15,6 @@           function="ShowAgentProfile"           parameter="agent" />        </menu_item_call> -      <menu_item_call -       label="Appearance..." -       name="ChangeOutfit" -       shortcut="control|O"> -        <menu_item_call.on_click -         function="Floater.ToggleOrBringToFront" -         parameter="appearance" /> -        <menu_item_call.on_enable -         function="Edit.EnableCustomizeAvatar" /> -      </menu_item_call> -      <menu_item_call -       label="Choose an avatar..." -       name="Avatar Picker"> -        <menu_item_call.on_click -         function="Floater.ToggleOrBringToFront" -         parameter="avatar" /> -      </menu_item_call> -      <menu_item_separator/>        <menu_item_check           label="Inventory..."           name="Inventory" @@ -76,119 +58,29 @@            parameter="experiences"/>        </menu_item_call>        <menu_item_call -        label="My Scripts..." -        name="MyScripts"> -        <menu_item_call.on_click -          function="Floater.ToggleOrBringToFront" -          parameter="my_scripts"/> -      </menu_item_call> -      <menu_item_separator/> -      <menu_item_call         label="Camera Controls..."         name="Camera Controls">          <menu_item_call.on_click           function="Floater.ToggleOrBringToFront"           parameter="camera" />        </menu_item_call> -      <menu -       create_jump_keys="true" -       label="Movement" -       name="Movement" -       tear_off="true"> -        <menu_item_call -         label="Sit Down" -         layout="topleft" -         shortcut="alt|shift|S" -         name="Sit Down Here"> -          <menu_item_call.on_click -           function="Self.SitDown"/> -          <menu_item_call.on_visible -           function="Self.ShowSitDown"/> -          <menu_item_call.on_enable -           function="Self.EnableSitDown" /> -        </menu_item_call> -        <menu_item_call -         label="Stand Up" -         layout="topleft" -         shortcut="alt|shift|S" -         name="Stand up"> -          <menu_item_call.on_click -           function="Self.StandUp"/> -          <menu_item_call.on_visible -           function="Self.EnableStandUp"/> -          <menu_item_call.on_enable -           function="Self.EnableStandUp" /> -        </menu_item_call> -        <menu_item_check -         label="Fly" -         name="Fly" -         shortcut="HOME"> -          <menu_item_check.on_check -           function="Agent.getFlying" /> -          <menu_item_check.on_click -           function="Agent.toggleFlying" /> -          <menu_item_check.on_enable -           function="Agent.enableFlying" /> -        </menu_item_check> -        <menu_item_call -         label="Stop flying" -         name="Stop flying" -         shortcut="HOME"> -          <menu_item_call.on_click -           function="Agent.toggleFlying" /> -          <menu_item_call.on_enable -           function="Agent.getFlying" /> -        </menu_item_call>	 -        <menu_item_check -         label="Always Run" -         name="Always Run" -         shortcut="control|R"> -          <menu_item_check.on_check -           function="World.CheckAlwaysRun" /> -          <menu_item_check.on_click -           function="World.AlwaysRun" /> -        </menu_item_check> -        <menu_item_call -         label="Stop Animating Me" -         name="Stop Animating My Avatar"> -          <menu_item_call.on_click -           function="Tools.StopAllAnimations" /> -        </menu_item_call> -        <menu_item_check -         label="Walk / run / fly..." -         name="WalkRunFly"> -          <menu_item_check.on_check -           function="Floater.Visible" -           parameter="moveview" /> -          <menu_item_check.on_click -           function="Floater.ToggleOrBringToFront" -           parameter="moveview" /> -        </menu_item_check> -      </menu> - -      <menu -       create_jump_keys="true" -       label="Status" -       name="Status" -       tear_off="true"> -        <menu_item_check -         name="Away" -         label="Away"> -          <menu_item_check.on_check -           function="View.Status.CheckAway" /> -          <menu_item_check.on_click -           function="World.SetAway" /> -        </menu_item_check> -        <menu_item_check -         name="Do Not Disturb" -         label="Do Not Disturb"> -          <menu_item_check.on_check -           function="View.Status.CheckDoNotDisturb" /> -          <menu_item_check.on_click -           function="World.SetDoNotDisturb"/> -        </menu_item_check> -       -    </menu> +      <menu_item_separator/> +      <menu_item_check +       name="Away" +       label="Away"> +        <menu_item_check.on_check +         function="View.Status.CheckAway" /> +        <menu_item_check.on_click +         function="World.SetAway" /> +      </menu_item_check> +      <menu_item_check +       name="Do Not Disturb" +       label="Do Not Disturb"> +        <menu_item_check.on_check +         function="View.Status.CheckDoNotDisturb" /> +        <menu_item_check.on_click +         function="World.SetDoNotDisturb"/> +      </menu_item_check>        <menu_item_separator/> @@ -260,6 +152,325 @@      </menu>      <menu       create_jump_keys="true" +     label="Avatar" +     name="Avatar" +     tear_off="true"> +       <menu_item_call +         label="Complete avatars..." +         name="Avatar Picker"> +            <menu_item_call.on_click +             function="Floater.ToggleOrBringToFront" +             parameter="avatar" /> +       </menu_item_call> +       <menu_item_call +         label="Outfits..." +         name="ChangeOutfit" +         shortcut="control|O"> +            <menu_item_call.on_click +             function="Floater.ToggleOrBringToFront" +             parameter="appearance" /> +            <menu_item_call.on_enable +             function="Edit.EnableCustomizeAvatar" /> +       </menu_item_call> +       <menu_item_call  +         label="Current outfit..." +         layout="topleft" +         name="Edit Outfit"> +            <menu_item_call.on_click +             function="EditOutfit" /> +            <menu_item_call.on_enable +             function="Edit.EnableCustomizeAvatar" /> +       </menu_item_call> +       <menu_item_call  +         label="Shape..." +         layout="topleft" +         name="Edit My Shape"> +            <menu_item_call.on_click +             function="EditShape" /> +            <menu_item_call.on_enable +             function="Edit.EnableEditShape" /> +      </menu_item_call> +       <menu_item_call label="Hover height..." +         layout="topleft" +         name="Hover Height"> +            <menu_item_call.on_click +             function="HoverHeight" /> +            <menu_item_call.on_enable +             function="Edit.EnableHoverHeight" /> +      </menu_item_call> +      <menu +        label="Take Off" +        layout="topleft" +        name="Take Off >"> +        <menu +         label="Clothes" +         layout="topleft" +         name="Clothes >"> +          <menu_item_call +           enabled="false" +           label="Shirt" +           layout="topleft" +           name="Shirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="shirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="shirt" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Pants" +           layout="topleft" +           name="Pants"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="pants" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="pants" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Skirt" +           layout="topleft" +           name="Skirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="skirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="skirt" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Shoes" +           layout="topleft" +           name="Shoes"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="shoes" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="shoes" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Socks" +           layout="topleft" +           name="Socks"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="socks" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="socks" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Jacket" +           layout="topleft" +           name="Jacket"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="jacket" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="jacket" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Gloves" +           layout="topleft" +           name="Gloves"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="gloves" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="gloves" /> +          </menu_item_call> +          <menu_item_call +                enabled="false" +                label="Undershirt" +                layout="topleft" +                name="Self Undershirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="undershirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="undershirt" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Underpants" +            layout="topleft" +            name="Self Underpants"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="underpants" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="underpants" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Tattoo" +            layout="topleft" +            name="Self Tattoo"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="tattoo" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="tattoo" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Physics" +            layout="topleft" +            name="Self Physics"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="physics" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="physics" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Alpha" +            layout="topleft" +            name="Self Alpha"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="alpha" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="alpha" /> +          </menu_item_call> +          <menu_item_separator +           layout="topleft" /> +          <menu_item_call +           label="All Clothes" +           layout="topleft" +           name="All Clothes"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="all" /> +          </menu_item_call> +        </menu> +        <menu +         label="HUD" +         layout="topleft" +         name="Avatar Detach HUD" /> +        <menu +         label="Detach" +         layout="topleft" +         name="Avatar Detach" /> +        <menu_item_call +         label="Detach All" +         layout="topleft" +         name="Detach All"> +          <menu_item_call.on_click +           function="Self.RemoveAllAttachments" +           parameter="" /> +          <menu_item_call.on_enable +           function="Self.EnableRemoveAllAttachments" /> +        </menu_item_call> +      </menu> +      <menu_item_separator/> + +       <menu_item_call +         label="Sit / stand" +         layout="topleft" +         shortcut="alt|shift|S" +         name="Sit stand"> +          <menu_item_call.on_click +           function="Self.ToggleSitStand"/> +          <menu_item_call.on_enable +           function="Self.EnableSitStand" /> +        </menu_item_call> +        <menu_item_call +         label="Fly / land" +         name="Fly land" +         shortcut="HOME"> +          <menu_item_call.on_click +           function="Agent.toggleFlying" /> +          <menu_item_call.on_enable +           function="Agent.enableFlyLand" /> +        </menu_item_call>        +        <menu_item_call +         label="Stop animations" +         name="Stop Animating My Avatar"> +          <menu_item_call.on_click +           function="Tools.StopAllAnimations" /> +        </menu_item_call> +        <menu_item_check +          label="Walk / run / fly..." +          name="WalkRunFly"> +          <menu_item_check.on_check +           function="Floater.Visible" +           parameter="moveview" /> +          <menu_item_check.on_click +           function="Floater.ToggleOrBringToFront" +           parameter="moveview" /> +        </menu_item_check> +        <menu_item_check +          label="Always run" +          name="Always Run" +          shortcut="control|R"> +          <menu_item_check.on_check +           function="World.CheckAlwaysRun" /> +          <menu_item_check.on_click +           function="World.AlwaysRun" /> +        </menu_item_check> +      <menu_item_separator/> +      <menu_item_check +       label="Gestures..." +       name="Gestures" +       shortcut="control|G"> +        <menu_item_check.on_check +         function="Floater.Visible" +         parameter="gestures" /> +        <menu_item_check.on_click +         function="Floater.Toggle" +         parameter="gestures" /> +      </menu_item_check> +      <menu_item_separator/> +      <menu_item_call  +       label="Reset skeleton" +       layout="topleft" +       name="Reset Skeleton"> +        <menu_item_call.on_click +         function="Avatar.ResetSkeleton" /> +      </menu_item_call> +      <menu_item_call  +       label="Reset skeleton and animations" +       layout="topleft" +       name="Reset Skeleton And Animations"> +        <menu_item_call.on_click +         function="Avatar.ResetSkeletonAndAnimations" /> +      </menu_item_call> +      <menu_item_call +       label="Attachment scripts..." +       name="MyScripts"> +        <menu_item_call.on_click +         function="Floater.ToggleOrBringToFront" +         parameter="my_scripts"/> +      </menu_item_call> +      <menu_item_separator/> +      <menu_item_call +     label="Help with avatars..." +     name="Help with avatars"> +        <menu_item_call.on_click +            function="Advanced.ShowURL" +            parameter="https://community.secondlife.com/search/?type=cms_records3&tags=avatar&nodes=30&search_and_or=or"/> +      </menu_item_call> +    </menu> +    <menu +     create_jump_keys="true"       label="Communicate"       name="Communicate"       tear_off="true"> diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index cb429812e2..67d4515e3c 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -4,6 +4,7 @@      <menu_item_call       label="Replace"       layout="topleft" +     visible="false"       name="wear_replace">          <on_click           function="Wearable.Wear" /> @@ -11,6 +12,7 @@      <menu_item_call       label="Wear"       layout="topleft" +     visible="false"       name="wear_wear">          <on_click           function="Wearable.Wear" /> @@ -18,6 +20,7 @@      <menu_item_call       label="Add"       layout="topleft" +     visible="false"       name="wear_add">          <on_click           function="Wearable.Add" /> @@ -37,6 +40,7 @@      <menu_item_call       label="Take Off / Detach"       layout="topleft" +     visible="false"       name="take_off_or_detach">          <on_click           function="Wearable.TakeOffDetach" /> @@ -44,6 +48,7 @@      <menu_item_call       label="Detach"       layout="topleft" +     visible="false"       name="detach">          <on_click           function="Attachment.Detach" /> @@ -59,13 +64,23 @@      <menu_item_call       label="Take Off"       layout="topleft" +     visible="false"       name="take_off">          <on_click           function="Clothing.TakeOff" />      </menu_item_call>      <menu_item_call +     label="Edit" +     layout="topleft" +     visible="false" +     name="edit"> +        <on_click +         function="Wearable.Edit" /> +    </menu_item_call> +    <menu_item_call       label="Item Profile"       layout="topleft" +     visible="false"       name="object_profile">          <on_click           function="Attachment.Profile" /> @@ -73,6 +88,7 @@      <menu_item_call       label="Show Original"       layout="topleft" +     visible="false"       name="show_original">          <on_click           function="Wearable.ShowOriginal" /> @@ -80,6 +96,7 @@      <menu_item_call       label="Create New"       layout="topleft" +     visible="false"       name="create_new"       translate="false">          <on_click @@ -88,6 +105,7 @@      <menu_item_call       label="--no options--"       layout="topleft" +     visible="false"       name="--no options--"       translate="false">      </menu_item_call> diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index dc1553e6a3..85d73ece48 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -13,7 +13,7 @@   width="333">      <string       name="edit_shape_title"> -        Editing Shape +        Shape      </string>      <string       name="edit_skin_title"> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 47aceb2c2e..a5aca5c72b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -59,7 +59,8 @@ Maximum 200 per group daily          <scroll_list.columns           label="Date"           name="date" -         width="60" /> +         sort_column="sort" +         width="100" />          <scroll_list.columns           name="sort"           width="-1" /> diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index afce9f6eb5..adbeb09935 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -81,7 +81,7 @@              name="title"              text_color="LtGray"              top="0" -            value="Edit Outfit" +            value="Current Outfit"              use_ellipses="true"              width="275" /> diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index ed37e9e2cc..545c01935b 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -145,10 +145,6 @@        name="Help"        width="112">        <menu_item_call -        label="Help..." -        layout="topleft" -        name="Help..." /> -      <menu_item_call          label="Keyword Help..."          layout="topleft"          name="Keyword Help..." /> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f9f12e7f5c..81390447e9 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -4104,8 +4104,8 @@ Try enclosing path to the editor with double quotes.    <!-- commands -->    <string name="Command_AboutLand_Label">About land</string> -  <string name="Command_Appearance_Label">Appearance</string> -  <string name="Command_Avatar_Label">Avatar</string> +  <string name="Command_Appearance_Label">Outfits</string> +  <string name="Command_Avatar_Label">Complete avatars</string>    <string name="Command_Build_Label">Build</string>    <string name="Command_Chat_Label">Chat</string>    <string name="Command_Conversations_Label">Conversations</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 90a2af98f7..c6f149b5fe 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -260,6 +260,9 @@ class ViewerManifest(LLManifest):              app_suffix=self.channel_variant()          return CHANNEL_VENDOR_BASE + ' ' + app_suffix +    def exec_name(self): +        return "SecondLifeViewer" +      def app_name_oneword(self):          return ''.join(self.app_name().split()) @@ -419,10 +422,12 @@ class WindowsManifest(ViewerManifest):      build_data_json_platform = 'win'      def final_exe(self): -        return self.app_name_oneword()+".exe" +        return self.exec_name()+".exe" + +    def final_pdb(self): +        return self.exec_name()+".pdb"      def finish_build_data_dict(self, build_data_dict): -        #MAINT-7294: Windows exe names depend on channel name, so write that in also          build_data_dict['Executable'] = self.final_exe()          build_data_dict['AppName']    = self.app_name()          return build_data_dict @@ -487,6 +492,10 @@ class WindowsManifest(ViewerManifest):          if self.is_packaging_viewer():              # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.              self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) +            # Bugsplat for some reason requires a match between user's exe and supplied pdb on Windows 10 +            # this feels wrong and doesn't make any sense, since often we are supposed to match a whole +            # folder of symbol files to a random exe. But Bugsplat says 'it's expected' so just rename files. +            self.ccopyfile(src='%s/secondlife-bin.pdb' % self.args['configuration'], dst='%s/%s' % (self.args['configuration'], self.final_pdb()))              with self.prefix(src=os.path.join(pkgdir, "VMP")):                  # include the compiled launcher scripts so that it gets included in the file_list | 
