From 6162b9208a087f78eba609d3fe9da5c8385f7ade Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Thu, 30 Mar 2023 10:41:04 -0500
Subject: [PATCH] DRTVWR-559 Add RenderAutomaticReflectionProbes control. 
 Tweak automatic exposure.

---
 indra/newview/app_settings/settings.xml       | 11 ++--
 .../shaders/class1/deferred/exposureF.glsl    |  4 +-
 .../deferred/postDeferredGammaCorrect.glsl    |  1 -
 indra/newview/llreflectionmapmanager.cpp      | 27 ++++------
 indra/newview/llviewerregion.cpp              | 52 ++++++++++---------
 5 files changed, 43 insertions(+), 52 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index d6af39f97eb..5ffd610fbaf 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10367,7 +10367,7 @@
     <key>Type</key>
     <string>U32</string>
     <key>Value</key>
-    <real>1</real>
+    <real>2</real>
   </map>
   <key>RenderExposure</key>
   <map>
@@ -10403,18 +10403,17 @@
     <key>Value</key>
     <real>0</real>
   </map>
-  <key>RenderReflectionProbeTextureHackID</key>
+  <key>RenderAutomaticReflectionProbes</key>
   <map>
     <key>Comment</key>
-    <string>HACK -- Any object with a diffuse texture with this ID will be treated as a user override reflection probe. (default is "Violet Info Hub" photo from Library)</string>
+    <string>Automatic reflection probes control.  0 - disable, 1 - Terrain/water only, 2- Terrain/water + objects.  Requires restart.</string>
     <key>Persist</key>
     <integer>1</integer>
     <key>Type</key>
-    <string>String</string>
+    <string>S32</string>
     <key>Value</key>
-    <string>6b186931-05da-eafa-a3ed-a012a33bbfb6</string>
+    <integer>2</integer>
   </map>
-  
   <key>RenderReflectionRes</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
index ff37f9e4b35..b325f555766 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
@@ -46,7 +46,7 @@ float lum(vec3 col)
 
 void main() 
 {
-    float step = 1.0/32.0;
+    float step = 1.0/16.0;
 
     float start = step;
     float end = 1.0-step;
@@ -82,7 +82,7 @@ void main()
 
     float L = lum(col);
 
-    float s = clamp(0.1/L, 0.5, 2.0);
+    float s = clamp(0.1/L, 0.5, 2.5);
 
     float prev = texture(exposureMap, vec2(0.5,0.5)).r;
     s = mix(prev, s, min(dt*2.0, 0.04));
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 4ac1ff93681..221de0b0954 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -125,7 +125,6 @@ vec3 toneMap(vec3 color)
     // this factor is based on the exposure correction of Krzysztof Narkowicz in his
     // implemetation of ACES tone mapping
     color *= 1.0/0.6;
-    //color /= 0.6;
     color = toneMapACES_Hill(color);
 #endif
 
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 58ce571505f..6828078f4fc 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -328,29 +328,20 @@ void LLReflectionMapManager::getReflectionMaps(std::vector<LLReflectionMap*>& ma
 
 LLReflectionMap* LLReflectionMapManager::registerSpatialGroup(LLSpatialGroup* group)
 {
-#if 1
-    if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
+    static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
+    if (automatic_probes > 1)
     {
-        OctreeNode* node = group->getOctreeNode();
-        F32 size = node->getSize().getF32ptr()[0];
-        if (size >= 15.f && size <= 17.f)
+        if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
         {
-            return addProbe(group);
+            OctreeNode* node = group->getOctreeNode();
+            F32 size = node->getSize().getF32ptr()[0];
+            if (size >= 15.f && size <= 17.f)
+            {
+                return addProbe(group);
+            }
         }
     }
-#endif
 
-#if 0
-    if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_TERRAIN)
-    {
-        OctreeNode* node = group->getOctreeNode();
-        F32 size = node->getSize().getF32ptr()[0];
-        if (size >= 15.f && size <= 17.f)
-        {
-            return addProbe(group);
-        }
-    }
-#endif
     return nullptr;
 }
 
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index dd4ff50259f..192a96a4089 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1255,43 +1255,45 @@ U32 LLViewerRegion::getNumOfVisibleGroups() const
 
 void LLViewerRegion::updateReflectionProbes()
 {
-#if 1
-    const F32 probe_spacing = 32.f;
-    const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
-    const F32 hover_height = 2.f;
+    static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
+    if (automatic_probes > 0)
+    {
+        const F32 probe_spacing = 32.f;
+        const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
+        const F32 hover_height = 2.f;
 
-    F32 start = probe_spacing * 0.5f;
+        F32 start = probe_spacing * 0.5f;
 
-    U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
+        U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
 
-    mReflectionMaps.resize(grid_width * grid_width);
+        mReflectionMaps.resize(grid_width * grid_width);
 
-    F32 water_height = getWaterHeight();
-    LLVector3 origin = getOriginAgent();
+        F32 water_height = getWaterHeight();
+        LLVector3 origin = getOriginAgent();
 
-    for (U32 i = 0; i < grid_width; ++i)
-    {
-        F32 x = i * probe_spacing + start;
-        for (U32 j = 0; j < grid_width; ++j)
+        for (U32 i = 0; i < grid_width; ++i)
         {
-            F32 y = j * probe_spacing + start;
+            F32 x = i * probe_spacing + start;
+            for (U32 j = 0; j < grid_width; ++j)
+            {
+                F32 y = j * probe_spacing + start;
 
-            U32 idx = i * grid_width + j;
+                U32 idx = i * grid_width + j;
 
-            if (mReflectionMaps[idx].isNull())
-            {
-                mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
-            }
+                if (mReflectionMaps[idx].isNull())
+                {
+                    mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
+                }
 
-            LLVector3 probe_origin = LLVector3(x,y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x,y)));
-            probe_origin.mV[2] += hover_height;
-            probe_origin += origin;
+                LLVector3 probe_origin = LLVector3(x, y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x, y)));
+                probe_origin.mV[2] += hover_height;
+                probe_origin += origin;
 
-            mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
-            mReflectionMaps[idx]->mRadius = probe_radius;
+                mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
+                mReflectionMaps[idx]->mRadius = probe_radius;
+            }
         }
     }
-#endif
 }
 
 void LLViewerRegion::addToVOCacheTree(LLVOCacheEntry* entry)
-- 
GitLab