diff options
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/llmath/llvolume.cpp | 33 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl | 64 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 14 | 
3 files changed, 74 insertions, 37 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index c3528349eb..f9dd843b92 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -6561,8 +6561,23 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  	LLVector4a normal;  	normal.setCross3(d0,d1); -	normal.normalize3fast(); +	if (normal.dot3(normal).getF32() > F_APPROXIMATELY_ZERO) +	{ +		normal.normalize3fast(); +	} +	else +	{ //degenerate, make up a value +		normal.set(0,0,1); +	} + +	llassert(llfinite(normal.getF32ptr()[0])); +	llassert(llfinite(normal.getF32ptr()[1])); +	llassert(llfinite(normal.getF32ptr()[2])); +	llassert(!llisnan(normal.getF32ptr()[0])); +	llassert(!llisnan(normal.getF32ptr()[1])); +	llassert(!llisnan(normal.getF32ptr()[2])); +	  	for (S32 i = 0; i < num_vertices; i++)  	{  		norm[i].load4a(normal.getF32ptr()); @@ -7048,6 +7063,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  		n[1]->add(c);  		n[2]->add(c); +		llassert(llfinite(c.getF32ptr()[0])); +		llassert(llfinite(c.getF32ptr()[1])); +		llassert(llfinite(c.getF32ptr()[2])); + +		llassert(!llisnan(c.getF32ptr()[0])); +		llassert(!llisnan(c.getF32ptr()[1])); +		llassert(!llisnan(c.getF32ptr()[2])); +  		//even out quad contributions  		n[i%2+1]->add(c);  	} @@ -7277,7 +7300,13 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe  			tangent[a] = tsubn; -			llassert(tangent[a].getLength3().getF32() > 0.f); +			llassert(llfinite(tangent[a].getF32ptr()[0])); +			llassert(llfinite(tangent[a].getF32ptr()[1])); +			llassert(llfinite(tangent[a].getF32ptr()[2])); + +			llassert(!llisnan(tangent[a].getF32ptr()[0])); +			llassert(!llisnan(tangent[a].getF32ptr()[1])); +			llassert(!llisnan(tangent[a].getF32ptr()[2]));  		}  		else  		{ //degenerate, make up a value diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 722020ccfe..b35ba549f6 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -56,38 +56,38 @@ uniform float far_z;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY
 -vec2 encode_normal(vec3 n)
 -{
 -	vec2 sn;
 -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
 -	return sn;
 -}
 -
 -vec3 decode_normal (vec2 enc)
 -{
 -	vec3 n;
 -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
 -	n.z = sqrt(1.0f - dot(n.xy,n.xy));
 -	return n;
 -}
 -#else
 -vec2 encode_normal(vec3 n)
 -{
 -	float f = sqrt(8 * n.z + 8);
 -	return n.xy / f + 0.5;
 -}
 -
 -vec3 decode_normal (vec2 enc)
 -{
 -    vec2 fenc = enc*4-2;
 -    float f = dot(fenc,fenc);
 -    float g = sqrt(1-f/4);
 -    vec3 n;
 -    n.xy = fenc*g;
 -    n.z = 1-f/2;
 -    return n;
 -}
 +#ifdef SINGLE_FP_ONLY +vec2 encode_normal(vec3 n) +{ +	vec2 sn; +	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); +	return sn; +} + +vec3 decode_normal (vec2 enc) +{ +	vec3 n; +	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); +	n.z = sqrt(1.0f - dot(n.xy,n.xy)); +	return n; +} +#else +vec2 encode_normal(vec3 n) +{ +	float f = sqrt(8 * n.z + 8); +	return n.xy / f + 0.5; +} + +vec3 decode_normal (vec2 enc) +{ +    vec2 fenc = enc*4-2; +    float f = dot(fenc,fenc); +    float g = sqrt(1-f/4); +    vec3 n; +    n.xy = fenc*g; +    n.z = 1-f/2; +    return n; +}  #endif  vec4 getPosition(vec2 pos_screen) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 19754774db..bd3be5b9cf 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4551,6 +4551,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						if (mat && LLPipeline::sRenderDeferred)  						{  							U8 alpha_mode = mat->getDiffuseAlphaMode(); +  							bool is_alpha = type == LLDrawPool::POOL_ALPHA &&  								(alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND ||  								te->getColor().mV[3] < 0.999f); @@ -4559,8 +4560,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							{ //this face needs alpha blending, override alpha mode  								alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND;  							} -							U32 mask = mat->getShaderMask(alpha_mode); -							pool->addRiggedFace(facep, mask); + +							if (!is_alpha || te->getColor().mV[3] > 0.f)  // //only add the face if it will actually be visible +							{  +								U32 mask = mat->getShaderMask(alpha_mode); +								pool->addRiggedFace(facep, mask); +							}  						}  						else if (mat)  						{ @@ -4576,7 +4581,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							}  							else if (is_alpha || (te->getColor().mV[3] < 0.999f))  							{ -								pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA : LLDrawPoolAvatar::RIGGED_ALPHA); +								if (te->getColor().mV[3] > 0.f) +								{ +									pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA : LLDrawPoolAvatar::RIGGED_ALPHA); +								}  							}  							else if (gPipeline.canUseVertexShaders()  								&& LLPipeline::sRenderBump  | 
