diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llspatialpartition.h | 5 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 24 | 
2 files changed, 17 insertions, 12 deletions
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 929f2adc1a..2c09a25e04 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -613,14 +613,15 @@ public:  //class for wrangling geometry out of volumes (implemented in LLVOVolume.cpp)  class LLVolumeGeometryManager: public LLGeometryManager  { -public: + public:  	virtual ~LLVolumeGeometryManager() { }  	virtual void rebuildGeom(LLSpatialGroup* group);  	virtual void rebuildMesh(LLSpatialGroup* group);  	virtual void getGeometry(LLSpatialGroup* group);  	void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE);  	void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type); - + private: +	bool canRenderAsMask(LLFace* facep); // logic helper  };  //spatial partition that uses volume geometry manager (implemented in LLVOVolume.cpp) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c92af140da..ea493d4798 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3201,7 +3201,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  	BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) ||  		(type == LLRenderPass::PASS_INVISIBLE) || -		(type == LLRenderPass::PASS_ALPHA ? facep->isState(LLFace::FULLBRIGHT) : FALSE); +		(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));  	if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))  	{ @@ -3296,6 +3296,16 @@ void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group)  static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume");  static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt"); +bool LLVolumeGeometryManager::canRenderAsMask(LLFace* facep) +{ +	const LLTextureEntry* te = facep->getTextureEntry(); +	return (LLPipeline::sFastAlpha && +		(te->getColor().mV[3] == 1.0f) && +		(!te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible, need to figure out why - for now, avoid +		(te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask +		facep->getTexture()->getIsAlphaMask()); +} +  void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  {  	if (group->changeLOD()) @@ -3421,10 +3431,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  				if (type == LLDrawPool::POOL_ALPHA)  				{ -					if (LLPipeline::sFastAlpha && -					    (te->getColor().mV[VW] == 1.0f) && -					    (!te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible, need to figure out why - for now, avoid -					    facep->getTexture()->getIsAlphaMask()) +					if (canRenderAsMask(facep))  					{ //can be treated as alpha mask  						simple_faces.push_back(facep);  					} @@ -3768,15 +3775,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			const LLTextureEntry* te = facep->getTextureEntry(); -			BOOL is_alpha = facep->getPoolType() == LLDrawPool::POOL_ALPHA ? TRUE : FALSE; +			BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;  			if (is_alpha)  			{  				// can we safely treat this as an alpha mask? -				if (LLPipeline::sFastAlpha && -				    (te->getColor().mV[VW] == 1.0f) && -				    (!te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible, need to figure out why - for now, avoid -				    facep->getTexture()->getIsAlphaMask()) +				if (canRenderAsMask(facep))  				{  					if (te->getFullbright())  					{  | 
