From f5c9196b365eee1032ead18a36320384deffc81a Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Thu, 8 Apr 2010 12:42:10 -0500
Subject: Fix for shadows going crazy at high altitudes.

---
 indra/newview/pipeline.cpp | 76 ++++++++++++++++++++++++++++------------------
 1 file changed, 47 insertions(+), 29 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 2aa0210a80..e3463574a7 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -193,6 +193,7 @@ std::string gPoolNames[] =
 };
 
 void drawBox(const LLVector3& c, const LLVector3& r);
+void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
 
 U32 nhpo2(U32 v) 
 {
@@ -1531,8 +1532,10 @@ BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
 
 BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3& max)
 {
-	min = LLVector3(F32_MAX, F32_MAX, F32_MAX);
-	max = LLVector3(-F32_MAX, -F32_MAX, -F32_MAX);
+	const F32 X = 65536.f;
+
+	min = LLVector3(X,X,X);
+	max = LLVector3(-X,-X,-X);
 
 	U32 saved_camera_id = LLViewerCamera::sCurCameraID;
 	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
@@ -3667,12 +3670,12 @@ void LLPipeline::renderDebug()
 
 		for (U32 i = 0; i < 8; i++)
 		{
+			LLVector3* frust = mShadowCamera[i].mAgentFrustum;
+
 			if (i > 3)
-			{
+			{ //render shadow frusta as volumes
 				gGL.color4fv(col+(i-4)*4);	
 			
-				LLVector3* frust = mShadowCamera[i].mAgentFrustum;
-
 				gGL.begin(LLRender::TRIANGLE_STRIP);
 				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV);
 				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV);
@@ -3700,31 +3703,46 @@ void LLPipeline::renderDebug()
 	
 			if (i < 4)
 			{
-				gGL.begin(LLRender::LINES);
-				
+
+				//render visible point cloud
+				gGL.flush();
+				glPointSize(8.f);
+				gGL.begin(LLRender::POINTS);
+
 				F32* c = col+i*4;
+				gGL.color3fv(c);
+
 				for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j)
-				{
+				{	
+					gGL.vertex3fv(mShadowFrustPoints[i][j].mV);
 					
-					gGL.color3fv(c);
+				}
+				gGL.end();
 
-					for (U32 k = 0; k < mShadowFrustPoints[i].size(); ++k)
-					{
-						if (j != k)
-						{
-							gGL.vertex3fv(mShadowFrustPoints[i][j].mV);
-							gGL.vertex3fv(mShadowFrustPoints[i][k].mV);
-						}
-					}
+				gGL.flush();
+				glPointSize(1.f);
 
-					if (!mShadowFrustOrigin[i].isExactlyZero())
-					{
-						gGL.vertex3fv(mShadowFrustPoints[i][j].mV);
-						gGL.color4f(1,1,1,1);
-						gGL.vertex3fv(mShadowFrustOrigin[i].mV);
-					}
-				}
+				LLVector3* ext = mShadowExtents[i]; 
+				LLVector3 pos = (ext[0]+ext[1])*0.5f;
+				LLVector3 size = (ext[1]-ext[0])*0.5f;
+				drawBoxOutline(pos, size);
+
+				//render camera frustum splits as outlines
+				gGL.begin(LLRender::LINES);
+				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[1].mV);
+				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[2].mV);
+				gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[3].mV);
+				gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[0].mV);
+				gGL.vertex3fv(frust[4].mV); gGL.vertex3fv(frust[5].mV);
+				gGL.vertex3fv(frust[5].mV); gGL.vertex3fv(frust[6].mV);
+				gGL.vertex3fv(frust[6].mV); gGL.vertex3fv(frust[7].mV);
+				gGL.vertex3fv(frust[7].mV); gGL.vertex3fv(frust[4].mV);
+				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV);
+				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV);
+				gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);
+				gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);
 				gGL.end();
