diff options
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolsimple.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 2 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 55 | 
6 files changed, 58 insertions, 24 deletions
| diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index a8abe9a267..1f5829c7ec 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -253,6 +253,10 @@ void LLDrawPoolAlpha::render(S32 pass)  				simple_shader->setMinimumAlpha(0.33f);  				pushMaskBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +				pushMaskBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +				pushMaskBatches(LLRenderPass::PASS_SPECMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +				pushMaskBatches(LLRenderPass::PASS_NORMMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +				pushMaskBatches(LLRenderPass::PASS_NORMSPEC_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);  			}  			if (fullbright_shader)  			{ diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 6e0ea78af2..1a6293c010 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -198,7 +198,11 @@ void LLDrawPoolSimple::render(S32 pass)  			if (LLPipeline::sRenderDeferred)  			{ //if deferred rendering is enabled, bump faces aren't registered as simple  				//render bump faces here as simple so bump faces will appear under water -				pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE); +				pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);			 +				pushBatches(LLRenderPass::PASS_MATERIAL, mask, TRUE, TRUE); +				pushBatches(LLRenderPass::PASS_SPECMAP, mask, TRUE, TRUE); +				pushBatches(LLRenderPass::PASS_NORMMAP, mask, TRUE, TRUE); +				pushBatches(LLRenderPass::PASS_NORMSPEC, mask, TRUE, TRUE);		  			}  		}  		else @@ -405,12 +409,20 @@ void LLDrawPoolFullbright::render(S32 pass)  		fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f);  		U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;  		pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE); +		pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask, TRUE, TRUE); +		pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask, TRUE, TRUE); +		pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask, TRUE, TRUE); +		pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask, TRUE, TRUE);  	}  	else  	{  		gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));  		U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;  		renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask); +		pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask); +		pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask); +		pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask); +		pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask);  	}  	stop_glerror(); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 3d6acedd02..8f8b35c578 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1311,6 +1311,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	{  		if (tep)  		{ +			LLMaterial* mat = tep->getMaterialParams().get(); +  			GLfloat alpha[4] =  			{  				0.00f, @@ -1319,7 +1321,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				0.75f  			}; -			if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny()))) +			if ((!LLPipeline::sRenderDeferred || !mat) && +				getPoolType() != LLDrawPool::POOL_ALPHA &&  +				(LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))  			{  				color.mV[3] = U8 (alpha[tep->getShiny()] * 255);  			} diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 7ec0d7df58..f42586c715 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4639,6 +4639,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,  	mFace(NULL),  	mDistance(0.f),  	mDrawMode(LLRender::TRIANGLES), +	mMaterial(NULL),  	mSpecColor(1.0f, 1.0f, 1.0f, 0.5f),  	mEnvIntensity(0.0f),  	mAlphaMaskCutoff(0.5f), diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 13196de1ef..bfb2de6ba6 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -120,7 +120,7 @@ public:  	F32 mDistance;  	U32 mDrawMode; -	LLMaterialID mMaterialID; // If this is null, the following parameters are unused. +	LLMaterial* mMaterial; // If this is null, the following parameters are unused.  	LLPointer<LLViewerTexture> mSpecularMap;  	const LLMatrix4* mSpecularMapMatrix;  	LLPointer<LLViewerTexture> mNormalMap; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b46f4d7351..bc1daa8b10 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3997,6 +3997,11 @@ bool can_batch_texture(LLFace* facep)  		return false;  	} +	if (facep->getTextureEntry()->getMaterialParams().notNull()) +	{ //materials don't work with texture batching yet +		return false; +	} +  	if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA)  	{ //can't batch invisiprims  		return false; @@ -4067,13 +4072,17 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  	U8 index = facep->getTextureIndex(); -	const LLMaterialID& matid = facep->getTextureEntry()->getMaterialID(); +	LLMaterial* mat = LLPipeline::sRenderDeferred ? facep->getTextureEntry()->getMaterialParams().get() : NULL;   	bool batchable = false;  	if (index < 255 && idx >= 0)  	{ -		if (index < draw_vec[idx]->mTextureList.size()) +		if (mat || draw_vec[idx]->mMaterial) +		{ //can't batch textures when materials are present (yet) +			batchable = false; +		} +		else if (index < draw_vec[idx]->mTextureList.size())  		{  			if (draw_vec[idx]->mTextureList[index].isNull())  			{ @@ -4103,13 +4112,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  		draw_vec[idx]->mBump == bump &&  		draw_vec[idx]->mTextureMatrix == tex_mat &&  		draw_vec[idx]->mModelMatrix == model_mat && -		draw_vec[idx]->mMaterialID == matid) +		draw_vec[idx]->mMaterial == mat)  	{  		draw_vec[idx]->mCount += facep->getIndicesCount();  		draw_vec[idx]->mEnd += facep->getGeomCount();  		draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize()); -		if (index >= draw_vec[idx]->mTextureList.size()) +		if (index < 255 && index >= draw_vec[idx]->mTextureList.size())  		{  			draw_vec[idx]->mTextureList.resize(index+1);  			draw_vec[idx]->mTextureList[index] = tex; @@ -4131,22 +4140,22 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  		draw_vec.push_back(draw_info);  		draw_info->mTextureMatrix = tex_mat;  		draw_info->mModelMatrix = model_mat; -		if (facep->getTextureEntry()->getMaterialParams().notNull()) -			{ +		if (mat) +		{  				// We have a material.  Update our draw info accordingly. -				draw_info->mMaterialID = matid; +				draw_info->mMaterial = mat;  				LLVector4 specColor; -				specColor.mV[0] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[0] * (1.f / 255.f); -				specColor.mV[1] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[1] * (1.f / 255.f); -				specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.f / 255.f); -				specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.f / 255.f); +				specColor.mV[0] = mat->getSpecularLightColor().mV[0] * (1.f / 255.f); +				specColor.mV[1] = mat->getSpecularLightColor().mV[1] * (1.f / 255.f); +				specColor.mV[2] = mat->getSpecularLightColor().mV[2] * (1.f / 255.f); +				specColor.mV[3] = mat->getSpecularLightExponent() * (1.f / 255.f);  				draw_info->mSpecColor = specColor; -				draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.f / 255.f); -				draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.f / 255.f); -				draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode(); +				draw_info->mEnvIntensity = mat->getEnvironmentIntensity() * (1.f / 255.f); +				draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f); +				draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode();  				draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset());  				draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTEOffset()); -			} +		}  		else   		{  			U8 shiny = facep->getTextureEntry()->getShiny(); @@ -4463,7 +4472,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);  						} -						LLMaterial* mat = te->getMaterialParams().get(); +						LLMaterial* mat = LLPipeline::sRenderDeferred ? te->getMaterialParams().get() : NULL;  						if (mat)  						{ @@ -4920,13 +4929,13 @@ struct CompareBatchBreakerModified  		{  			return lte->getFullbright() < rte->getFullbright();  		} -		else if (lhs->getTexture() != rhs->getTexture()) +		else if (LLPipeline::sRenderDeferred && lte->getMaterialParams() != rte->getMaterialParams())  		{ -			return lhs->getTexture() < rhs->getTexture(); +			return lte->getMaterialParams() < rte->getMaterialParams();  		}  		else  		{ -			return lte->getMaterialParams() < rte->getMaterialParams(); +			return lhs->getTexture() < rhs->getTexture();  		}  	}  }; @@ -5057,6 +5066,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  						if (!can_batch_texture(facep))  						{ //face is bump mapped or has an animated texture matrix -- can't   							//batch more than 1 texture at a time +							facep->setTextureIndex(0);  							break;  						} @@ -5107,6 +5117,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  						facep->setTextureIndex(cur_tex);  					}  				} +				else +				{ +					facep->setTextureIndex(0); +				}  				tex = texture_list[0];  			} @@ -5202,8 +5216,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			index_offset += facep->getGeomCount();  			indices_index += facep->getIndicesCount(); - - +			  			//append face to appropriate render batch  			BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA; | 
