diff options
Diffstat (limited to 'indra/newview')
| -rwxr-xr-x | indra/newview/llface.cpp | 42 | ||||
| -rwxr-xr-x | indra/newview/llface.h | 7 | ||||
| -rwxr-xr-x | indra/newview/llviewertexture.cpp | 37 | ||||
| -rwxr-xr-x | indra/newview/llviewertexture.h | 11 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 220 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.h | 26 | 
6 files changed, 313 insertions, 30 deletions
| diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index dc74f4a6ef..de349a03d4 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -330,24 +330,52 @@ void LLFace::dirtyTexture()  				{  					vobj->mLODChanged = TRUE; -			LLVOAvatar* avatar = vobj->getAvatar(); -			if (avatar) -			{ //avatar render cost may have changed -				avatar->updateVisualComplexity(); -			} +					LLVOAvatar* avatar = vobj->getAvatar(); +					if (avatar) +					{ //avatar render cost may have changed +						avatar->updateVisualComplexity(); +					}  				}  				gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE);  			}  		}  	} -			 +  	gPipeline.markTextured(drawablep);  } +void LLFace::notifyAboutCreatingTexture(LLViewerTexture *texture) +{ +	LLDrawable* drawablep = getDrawable(); +	if(mVObjp.notNull() && mVObjp->getVolume()) +	{ +		LLVOVolume *vobj = drawablep->getVOVolume(); +		if(vobj && vobj->notifyAboutCreatingTexture(texture)) +		{ +			gPipeline.markTextured(drawablep); +			gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME); +		} +	} +} + +void LLFace::notifyAboutMissingAsset(LLViewerTexture *texture) +{ +	LLDrawable* drawablep = getDrawable(); +	if(mVObjp.notNull() && mVObjp->getVolume()) +	{ +		LLVOVolume *vobj = drawablep->getVOVolume(); +		if(vobj && vobj->notifyAboutMissingAsset(texture)) +		{ +			gPipeline.markTextured(drawablep); +			gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME); +		} +	} +} +  void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture)  {  	llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); -	 +  	if(mTexture[ch] == new_texture)  	{  		return ; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index d3a561facc..ee545acb94 100755 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -218,7 +218,7 @@ public:  	void        setHasMedia(bool has_media)  { mHasMedia = has_media ;}  	BOOL        hasMedia() const ; -	BOOL                  switchTexture() ; +	BOOL		switchTexture() ;  	//vertex buffer tracking  	void setVertexBuffer(LLVertexBuffer* buffer); @@ -230,10 +230,13 @@ public:  	static U32 getRiggedDataMask(U32 type); +	void	notifyAboutCreatingTexture(LLViewerTexture *texture); +	void	notifyAboutMissingAsset(LLViewerTexture *texture); +  public: //aligned members  	LLVector4a		mExtents[2]; -private:	 +private:  	F32         adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );  	BOOL        calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;  public: diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 4e2eef39d6..e684be4361 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -655,12 +655,36 @@ S8 LLViewerTexture::getType() const  void LLViewerTexture::cleanup()  { +	notifyAboutMissingAsset(); +  	mFaceList[LLRender::DIFFUSE_MAP].clear();  	mFaceList[LLRender::NORMAL_MAP].clear();  	mFaceList[LLRender::SPECULAR_MAP].clear();  	mVolumeList.clear();  } +void LLViewerTexture::notifyAboutCreatingTexture() +{ +	for(U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) +	{ +		for(U32 f = 0; f < mNumFaces[ch]; f++) +		{ +			mFaceList[ch][f]->notifyAboutCreatingTexture(this); +		} +	} +} + +void LLViewerTexture::notifyAboutMissingAsset() +{ +	for(U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) +	{ +		for(U32 f = 0; f < mNumFaces[ch]; f++) +		{ +			mFaceList[ch][f]->notifyAboutMissingAsset(this); +		} +	} +} +  // virtual  void LLViewerTexture::dump()  { @@ -1281,7 +1305,7 @@ void LLViewerFetchedTexture::addToCreateTexture()  			llassert(mNumFaces[j] <= mFaceList[j].size());  			for(U32 i = 0; i < mNumFaces[j]; i++) -		{ +			{  				mFaceList[j][i]->dirtyTexture();  			}  		} @@ -1431,9 +1455,11 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)  		destroyRawImage();  		return FALSE;  	} -	 -		res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); -	 + +	res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); + +	notifyAboutCreatingTexture(); +  	setActive();  	if (!needsToSaveRawImage()) @@ -1441,6 +1467,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)  		mNeedsAux = FALSE;  		destroyRawImage();  	} +  	return res;  } @@ -2132,6 +2159,8 @@ void LLViewerFetchedTexture::setIsMissingAsset(BOOL is_missing)  	}  	if (is_missing)  	{ +		notifyAboutMissingAsset(); +  		if (mUrl.empty())  		{  			LL_WARNS() << mID << ": Marking image as missing" << LL_ENDL; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 05912404e4..aed7e94945 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -169,9 +169,13 @@ public:  	/*virtual*/ void updateBindStatsForTester() ;  protected:  	void cleanup() ; -	void init(bool firstinit) ;	 +	void init(bool firstinit) ;  	void reorganizeFaceList() ;  	void reorganizeVolumeList() ; + +	void notifyAboutMissingAsset(); +	void notifyAboutCreatingTexture(); +  private:  	friend class LLBumpImageList;  	friend class LLUIImageList; @@ -307,10 +311,11 @@ public:  	void addToCreateTexture(); +  	 // ONLY call from LLViewerTextureList  	BOOL createTexture(S32 usename = 0); -	void destroyTexture() ;	 -	 +	void destroyTexture() ; +  	virtual void processTextureStats() ;  	F32  calcDecodePriority() ; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b49543c158..b483ec283c 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2040,27 +2040,225 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  	return res;  } +bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture) +{ //Ok, here we have confirmation about texture creation, check our wait-list +  //and make changes, or return false + +	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); + +		//here we just interesting in DIFFUSE_MAP only! +		if(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 + +	//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); +	} + +	//clear wait-list +	mWaitingTextureInfo.erase(range.first, range.second); + +	return 0 != new_material.size(); +} + +bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture) +{ //Ok, here if we wait information about texture and it's missing +  //then depending from the texture map (diffuse, normal, or specular) +  //make changes in material and confirm it. If not return false. +	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; +	 +	for(mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it) +	{ +		LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); + +		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; +		} //switch +	} //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); +	} + +	//clear wait-list +	mWaitingTextureInfo.erase(range.first, range.second); + +	return 0 != new_material.size(); +} +  S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)  {  	LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams);  	if(pMaterialParams) -	{ -		LLViewerTexture* image = getTEImage(te); -		LLGLenum image_format = image ? image->getPrimaryFormat() : GL_RGB; -		LLMaterialPtr current_material = getTEMaterialParams(te); +	{ //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 +							if(GL_RGBA != img_diffuse->getPrimaryFormat()) +							{ +								bSetDiffuseNone = true; +							} +						} break; +					} +				} //else -		U8 new_diffuse_alpha_mode = pMaterialParams->getDiffuseAlphaMode(); -		if(new_diffuse_alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) +				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())  		{ -			new_diffuse_alpha_mode = (GL_RGB == image_format || 0 == image_format ? LLMaterial::DIFFUSE_ALPHA_MODE_NONE : new_diffuse_alpha_mode); +			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))); +			} + +		} + + +		//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))); +			}  		} -		if(pMaterialParams->getDiffuseAlphaMode() != new_diffuse_alpha_mode) { -			//create new material -			pMaterial = new LLMaterial(pMaterialParams->asLLSD()); -			pMaterial->setDiffuseAlphaMode(new_diffuse_alpha_mode); +		if(new_material) { +			pMaterial = new_material;  			LLMaterialMgr::getInstance()->put(getID(),te,*pMaterial);  		}  	} diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 7503f8c5aa..bbaca316b0 100755 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -372,17 +372,37 @@ private:  	// statics  public: -	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  +	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  	static F32 sLODFactor;				// LOD scale factor  	static F32 sDistanceFactor;			// LOD distance factor -		 +  	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;  	static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient;  protected:  	static S32 sNumLODChanges; -	 +  	friend class LLVolumeImplFlexible; + +public: +	bool notifyAboutCreatingTexture(LLViewerTexture *texture); +	bool notifyAboutMissingAsset(LLViewerTexture *texture); + +private: +	struct material_info  +	{ +		LLRender::eTexIndex map; +		U8 te; + +		material_info(LLRender::eTexIndex map_, U8 te_) +			: map(map_) +			, te(te_) +		{} +	}; + +	typedef std::multimap<LLUUID, material_info> mmap_UUID_MAP_t; +	mmap_UUID_MAP_t	mWaitingTextureInfo; +  };  #endif // LL_LLVOVOLUME_H | 