+
 			}
 
 			/*for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
@@ -7721,14 +7739,14 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 				//get point of intersection of 3 planes "p"
 				LLVector3 p = (-d1*(n2%n3)-d2*(n3%n1)-d3*(n1%n2))/(n1*(n2%n3));
 				
-				if (llround(p*n1+d1, 0.0001f) == 0.f &&
-					llround(p*n2+d2, 0.0001f) == 0.f &&
-					llround(p*n3+d3, 0.0001f) == 0.f)
+				if (llround(p*n1+d1, 0.1f) == 0.f &&
+					llround(p*n2+d2, 0.1f) == 0.f &&
+					llround(p*n3+d3, 0.1f) == 0.f)
 				{ //point is on all three planes
 					BOOL found = TRUE;
 					for (U32 l = 0; l < ps.size() && found; ++l)
 					{
-						if (llround(ps[l].dist(p), 0.0001f) > 0.0f)
+						if (llround(ps[l].dist(p), 0.1f) > 0.0f)
 						{ //point is above some plane, not contained
 							found = FALSE;	
 						}
@@ -8173,7 +8191,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 		shadow_cam = camera;
 		shadow_cam.setFar(16.f);
 	
-		LLViewerCamera::updateFrustumPlanes(shadow_cam);
+		LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
 
 		LLVector3* frust = shadow_cam.mAgentFrustum;
 
-- 
cgit v1.2.3


From 1df3e85d2d73820a3129ebeb1a3e4c88338e5a93 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Thu, 8 Apr 2010 20:42:55 -0500
Subject: Total fix for shadows going wonky at altitude.

---
 indra/newview/llspatialpartition.cpp |  7 +--
 indra/newview/pipeline.cpp           | 95 ++++++++++++++++++++++--------------
 2 files changed, 61 insertions(+), 41 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 3742f70df5..77c38798d1 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -1924,11 +1924,8 @@ public:
 			return;
 		}
 		
-		if (mRes == 2)
-		{
-			//fully in, don't traverse further (won't effect extents
-		}
-		else if (mRes && group->isState(LLSpatialGroup::SKIP_FRUSTUM_CHECK))
+		if ((mRes && group->isState(LLSpatialGroup::SKIP_FRUSTUM_CHECK)) ||
+			mRes == 2)
 		{	//don't need to do frustum check
 			LLSpatialGroup::OctreeTraveler::traverse(n);
 		}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e3463574a7..fd1445b33e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -3674,6 +3674,11 @@ void LLPipeline::renderDebug()
 
 			if (i > 3)
 			{ //render shadow frusta as volumes
+				if (mShadowFrustPoints[i-4].empty())
+				{
+					continue;
+				}
+
 				gGL.color4fv(col+(i-4)*4);	
 			
 				gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -3704,44 +3709,47 @@ void LLPipeline::renderDebug()
 			if (i < 4)
 			{
 
-				//render visible point cloud
-				gGL.flush();
-				glPointSize(8.f);
-				gGL.begin(LLRender::POINTS);
+				if (i == 0 || !mShadowFrustPoints[i].empty())
+				{
+					//render visible point cloud
+					gGL.flush();
+					glPointSize(8.f);
+					gGL.begin(LLRender::POINTS);
 
-				F32* c = col+i*4;
-				gGL.color3fv(c);
+					F32* c = col+i*4;
+					gGL.color3fv(c);
 
-				for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j)
-				{	
-					gGL.vertex3fv(mShadowFrustPoints[i][j].mV);
-					
+					for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j)
+					{	
+						gGL.vertex3fv(mShadowFrustPoints[i][j].mV);
+						
+					}
+					gGL.end();
+
+					gGL.flush();
+					glPointSize(1.f);
+
+					LLVector3* ext = mShadowExtents[i]; 
+					LLVector3 pos = (ext[0]+ext[1])*0.5f;
+					LLVector3 size = (ext[1]-ext[0])*0.5f;
+					drawBoxOutline(pos, size);
+
+					//render camera frustum splits as outlines
+					gGL.begin(LLRender::LINES);
+					gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[1].mV);
+					gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[2].mV);
+					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[3].mV);
+					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[0].mV);
+					gGL.vertex3fv(frust[4].mV); gGL.vertex3fv(frust[5].mV);
+					gGL.vertex3fv(frust[5].mV); gGL.vertex3fv(frust[6].mV);
+					gGL.vertex3fv(frust[6].mV); gGL.vertex3fv(frust[7].mV);
+					gGL.vertex3fv(frust[7].mV); gGL.vertex3fv(frust[4].mV);
+					gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV);
+					gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV);
+					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);
+					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);
+					gGL.end();
 				}
-				gGL.end();
-
-				gGL.flush();
-				glPointSize(1.f);
-
-				LLVector3* ext = mShadowExtents[i]; 
-				LLVector3 pos = (ext[0]+ext[1])*0.5f;
-				LLVector3 size = (ext[1]-ext[0])*0.5f;
-				drawBoxOutline(pos, size);
-
-				//render camera frustum splits as outlines
-				gGL.begin(LLRender::LINES);
-				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[1].mV);
-				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[2].mV);
-				gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[3].mV);
-				gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[0].mV);
-				gGL.vertex3fv(frust[4].mV); gGL.vertex3fv(frust[5].mV);
-				gGL.vertex3fv(frust[5].mV); gGL.vertex3fv(frust[6].mV);
-				gGL.vertex3fv(frust[6].mV); gGL.vertex3fv(frust[7].mV);
-				gGL.vertex3fv(frust[7].mV); gGL.vertex3fv(frust[4].mV);
-				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV);
-				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV);
-				gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);
-				gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);
-				gGL.end();
 
 			}
 
@@ -8107,16 +8115,31 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 	at.normVec();
 	
 	
+	LLCamera main_camera = camera;
+	
 	F32 near_clip = 0.f;
 	{
 		//get visible point cloud
 		std::vector<LLVector3> fp;
 
+		main_camera.calcAgentFrustumPlanes(main_camera.mAgentFrustum);
+		
 		LLVector3 min,max;
-		getVisiblePointCloud(camera,min,max,fp);
+		getVisiblePointCloud(main_camera,min,max,fp);
 
 		if (fp.empty())
 		{
+			if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA))
+			{
+				mShadowCamera[0] = main_camera;
+				mShadowExtents[0][0] = min;
+				mShadowExtents[0][1] = max;
+
+				mShadowFrustPoints[0].clear();
+				mShadowFrustPoints[1].clear();
+				mShadowFrustPoints[2].clear();
+				mShadowFrustPoints[3].clear();
+			}
 			mRenderTypeMask = type_mask;
 			return;
 		}
-- 
cgit v1.2.3


From b13af3b8baa05d20ae9f33046f100596182f6be0 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Fri, 9 Apr 2010 01:42:50 -0500
Subject: Tweak bias on projectors.  Fix some silly shader mistakes.

---
 indra/newview/app_settings/settings.xml            |  2 +-
 .../shaders/class2/deferred/sunLightF.glsl         | 29 ++++------------------
 .../shaders/class2/deferred/sunLightSSAOF.glsl     | 16 +++++++++---
 indra/newview/lldrawpoolavatar.cpp                 |  5 ++++
 4 files changed, 23 insertions(+), 29 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b9647d0148..fa8dccd659 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6524,7 +6524,7 @@
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
-    <real>-0.008</real>
+    <real>-0.0005</real>
   </map>
   <key>RenderSpotShadowOffset</key>
   <map>
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index 4974bbef9e..46db3c990c 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -75,28 +75,10 @@ float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
 	//return shadow;
 }
 
-float pcfSpotShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
-{
-	stc.xyz /= stc.w;
-	stc.z += spot_shadow_bias*scl;
-	
-	float cs = shadow2DRect(shadowMap, stc.xyz).x;
-	float shadow = cs;
-
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs);
-			
-	return shadow/5.0;
-	
-	//return shadow;
-}
-
 float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
 {
 	stc.xyz /= stc.w;
-	stc.z += shadow_bias*scl;
+	stc.z += spot_shadow_bias*scl;
 	
 	float cs = shadow2D(shadowMap, stc.xyz).x;
 	float shadow = cs;
@@ -107,8 +89,7 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
 	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs);
 	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
 	shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
-	
-			
+				
 	return shadow/5.0;
 	
 	//return shadow;
@@ -200,15 +181,15 @@ void main()
 	gl_FragColor[0] = shadow;
 	gl_FragColor[1] = 1.0;
 	
-	spos.xyz = shadow_pos*offset*spot_shadow_offset;
+	spos.xyz = shadow_pos+offset*spot_shadow_offset;
 	
 	//spotlight shadow 1
 	vec4 lpos = shadow_matrix[4]*spos;
-	gl_FragColor[2] = pcfSpotShadow(shadowMap4, lpos, 0.8).x; 
+	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8); 
 	
 	//spotlight shadow 2
 	lpos = shadow_matrix[5]*spos;
-	gl_FragColor[3] = pcfSpotShadow(shadowMap5, lpos, 0.8).x; 
+	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8); 
 
 	//gl_FragColor.rgb = pos.xyz;
 	//gl_FragColor.b = shadow;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index d77d17942a..a0dfc96f14 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -40,6 +40,9 @@ uniform vec2 proj_shadow_res;
 uniform float shadow_bias;
 uniform float shadow_offset;
 
+uniform float spot_shadow_bias;
+uniform float spot_shadow_offset;
+
 vec4 getPosition(vec2 pos_screen)
 {
 	float depth = texture2DRect(depthMap, pos_screen.xy).a;
@@ -134,7 +137,7 @@ float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
 float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
 {
 	stc.xyz /= stc.w;
-	stc.z += shadow_bias*scl;
+	stc.z += spot_shadow_bias*scl;
 	
 	float cs = shadow2D(shadowMap, stc.xyz).x;
 	float shadow = cs;
@@ -173,7 +176,10 @@ void main()
 	float shadow = 1.0;
 	float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
 
-	vec4 spos = vec4(pos.xyz + displace*norm + vary_light.xyz * (1.0-dp_directional_light)*shadow_offset, 1.0);
+	vec3 shadow_pos = pos.xyz + displace*norm;
+	vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+	
+	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
 	
 	if (spos.z > -shadow_clip.w)
 	{	
@@ -235,13 +241,15 @@ void main()
 	gl_FragColor[0] = shadow;
 	gl_FragColor[1] = calcAmbientOcclusion(pos, norm);
 	
+	spos.xyz = shadow_pos+offset*spot_shadow_offset;
+	
 	//spotlight shadow 1
 	vec4 lpos = shadow_matrix[4]*spos;
-	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8).x; 
+	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8); 
 	
 	//spotlight shadow 2
 	lpos = shadow_matrix[5]*spos;
-	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8).x; 
+	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8); 
 
 	//gl_FragColor.rgb = pos.xyz;
 	//gl_FragColor.b = shadow;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 9311a5f60e..23211d7090 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -314,6 +314,11 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
 		return;
 	}
 	
+	if (sShaderLevel > 0)
+	{
+		gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
+	}
+
 	avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
 
 }
-- 
cgit v1.2.3