diff options
| author | Don Kjer <don@lindenlab.com> | 2012-12-20 21:33:30 +0000 | 
|---|---|---|
| committer | Don Kjer <don@lindenlab.com> | 2012-12-20 21:33:30 +0000 | 
| commit | 2f7901ab929e90748e38734555cb861a2645f256 (patch) | |
| tree | 3e091c658f89ae96248afbf06a8986cba1ad5803 | |
| parent | ec2b97110158a225ea1ac35d377b905e70418b77 (diff) | |
Skipping rendering of unneeded morph masks
| -rw-r--r-- | indra/llappearance/lltexlayer.cpp | 34 | ||||
| -rw-r--r-- | indra/llappearance/lltexlayer.h | 2 | 
2 files changed, 25 insertions, 11 deletions
| diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index 6e184beac8..15d531259f 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -1136,7 +1136,8 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)  			}  		}//*/ -		renderMorphMasks(x, y, width, height, net_color); +		const bool force_render = true; +		renderMorphMasks(x, y, width, height, net_color, force_render);  		alpha_mask_specified = TRUE;  		gGL.flush();  		gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA); @@ -1385,8 +1386,13 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)  }  static LLFastTimer::DeclareTimer FTM_RENDER_MORPH_MASKS("renderMorphMasks"); -BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color) +void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, bool force_render)  { +	if (!force_render && !hasMorph()) +	{ +		lldebugs << "skipping renderMorphMasks for " << getUUID() << llendl; +		return; +	}  	LLFastTimer t(FTM_RENDER_MORPH_MASKS);  	BOOL success = TRUE; @@ -1423,6 +1429,11 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  	{  		LLTexLayerParamAlpha* param = *iter;  		success &= param->render( x, y, width, height ); +		if (!success && !force_render) +		{ +			lldebugs << "Failed to render param " << param->getID() << " ; skipping morph mask." << llendl; +			return; +		}  	}  	// Approximates a min() function @@ -1448,25 +1459,29 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  		}  	} -	if( !getInfo()->mStaticImageFileName.empty() ) +	if( !getInfo()->mStaticImageFileName.empty() && getInfo()->mStaticImageIsMask )  	{  		LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);  		if( tex )  		{ -			if(	(tex->getComponents() == 4) || -				( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) +			if(	(tex->getComponents() == 4) || (tex->getComponents() == 1) )  			{  				LLGLSNoAlphaTest gls_no_alpha_test;  				gGL.getTexUnit(0)->bind(tex, TRUE);  				gl_rect_2d_simple_tex( width, height );  				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  			} +			else +			{ +				llwarns << "Skipping rendering of " << getInfo()->mStaticImageFileName  +						<< "; expected 1 or 4 components." << llendl; +			}  		}  	}  	// Draw a rectangle with the layer color to multiply the alpha by that color's alpha.  	// Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); -	if (layer_color.mV[VW] != 1.f) +	if ( !is_approx_equal(layer_color.mV[VW], 1.f) )  	{  		LLGLDisable no_alpha(GL_ALPHA_TEST);  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -1519,8 +1534,6 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC  		mMorphMasksValid = TRUE;  		getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1);  	} - -	return success;  }  static LLFastTimer::DeclareTimer FTM_ADD_ALPHA_MASK("addAlphaMask"); @@ -1535,7 +1548,8 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32  		findNetColor( &net_color );  		// TODO: eliminate need for layer morph mask valid flag  		invalidateMorphMasks(); -		renderMorphMasks(originX, originY, width, height, net_color); +		const bool force_render = false; +		renderMorphMasks(originX, originY, width, height, net_color, force_render);  		alphaData = getAlphaData();  	}  	if (alphaData) @@ -1544,7 +1558,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32  		{  			U8 curAlpha = data[i];  			U16 resultAlpha = curAlpha; -			resultAlpha *= (alphaData[i] + 1); +			resultAlpha *= ( ((U16)alphaData[i]) + 1);  			resultAlpha = resultAlpha >> 8;  			data[i] = (U8)resultAlpha;  		} diff --git a/indra/llappearance/lltexlayer.h b/indra/llappearance/lltexlayer.h index 405d2c7df4..959d6e499a 100644 --- a/indra/llappearance/lltexlayer.h +++ b/indra/llappearance/lltexlayer.h @@ -160,7 +160,7 @@ public:  	BOOL					findNetColor(LLColor4* color) const;  	/*virtual*/ BOOL		blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer  	/*virtual*/ void		gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); -	BOOL					renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color); +	void					renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, bool force_render);  	void					addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height);  	/*virtual*/ BOOL		isInvisibleAlphaMask() const; | 
