From dcd74c98dc5ab1373f1e7f692fd30dee92472acf Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Tue, 27 Sep 2022 19:35:49 +0300
Subject: [PATCH] SL-18202 impostor too slow avatars and add autotune settings
 button to Preference

---
 indra/newview/llfloaterperformance.cpp            |  5 +++++
 indra/newview/llfloaterperformance.h              |  1 +
 indra/newview/llfloaterpreference.cpp             | 15 ++++++++++++++-
 indra/newview/llfloaterpreference.h               |  1 +
 indra/newview/llviewerpartsim.cpp                 |  2 +-
 indra/newview/llvoavatar.cpp                      |  8 ++++----
 indra/newview/pipeline.cpp                        |  8 ++++----
 .../xui/en/panel_preferences_graphics1.xml        | 14 +++++++++++++-
 8 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
index da1670c15e8..e79e9d19b1d 100644
--- a/indra/newview/llfloaterperformance.cpp
+++ b/indra/newview/llfloaterperformance.cpp
@@ -170,6 +170,11 @@ void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel)
     }
 }
 
+void LLFloaterPerformance::showAutoadjustmentsPanel()
+{
+    showSelectedPanel(mAutoadjustmentsPanel);
+}
+
 void LLFloaterPerformance::draw()
 {
     if (mUpdateTimer->hasExpired())
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index a79da7460b1..09bcd18bb58 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -44,6 +44,7 @@ class LLFloaterPerformance : public LLFloater
     void showSelectedPanel(LLPanel* selected_panel);
     void showMainPanel();
     void hidePanels();
+    void showAutoadjustmentsPanel();
 
     void detachItem(const LLUUID& item_id);
 
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index e9d5a8e02c9..179f70a4a7a 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -51,6 +51,7 @@
 #include "llfloaterabout.h"
 #include "llfavoritesbar.h"
 #include "llfloaterpreferencesgraphicsadvanced.h"
+#include "llfloaterperformance.h"
 #include "llfloatersidepanelcontainer.h"
 #include "llfloaterimsession.h"
 #include "llkeyboard.h"
@@ -287,6 +288,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	
 	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this));
 	mCommitCallbackRegistrar.add("Pref.RenderExceptions",       boost::bind(&LLFloaterPreference::onClickRenderExceptions, this));
+	mCommitCallbackRegistrar.add("Pref.AutoAdjustments",         boost::bind(&LLFloaterPreference::onClickAutoAdjustments, this));
 	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",		boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
 	mCommitCallbackRegistrar.add("Pref.AvatarImpostorsEnable",	boost::bind(&LLFloaterPreference::onAvatarImpostorsEnable, this));
 	mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity",	boost::bind(&LLFloaterPreference::updateMaxComplexity, this));
@@ -726,13 +728,15 @@ void LLFloaterPreference::onOpen(const LLSD& key)
 	LLButton* save_btn = findChild<LLButton>("PrefSaveButton");
 	LLButton* delete_btn = findChild<LLButton>("PrefDeleteButton");
 	LLButton* exceptions_btn = findChild<LLButton>("RenderExceptionsButton");
+    LLButton* auto_adjustments_btn = findChild<LLButton>("AutoAdjustmentsButton");
 
-	if (load_btn && save_btn && delete_btn && exceptions_btn)
+	if (load_btn && save_btn && delete_btn && exceptions_btn && auto_adjustments_btn)
 	{
 		load_btn->setEnabled(started);
 		save_btn->setEnabled(started);
 		delete_btn->setEnabled(started);
 		exceptions_btn->setEnabled(started);
+        auto_adjustments_btn->setEnabled(started);
 	}
 
     collectSearchableItems();
@@ -1655,6 +1659,15 @@ void LLFloaterPreference::onClickRenderExceptions()
     LLFloaterReg::showInstance("avatar_render_settings");
 }
 
