diff options
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 91 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.h | 1 | 
3 files changed, 71 insertions, 25 deletions
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 3cc44638b1..5a502b61ab 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4376,8 +4376,8 @@ LLViewerTexture* LLViewerObject::getBakedTextureForMagicId(const LLUUID& id)  	LLVOAvatar* avatar = getAvatar();  	if (avatar)  	{ -		LLAvatarAppearanceDefines::ETextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id)); -		LLViewerTexture* bakedTexture = avatar->getBakedTextureImage(texIndex, avatar->getTE(texIndex)->getID()); +		LLAvatarAppearanceDefines::EBakedTextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id); +		LLViewerTexture* bakedTexture = avatar->getBakedTexture(texIndex);  		if (bakedTexture == NULL || bakedTexture->isMissingAsset())  		{  			return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9e2a69ae65..6e49a92e97 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -7558,6 +7558,33 @@ void LLVOAvatar::updateMeshTextures()  		call_remove_missing = true;  	} +	//refresh bakes on any attached objects +	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); +		iter != mAttachmentPoints.end(); +		++iter) +	{ +		LLViewerJointAttachment* attachment = iter->second; + +		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +			attachment_iter != attachment->mAttachedObjects.end(); +			++attachment_iter) +		{ +			LLViewerObject* attached_object = (*attachment_iter); +			attached_object->refreshBakeTexture(); + +			LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); +			for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); +				iter != child_list.end(); ++iter) +			{ +				LLViewerObject* objectp = *iter; +				if (objectp) +				{ +					objectp->refreshBakeTexture(); +				} +			} +		} +	} +  } @@ -8336,36 +8363,54 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte  	}  	updateMeshTextures(); +	updateMeshVisibility(); -	//refresh bakes on any attached objects -	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); -		iter != mAttachmentPoints.end(); -		++iter) +} + +LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te) +{ +	if (te < 0 || te >= BAKED_NUM_INDICES)  	{ -		LLViewerJointAttachment* attachment = iter->second; +		return NULL; +	} -		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -			attachment_iter != attachment->mAttachedObjects.end(); -			++attachment_iter) -		{ -			LLViewerObject* attached_object = (*attachment_iter); -			attached_object->refreshBakeTexture(); +	BOOL is_layer_baked = isTextureDefined(mBakedTextureDatas[te].mTextureIndex); +	BOOL use_lkg_baked_layer; // lkg = "last known good" +	 +	LLViewerTexLayerSet* layerset = NULL; +	layerset = getTexLayerSet(te); +	BOOL layerset_invalid = layerset && (!layerset->getViewerComposite()->isInitialized() || !layerset->isLocalTextureDataAvailable()); +	use_lkg_baked_layer = (!is_layer_baked && (mBakedTextureDatas[te].mLastTextureID != IMG_DEFAULT_AVATAR) && layerset_invalid); +	if (use_lkg_baked_layer) +	{ +		layerset->setUpdatesEnabled(TRUE); +	} +	else +	{ +		use_lkg_baked_layer = (!is_layer_baked && mBakedTextureDatas[te].mLastTextureID != IMG_DEFAULT_AVATAR); +	} -			LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); -			for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -				iter != child_list.end(); ++iter) -			{ -				LLViewerObject* objectp = *iter; -				if (objectp) -				{ -					objectp->refreshBakeTexture(); -				} -			} -		} +	if (use_lkg_baked_layer && !isUsingLocalAppearance()) +	{ +		LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[te].mLastTextureID); +		return baked_img;  	} +	else if (!isUsingLocalAppearance() && is_layer_baked) +	{ +		LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage(mBakedTextureDatas[te].mTextureIndex, 0), TRUE); +		return baked_img; +	} +	else if (layerset && isUsingLocalAppearance()) +	{ +		layerset->createComposite(); +		layerset->setUpdatesEnabled(TRUE); -	updateMeshVisibility(); +		return layerset->getViewerComposite(); +	} + +	return NULL; +	  }  // static diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 1b0044201f..8d45877a9d 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -655,6 +655,7 @@ public:  	virtual void	dirtyMesh(); // Dirty the avatar mesh  	void 			updateMeshData();  	void			updateMeshVisibility(); +	LLViewerTexture*		getBakedTexture(const U8 te);  protected:  	void 			releaseMeshData();  | 
