diff options
Diffstat (limited to 'indra/newview')
| -rwxr-xr-x | indra/newview/llagent.cpp | 25 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llagent.h | 1 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 94 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 2 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llcallbacklist.cpp | 49 | ||||
| -rw-r--r-- | indra/newview/llcallbacklist.h | 6 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 5 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llviewertexture.cpp | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llviewertexturelist.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 212 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvoavatarself.cpp | 69 | ||||
| -rwxr-xr-x | indra/newview/llvoavatarself.h | 1 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llwearablelist.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/textures/textures.xml | 3 | 
17 files changed, 376 insertions, 111 deletions
| diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 3e26eac59a..c49caf93be 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -809,6 +809,18 @@ void LLAgent::standUp()  } +void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) +{ +	llinfos << "called" << llendl; + +	if (isAgentAvatarValid() && +		!gAgentAvatarp->isUsingServerBakes() && +		(mRegionp->getCentralBakeVersion()>0)) +	{ +		LLAppearanceMgr::instance().requestServerAppearanceUpdate(); +	} +} +  //-----------------------------------------------------------------------------  // setRegion()  //----------------------------------------------------------------------------- @@ -904,6 +916,19 @@ void LLAgent::setRegion(LLViewerRegion *regionp)  	{  		LLEnvManagerNew::instance().onRegionCrossing();  	} + +	// If the newly entered region is using server bakes, and our +	// current appearance is non-baked, request appearance update from +	// server. +	if (mRegionp->capabilitiesReceived()) +	{ +		handleServerBakeRegionTransition(mRegionp->getRegionID()); +	} +	else +	{ +		// Need to handle via callback after caps arrive. +		mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); +	}  } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index ae5efb2287..693c123851 100644..100755 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -610,6 +610,7 @@ private:  	void            handleTeleportFinished();  	void            handleTeleportFailed(); +	void			handleServerBakeRegionTransition(const LLUUID& region_id);  	//--------------------------------------------------------------------  	// Teleport State diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index c57269d0b0..4e103bb75e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1750,6 +1750,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)  	{  		requestServerAppearanceUpdate();  	} +	// DRANO really should wait for the appearance message to set this. +	// verify that deleting this line doesn't break anything.  	gAgentAvatarp->setIsUsingServerBakes(gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion());  	//dumpCat(getCOF(),"COF, start"); @@ -2650,12 +2652,70 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base  	if (inventory_changed) gInventory.notifyObservers();  } +// This is intended for use with HTTP Clients/Responders, but is not +// specifically coupled with those classes. +class LLHTTPRetryPolicy: public LLThreadSafeRefCount +{ +public: +	LLHTTPRetryPolicy() {} +	virtual ~LLHTTPRetryPolicy() {} +	virtual bool shouldRetry(U32 status, F32& seconds_to_wait) = 0; +}; + +// Example of simplest possible policy, not necessarily recommended. +class LLAlwaysRetryImmediatelyPolicy: public LLHTTPRetryPolicy +{ +public: +	LLAlwaysRetryImmediatelyPolicy() {} +	bool shouldRetry(U32 status, F32& seconds_to_wait) +	{ +		seconds_to_wait = 0.0; +		return true; +	} +}; + +// Very general policy with geometric back-off after failures, +// up to a maximum delay, and maximum number of retries. +class LLAdaptiveRetryPolicy: public LLHTTPRetryPolicy +{ +public: +	LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries): +		mMinDelay(min_delay), +		mMaxDelay(max_delay), +		mBackoffFactor(backoff_factor), +		mMaxRetries(max_retries), +		mDelay(min_delay), +		mRetryCount(0) +	{ +	} + +	bool shouldRetry(U32 status, F32& seconds_to_wait) +	{ +		seconds_to_wait = mDelay; +		mDelay = llclamp(mDelay*mBackoffFactor,mMinDelay,mMaxDelay); +		mRetryCount++; +		return (mRetryCount<=mMaxRetries); +	} + +private: +	F32 mMinDelay; // delay never less than this value +	F32 mMaxDelay; // delay never exceeds this value +	F32 mBackoffFactor; // delay increases by this factor after each retry, up to mMaxDelay. +	U32 mMaxRetries; // maximum number of times shouldRetry will return true. +	F32 mDelay; // current delay. +	U32 mRetryCount; // number of times shouldRetry has been called. +}; +  class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::Responder  {  public:  	RequestAgentUpdateAppearanceResponder()  	{ -		llinfos << "request created" << llendl; +		mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 16.0, 2.0, 5); +	} + +	virtual ~RequestAgentUpdateAppearanceResponder() +	{  	}  	// Successful completion. @@ -2667,27 +2727,51 @@ public:  	// Error  	/*virtual*/ void error(U32 status, const std::string& reason)  	{ -		llwarns << "appearance update request failed, reason: " << reason << llendl; +		llwarns << "appearance update request failed, status: " << status << " reason: " << reason << llendl; +		F32 seconds_to_wait; +		if (mRetryPolicy->shouldRetry(status,seconds_to_wait)) +		{ +			llinfos << "retrying" << llendl; +			doAfterInterval(boost::bind(&LLAppearanceMgr::requestServerAppearanceUpdate, +										LLAppearanceMgr::getInstance(), +										LLCurl::ResponderPtr(this)), +							seconds_to_wait); +		} +		else +		{ +			llwarns << "giving up after too many retries" << llendl; +		}  	}	 + +	LLPointer<LLHTTPRetryPolicy> mRetryPolicy;  }; -void LLAppearanceMgr::requestServerAppearanceUpdate() +void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr)  {  	if (!gAgent.getRegion())  	{  		llwarns << "Region not set, cannot request server appearance update" << llendl;  	} +	if (gAgent.getRegion()->getCentralBakeVersion()==0) +	{ +		llwarns << "Region does not support baking" << llendl; +	}  	std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance");	  	if (url.empty())  	{ -		llwarns << "NO CAP for UpdateAvatarAppearance. This is a bug." << llendl; +		llwarns << "No cap for UpdateAvatarAppearance." << llendl;  		return;  	}  	LLSD body;  	S32 cof_version = getCOFVersion();  	body["cof_version"] = cof_version; -	LLHTTPClient::post(url, body, new RequestAgentUpdateAppearanceResponder); +	//LLCurl::ResponderPtr responder_ptr; +	if (!responder_ptr.get()) +	{ +		responder_ptr = new RequestAgentUpdateAppearanceResponder; +	} +	LLHTTPClient::post(url, body, responder_ptr);  	llassert(cof_version >= mLastUpdateRequestCOFVersion);  	mLastUpdateRequestCOFVersion = cof_version;  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 4baee10218..01ed66711c 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -187,7 +187,7 @@ public:  	bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; } -	void requestServerAppearanceUpdate(); +	void requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr = NULL);  protected:  	LLAppearanceMgr(); diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp index 357a6582d1..79ec43dfe9 100644..100755 --- a/indra/newview/llcallbacklist.cpp +++ b/indra/newview/llcallbacklist.cpp @@ -27,6 +27,7 @@  #include "llviewerprecompiledheaders.h"  #include "llcallbacklist.h" +#include "lleventtimer.h"  // Library includes  #include "llerror.h" @@ -180,6 +181,54 @@ void doOnIdleRepeating(bool_func_t callable)  	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);  } +class NullaryFuncEventTimer: public LLEventTimer +{ +public: +	NullaryFuncEventTimer(nullary_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} + +private: +	BOOL tick() +	{ +		mCallable(); +		return TRUE; +	} + +	nullary_func_t mCallable; +}; + +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds) +{ +	new NullaryFuncEventTimer(callable, seconds); +} + +class BoolFuncEventTimer: public LLEventTimer +{ +public: +	BoolFuncEventTimer(bool_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} +private: +	BOOL tick() +	{ +		return mCallable(); +	} + +	bool_func_t mCallable; +}; + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds) +{ +	new BoolFuncEventTimer(callable, seconds); +} +  #ifdef _DEBUG  void test1(void *data) diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h index 97f3bfd9ee..0516c9cdb4 100644 --- a/indra/newview/llcallbacklist.h +++ b/indra/newview/llcallbacklist.h @@ -61,6 +61,12 @@ void doOnIdleOneTime(nullary_func_t callable);  // Repeatedly call a callable in idle loop until it returns true.  void doOnIdleRepeating(bool_func_t callable); +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds); + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds); +  extern LLCallbackList gIdleCallbacks;  #endif diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index f4d0110b0f..eb92902de9 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -183,7 +183,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)  void LLInventoryModelBackgroundFetch::backgroundFetch()  { -	if (mBackgroundFetchActive && gAgent.getRegion()) +	if (mBackgroundFetchActive && gAgent.getRegion() && gAgent.getRegion()->capabilitiesReceived())  	{  		// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.  		if (gSavedSettings.getBOOL("UseHTTPInventory"))  diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index db08c16f15..43bfb4442b 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -351,7 +351,7 @@ public:  			if (!success)  			{  				worker->setGetStatus(status, reason); -// 				llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl; + 				llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << " id: " << mID <<llendl;  			}  			data_size = worker->callbackHttpGet(channels, buffer, partial, success); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 94533d97df..f5d2fc6888 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1746,6 +1746,11 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)  std::string LLViewerRegion::getCapability(const std::string& name) const  { +	if (!capabilitiesReceived() && (name!=std::string("Seed")) && (name!=std::string("ObjectMedia"))) +	{ +		llwarns << "getCapability called before caps received" << llendl; +	} +	  	CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name);  	if(iter == mImpl->mCapabilities.end())  	{ diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a73ce1d115..37f2fd3520 100644..100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1946,8 +1946,10 @@ void LLViewerFetchedTexture::setIsMissingAsset()  	}  	else  	{ -		//it is normal no map tile on an empty region. -		//llwarns << mUrl << ": Marking image as missing" << llendl; +		// This may or may not be an error - it is normal to have no +		// map tile on an empty region, but bad if we're failing on a +		// server bake texture. +		llwarns << mUrl << ": Marking image as missing" << llendl;  	}  	if (mHasFetcher)  	{ diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index b89247ec6f..eeb962a124 100644..100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -228,7 +228,9 @@ void LLViewerTextureList::shutdown()  		if (!image->hasGLTexture() ||  			!image->getUseDiscard() ||  			image->needsAux() || -			image->getTargetHost() != LLHost::invalid) +			image->getTargetHost() != LLHost::invalid || +			!image->getUrl().empty() +			)  		{  			continue; // avoid UI, baked, and other special images  		} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index a49ecc0127..160f498443 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2888,11 +2888,15 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		{  			central_bake_version = getRegion()->getCentralBakeVersion();  		} -		addDebugText(llformat("mUseLocalAppearance: %d\nmIsEditingAppearance: %d\n" -							  "mUseServerBakes %d\ncentralBakeVersion %d", +		addDebugText(llformat("mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d",  							  mUseLocalAppearance, mIsEditingAppearance,  							  mUseServerBakes, central_bake_version));  	} +	if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +	{ +		if (!mBakedTextureDebugText.empty()) +			addDebugText(mBakedTextureDebugText); +	}  	if (LLVOAvatar::sShowAnimationDebug)  	{ @@ -5767,6 +5771,25 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const  	return mMotionController.findMotion(id);  } +void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) +{ +	if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +	{ +		avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +		avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +		for (; iter != end; ++iter) +		{ +			LLAvatarJointMesh* mesh = (*iter); +			if (mesh) +			{ +				{ +					mesh->setColor(color); +				} +			} +		} +	} +} +  //-----------------------------------------------------------------------------  // updateMeshTextures()  // Uses the current TE values to set the meshes' and layersets' textures. @@ -5774,14 +5797,17 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const  // virtual  void LLVOAvatar::updateMeshTextures()  { -    // llinfos << "updateMeshTextures" << llendl; +	mBakedTextureDebugText.clear(); +	  	// if user has never specified a texture, assign the default  	for (U32 i=0; i < getNumTEs(); i++)  	{  		const LLViewerTexture* te_image = getImage(i, 0);  		if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT))  		{ -			setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered. +			// IMG_DEFAULT_AVATAR = a special texture that's never rendered. +			const LLUUID& image_id = (i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR); +			setImage(i, LLViewerTextureManager::getFetchedTexture(image_id), 0);   		}  	} @@ -5800,21 +5826,22 @@ void LLVOAvatar::updateMeshTextures()  	std::vector<BOOL> use_lkg_baked_layer; // lkg = "last known good"  	use_lkg_baked_layer.resize(mBakedTextureDatas.size(), false); +	mBakedTextureDebugText +=          "indx layerset linvld ltda ilb ulkg ltid\n";  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{  		is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex); - +		LLViewerTexLayerSet* layerset = NULL; +		bool layerset_invalid = false;  		if (!other_culled)  		{  			// When an avatar is changing clothes and not in Appearance mode, -			// use the last-known good baked texture until it finish the first +			// use the last-known good baked texture until it finishes the first  			// render of the new layerset. -			LLViewerTexLayerSet* layerset = getTexLayerSet(i); -			const BOOL layerset_invalid = layerset -										  && ( !layerset->getViewerComposite()->isInitialized() -										  || !layerset->isLocalTextureDataAvailable() ); +			layerset = getTexLayerSet(i); +			layerset_invalid = layerset && ( !layerset->getViewerComposite()->isInitialized() +											 || !layerset->isLocalTextureDataAvailable() );  			use_lkg_baked_layer[i] = (!is_layer_baked[i]  -									  && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR)  +									  && (mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR)   									  && layerset_invalid);  			if (use_lkg_baked_layer[i])  			{ @@ -5824,21 +5851,44 @@ void LLVOAvatar::updateMeshTextures()  		else  		{  			use_lkg_baked_layer[i] = (!is_layer_baked[i]  -									  && mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR); +									  && mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR);  		} +		std::string last_id_string; +		if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT_AVATAR) +			last_id_string = "A"; +		else if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT) +			last_id_string = "D"; +		else +			last_id_string = "*"; +		bool is_ltda = layerset +			&& layerset->getViewerComposite()->isInitialized() +			&& layerset->isLocalTextureDataAvailable(); +		mBakedTextureDebugText += llformat("%4d   %4s     %4d %4d %4d %4d %4s\n", +										   i, +										   (layerset?"*":"0"), +										   layerset_invalid, +										   is_ltda, +										   is_layer_baked[i], +										   use_lkg_baked_layer[i], +										   last_id_string.c_str());  	}  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{ +		debugColorizeSubMeshes(i, LLColor4::white); +  		LLViewerTexLayerSet* layerset = getTexLayerSet(i);  		if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() )  		{  			LLViewerFetchedTexture* baked_img; -			const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureIndex); +#ifndef LL_RELEASE_FOR_DOWNLOAD +			LLViewerFetchedTexture* existing_baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID); +#endif +			const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureID);  			if (!url.empty())  			{ -				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureIndex); +				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureID);  			}  			else  			{ @@ -5849,10 +5899,14 @@ void LLVOAvatar::updateMeshTextures()  					llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl;  				} -				baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host ); +				baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureID, target_host );  			} +			llassert(baked_img == existing_baked_img);  			mBakedTextureDatas[i].mIsUsed = TRUE; + +			debugColorizeSubMeshes(i,LLColor4::red); +  			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();  			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end();  			for (; iter != end; ++iter) @@ -5861,25 +5915,26 @@ void LLVOAvatar::updateMeshTextures()  				if (mesh)  				{  					mesh->setTexture( baked_img ); -					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) -					{ -						mesh->setColor(LLColor4::red); -					}  				}  			}  		}  		else if (!isUsingLocalAppearance() && is_layer_baked[i])  		{ -			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; -			if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex ) +			LLViewerFetchedTexture* baked_img = +				LLViewerTextureManager::staticCastToFetchedTexture( +					getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; +			if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureID )  			{ -				// Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing). +				// Even though the file may not be finished loading, +				// we'll consider it loaded and use it (rather than +				// doing compositing).  				useBakedTexture( baked_img->getID() );  			}  			else  			{  				mBakedTextureDatas[i].mIsLoaded = FALSE; -				if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) +				if ( (baked_img->getID() != IMG_INVISIBLE) && +					 ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )  				{			  					baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),   						src_callback_list, paused);	 @@ -5890,9 +5945,12 @@ void LLVOAvatar::updateMeshTextures()  		}  		else if (layerset && isUsingLocalAppearance())  		{ +			debugColorizeSubMeshes(i,LLColor4::yellow ); +  			layerset->createComposite();  			layerset->setUpdatesEnabled( TRUE );  			mBakedTextureDatas[i].mIsUsed = FALSE; +  			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();  			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end();  			for (; iter != end; ++iter) @@ -5901,28 +5959,12 @@ void LLVOAvatar::updateMeshTextures()  				if (mesh)  				{  					mesh->setLayerSet( layerset ); -					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) -					{ -						mesh->setColor( LLColor4::yellow ); -					}  				}  			}  		}  		else  		{ -			if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) -			{ -				avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); -				avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); -				for (; iter != end; ++iter) -				{ -					LLAvatarJointMesh* mesh = (*iter); -					if (mesh) -					{ -						mesh->setColor( LLColor4::blue ); -					} -				} -			} +			debugColorizeSubMeshes(i,LLColor4::blue);  		}  	} @@ -5947,7 +5989,8 @@ void LLVOAvatar::updateMeshTextures()  	}  -	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); +	for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = +			 LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin();  		 baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();  		 ++baked_iter)  	{ @@ -6241,7 +6284,7 @@ void LLVOAvatar::onFirstTEMessageReceived()  			if (layer_baked)  			{  				LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; -				mBakedTextureDatas[i].mLastTextureIndex = image->getID(); +				mBakedTextureDatas[i].mLastTextureID = image->getID();  				// If we have more than one texture for the other baked layers, we'll want to call this for them too.  				if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )  				{ @@ -6313,9 +6356,11 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value)  		wtype = vparam->getWearableType();  	}  	S32 u8_value = F32_to_U8(value,viewer_param->getMinWeight(),viewer_param->getMaxWeight()); -	apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\"/>\n", +	apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\" loc=\"%s\"/>\n",  					viewer_param->getID(), viewer_param->getName().c_str(), value, u8_value, type_string.c_str(), -					LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str()); +					LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str(), +					param_location_name(vparam->getParamLocation()).c_str() +		);  } @@ -6400,8 +6445,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0);  	} -	mUseServerBakes = (appearance_version > 0); -  	// Only now that we have result of appearance_version can we decide whether to bail out.  	if( isSelf() )  	{ @@ -6409,7 +6452,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		{  			llwarns << avString() << "Received AvatarAppearance message for self in non-server-bake region" << llendl;  		} -		if( mFirstTEMessageReceived && !isUsingServerBakes()) +		if( mFirstTEMessageReceived && (appearance_version == 0))  		{  			return;  		} @@ -6417,25 +6460,34 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	// Check for stale update. -	if (isUsingServerBakes() && isSelf() -		&& this_update_cof_version >= LLViewerInventoryCategory::VERSION_INITIAL -		&& this_update_cof_version < last_update_request_cof_version) +	if (isSelf() +		&& (appearance_version>0) +		&& (this_update_cof_version < last_update_request_cof_version))  	{  		llwarns << "Stale appearance update, wanted version " << last_update_request_cof_version  				<< ", got " << this_update_cof_version << llendl;  		return;  	} + +	if (isSelf() && isEditingAppearance()) +	{ +		llinfos << "ignoring appearance message while in appearance edit" << llendl; +		return; +	} + +	mUseServerBakes = (appearance_version > 0); +  	applyParsedTEMessage(tec);  	// prevent the overwriting of valid baked textures with invalid baked textures  	for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)  	{  		if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex)  -			&& mBakedTextureDatas[baked_index].mLastTextureIndex != IMG_DEFAULT +			&& mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT  			&& baked_index != BAKED_SKIRT)  		{  			setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,  -				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); +				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));  		}  	} @@ -6721,7 +6773,7 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,  									  LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src,  									  S32 discard_level, BOOL final, void* userdata)  { -	//llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl; +	// llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl;  	LLUUID id = src_vi->getID();  	LLUUID *avatar_idp = (LLUUID *)userdata; @@ -6752,12 +6804,6 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,  void LLVOAvatar::useBakedTexture( const LLUUID& id )  { -	 -	/* if(id == head_baked->getID()) -		 mHeadBakedLoaded = TRUE; -		 mLastHeadBakedID = id; -		 mHeadMesh0.setTexture( head_baked ); -		 mHeadMesh1.setTexture( head_baked ); */  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{  		LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 ); @@ -6765,27 +6811,31 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  		{  			LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL;  			mBakedTextureDatas[i].mIsLoaded = true; -			mBakedTextureDatas[i].mLastTextureIndex = id; +			mBakedTextureDatas[i].mLastTextureID = id;  			mBakedTextureDatas[i].mIsUsed = true; -			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); -			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); -			for (; iter != end; ++iter) + +			if (isUsingLocalAppearance())  			{ -				LLAvatarJointMesh* mesh = (*iter); -				if (mesh) +				llinfos << "not changing to baked texture while isUsingLocalAppearance" << llendl; +			} +			else +			{ +				debugColorizeSubMeshes(i,LLColor4::green); + +				avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); +				avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end(); +				for (; iter != end; ++iter)  				{ -					mesh->setTexture( image_baked ); -					if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) +					LLAvatarJointMesh* mesh = (*iter); +					if (mesh)  					{ -						mesh->setColor( LLColor4::green ); +						mesh->setTexture( image_baked );  					}  				}  			} -			if (mBakedTextureDatas[i].mTexLayerSet) -			{ -				//mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); -			} -			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); +			 +			const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = +				LLAvatarAppearanceDictionary::getInstance()->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) @@ -6922,6 +6972,12 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  	apr_file_printf( file, "\t</archetype>\n" );  	apr_file_printf( file, "\n</linden_genepool>\n" ); +	bool ultra_verbose = false; +	if (isSelf() && ultra_verbose) +	{ +		// show the cloned params inside the wearables as well. +		gAgentAvatarp->dumpWearableInfo(outfile); +	}  	// File will close when handle goes out of scope  } @@ -7004,15 +7060,9 @@ void LLVOAvatar::cullAvatarsByPixelArea()  		}  	} -	// runway - this doesn't detect gray/grey state. -	// think we just need to be checking self av since it's the only -	// one with lltexlayer stuff. +	// runway - this doesn't really detect gray/grey state.  	S32 grey_avatars = 0; -	if (LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars)) -	{ -		LLVOAvatar::deleteCachedImages(false); -	} -	else +	if (!LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars))  	{  		if (gFrameTimeSeconds != sUnbakedUpdateTime) // only update once per frame  		{ diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 5f858a2bea..4802476e59 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -595,6 +595,7 @@ private:   **/  public: +	void			debugColorizeSubMeshes(U32 i, const LLColor4& color);  	virtual void 	updateMeshTextures();  	void 			updateSexDependentLayerSets(BOOL upload_bake);  	virtual void	dirtyMesh(); // Dirty the avatar mesh @@ -944,6 +945,7 @@ private:  	F32					mMaxPixelArea;  	F32					mAdjustedPixelArea;  	std::string  		mDebugText; +	std::string			mBakedTextureDebugText;  	//-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a01188d7dc..77deb5e3bc 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1379,7 +1379,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* laye  				const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);  				for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)  				{ -					ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0); +					BOOL tex_avail = (getLocalDiscardLevel(tex_index, wearable_index) >= 0); +					ret &= tex_avail;  				}  			}  			return ret; @@ -1781,6 +1782,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  	local_tex_obj->setID(tex->getID());  	setBakedReady(type,baked_version_ready,index);  } +  //virtual  void LLVOAvatarSelf::setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)  { @@ -2275,30 +2277,30 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  {  	if (!isIndexLocalTexture(type)) return; -	if (!covered_by_baked) +	if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0)  	{ -		if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0) +		F32 desired_pixels; +		desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); + +		if (isUsingLocalAppearance())  		{ -			F32 desired_pixels; -			desired_pixels = llmin(mPixelArea, (F32)getTexImageArea());  			imagep->setBoostLevel(getAvatarBoostLevel()); - -			imagep->resetTextureStats(); -			imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); -			imagep->addTextureStats( desired_pixels / texel_area_ratio );  			imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; -			imagep->forceUpdateBindStats() ; -			if (imagep->getDiscardLevel() < 0) -			{ -				mHasGrey = TRUE; // for statistics gathering -			}  		} -		else +		imagep->resetTextureStats(); +		imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); +		imagep->addTextureStats( desired_pixels / texel_area_ratio ); +		imagep->forceUpdateBindStats() ; +		if (imagep->getDiscardLevel() < 0)  		{ -			// texture asset is missing  			mHasGrey = TRUE; // for statistics gathering  		}  	} +	else +	{ +		// texture asset is missing +		mHasGrey = TRUE; // for statistics gathering +	}  }  LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 wearable_index) const @@ -2777,3 +2779,38 @@ void LLVOAvatarSelf::dumpScratchTextureByteCount()  {  	llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;  } + +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); + +void LLVOAvatarSelf::dumpWearableInfo(LLAPRFile& outfile) +{ +	apr_file_t* file = outfile.getFileHandle(); +	if (!file) +	{ +		return; +	} + +	 +	apr_file_printf( file, "\n<wearable_info>\n" ); + +	LLWearableData *wd = getWearableData(); +	for (S32 type = 0; type < LLWearableType::WT_COUNT; type++) +	{ +		const std::string& type_name = LLWearableType::getTypeName((LLWearableType::EType)type); +		for (U32 j=0; j< wd->getWearableCount((LLWearableType::EType)type); j++) +		{ +			LLViewerWearable *wearable = gAgentWearables.getViewerWearable((LLWearableType::EType)type,j); +			apr_file_printf( file, "\n\t    <wearable type=\"%s\" name=\"%s\"/>\n", +							 type_name.c_str(), wearable->getName().c_str() ); +			LLWearable::visual_param_vec_t v_params; +			wearable->getVisualParams(v_params); +			for (LLWearable::visual_param_vec_t::iterator it = v_params.begin(); +				 it != v_params.end(); ++it) +			{ +				LLVisualParam *param = *it; +				dump_visual_param(file, param, param->getWeight()); +			} +		} +	} +	apr_file_printf( file, "\n</wearable_info>\n" ); +} diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 89bb8bf5c9..eeac5ddaeb 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -364,6 +364,7 @@ public:  	static void		dumpTotalLocalTextureByteCount();  	void			dumpLocalTextures() const;  	static void		dumpScratchTextureByteCount(); +	void			dumpWearableInfo(LLAPRFile& outfile);  	//--------------------------------------------------------------------  	// Avatar Rez Metrics diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 3dfacd70f3..507ce57e79 100644..100755 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -134,6 +134,10 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  			if(filename)  			{ +				if (ifs.is_open()) +				{ +					ifs.close(); +				}  				LLFile::remove(std::string(filename));  			}  		} diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 06f8f8c670..03aedae0a9 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -712,9 +712,6 @@ with the same filename but different name    <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />    <texture name="icon_top_pick.tga" /> -  <texture name="inv_folder_mesh.tga"/> -  <texture name="inv_item_mesh.tga"/> -    <texture name="lag_status_critical.tga" />    <texture name="lag_status_good.tga" />    <texture name="lag_status_warning.tga" /> | 
