From 153398a3d76f443a44159ce7933e109d6bc97449 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Sun, 10 Nov 2019 21:17:34 -0500
Subject: [PATCH] Fix some bugs with ssao samples at screen edge

---
 .../shaders/class1/deferred/SSAOF.glsl           | 16 ++++++++++++++--
 indra/newview/pipeline.cpp                       |  1 -
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl
index 0c0a779279..ee070b8d4f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl
@@ -43,6 +43,13 @@ uniform float ssao_factor;
 uniform vec2 kern_scale;
 uniform vec2 noise_scale;
 
+uniform float seconds60;
+
+float rand(vec2 co)
+{
+    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
+}
+
 vec3 decode_normal (vec2 enc)
 {
     vec2 fenc = enc*4-2;
@@ -102,8 +109,13 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
     vec2 samppos_screen = pos_screen + scale * reflect(getKern(i), noise_reflect);
 
     // if sample is out-of-screen then give it no weight by continuing
-    //if (any(lessThan(samppos_screen.xy, vec2(0.0, 0.0))) ||
-    //  any(greaterThan(samppos_screen.xy, vec2(screen_res.xy)))) continue;
+    if (any(lessThan(samppos_screen.xy, vec2(0.0, 0.0))) ||
+      any(greaterThan(samppos_screen.xy, vec2(pos_screen.xy))))
+	{
+		// Try to bring the sample back on screen
+		float rnd1 = rand(pos_screen.xy + vec2(33.0 * (seconds60 + i)));
+		samppos_screen.xy = vec2(rnd1, rand(pos_screen.yx + vec2(55.0 * (seconds60 + i)))) /  kern_scale;
+	}
 
     vec3 samppos_world = getPosition(samppos_screen).xyz; 
 			
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c9b10509cf..04508dd5f3 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7354,7 +7354,6 @@ void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield)
 				shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
 				shader->uniform1f(LLShaderMgr::DOF_WIDTH, CameraDoFResScale - CameraDoFResScale / dof_width);
 				shader->uniform1f(LLShaderMgr::DOF_HEIGHT, CameraDoFResScale - CameraDoFResScale / dof_height);
-				shader->uniform1f(LLShaderMgr::SECONDS60, fmodf(LLTimer::getElapsedSeconds(), 60.f));
 
 				drawFullScreenRect();
 
-- 
GitLab