+void LLFloaterPreference::onClickAutoAdjustments()
+{
+    LLFloaterPerformance* performance_floater = LLFloaterReg::showTypedInstance<LLFloaterPerformance>("performance");
+    if (performance_floater)
+    {
+        performance_floater->showAutoadjustmentsPanel();
+    }
+}
+
 void LLFloaterPreference::onClickAdvanced()
 {
 	LLFloaterReg::showInstance("prefs_graphics_advanced");
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 94aac56506a..1079b41000a 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -185,6 +185,7 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver,
 	void onClickAutoReplace();
 	void onClickSpellChecker();
 	void onClickRenderExceptions();
+	void onClickAutoAdjustments();
 	void onClickAdvanced();
 	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
 	void getUIColor(LLUICtrl* ctrl, const LLSD& param);
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index e5265f1dcd5..a440f3232a6 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -716,7 +716,7 @@ void LLViewerPartSim::updateSimulation()
 
 			if (upd && vobj && (vobj->getPCode() == LL_PCODE_VOLUME))
 			{
-				if(vobj->getAvatar() && vobj->getAvatar()->isTooComplex())
+				if(vobj->getAvatar() && vobj->getAvatar()->isTooComplex() && vobj->getAvatar()->isTooSlowWithShadows())
 				{
 					upd = FALSE;
 				}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1a71780a882..976b69502f4 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3136,7 +3136,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
 																 LLPartData::LL_PART_TARGET_POS_MASK );
 			
 			// do not generate particles for dummy or overly-complex avatars
-			if (!mIsDummy && !isTooComplex())
+			if (!mIsDummy && !isTooComplex() && !isTooSlowWithShadows())
 			{
 				setParticleSource(particle_parameters, getID());
 			}
@@ -3717,7 +3717,7 @@ bool LLVOAvatar::isVisuallyMuted()
         }
 		else 
 		{
-			muted = isTooComplex();
+			muted = isTooComplex() || isTooSlowWithShadows();
 		}
 	}
 
@@ -11174,7 +11174,7 @@ LLVOAvatar::AvatarOverallAppearance LLVOAvatar::getOverallAppearance() const
 		{	// Always want to see this AV as an impostor
 			result = AOA_JELLYDOLL;
 		}
-		else if (isTooComplex())
+		else if (isTooComplex() || isTooSlowWithShadows())
 		{
 			result = AOA_JELLYDOLL;
 		}
@@ -11201,7 +11201,7 @@ void LLVOAvatar::calcMutedAVColor()
         new_color = LLColor4::grey4;
         change_msg = " blocked: color is grey4";
     }
-    else if (!isTooComplex())
+    else if (!isTooComplex() && !isTooSlowWithShadows())
     {
         new_color = LLColor4::white;
         change_msg = " simple imposter ";
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3110a1cbe5b..ba5e35fd3ea 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -132,7 +132,7 @@
 
 // NOTE: Keep in sync with indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
 // NOTE: Unused consts are commented out since some compilers (on macOS) may complain about unused variables.
-    const S32 WATER_REFLECT_NONE_WATER_OPAQUE       = -2;
+//  const S32 WATER_REFLECT_NONE_WATER_OPAQUE       = -2;
     const S32 WATER_REFLECT_NONE_WATER_TRANSPARENT  = -1;
     const S32 WATER_REFLECT_MINIMAL                 =  0;
 //  const S32 WATER_REFLECT_TERRAIN                 =  1;
@@ -5993,7 +5993,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
 			LLDrawable* drawable = light->drawable;
             const LLViewerObject *vobj = light->drawable->getVObj();
             if(vobj && vobj->getAvatar() 
-               && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList())
+               && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlowWithShadows())
                )
             {
                 drawable->clearState(LLDrawable::NEARBY_LIGHT);
@@ -6072,7 +6072,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
 				continue;
 			}
             LLVOAvatar * av = light->getAvatar();
-            if (av && (av->isTooComplex() || av->isInMuteList()))
+            if (av && (av->isTooComplex() || av->isInMuteList() || av->isTooSlowWithShadows()))
             {
                 // avatars that are already in the list will be removed by removeMutedAVsLights
                 continue;
@@ -10850,7 +10850,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar)
                               << " is " << ( too_complex ? "" : "not ") << "too complex"
                               << LL_ENDL;
 
-    bool too_slow = avatar->isTooSlowWithoutShadows(); // only if we really have to do we imposter.
+    bool too_slow = avatar->isTooSlowWithShadows();
 
     pushRenderTypeMask();
 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 5aff7a51276..ad02df3087e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -258,6 +258,18 @@
     <check_box.commit_callback
       function="Pref.RenderOptionUpdate" />
   </check_box>
+
+  <button
+  height="23"
+  label="Automatic adjustments settings"
+  layout="topleft"
+  left="30"
+  name="AutoAdjustmentsButton"
+  top_delta="30"
+  width="200">
+    <button.commit_callback
+      function="Pref.AutoAdjustments"/>
+  </button>
   
   <slider
     control_name="IndirectMaxComplexity"
@@ -274,7 +286,7 @@
     max_val="101"
     name="IndirectMaxComplexity"
     show_text="false"
-    top_delta="60"
+    top_delta="40"
     width="300">
     <slider.commit_callback
       function="Pref.UpdateIndirectMaxComplexity"
-- 
GitLab