From 26a2e4ba1e69fafac350ae2f1dd9be2ad8f4c0f6 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Fri, 9 Aug 2019 20:46:38 +0300
Subject: SL-11614 Rotating objects flicker if Render type Avatar is disabled
 SL-1232 Derendering Avatar type also derenders some rezzed mesh objects
 SL-10357 [LOVE ME RENDER] Screen Artifacts in Specific Region(s) - Fixed

---
 indra/newview/llviewerdisplay.cpp | 4 ++--
 indra/newview/pipeline.cpp        | 8 ++++----
 indra/newview/pipeline.h          | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 64f6123f5d..7fc9d5d8e7 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file llviewerdisplay.cpp
  * @brief LLViewerDisplay class implementation
  *
@@ -1128,7 +1128,7 @@ void render_hud_attachments()
 		LLSpatialGroup::sNoDelete = TRUE;
 
 		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-		gPipeline.updateCull(hud_cam, result);
+		gPipeline.updateCull(hud_cam, result, 0, NULL, true);
 
 		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_BUMP);
 		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_SIMPLE);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a72244929e..63dc3f899e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file pipeline.cpp
  * @brief Rendering pipeline.
  *
@@ -2396,7 +2396,7 @@ bool LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 
 static LLTrace::BlockTimerStatHandle FTM_CULL("Object Culling");
 
-void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
+void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep, bool hud_attachments)
 {
 	static LLCachedControl<bool> use_occlusion(gSavedSettings,"UseOcclusion");
 	static bool can_use_occlusion = LLGLSLShader::sNoFixedFunction
@@ -2514,9 +2514,9 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 			LLSpatialPartition* part = region->getSpatialPartition(i);
 			if (part)
 			{
-				if (hasRenderType(part->mDrawableType))
+				if (!hud_attachments ? LLViewerRegion::PARTITION_BRIDGE == i || hasRenderType(part->mDrawableType) : hasRenderType(part->mDrawableType))
 				{
-					part->cull(camera);
+				    part->cull(camera);
 				}
 			}
 		}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 29fe1cbd33..abce1e46a6 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file pipeline.h
  * @brief Rendering pipeline definitions
  *
@@ -237,7 +237,7 @@ public:
 	bool visibleObjectsInFrustum(LLCamera& camera);
 	bool getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
 	bool getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
-	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL, bool hud_attachments = false);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
 	void createObjects(F32 max_dtime);
 	void createObject(LLViewerObject* vobj);
 	void processPartitionQ();
-- 
cgit v1.2.3


From d21917338e7e465a5e2ccc87ecca1e75c7e2903b Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Fri, 20 Sep 2019 17:34:38 +0300
Subject: SL-6531 Objects rotating with llTargetOmega now "vibrate" on spin
 axis when the camera is focused on them

---
 indra/newview/pipeline.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 8133c1c6f3..ad8a24ca96 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2010,7 +2010,7 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)
 		drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED);
 		if (done)
 		{
-			if (drawablep->isRoot())
+			if (drawablep->isRoot() && !drawablep->isState(LLDrawable::ACTIVE))
 			{
 				drawablep->makeStatic();
 			}
-- 
cgit v1.2.3


From 2ec0ccb628e8fa2e8affe27dde4e4dab0906b5c5 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Wed, 25 Sep 2019 18:39:08 +0300
Subject: SL-11656 Alpha textures with Alpha mask cutoff of 255 look glitchy
 while ALM is off.

---
 .../newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
index cad5b9ff04..bc403bf9af 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -41,12 +41,12 @@ void default_lighting()
 {
 	vec4 color = diffuseLookup(vary_texcoord0.xy);
 	
-	color *= vertex_color;
-
 	if (color.a < minimum_alpha)
 	{
 		discard;
 	}
+	
+	color *= vertex_color;
 
 	color.rgb = atmosLighting(color.rgb);
 
-- 
cgit v1.2.3


From 2b8acfea0e29fd4604fc7ed677b4bfc01d10252f Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Fri, 18 Oct 2019 22:38:33 +0300
Subject: SL-11840 [Bakes on Mesh] Enable bake textures to be applied to
 non-attached editable items - Now bake texture channel's available for assign
 for non attached objects

---
 indra/newview/llpanelface.cpp   | 33 +++------------------------------
 indra/newview/lltexturectrl.cpp |  8 +++-----
 indra/newview/lltexturectrl.h   |  1 -
 3 files changed, 6 insertions(+), 36 deletions(-)

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index c686aab821..2d300ecf9f 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1027,21 +1027,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
 					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
 
-					bool allAttachments = true;
-					for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin();
-						iter != LLSelectMgr::getInstance()->getSelection()->end();iter++)
-					{
-						LLSelectNode* node = *iter;
-						LLViewerObject* object = node->getObject();
-						if (!object->isAttachment())
-						{
-							allAttachments = false;
-							break;
-						}
-					}
-
-					texture_ctrl->setBakeTextureEnabled(allAttachments);
-					
+					texture_ctrl->setBakeTextureEnabled(TRUE);
 				}
 				else if (id.isNull())
 					{
@@ -1066,21 +1052,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 					getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
 					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
-
-					bool allAttachments = true;
-					for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin();
-						iter != LLSelectMgr::getInstance()->getSelection()->end();iter++)
-					{
-						LLSelectNode* node = *iter;
-						LLViewerObject* object = node->getObject();
-						if (!object->isAttachment())
-						{
-							allAttachments = false;
-							break;
-				}
-			}
-
-					texture_ctrl->setBakeTextureEnabled(allAttachments);
+					
+					texture_ctrl->setBakeTextureEnabled(TRUE);
 				}
 				
 			}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 8a2fc881a9..2f94d59217 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -435,7 +435,7 @@ BOOL LLFloaterTexturePicker::postBuild()
 	getChild<LLComboBox>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this);
 	getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setCommitCallback(onHideBaseMeshRegionCheck, this);
 
-	setBakeTextureEnabled(FALSE);
+	setBakeTextureEnabled(TRUE);
 	return TRUE;
 }
 
@@ -1211,8 +1211,7 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
 	mImageAssetID(p.image_id),
 	mDefaultImageAssetID(p.default_image_id),
 	mDefaultImageName(p.default_image_name),
-	mFallbackImage(p.fallback_image),
-	mBakeTextureEnabled(FALSE)
+	mFallbackImage(p.fallback_image)
 {
 
 	// Default of defaults is white image for diff tex
@@ -1405,7 +1404,7 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
 		}
 		if (texture_floaterp)
 		{
-			texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled);
+			texture_floaterp->setBakeTextureEnabled(TRUE);
 		}
 
 		LLFloater* root_floater = gFloaterView->getParentFloater(this);
@@ -1584,7 +1583,6 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
 
 void LLTextureCtrl::setBakeTextureEnabled(BOOL enabled)
 {
-	mBakeTextureEnabled = enabled;
 	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
 	if (floaterp)
 	{
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index b2a34a37c4..06e8101177 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -239,7 +239,6 @@ private:
 	BOOL					 	mShowLoadingPlaceholder;
 	std::string				 	mLoadingPlaceholderString;
 	S32						 	mLabelWidth;
-	BOOL						mBakeTextureEnabled;
 };
 
 //////////////////////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From 6f4692bac2736bc38828911a52e657df6fa13a07 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Tue, 22 Oct 2019 17:56:12 +0300
Subject: SL-1130 Fixed crash in LLRender::loadMatrix()

---
 indra/newview/lldrawpool.cpp       | 2 +-
 indra/newview/lldrawpoolavatar.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 82888b2df6..71b0f32a4f 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -449,10 +449,10 @@ void LLRenderPass::applyModelMatrix(const LLDrawInfo& params)
 	if (params.mModelMatrix != gGLLastMatrix)
 	{
 		gGLLastMatrix = params.mModelMatrix;
+		gGL.matrixMode(LLRender::MM_MODELVIEW);
 		gGL.loadMatrix(gGLModelView);
 		if (params.mModelMatrix)
 		{
-			llassert(gGL.getMatrixMode() == LLRender::MM_MODELVIEW);
 			gGL.multMatrix((GLfloat*) params.mModelMatrix->mMatrix);
 		}
 		gPipeline.mMatrixOpCount++;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 63abadbcf4..9bb5d4a6bf 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -2083,8 +2083,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 				gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
 				buff->setBuffer(data_mask);
 				buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+				gGL.matrixMode(LLRender::MM_TEXTURE);
 				gGL.loadIdentity();
-				gGL.matrixMode(LLRender::MM_MODELVIEW);
 			}
 			else
 			{
-- 
cgit v1.2.3


From 62ce96a77b4305ead8fdde7644805b1cbf069597 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 25 Oct 2019 19:29:36 +0300
Subject: Backed out changeset: cb9915554e9f (SL-1232/SL-11614)

---
 indra/newview/llviewerdisplay.cpp | 4 ++--
 indra/newview/pipeline.cpp        | 8 ++++----
 indra/newview/pipeline.h          | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index efdf6aad86..5924dbc260 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file llviewerdisplay.cpp
  * @brief LLViewerDisplay class implementation
  *
@@ -1130,7 +1130,7 @@ void render_hud_attachments()
 		LLSpatialGroup::sNoDelete = TRUE;
 
 		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-		gPipeline.updateCull(hud_cam, result, 0, NULL, true);
+		gPipeline.updateCull(hud_cam, result);
 
 		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_BUMP);
 		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_SIMPLE);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index ad8a24ca96..4647e7e84e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file pipeline.cpp
  * @brief Rendering pipeline.
  *
@@ -2396,7 +2396,7 @@ bool LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 
 static LLTrace::BlockTimerStatHandle FTM_CULL("Object Culling");
 
-void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep, bool hud_attachments)
+void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
 {
 	static LLCachedControl<bool> use_occlusion(gSavedSettings,"UseOcclusion");
 	static bool can_use_occlusion = LLGLSLShader::sNoFixedFunction
@@ -2514,9 +2514,9 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 			LLSpatialPartition* part = region->getSpatialPartition(i);
 			if (part)
 			{
-				if (!hud_attachments ? LLViewerRegion::PARTITION_BRIDGE == i || hasRenderType(part->mDrawableType) : hasRenderType(part->mDrawableType))
+				if (hasRenderType(part->mDrawableType))
 				{
-				    part->cull(camera);
+					part->cull(camera);
 				}
 			}
 		}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index abce1e46a6..29fe1cbd33 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -1,4 +1,4 @@
-/** 
+/** 
  * @file pipeline.h
  * @brief Rendering pipeline definitions
  *
@@ -237,7 +237,7 @@ public:
 	bool visibleObjectsInFrustum(LLCamera& camera);
 	bool getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
 	bool getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
-	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL, bool hud_attachments = false);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
 	void createObjects(F32 max_dtime);
 	void createObject(LLViewerObject* vobj);
 	void processPartitionQ();
-- 
cgit v1.2.3


From 4f5d78522632920586e7e4bf7acbc908f9492edb Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 25 Oct 2019 17:32:19 +0300
Subject: SL-12014 Animesh is now a separate rendering type

---
 indra/newview/lldrawable.cpp                       | 31 +++++++++++++++++++---
 indra/newview/lldrawpool.cpp                       | 13 ++-------
 indra/newview/lldrawpool.h                         |  3 +--
 indra/newview/lldrawpoolavatar.cpp                 | 21 ++++++---------
 indra/newview/lldrawpoolavatar.h                   |  4 +--
 indra/newview/lldrawpoolground.cpp                 |  5 ----
 indra/newview/lldrawpoolground.h                   |  2 --
 indra/newview/lldrawpoolsky.cpp                    |  5 ----
 indra/newview/lldrawpoolsky.h                      |  2 --
 indra/newview/lldrawpoolterrain.cpp                |  7 -----
 indra/newview/lldrawpoolterrain.h                  |  2 --
 indra/newview/lldrawpooltree.cpp                   |  5 ----
 indra/newview/lldrawpooltree.h                     |  2 --
 indra/newview/lldrawpoolwater.cpp                  |  7 -----
 indra/newview/lldrawpoolwater.h                    |  1 -
 indra/newview/lldrawpoolwlsky.cpp                  |  5 ----
 indra/newview/lldrawpoolwlsky.h                    |  2 --
 indra/newview/llface.cpp                           |  2 +-
 indra/newview/llspatialpartition.cpp               |  3 ++-
 indra/newview/llspatialpartition.h                 | 12 +++++++++
 indra/newview/lltoolpie.cpp                        |  2 +-
 indra/newview/llviewermenu.cpp                     |  4 +++
 indra/newview/llviewerregion.cpp                   |  1 +
 indra/newview/llviewerregion.h                     |  1 +
 indra/newview/llvoavatar.cpp                       | 10 +++----
 indra/newview/llvovolume.cpp                       | 17 ++++++++++--
 indra/newview/pipeline.cpp                         |  7 ++++-
 indra/newview/pipeline.h                           |  1 +
 indra/newview/skins/default/xui/en/menu_viewer.xml | 11 ++++++++
 29 files changed, 99 insertions(+), 89 deletions(-)

diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 8c6cbc020b..61524bcc6e 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -1178,11 +1178,23 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 	}
 	else if (isRoot())
 	{
-		if (mSpatialBridge && (mSpatialBridge->asPartition()->mPartitionType == LLViewerRegion::PARTITION_HUD) != mVObjp->isHUDAttachment())
+		if (mSpatialBridge)
 		{
-			// remove obsolete bridge
-			mSpatialBridge->markDead();
-			setSpatialBridge(NULL);
+			U32 partition_type = mSpatialBridge->asPartition()->mPartitionType;
+			if ((partition_type == LLViewerRegion::PARTITION_HUD) != mVObjp->isHUDAttachment())
+			{
+				// Was/became HUD
+				// remove obsolete bridge
+				mSpatialBridge->markDead();
+				setSpatialBridge(NULL);
+			}
+			else if ((partition_type == LLViewerRegion::PARTITION_CONTROL_AV) != (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar() != NULL))
+			{
+				// Was/became part of animesh
+				// remove obsolete bridge
+				mSpatialBridge->markDead();
+				setSpatialBridge(NULL);
+			}
 		}
 		//must be an active volume
 		if (!mSpatialBridge)
@@ -1191,6 +1203,10 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 			{
 				setSpatialBridge(new LLHUDBridge(this, getRegion()));
 			}
+			else if (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar())
+			{
+				setSpatialBridge(new LLControlAVBridge(this, getRegion()));
+			}
 			else
 			{
 				setSpatialBridge(new LLVolumeBridge(this, getRegion()));
@@ -1704,6 +1720,13 @@ LLBridgePartition::LLBridgePartition(LLViewerRegion* regionp)
 	mSlopRatio = 0.25f;
 }
 
+LLControlAVPartition::LLControlAVPartition(LLViewerRegion* regionp)
+	: LLBridgePartition(regionp)
+{
+	mDrawableType = LLPipeline::RENDER_TYPE_CONTROL_AV;
+	mPartitionType = LLViewerRegion::PARTITION_CONTROL_AV;
+}
+
 LLHUDBridge::LLHUDBridge(LLDrawable* drawablep, LLViewerRegion* regionp)
 : LLVolumeBridge(drawablep, regionp)
 {
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 71b0f32a4f..f6f6d4fb40 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -86,7 +86,8 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0)
 		poolp = new LLDrawPoolAlpha();
 		break;
 	case POOL_AVATAR:
-		poolp = new LLDrawPoolAvatar();
+	case POOL_CONTROL_AV:
+		poolp = new LLDrawPoolAvatar(type);
 		break;
 	case POOL_TREE:
 		poolp = new LLDrawPoolTree(tex0);
@@ -383,16 +384,6 @@ LLRenderPass::~LLRenderPass()
 
 }
 
-LLDrawPool* LLRenderPass::instancePool()
-{
-#if LL_RELEASE_FOR_DOWNLOAD
-	LL_WARNS() << "Attempting to instance a render pass.  Invalid operation." << LL_ENDL;
-#else
-	LL_ERRS() << "Attempting to instance a render pass.  Invalid operation." << LL_ENDL;
-#endif
-	return NULL;
-}
-
 void LLRenderPass::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture)
 {					
 	LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index bc299cc89f..e526930ec1 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -60,6 +60,7 @@ public:
 		POOL_GRASS,
 		POOL_INVISIBLE, // see below *
 		POOL_AVATAR,
+		POOL_CONTROL_AV, // Animesh
 		POOL_VOIDWATER,
 		POOL_WATER,
 		POOL_GLOW,
@@ -110,7 +111,6 @@ public:
 	virtual S32 getVertexShaderLevel() const { return mVertexShaderLevel; }
 	
 	static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL);
-	virtual LLDrawPool *instancePool() = 0;	// Create an empty new instance of the pool.
 	virtual LLViewerTexture* getTexture() = 0;
 	virtual BOOL isFacePool() { return FALSE; }
 	virtual void resetDrawOrders() = 0;
@@ -162,7 +162,6 @@ public:
 
 	LLRenderPass(const U32 type);
 	virtual ~LLRenderPass();
-	/*virtual*/ LLDrawPool* instancePool();
 	/*virtual*/ LLViewerTexture* getDebugTexture() { return NULL; }
 	LLViewerTexture* getTexture() { return NULL; }
 	BOOL isDead() { return FALSE; }
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 9bb5d4a6bf..a858c81395 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -105,8 +105,8 @@ S32 cube_channel = -1;
 
 static LLTrace::BlockTimerStatHandle FTM_SHADOW_AVATAR("Avatar Shadow");
 
-LLDrawPoolAvatar::LLDrawPoolAvatar() : 
-	LLFacePool(POOL_AVATAR)	
+LLDrawPoolAvatar::LLDrawPoolAvatar(U32 type) : 
+	LLFacePool(type)	
 {
 }
 
@@ -135,15 +135,6 @@ BOOL LLDrawPoolAvatar::isDead()
     }
     return TRUE;
 }
- 
-//-----------------------------------------------------------------------------
-// instancePool()
-//-----------------------------------------------------------------------------
-LLDrawPool *LLDrawPoolAvatar::instancePool()
-{
-	return new LLDrawPoolAvatar();
-}
-
 
 S32 LLDrawPoolAvatar::getVertexShaderLevel() const
 {
@@ -1671,6 +1662,10 @@ void LLDrawPoolAvatar::getRiggedGeometry(
 	{
 		face->setPoolType(LLDrawPool::POOL_ALPHA);
 	}
+	else if (type == LLDrawPool::POOL_CONTROL_AV)
+	{
+		face->setPoolType(LLDrawPool::POOL_CONTROL_AV);
+	}
 	else
 	{
 		face->setPoolType(LLDrawPool::POOL_AVATAR);
@@ -2267,7 +2262,7 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
 void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
 {
     llassert (facep->isState(LLFace::RIGGED));
-    llassert(getType() == LLDrawPool::POOL_AVATAR);
+    llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);
     if (facep->getPool() && facep->getPool() != this)
     {
         LL_ERRS() << "adding rigged face that's already in another pool" << LL_ENDL;
@@ -2289,7 +2284,7 @@ void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
 void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
 {
     llassert (facep->isState(LLFace::RIGGED));
-    llassert(getType() == LLDrawPool::POOL_AVATAR);
+    llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);
     if (facep->getPool() != this)
     {
         LL_ERRS() << "Tried to remove a rigged face from the wrong pool" << LL_ENDL;
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 8c1bc70c8e..6732a93b0f 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -177,12 +177,10 @@ typedef enum
 
 	virtual S32 getVertexShaderLevel() const;
 
-	LLDrawPoolAvatar();
+	LLDrawPoolAvatar(U32 type);
 
 	static LLMatrix4& getModelView();
 
-	/*virtual*/ LLDrawPool *instancePool();
-
 	/*virtual*/ S32  getNumPasses();
 	/*virtual*/ void beginRenderPass(S32 pass);
 	/*virtual*/ void endRenderPass(S32 pass);
diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp
index 59c3fbf7a1..5f8d492d08 100644
--- a/indra/newview/lldrawpoolground.cpp
+++ b/indra/newview/lldrawpoolground.cpp
@@ -46,11 +46,6 @@ LLDrawPoolGround::LLDrawPoolGround() :
 {
 }
 
-LLDrawPool *LLDrawPoolGround::instancePool()
-{
-	return new LLDrawPoolGround();
-}
-
 void LLDrawPoolGround::prerender()
 {
 	mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
diff --git a/indra/newview/lldrawpoolground.h b/indra/newview/lldrawpoolground.h
index a4f8a3fcf5..15b1dc60a2 100644
--- a/indra/newview/lldrawpoolground.h
+++ b/indra/newview/lldrawpoolground.h
@@ -43,8 +43,6 @@ public:
 
 	LLDrawPoolGround();
 
-	/*virtual*/ LLDrawPool *instancePool();
-
 	/*virtual*/ void prerender();
 	/*virtual*/ void render(S32 pass = 0);
 };
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index bdb16abc78..ebb30c955f 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -48,11 +48,6 @@ LLDrawPoolSky::LLDrawPoolSky()
 {
 }
 
-LLDrawPool *LLDrawPoolSky::instancePool()
-{
-	return new LLDrawPoolSky();
-}
-
 void LLDrawPoolSky::prerender()
 {
 	mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT); 
diff --git a/indra/newview/lldrawpoolsky.h b/indra/newview/lldrawpoolsky.h
index 098bd2134a..6817cd023e 100644
--- a/indra/newview/lldrawpoolsky.h
+++ b/indra/newview/lldrawpoolsky.h
@@ -49,8 +49,6 @@ public:
 
 	LLDrawPoolSky();
 
-	/*virtual*/ LLDrawPool *instancePool();
-
 	/*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); }
 	/*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
 	/*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 3eefcef7aa..38b01a7561 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -85,13 +85,6 @@ LLDrawPoolTerrain::~LLDrawPoolTerrain()
 	llassert( gPipeline.findPool( getType(), getTexture() ) == NULL );
 }
 
-
-LLDrawPool *LLDrawPoolTerrain::instancePool()
-{
-	return new LLDrawPoolTerrain(mTexturep);
-}
-
-
 U32 LLDrawPoolTerrain::getVertexDataMask() 
 { 
 	if (LLPipeline::sShadowRender)
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index 484820491a..17409e961a 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -49,8 +49,6 @@ public:
 	LLDrawPoolTerrain(LLViewerTexture *texturep);
 	virtual ~LLDrawPoolTerrain();
 
-	/*virtual*/ LLDrawPool *instancePool();
-
 	/*virtual*/ S32 getNumDeferredPasses() { return 1; }
 	/*virtual*/ void beginDeferredPass(S32 pass);
 	/*virtual*/ void endDeferredPass(S32 pass);
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index b1f40781f7..8a5073397e 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -50,11 +50,6 @@ LLDrawPoolTree::LLDrawPoolTree(LLViewerTexture *texturep) :
 	mTexturep->setAddressMode(LLTexUnit::TAM_WRAP);
 }
 
-LLDrawPool *LLDrawPoolTree::instancePool()
-{
-	return new LLDrawPoolTree(mTexturep);
-}
-
 void LLDrawPoolTree::prerender()
 {
 	mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h
index e7e25453cf..1b11469d9f 100644
--- a/indra/newview/lldrawpooltree.h
+++ b/indra/newview/lldrawpooltree.h
@@ -44,8 +44,6 @@ public:
 
 	LLDrawPoolTree(LLViewerTexture *texturep);
 
-	/*virtual*/ LLDrawPool *instancePool();
-
 	/*virtual*/ void prerender();
 
 	/*virtual*/ S32 getNumDeferredPasses() { return 1; }
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index df06ad31e6..49954e7f24 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -96,13 +96,6 @@ void LLDrawPoolWater::restoreGL()
 	
 }
 
-LLDrawPool *LLDrawPoolWater::instancePool()
-{
-	LL_ERRS() << "Should never be calling instancePool on a water pool!" << LL_ENDL;
-	return NULL;
-}
-
-
 void LLDrawPoolWater::prerender()
 {
 	mVertexShaderLevel = (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) ?
diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h
index aeeba179d6..10e0849016 100644
--- a/indra/newview/lldrawpoolwater.h
+++ b/indra/newview/lldrawpoolwater.h
@@ -63,7 +63,6 @@ public:
 	LLDrawPoolWater();
 	/*virtual*/ ~LLDrawPoolWater();
 
-	/*virtual*/ LLDrawPool *instancePool();
 	static void restoreGL();
 	
 	/*virtual*/ S32 getNumPostDeferredPasses() { return 0; } //getNumPasses(); }
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 309f535c39..d79d04b271 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -394,11 +394,6 @@ void LLDrawPoolWLSky::prerender()
 	//LL_INFOS() << "wlsky prerendering pass." << LL_ENDL;
 }
 
-LLDrawPoolWLSky *LLDrawPoolWLSky::instancePool()
-{
-	return new LLDrawPoolWLSky();
-}
-
 LLViewerTexture* LLDrawPoolWLSky::getTexture()
 {
 	return NULL;
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index cd15c991ee..50d29b7558 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -61,8 +61,6 @@ public:
 	
 	//static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL);
 
-	// Create an empty new instance of the pool.
-	/*virtual*/ LLDrawPoolWLSky *instancePool();  ///< covariant override
 	/*virtual*/ LLViewerTexture* getTexture();
 	/*virtual*/ BOOL isFacePool() { return FALSE; }
 	/*virtual*/ void resetDrawOrders();
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 912bde9986..ebdd0c61d5 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -194,7 +194,7 @@ void LLFace::destroy()
 
 	if (mDrawPoolp)
 	{
-		if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
+		if (this->isState(LLFace::RIGGED) && (mDrawPoolp->getType() == LLDrawPool::POOL_CONTROL_AV || mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR))
 		{
 			((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
 		}
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 1dc1e65fe5..8fcfe9d386 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -558,7 +558,8 @@ void LLSpatialGroup::shift(const LLVector4a &offset)
 	if (!getSpatialPartition()->mRenderByGroup && 
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_TREE &&
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_TERRAIN &&
-		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_BRIDGE)
+		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_BRIDGE &&
+		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_CONTROL_AV)
 	{
 		setState(GEOM_DIRTY);
 		gPipeline.markRebuild(this, TRUE);
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 7e65da42f7..7947b2c908 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -685,6 +685,12 @@ public:
 	virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
 };
 
+class LLControlAVBridge : public LLVolumeBridge
+{
+public:
+	LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regionp);
+};
+
 class LLHUDBridge : public LLVolumeBridge
 {
 public:
@@ -702,6 +708,12 @@ public:
 	virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) {  }
 };
 
+class LLControlAVPartition : public LLBridgePartition
+{
+public:
+	LLControlAVPartition(LLViewerRegion* regionp);
+};
+
 class LLHUDPartition : public LLBridgePartition
 {
 public:
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 2a87bce134..4a9cc36ac5 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -649,7 +649,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
 	else
 	{
 		// perform a separate pick that detects transparent objects since they respond to 1-click actions
-		LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE, pick_rigged);
+		LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged);
 
 		LLViewerObject* click_action_object = click_action_pick.getObject();
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 52b2c631fa..aec8ba1656 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -745,6 +745,10 @@ U32 render_type_from_string(std::string render_type)
 	{
 		return LLPipeline::RENDER_TYPE_AVATAR;
 	}
+	else if ("controlAV" == render_type) // Animesh
+	{
+		return LLPipeline::RENDER_TYPE_CONTROL_AV;
+	}
 	else if ("surfacePatch" == render_type)
 	{
 		return LLPipeline::RENDER_TYPE_TERRAIN;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 5b227c641b..a5a4c877b9 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -607,6 +607,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mImpl->mObjectPartition.push_back(new LLGrassPartition(this));		//PARTITION_GRASS
 	mImpl->mObjectPartition.push_back(new LLVolumePartition(this));	//PARTITION_VOLUME
 	mImpl->mObjectPartition.push_back(new LLBridgePartition(this));	//PARTITION_BRIDGE
+	mImpl->mObjectPartition.push_back(new LLControlAVPartition(this));	//PARTITION_CONTROL_AV
 	mImpl->mObjectPartition.push_back(new LLHUDParticlePartition(this));//PARTITION_HUD_PARTICLE
 	mImpl->mObjectPartition.push_back(new LLVOCachePartition(this)); //PARTITION_VO_CACHE
 	mImpl->mObjectPartition.push_back(NULL);					//PARTITION_NONE
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 2548ff1423..d9b08d4548 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -86,6 +86,7 @@ public:
 		PARTITION_GRASS,
 		PARTITION_VOLUME,
 		PARTITION_BRIDGE,
+		PARTITION_CONTROL_AV, // Animesh
 		PARTITION_HUD_PARTICLE,
 		PARTITION_VO_CACHE,
 		PARTITION_NONE,
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b5db5d4a48..6644654a1c 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2448,7 +2448,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 		return;
 	}	
 
-	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR))
+	if (!(gPipeline.hasRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR))
 		&& !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf())
 	{
 		return;
@@ -6793,13 +6793,13 @@ LLDrawable *LLVOAvatar::createDrawable(LLPipeline *pipeline)
 	pipeline->allocDrawable(this);
 	mDrawable->setLit(FALSE);
 
-	LLDrawPoolAvatar *poolp = (LLDrawPoolAvatar*) gPipeline.getPool(LLDrawPool::POOL_AVATAR);
+	LLDrawPoolAvatar *poolp = (LLDrawPoolAvatar*)gPipeline.getPool(mIsControlAvatar ? LLDrawPool::POOL_CONTROL_AV : LLDrawPool::POOL_AVATAR);
 
 	// Only a single face (one per avatar)
 	//this face will be splitted into several if its vertex buffer is too long.
 	mDrawable->setState(LLDrawable::ACTIVE);
 	mDrawable->addFace(poolp, NULL);
-	mDrawable->setRenderType(LLPipeline::RENDER_TYPE_AVATAR);
+	mDrawable->setRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR);
 	
 	mNumInitFaces = mDrawable->getNumFaces() ;
 
@@ -6824,7 +6824,7 @@ static LLTrace::BlockTimerStatHandle FTM_UPDATE_AVATAR("Update Avatar");
 BOOL LLVOAvatar::updateGeometry(LLDrawable *drawable)
 {
 	LL_RECORD_BLOCK_TIME(FTM_UPDATE_AVATAR);
- 	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
+	if (!(gPipeline.hasRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR)))
 	{
 		return TRUE;
 	}
@@ -9963,7 +9963,7 @@ void LLVOAvatar::onActiveOverrideMeshesChanged()
 U32 LLVOAvatar::getPartitionType() const
 { 
 	// Avatars merely exist as drawables in the bridge partition
-	return LLViewerRegion::PARTITION_BRIDGE;
+	return mIsControlAvatar ? LLViewerRegion::PARTITION_CONTROL_AV : LLViewerRegion::PARTITION_BRIDGE;
 }
 
 //static
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 33a9c771ea..83f7f6a5e9 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4850,6 +4850,10 @@ U32 LLVOVolume::getPartitionType() const
 	{
 		return LLViewerRegion::PARTITION_HUD;
 	}
+	if (isAnimatedObject() && getControlAvatar())
+	{
+		return LLViewerRegion::PARTITION_CONTROL_AV;
+	}
 
 	return LLViewerRegion::PARTITION_VOLUME;
 }
@@ -4880,6 +4884,13 @@ LLVolumeGeometryManager()
 	mSlopRatio = 0.25f;
 }
 
+LLControlAVBridge::LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regionp)
+	: LLVolumeBridge(drawablep, regionp)
+{
+	mDrawableType = LLPipeline::RENDER_TYPE_CONTROL_AV;
+	mPartitionType = LLViewerRegion::PARTITION_CONTROL_AV;
+}
+
 bool can_batch_texture(LLFace* facep)
 {
 	if (facep->getTextureEntry()->getBumpmap())
@@ -5224,7 +5235,8 @@ static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
 				LLDrawPool* drawpool = face->getPool();
 				if (drawpool)
 				{
-					if (drawpool->getType() == LLDrawPool::POOL_AVATAR)
+					if (drawpool->getType() == LLDrawPool::POOL_AVATAR
+						|| drawpool->getType() == LLDrawPool::POOL_CONTROL_AV)
 					{
 						return (LLDrawPoolAvatar*) drawpool;
 					}
@@ -5503,7 +5515,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 						//remove face from old pool if it exists
 						LLDrawPool* old_pool = facep->getPool();
-						if (old_pool && old_pool->getType() == LLDrawPool::POOL_AVATAR)
+						if (old_pool
+							&& (old_pool->getType() == LLDrawPool::POOL_AVATAR || old_pool->getType() == LLDrawPool::POOL_CONTROL_AV))
 						{
 							((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep);
 						}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 4647e7e84e..927ed5528f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1624,6 +1624,7 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)
 		break;
 
 	case LLDrawPool::POOL_AVATAR:
+	case LLDrawPool::POOL_CONTROL_AV:
 		break; // Do nothing
 
 	case LLDrawPool::POOL_SKY:
@@ -3401,6 +3402,7 @@ static LLTrace::BlockTimerStatHandle FTM_RESET_DRAWORDER("Reset Draw Order");
 void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
 {
 	if (hasAnyRenderType(LLPipeline::RENDER_TYPE_AVATAR,
+					  LLPipeline::RENDER_TYPE_CONTROL_AV,
 					  LLPipeline::RENDER_TYPE_GROUND,
 					  LLPipeline::RENDER_TYPE_TERRAIN,
 					  LLPipeline::RENDER_TYPE_TREE,
@@ -5799,6 +5801,7 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )
 		break;
 
 	case LLDrawPool::POOL_AVATAR:
+	case LLDrawPool::POOL_CONTROL_AV:
 		break; // Do nothing
 
 	case LLDrawPool::POOL_SKY:
@@ -5947,6 +5950,7 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
 		break;
 
 	case LLDrawPool::POOL_AVATAR:
+	case LLDrawPool::POOL_CONTROL_AV:
 		break; // Do nothing
 
 	case LLDrawPool::POOL_SKY:
@@ -7142,7 +7146,8 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
 		for (U32 j = 0; j < LLViewerRegion::NUM_PARTITIONS; j++)
 		{
 			if ((j == LLViewerRegion::PARTITION_VOLUME) || 
-				(j == LLViewerRegion::PARTITION_BRIDGE) || 
+				(j == LLViewerRegion::PARTITION_BRIDGE) ||
+				(j == LLViewerRegion::PARTITION_CONTROL_AV) ||
 				(j == LLViewerRegion::PARTITION_TERRAIN) ||
 				(j == LLViewerRegion::PARTITION_TREE) ||
 				(j == LLViewerRegion::PARTITION_GRASS))  // only check these partitions for now
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 29fe1cbd33..462d4836ac 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -442,6 +442,7 @@ public:
 		RENDER_TYPE_BUMP						= LLDrawPool::POOL_BUMP,
 		RENDER_TYPE_MATERIALS					= LLDrawPool::POOL_MATERIALS,
 		RENDER_TYPE_AVATAR						= LLDrawPool::POOL_AVATAR,
+		RENDER_TYPE_CONTROL_AV					= LLDrawPool::POOL_CONTROL_AV, // Animesh
 		RENDER_TYPE_TREE						= LLDrawPool::POOL_TREE,
 		RENDER_TYPE_INVISIBLE					= LLDrawPool::POOL_INVISIBLE,
 		RENDER_TYPE_VOIDWATER					= LLDrawPool::POOL_VOIDWATER,
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 7bb7b5d62c..96996156c0 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1749,6 +1749,17 @@
                  function="Advanced.ToggleRenderType"
                  parameter="character" />
             </menu_item_check>
+            <menu_item_check
+             label="Animeshes"
+             name="Rendering Type Control Avatar"
+             shortcut="control|alt|shift|5">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="controlAV" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="controlAV" />
+            </menu_item_check>
             <menu_item_check
              label="Surface Patch"
              name="Rendering Type Surface Patch"
-- 
cgit v1.2.3


From a4199b3e3c389d4291007566739382ee1daad9d6 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 25 Oct 2019 18:12:47 +0300
Subject: SL-12026, SL-1232 and SL-11614

---
 indra/newview/lldrawable.cpp         | 25 +++++++++++++++++++++++--
 indra/newview/llspatialpartition.cpp |  1 +
 indra/newview/llspatialpartition.h   | 12 ++++++++++++
 indra/newview/llviewerobject.cpp     | 26 +++++++++++++-------------
 indra/newview/llviewerobject.h       |  1 +
 indra/newview/llviewerregion.cpp     |  1 +
 indra/newview/llviewerregion.h       |  1 +
 indra/newview/llvoavatar.cpp         |  2 +-
 indra/newview/llvovolume.cpp         | 11 +++++++++++
 indra/newview/pipeline.cpp           |  2 +-
 10 files changed, 65 insertions(+), 17 deletions(-)

diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 61524bcc6e..ad19574b44 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -1181,7 +1181,9 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 		if (mSpatialBridge)
 		{
 			U32 partition_type = mSpatialBridge->asPartition()->mPartitionType;
-			if ((partition_type == LLViewerRegion::PARTITION_HUD) != mVObjp->isHUDAttachment())
+			bool is_hud = mVObjp->isHUDAttachment();
+			bool is_attachment = mVObjp->isAttachment() && !is_hud;
+			if ((partition_type == LLViewerRegion::PARTITION_HUD) != is_hud)
 			{
 				// Was/became HUD
 				// remove obsolete bridge
@@ -1195,6 +1197,13 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 				mSpatialBridge->markDead();
 				setSpatialBridge(NULL);
 			}
+			else if ((partition_type == LLViewerRegion::PARTITION_AVATAR) != is_attachment)
+			{
+				// Was/became part of avatar
+				// remove obsolete bridge
+				mSpatialBridge->markDead();
+				setSpatialBridge(NULL);
+			}
 		}
 		//must be an active volume
 		if (!mSpatialBridge)
@@ -1207,6 +1216,11 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 			{
 				setSpatialBridge(new LLControlAVBridge(this, getRegion()));
 			}
+			// check HUD first, because HUD is also attachment
+			else if (mVObjp->isAttachment())
+			{
+				setSpatialBridge(new LLAvatarBridge(this, getRegion()));
+			}
 			else
 			{
 				setSpatialBridge(new LLVolumeBridge(this, getRegion()));
@@ -1714,12 +1728,19 @@ void LLDrawable::updateFaceSize(S32 idx)
 LLBridgePartition::LLBridgePartition(LLViewerRegion* regionp)
 : LLSpatialPartition(0, FALSE, 0, regionp) 
 { 
-	mDrawableType = LLPipeline::RENDER_TYPE_AVATAR; 
+	mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; 
 	mPartitionType = LLViewerRegion::PARTITION_BRIDGE;
 	mLODPeriod = 16;
 	mSlopRatio = 0.25f;
 }
 
+LLAvatarPartition::LLAvatarPartition(LLViewerRegion* regionp)
+	: LLBridgePartition(regionp)
+{
+	mDrawableType = LLPipeline::RENDER_TYPE_AVATAR;
+	mPartitionType = LLViewerRegion::PARTITION_AVATAR;
+}
+
 LLControlAVPartition::LLControlAVPartition(LLViewerRegion* regionp)
 	: LLBridgePartition(regionp)
 {
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8fcfe9d386..ab95076ab5 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -559,6 +559,7 @@ void LLSpatialGroup::shift(const LLVector4a &offset)
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_TREE &&
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_TERRAIN &&
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_BRIDGE &&
+		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_AVATAR &&
 		getSpatialPartition()->mPartitionType != LLViewerRegion::PARTITION_CONTROL_AV)
 	{
 		setState(GEOM_DIRTY);
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 7947b2c908..919f386d29 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -685,6 +685,12 @@ public:
 	virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
 };
 
+class LLAvatarBridge : public LLVolumeBridge
+{
+public:
+	LLAvatarBridge(LLDrawable* drawablep, LLViewerRegion* regionp);
+};
+
 class LLControlAVBridge : public LLVolumeBridge
 {
 public:
@@ -708,6 +714,12 @@ public:
 	virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) {  }
 };
 
+class LLAvatarPartition : public LLBridgePartition
+{
+public:
+	LLAvatarPartition(LLViewerRegion* regionp);
+};
+
 class LLControlAVPartition : public LLBridgePartition
 {
 public:
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1353a27982..0cbfa7d31a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -279,6 +279,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mOnActiveList(FALSE),
 	mOnMap(FALSE),
 	mStatic(FALSE),
+	mSeatCount(0),
 	mNumFaces(0),
 	mRotTime(0.f),
 	mAngularVelocityRot(),
@@ -890,7 +891,12 @@ void LLViewerObject::addChild(LLViewerObject *childp)
 	if(childp->setParent(this))
 	{
 		mChildList.push_back(childp);
-        childp->afterReparent();
+		childp->afterReparent();
+
+		if (childp->isAvatar())
+		{
+			mSeatCount++;
+		}
 	}
 }
 
@@ -919,6 +925,11 @@ void LLViewerObject::removeChild(LLViewerObject *childp)
 			{
 				childp->setParent(NULL);			
 			}
+
+			if (childp->isAvatar())
+			{
+				mSeatCount--;
+			}
 			break;
 		}
 	}
@@ -976,21 +987,10 @@ BOOL LLViewerObject::isChild(LLViewerObject *childp) const
 	return FALSE;
 }
 
-
 // returns TRUE if at least one avatar is sitting on this object
 BOOL LLViewerObject::isSeat() const
 {
-	for (child_list_t::const_iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		if (child->isAvatar())
-		{
-			return TRUE;
-		}
-	}
-	return FALSE;
-
+	return mSeatCount > 0;
 }
 
 BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 873b300489..5322dbfe89 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -822,6 +822,7 @@ protected:
 	BOOL			mOnActiveList;
 	BOOL			mOnMap;						// On the map.
 	BOOL			mStatic;					// Object doesn't move.
+	S32				mSeatCount;
 	S32				mNumFaces;
 
 	F32				mRotTime;					// Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index a5a4c877b9..dbe9cdb13b 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -607,6 +607,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mImpl->mObjectPartition.push_back(new LLGrassPartition(this));		//PARTITION_GRASS
 	mImpl->mObjectPartition.push_back(new LLVolumePartition(this));	//PARTITION_VOLUME
 	mImpl->mObjectPartition.push_back(new LLBridgePartition(this));	//PARTITION_BRIDGE
+	mImpl->mObjectPartition.push_back(new LLAvatarPartition(this));	//PARTITION_AVATAR
 	mImpl->mObjectPartition.push_back(new LLControlAVPartition(this));	//PARTITION_CONTROL_AV
 	mImpl->mObjectPartition.push_back(new LLHUDParticlePartition(this));//PARTITION_HUD_PARTICLE
 	mImpl->mObjectPartition.push_back(new LLVOCachePartition(this)); //PARTITION_VO_CACHE
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index d9b08d4548..6e96b98a2d 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -86,6 +86,7 @@ public:
 		PARTITION_GRASS,
 		PARTITION_VOLUME,
 		PARTITION_BRIDGE,
+		PARTITION_AVATAR,
 		PARTITION_CONTROL_AV, // Animesh
 		PARTITION_HUD_PARTICLE,
 		PARTITION_VO_CACHE,
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6644654a1c..706927d81e 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -9963,7 +9963,7 @@ void LLVOAvatar::onActiveOverrideMeshesChanged()
 U32 LLVOAvatar::getPartitionType() const
 { 
 	// Avatars merely exist as drawables in the bridge partition
-	return mIsControlAvatar ? LLViewerRegion::PARTITION_CONTROL_AV : LLViewerRegion::PARTITION_BRIDGE;
+	return mIsControlAvatar ? LLViewerRegion::PARTITION_CONTROL_AV : LLViewerRegion::PARTITION_AVATAR;
 }
 
 //static
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 83f7f6a5e9..25e9b425b4 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4854,6 +4854,10 @@ U32 LLVOVolume::getPartitionType() const
 	{
 		return LLViewerRegion::PARTITION_CONTROL_AV;
 	}
+	if (isAttachment())
+	{
+		return LLViewerRegion::PARTITION_AVATAR;
+	}
 
 	return LLViewerRegion::PARTITION_VOLUME;
 }
@@ -4884,6 +4888,13 @@ LLVolumeGeometryManager()
 	mSlopRatio = 0.25f;
 }
 
+LLAvatarBridge::LLAvatarBridge(LLDrawable* drawablep, LLViewerRegion* regionp)
+	: LLVolumeBridge(drawablep, regionp)
+{
+	mDrawableType = LLPipeline::RENDER_TYPE_AVATAR;
+	mPartitionType = LLViewerRegion::PARTITION_AVATAR;
+}
+
 LLControlAVBridge::LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regionp)
 	: LLVolumeBridge(drawablep, regionp)
 {
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 927ed5528f..7c0ba51dd3 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7209,7 +7209,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
 		{
 			LLViewerRegion* region = *iter;
 
-			LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE);
+			LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_AVATAR);
 			if (part && hasRenderType(part->mDrawableType))
 			{
 				LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, face_hit, &position, tex_coord, normal, tangent);
-- 
cgit v1.2.3


From eeb0a79d7a0242a9b697b367017ddbb84dc7157f Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 25 Oct 2019 20:13:58 +0300
Subject: SL-12014 Removed dupplicate shortcut

---
 indra/newview/skins/default/xui/en/menu_viewer.xml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 96996156c0..be2317b313 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1751,8 +1751,7 @@
             </menu_item_check>
             <menu_item_check
              label="Animeshes"
-             name="Rendering Type Control Avatar"
-             shortcut="control|alt|shift|5">
+             name="Rendering Type Control Avatar">
                 <menu_item_check.on_check
                  function="Advanced.CheckRenderType"
                  parameter="controlAV" />
-- 
cgit v1.2.3


From 3b7a89322e5b0b3e177f4ea2faf5f061db17b37f Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 29 Nov 2019 18:21:21 +0200
Subject: SL-1130 Reverted part of d9dc1e2

---
 indra/newview/lldrawpoolavatar.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index a858c81395..9800a4e189 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -2078,8 +2078,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 				gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
 				buff->setBuffer(data_mask);
 				buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
-				gGL.matrixMode(LLRender::MM_TEXTURE);
 				gGL.loadIdentity();
+				gGL.matrixMode(LLRender::MM_MODELVIEW);
 			}
 			else
 			{
-- 
cgit v1.2.3


From 74904f39e15961ada40221be418bbd758a5969ef Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 29 Nov 2019 18:31:50 +0200
Subject: SL-1130 Prevent crash on mMatrix

---
 indra/llrender/llrender.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 65d6181920..5bcccb35af 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1458,9 +1458,15 @@ void LLRender::matrixMode(U32 mode)
 	if (mode == MM_TEXTURE)
 	{
 		mode = MM_TEXTURE0 + gGL.getCurrentTexUnitIndex();
+		if (mode > MM_TEXTURE3)
+		{
+			// getCurrentTexUnitIndex() can go as high as 32 (LL_NUM_TEXTURE_LAYERS)
+			// Large value will result in a crash at mMatrix
+			LL_WARNS_ONCE() << "Attempted to assign matrix mode out of bounds: " << mode << LL_ENDL;
+			mode = MM_TEXTURE0;
+		}
 	}
 
-	llassert(mode < NUM_MATRIX_MODES);
 	mMatrixMode = mode;
 }
 
-- 
cgit v1.2.3


From 4c006e76e39a8b59dc6f9c890e5a27d38b5ece50 Mon Sep 17 00:00:00 2001
From: ruslantproductengine <ruslantproductengine@lindenlab.com>
Date: Mon, 30 Sep 2019 21:01:22 +0300
Subject: SL-8191 RenderUseVAO with Basic Shaders turned off caused textures
 not to show - Disable VAO for fixed pipeline + UI

---
 indra/newview/llappviewer.cpp            |  2 +-
 indra/newview/llfloatersettingsdebug.cpp | 19 +++++++++++++++++++
 indra/newview/pipeline.cpp               |  4 ++--
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index ff897ef962..cf6e31fa4d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -568,7 +568,7 @@ static void settings_to_globals()
 
 	LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
 	LLRender::sNsightDebugSupport = gSavedSettings.getBOOL("RenderNsightDebugSupport");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
 	LLVOVolume::sLODFactor				= llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR);
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index fb202b4c40..73269d0531 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -34,6 +34,7 @@
 #include "llcolorswatch.h"
 #include "llviewercontrol.h"
 #include "lltexteditor.h"
+#include "llviewershadermgr.h"
 
 
 LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key) 
@@ -207,6 +208,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
 	getChildView("val_text")->setVisible( FALSE);
 	mComment->setText(LLStringUtil::null);
 
+    getChild<LLUICtrl>("boolean_combo")->setEnabled(true);
+    getChild<LLUICtrl>("TRUE")->setEnabled(true);
+    getChild<LLUICtrl>("FALSE")->setEnabled(true);
+    getChild<LLUICtrl>("default_btn")->setEnabled(true);
+
 	if (controlp)
 	{
 		eControlType type = controlp->type();
@@ -288,6 +294,19 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
 				{
 					getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(""));
 				}
+
+				bool bUseVAO = controlp->getName() == "RenderUseVAO";
+				if (bUseVAO)
+				{
+					bool use_shaders = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+					getChild<LLUICtrl>("boolean_combo")->setEnabled(use_shaders);
+					getChild<LLUICtrl>("TRUE")->setEnabled(use_shaders);
+					getChild<LLUICtrl>("FALSE")->setEnabled(use_shaders);
+					getChild<LLUICtrl>("default_btn")->setEnabled(use_shaders);
+					if (!use_shaders) {
+						getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(false));
+					}
+				}
 			}
 			break;
 		  case TYPE_STRING:
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 7c0ba51dd3..54e1ad10b8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -481,7 +481,7 @@ void LLPipeline::init()
 	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
 	sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -7430,7 +7430,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
 	LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
-- 
cgit v1.2.3


From 7f1cb755fef2b16a6c05fd20db4af8feea136017 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 28 Nov 2019 17:23:16 +0200
Subject: SL-12366 FIXED Crash in LLOutfitGallery::refreshOutfit(LLUUID const&)

---
 indra/newview/lloutfitgallery.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 12b46e9bb2..1a28c49141 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -1046,6 +1046,7 @@ void LLOutfitGallery::updateSnapshotFolderObserver()
 void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
 {
     LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
+    if (category)
     {
         bool photo_loaded = false;
         LLInventoryModel::cat_array_t sub_cat_array;
-- 
cgit v1.2.3


From fd77a8001593183953ac24488593d997aee6bc28 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 28 Nov 2019 17:09:34 +0200
Subject: SL-6109 Fixed issue with llcontrols ignoring left mouse button with
 masks

---
 indra/llcommon/llkeybind.cpp | 4 ++--
 indra/llcommon/llkeybind.h   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/llcommon/llkeybind.cpp b/indra/llcommon/llkeybind.cpp
index ecfc289cb3..38696c2258 100644
--- a/indra/llcommon/llkeybind.cpp
+++ b/indra/llcommon/llkeybind.cpp
@@ -144,7 +144,7 @@ bool LLKeyData::canHandle(const LLKeyData& data) const
 {
     if (data.mKey == mKey
         && data.mMouse == mMouse
-        && ((mIgnoreMasks && (data.mMask & mMask) == data.mMask) || data.mMask == mMask))
+        && ((mIgnoreMasks && (data.mMask & mMask) == mMask) || data.mMask == mMask))
     {
         return true;
     }
@@ -155,7 +155,7 @@ bool LLKeyData::canHandle(EMouseClickType mouse, KEY key, MASK mask) const
 {
     if (mouse == mMouse
         && key == mKey
-        && ((mIgnoreMasks && (mask & mMask) == mask) || mask == mMask))
+        && ((mIgnoreMasks && (mask & mMask) == mMask) || mask == mMask))
     {
         return true;
     }
diff --git a/indra/llcommon/llkeybind.h b/indra/llcommon/llkeybind.h
index ad0ebec67c..7dc2aff4cb 100644
--- a/indra/llcommon/llkeybind.h
+++ b/indra/llcommon/llkeybind.h
@@ -53,7 +53,7 @@ public:
     EMouseClickType mMouse;
     KEY mKey;
     MASK mMask;
-    // Either to expect exact match or ignore not expected masks
+    // Either to expect exact match or to make sure mMask is inclused and ignore not expected masks
     bool mIgnoreMasks; 
 };
 
-- 
cgit v1.2.3


From efe2ba3bab732add39f46e1fbc3a331355a693dd Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 28 Nov 2019 17:07:02 +0200
Subject: SL-12264 Ctrl-drag does not work when certain scripted controls are
 active

---
 indra/newview/lltoolgrab.cpp | 5 +++--
 indra/newview/lltoolgrab.h   | 1 +
 indra/newview/lltoolpie.cpp  | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 429664e743..ba00d4c262 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -142,8 +142,9 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
 
 	// call the base class to propogate info to sim
 	LLTool::handleMouseDown(x, y, mask);
-	
-	if (!gAgent.leftButtonGrabbed())
+
+	// leftButtonGrabbed() checks if controls are reserved by scripts, but does not take masks into account
+	if (!gAgent.leftButtonGrabbed() || ((mask & DEFAULT_GRAB_MASK) != 0 && !gAgentCamera.cameraMouselook()))
 	{
 		// can grab transparent objects (how touch event propagates, scripters rely on this)
 		gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE);
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 02ed5c26d7..ce0de0f946 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -44,6 +44,7 @@ class LLPickInfo;
 void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
 void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
 
+const MASK DEFAULT_GRAB_MASK = MASK_CONTROL;
 
 /**
  * LLToolGrabBase contains most of the semantics of LLToolGrab. It's just that
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index e7030a3f85..640f3ee3b8 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1390,7 +1390,7 @@ LLTool* LLToolPie::getOverrideTool(MASK mask)
 {
 	if (gSavedSettings.getBOOL("EnableGrab"))
 	{
-		if (mask == MASK_CONTROL)
+		if (mask == DEFAULT_GRAB_MASK)
 		{
 			return LLToolGrab::getInstance();
 		}
-- 
cgit v1.2.3


From 81c7bdea5a98b214f03807ddccd9b80182d31d4f Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 3 Dec 2019 17:04:02 +0200
Subject: SL-11582 Alpha mask objects with cutoff == 0 don't respond to clicks

---
 indra/newview/llvovolume.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 33a9c771ea..db932c17ac 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4567,8 +4567,9 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
 					{
 						U8 mode = mat->getDiffuseAlphaMode();
 
-						if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE ||
-							mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE)
+						if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE
+							|| mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE
+							|| (mode == LLMaterial::DIFFUSE_ALPHA_MODE_MASK && mat->getAlphaMaskCutoff() == 0))
 						{
 							ignore_alpha = true;
 						}
-- 
cgit v1.2.3


From ff002e65f85aa8613cc9a49bd2ec68a754defd70 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 5 Dec 2019 14:53:24 +0200
Subject: SL-10991 Renamed button to highlight that these are voice options

---
 indra/newview/skins/default/xui/en/panel_preferences_sound.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index c2995393fd..73fe36a8b4 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -475,12 +475,12 @@
    follows="left|top"
    height="23"
    is_toggle="true"
-   label="Input/Output devices"
+   label="Voice Input/Output devices"
    layout="topleft"
    left="20"
    top_pad="6"
    name="device_settings_btn"
-   width="190">
+   width="230">
   </button>
     <panel
     layout="topleft"
-- 
cgit v1.2.3


From 691993dc53a0d2299fbf024cceee4ece5e44555b Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 5 Dec 2019 21:44:43 +0200
Subject: SL-12269 Unknown asset types are matched in inventory search for
 specific types

---
 indra/newview/llinventoryfilter.cpp | 79 +++++++++++++++++++++++++------------
 1 file changed, 53 insertions(+), 26 deletions(-)

diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index e8bc915f22..e200b5bc9e 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -286,21 +286,34 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
 	// Pass if this item's type is of the correct filter type
 	if (filterTypes & FILTERTYPE_OBJECT)
 	{
-
-		// If it has no type, pass it, unless it's a link.
-		if (object_type == LLInventoryType::IT_NONE)
-		{
-			if (object && object->getIsLinkType())
-			{
-				return FALSE;
-			}
-		}
-		else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
-		{
-			return FALSE;
-		}
+        switch (object_type)
+        {
+        case LLInventoryType::IT_NONE:
+            // If it has no type, pass it, unless it's a link.
+            if (object && object->getIsLinkType())
+            {
+                return FALSE;
+            }
+            break;
+        case LLInventoryType::IT_UNKNOWN:
+            {
+                // Unknows are only shown when we show every type. 
+                // Unknows are 255 and won't fit in 64 bits.
+                if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
+                {
+                    return FALSE;
+                }
+                break;
+            }
+        default:
+            if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
+            {
+                return FALSE;
+            }
+            break;
+        }
 	}
-	
+
 	if(filterTypes & FILTERTYPE_WORN)
 	{
 		if (!get_is_item_worn(object_id))
@@ -411,18 +424,32 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons
 	// Pass if this item's type is of the correct filter type
 	if (filterTypes & FILTERTYPE_OBJECT)
 	{
-		// If it has no type, pass it, unless it's a link.
-		if (object_type == LLInventoryType::IT_NONE)
-		{
-			if (item && item->getIsLinkType())
-			{
-				return false;
-			}
-		}
-		else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
-		{
-			return false;
-		}
+        switch (object_type)
+        {
+        case LLInventoryType::IT_NONE:
+            // If it has no type, pass it, unless it's a link.
+            if (item && item->getIsLinkType())
+            {
+                return FALSE;
+            }
+            break;
+        case LLInventoryType::IT_UNKNOWN:
+            {
+                // Unknows are only shown when we show every type. 
+                // Unknows are 255 and won't fit in 64 bits.
+                if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
+                {
+                    return FALSE;
+                }
+                break;
+            }
+        default:
+            if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
+            {
+                return FALSE;
+            }
+            break;
+        }
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From 57050ea2a712814c61e07558f9bf7f486b020bee Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 6 Dec 2019 17:39:00 +0200
Subject: SL-12198 Log source of quit command

---
 indra/newview/llappviewer.cpp         | 1 +
 indra/newview/llappviewerlistener.cpp | 2 ++
 indra/newview/llprogressview.cpp      | 1 +
 indra/newview/llstartup.cpp           | 2 ++
 indra/newview/llviewerwindow.cpp      | 1 +
 5 files changed, 7 insertions(+)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 8c56ed3cd1..2ddae0cfc2 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3994,6 +3994,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
 
 void LLAppViewer::userQuit()
 {
+	LL_INFOS() << "User requested quit" << LL_ENDL;
 	if (gDisconnected
 		|| !gViewerWindow
 		|| !gViewerWindow->getProgressView()
diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp
index 94250f1fc2..2380a8ebf0 100644
--- a/indra/newview/llappviewerlistener.cpp
+++ b/indra/newview/llappviewerlistener.cpp
@@ -52,10 +52,12 @@ LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
 
 void LLAppViewerListener::requestQuit(const LLSD& event)
 {
+    LL_INFOS() << "Listener requested quit" << LL_ENDL;
     mAppViewerGetter()->requestQuit();
 }
 
 void LLAppViewerListener::forceQuit(const LLSD& event)
 {
+    LL_INFOS() << "Listener requested force quit" << LL_ENDL;
     mAppViewerGetter()->forceQuit();
 }
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index c17b86783d..8997456782 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -325,6 +325,7 @@ void LLProgressView::onCancelButtonClicked(void*)
 	// cancel is pressed while teleporting inside region (EXT-4911)
 	if (LLStartUp::getStartupState() < STATE_STARTED)
 	{
+		LL_INFOS() << "User requesting quit during login" << LL_ENDL;
 		LLAppViewer::instance()->requestQuit();
 	}
 	else
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index b1bdaa1c1a..150777a778 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1112,6 +1112,8 @@ bool idle_startup()
 				// Its either downloading or declined.
 				// If optional was skipped this case shouldn't 
 				// be reached.
+
+				LL_INFOS() << "Forcing a quit due to update." << LL_ENDL;
 				LLLoginInstance::getInstance()->disconnect();
 				LLAppViewer::instance()->forceQuit();
 			}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 6f468270d2..68313d9fce 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1378,6 +1378,7 @@ BOOL LLViewerWindow::handleCloseRequest(LLWindow *window)
 
 void LLViewerWindow::handleQuit(LLWindow *window)
 {
+	LL_INFOS() << "Window forced quit" << LL_ENDL;
 	LLAppViewer::instance()->forceQuit();
 }
 
-- 
cgit v1.2.3


From fa650fe7913603249dd4a17c6c53ee1c254446ae Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 11 Dec 2019 14:09:22 +0200
Subject: SL-11891 Change format to SLT to make things consistent

---
 indra/newview/skins/default/xui/en/floater_about_land.xml  | 4 ++--
 indra/newview/skins/default/xui/en/floater_inspect.xml     | 2 +-
 indra/newview/skins/default/xui/en/panel_landmark_info.xml | 2 +-
 indra/newview/skins/default/xui/en/sidepanel_item_info.xml | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a143adfa06..4a9aebbf09 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -123,8 +123,8 @@
                 No parcel selected.
             </panel.string>
             <panel.string name="time_stamp_template">
-				[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
-			</panel.string>
+              [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
+            </panel.string>
             <text
              type="string"
              length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 63334e2b24..802a6649c8 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -13,7 +13,7 @@
  width="400">
     <floater.string
      name="timeStamp">
-        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+        [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
     </floater.string>
     <scroll_list
      bottom="268"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index 13986c4030..87035e5cd3 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -41,7 +41,7 @@
     </string>
     <string
      name="acquired_date">
-        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+        [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
     </string>
     <!-- Texture names for rating icons -->
     <string
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index acb6f5b42a..9a68479d05 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -33,7 +33,7 @@
   </panel.string>
   <panel.string
     name="acquiredDate">
-    [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+    [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
   </panel.string>
   <panel.string
     name="origin_inventory">
-- 
cgit v1.2.3


From 8c09a295c1e2a7d6ab0ce066d5d8a399fcfaea20 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 10 Dec 2019 20:44:49 +0200
Subject: SL-12435 Fix for some crashes in LLOutfitGallery

---
 indra/newview/llpaneloutfitsinventory.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 8019335f97..8fff52ca4e 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -55,6 +55,7 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
 	mMyOutfitsPanel(NULL),
 	mCurrentOutfitPanel(NULL),
 	mActivePanel(NULL),
+	mAppearanceTabs(NULL),
 	mInitialized(false)
 {
 	gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
@@ -312,6 +313,7 @@ void LLPanelOutfitsInventory::initTabPanels()
 
 void LLPanelOutfitsInventory::onTabChange()
 {
+	if (!mAppearanceTabs) return;
 	mActivePanel = dynamic_cast<LLPanelAppearanceTab*>(mAppearanceTabs->getCurrentPanel());
 	if (!mActivePanel) return;
 
-- 
cgit v1.2.3


From 79bc739115010dd26f6d82b6974e03a7ccd485d5 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 12 Dec 2019 17:45:58 +0200
Subject: SL-12416 Don't escape ad-hoc name in conversation.log

---
 indra/newview/llconversationlog.cpp | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index ba6b251d58..08a72a7838 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -478,6 +478,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
 		conv_it->getSessionID().toString(conversation_id);
 		conv_it->getParticipantID().toString(participant_id);
 
+		bool is_adhoc = (conv_it->getConversationType() == LLIMModel::LLIMSession::ADHOC_SESSION);
+		std::string conv_name = is_adhoc ? conv_it->getConversationName() : LLURI::escape(conv_it->getConversationName());
+		std::string file_name = is_adhoc ? conv_it->getHistoryFileName() : LLURI::escape(conv_it->getHistoryFileName());
+
 		// examples of two file entries
 		// [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
 		// [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
@@ -486,10 +490,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
 				(S32)conv_it->getConversationType(),
 				(S32)0,
 				(S32)conv_it->hasOfflineMessages(),
-				LLURI::escape(conv_it->getConversationName()).c_str(),
+				conv_name.c_str(),
 				participant_id.c_str(),
 				conversation_id.c_str(),
-				LLURI::escape(conv_it->getHistoryFileName()).c_str());
+				file_name.c_str());
 	}
 	fclose(fp);
 	return true;
@@ -537,14 +541,18 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
 				conv_id_buffer,
 				history_file_name);
 
+		bool is_adhoc = ((SessionType)stype == LLIMModel::LLIMSession::ADHOC_SESSION);
+		std::string conv_name = is_adhoc ? conv_name_buffer : LLURI::unescape(conv_name_buffer);
+		std::string file_name = is_adhoc ? history_file_name : LLURI::unescape(history_file_name);
+
 		ConversationParams params;
 		params.time(LLUnits::Seconds::fromValue(time))
 			.conversation_type((SessionType)stype)
 			.has_offline_ims(has_offline_ims)
-			.conversation_name(LLURI::unescape(conv_name_buffer))
+			.conversation_name(conv_name)
 			.participant_id(LLUUID(part_id_buffer))
 			.session_id(LLUUID(conv_id_buffer))
-			.history_filename(LLURI::unescape(history_file_name));
+			.history_filename(file_name);
 
 		LLConversation conversation(params);
 
-- 
cgit v1.2.3


From e83da3f5e2f23443682ba26fa5f250cabe105ced Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 16 Dec 2019 14:36:33 +0200
Subject: SL-12453 FIXED The "Align planar faces" checkbox is visible in the
 Default mapping mode

---
 indra/newview/llpanelface.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index c686aab821..7b5ece7e7a 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1109,6 +1109,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 
 			bool enabled = (editable && isIdenticalPlanarTexgen());
 			childSetValue("checkbox planar align", align_planar && enabled);
+			childSetVisible("checkbox planar align", enabled);
 			childSetEnabled("checkbox planar align", enabled);
 			childSetEnabled("button align textures", enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1);
 
-- 
cgit v1.2.3


From 7633285f9a8a2908e596df3316d025c0fb64a73e Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 18 Dec 2019 17:36:05 +0200
Subject: SL-11921 fixed location overlaps

---
 indra/newview/skins/default/xui/pt/floater_about_land.xml | 2 +-
 indra/newview/skins/default/xui/ru/floater_about_land.xml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 96e54bb9bc..0e7d0798c7 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -366,7 +366,7 @@ Apenas lotes maiores podem ser listados na busca.
 				Avatares em outros lotes podem ver e conversar com avatares neste lote
 			</text>
 			<check_box label="Ver avatares" name="SeeAvatarsCheck" top="170" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
-			<text name="landing_point">
+			<text name="landing_point" width="225">
 				Ponto de Aterrissagem: [LANDING]
 			</text>
 			<button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem de visitantes. Define para o ponto em que seu avatar se encontra neste lote."/>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
index 222572b4bf..fb17896551 100644
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -364,7 +364,7 @@
 				Аватары с других участков могут видеть аватары на этом участке и общаться с ними
 			</text>
 			<check_box label="Видны аватары" left="262" name="SeeAvatarsCheck" tool_tip="Аватары с других участков смогут видеть аватары на этом участке и общаться с ними в чате, а вы также сможете видеть их и общаться с ними."/>
-			<text name="landing_point">
+			<text name="landing_point" width="225">
 				В точку телепортации: [LANDING]
 			</text>
 			<button label="Задать" label_selected="Задать" name="Set" tool_tip="Установить точку телепортации, в которую будут прибывать посетители, Ставится в месте вашего аватара на этом участке."/>
-- 
cgit v1.2.3


From 941c1ee7f8a0446937c37ba6ce31503a0c360d50 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 9 Jan 2020 20:54:36 +0200
Subject: SL-11172 Scroll to focused object if object is not in visible area

---
 indra/llui/llaccordionctrl.cpp    | 31 +++++++++++++++++++++++++++++++
 indra/llui/llaccordionctrl.h      |  1 +
 indra/llui/llaccordionctrltab.cpp | 29 +++++++++++++++++++++++++++++
 indra/llui/llaccordionctrltab.h   |  1 +
 indra/llui/lluictrl.cpp           |  1 +
 indra/llui/llview.cpp             | 10 ++++++++++
 indra/llui/llview.h               |  1 +
 7 files changed, 74 insertions(+)

diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 623f570cef..779508df49 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -655,6 +655,37 @@ void	LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
 {
 	updateLayout(getRect().getWidth(),getRect().getHeight());
 }
+
+// virtual
+void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl)
+{
+    if (mScrollbar && mScrollbar->getVisible())
+    {
+        // same as scrollToShowRect
+        LLRect rect;
+        cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
+
+        // Translate to parent coordinatess to check if we are in visible rectangle
+        rect.translate(getRect().mLeft, getRect().mBottom);
+
+        if (!getRect().contains(rect))
+        {
+            // for accordition's scroll, height is in pixels
+            // Back to local coords and calculate position for scroller
+            S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
+            S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
+
+            S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
+                bottom, // min vertical scroll
+                top); // max vertical scroll 
+
+            mScrollbar->setDocPos(scroll_pos);
+        }
+    }
+
+    LLUICtrl::onChildGotFocus(cntrl);
+}
+
 void	LLAccordionCtrl::onOpen		(const LLSD& key)
 {
 	for(size_t i=0;i<mAccordionTabs.size();++i)
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 1fe64c472e..3e30677429 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -111,6 +111,7 @@ public:
 	void	draw();
 	
 	void	onScrollPosChangeCallback(S32, LLScrollbar*);
+	virtual void onChildGotFocus(const LLUICtrl * cntrl);
 
 	void	onOpen		(const LLSD& key);
 	S32		notifyParent(const LLSD& info);
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index eaf1284237..d65d5b246e 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -452,6 +452,35 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
 	notifyParent(LLSD().with("child_visibility_change", new_visibility));
 }
 
+// virtual
+void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl)
+{
+    if (mScrollbar && mScrollbar->getVisible())
+    {
+        LLRect rect;
+        cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
+
+        // Translate to parent coordinatess to check if we are in visible rectangle
+        rect.translate(getRect().mLeft, getRect().mBottom);
+
+        if (!getRect().contains(rect))
+        {
+            // for accordition's scroll, height is in pixels
+            // Back to local coords and calculate position for scroller
+            S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
+            S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
+
+            S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
+                bottom, // min vertical scroll
+                top); // max vertical scroll 
+
+            mScrollbar->setDocPos(scroll_pos);
+        }
+    }
+
+    LLUICtrl::onChildGotFocus(cntrl);
+}
+
 BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	if(mCollapsible && mHeaderVisible && mCanOpenClose)
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 0263bce4be..53546ad5a1 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -159,6 +159,7 @@ public:
 	 * Raises notifyParent event with "child_visibility_change" = new_visibility
 	 */
 	void onVisibilityChange(BOOL new_visibility);
+	virtual void onChildGotFocus(const LLUICtrl * cntrl);
 
 	// Changes expand/collapse state and triggers expand/collapse callbacks
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index c98da0d410..e1d275c351 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -679,6 +679,7 @@ void LLUICtrl::setFocus(BOOL b)
 		if (!hasFocus())
 		{
 			gFocusMgr.setKeyboardFocus( this );
+			onChildGotFocus(this);
 		}
 	}
 	else
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index b0e346f513..aa64b2c16e 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -640,6 +640,16 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
 	}
 }
 
+// virtual
+void LLView::onChildGotFocus(const LLUICtrl * cntrl)
+{
+    LLView* parent_view = getParent();
+    if (parent_view)
+    {
+        parent_view->onChildGotFocus(cntrl);
+    }
+}
+
 // virtual
 void LLView::translate(S32 x, S32 y)
 {
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index b448cc8397..031405035e 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -301,6 +301,7 @@ public:
 	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text );
 
 	virtual void	onVisibilityChange ( BOOL new_visibility );
+	virtual void	onChildGotFocus(const LLUICtrl * cntrl);
 
 	void			pushVisible(BOOL visible)	{ mLastVisible = mVisible; setVisible(visible); }
 	void			popVisible()				{ setVisible(mLastVisible); }
-- 
cgit v1.2.3


From feb4280e290d3bad8556a7d5073aec0b838e41e6 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 15 Jan 2020 14:02:02 +0200
Subject: SL-12558 FIXED The "Default" preset allows saving over it

---
 indra/newview/llfloatersaveprefpreset.cpp | 5 ++++-
 indra/newview/llpresetsmanager.h          | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatersaveprefpreset.cpp b/indra/newview/llfloatersaveprefpreset.cpp
index 684778c93a..8eb3510881 100644
--- a/indra/newview/llfloatersaveprefpreset.cpp
+++ b/indra/newview/llfloatersaveprefpreset.cpp
@@ -87,7 +87,10 @@ void LLFloaterSavePrefPreset::onBtnSave()
 {
 	std::string name = mPresetCombo->getSimple();
 
-	if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (name == PRESETS_DEFAULT))
+	std::string upper_name(name);
+	LLStringUtil::toUpper(upper_name);
+
+	if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (upper_name == PRESETS_DEFAULT_UPPER))
 	{
 		LLNotificationsUtil::add("DefaultPresetNotSaved");
 	}
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index 0014e32267..488a61290b 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -33,6 +33,7 @@
 #include <map>
 
 static const std::string PRESETS_DEFAULT = "Default";
+static const std::string PRESETS_DEFAULT_UPPER = "DEFAULT";
 static const std::string PRESETS_DIR = "presets";
 static const std::string PRESETS_GRAPHIC = "graphic";
 static const std::string PRESETS_CAMERA = "camera";
-- 
cgit v1.2.3


From dcbbe66e0a9fcf3d887b043f6e325c86d51a8f4b Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 16 Jan 2020 13:48:45 +0200
Subject: SL-12566 Select current preset in 'Select preset' combo when opening
 the floater

---
 indra/newview/llfloaterloadprefpreset.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/indra/newview/llfloaterloadprefpreset.cpp b/indra/newview/llfloaterloadprefpreset.cpp
index 403db35cc0..36fae0391c 100644
--- a/indra/newview/llfloaterloadprefpreset.cpp
+++ b/indra/newview/llfloaterloadprefpreset.cpp
@@ -65,6 +65,11 @@ void LLFloaterLoadPrefPreset::onOpen(const LLSD& key)
 
 	EDefaultOptions option = DEFAULT_TOP;
 	LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+	if (!preset_graphic_active.empty())
+	{
+		combo->setSimple(preset_graphic_active);
+	}
 }
 
 void LLFloaterLoadPrefPreset::onPresetsListChange()
@@ -73,6 +78,11 @@ void LLFloaterLoadPrefPreset::onPresetsListChange()
 
 	EDefaultOptions option = DEFAULT_TOP;
 	LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+	if (!preset_graphic_active.empty())
+	{
+		combo->setSimple(preset_graphic_active);
+	}
 }
 
 void LLFloaterLoadPrefPreset::onBtnCancel()
-- 
cgit v1.2.3


From e0d1586f8c62cdf6455b3ff853f9c22d866e102c Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 21 Jan 2020 17:02:53 +0200
Subject: SL-12494 Add some more key bindings

---
 indra/newview/skins/default/xui/en/menu_viewer.xml | 31 +++++++++++++++++-----
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index af185d43b0..8e65a2ffb1 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -56,7 +56,8 @@
       </menu_item_call>
       <menu_item_call
        label="Places..."
-       name="Places">
+       name="Places"
+       shortcut="control|L">
         <menu_item_call.on_click
          function="Floater.ToggleOrBringToFront"
          parameter="places" />
@@ -85,11 +86,22 @@
       <menu_item_separator/>
       <menu_item_call
        label="Camera Controls..."
-       name="Camera Controls">
+       name="Camera Controls"
+       shortcut="control|K">
         <menu_item_call.on_click
          function="Floater.ToggleOrBringToFront"
          parameter="camera" />
       </menu_item_call>
+      <menu_item_call
+       label="Hover Height"
+       name="HoverHeight"
+       shortcut="alt|control|H"
+       visible="false">
+        <menu_item_call.on_click
+         function="HoverHeight"/>
+        <menu_item_call.on_enable
+         function="Edit.EnableHoverHeight"/>
+      </menu_item_call>
       <menu
        create_jump_keys="true"
        label="Movement"
@@ -150,7 +162,8 @@
         </menu_item_check>
         <menu_item_call
          label="Stop Animating Me"
-         name="Stop Animating My Avatar">
+         name="Stop Animating My Avatar"
+         shortcut="alt|shift|A">
           <menu_item_call.on_click
            function="Tools.StopAllAnimations" />
         </menu_item_call>
@@ -473,7 +486,8 @@
         </menu_item_check>
         <menu_item_call
              label="Events"
-             name="Events">
+             name="Events"
+             shortcut="control|E">
             <menu_item_call.on_click
              function="Advanced.ShowURL"
              parameter="http://events.secondlife.com"/>
@@ -662,7 +676,8 @@
          tear_off="true">
             <menu_item_check
              label="Sunrise"
-             name="Sunrise">
+             name="Sunrise"
+             shortcut="control|shift|O">
                 <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="sunrise" />
@@ -694,7 +709,8 @@
             </menu_item_check>
             <menu_item_check
              label="Midnight"
-             name="Midnight">
+             name="Midnight"
+             shortcut="control|shift|Z">
                 <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="midnight" />
@@ -1342,7 +1358,8 @@
             <menu_item_call
            label="Model..."
            layout="topleft"
-           name="Upload Model">
+           name="Upload Model"
+           shortcut="alt|control|U">
             <menu_item_call.on_click
              function="File.UploadModel"
              parameter="" />
-- 
cgit v1.2.3


From 08ac091dbd1f8946e170bd24ec1947427bb04b98 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 23 Jan 2020 12:05:09 +0200
Subject: SL-12610 FIXED [Portuguese] The texture size isn't displayed in the
 "Texture" floater

---
 indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index ba4ef0afde..5ec005bd1a 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -13,8 +13,11 @@
 		<radio_item label="Inventário" name="inventory" value="0"/>
 		<radio_item label="Local" name="local" value="1"/>
 	</radio_group>
+	<text name="size_lbl">
+		Tamanho:
+	</text>
 	<text name="unknown">
-		Tamanho: [DIMENSÕES]
+		[DIMENSIONS]
 	</text>
 	<button label="Padrão" label_selected="Padrão" name="Default"/>
 	<button label="Branco" label_selected="Branco" name="Blank"/>
-- 
cgit v1.2.3


From 92499ce1b43fd60ce7aad71d12f9eef0cef04f7f Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 27 Jan 2020 17:54:02 +0200
Subject: SL-12475 add Inventory Favorites tab

---
 indra/llui/llfolderview.h                          |  2 +
 .../newview/app_settings/settings_per_account.xml  | 11 +++
 indra/newview/llinventorybridge.cpp                | 53 ++++++++++--
 indra/newview/llinventorymodel.cpp                 |  5 ++
 indra/newview/llinventorypanel.cpp                 | 95 ++++++++++++++++++++++
 indra/newview/llinventorypanel.h                   | 21 +++++
 indra/newview/llpanelmaininventory.cpp             | 12 ++-
 indra/newview/llpanelmaininventory.h               |  2 +
 .../skins/default/xui/en/menu_inventory.xml        |  7 ++
 .../skins/default/xui/en/panel_main_inventory.xml  | 40 +++++----
 indra/newview/skins/default/xui/en/strings.xml     |  1 +
 11 files changed, 225 insertions(+), 24 deletions(-)

diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 2926e160d0..f70e9aa488 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -238,6 +238,8 @@ public:
 	void dumpSelectionInformation();
 
 	virtual S32	notify(const LLSD& info) ;
+
+	void setShowEmptyMessage(bool show_msg) { mShowEmptyMessage = show_msg; }
 	
 	bool useLabelSuffix() { return mUseLabelSuffix; }
 	virtual void updateMenu();
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 8f4ca6c633..5eecf1b9f5 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -392,6 +392,17 @@
         <key>Value</key>
         <string></string>
       </map>
+      <key>FavoritesFolder</key>
+      <map>
+        <key>Comment</key>
+        <string>User's chosen folder which will be shown in the Favorites tab (UUID)</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>String</string>
+        <key>Value</key>
+        <string></string>
+      </map>
       <key>SnapshotBaseDir</key>
       <map>
         <key>Comment</key>
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d460aa1452..d214946398 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -134,6 +134,35 @@ bool isMarketplaceSendAction(const std::string& action)
 	return ("send_to_marketplace" == action);
 }
 
+bool isPanelActive(const std::string& panel_name)
+{
+    LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+    return (active_panel && (active_panel->getName() == panel_name));
+}
+
+bool isParentSystemFolder(const LLInventoryModel* model, const LLUUID& folder_id)
+{
+    if (!model || folder_id.isNull()) return false;
+
+    LLViewerInventoryCategory* cat = model->getCategory(folder_id);
+    if (cat)
+    {
+        if (cat->getPreferredType() == LLFolderType::FT_ROOT_INVENTORY)
+        {
+            return false;
+        }
+        if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+        {
+            return true;
+        }
+        else
+        {
+            return isParentSystemFolder(model, cat->getParentUUID());
+        }
+    }
+    return false;
+}
+
 // Used by LLFolderBridge as callback for directory fetching recursion
 class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
 {
@@ -884,8 +913,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 		disabled_items.push_back(std::string("Properties"));
 	}
 
-	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
-	if (active_panel && (active_panel->getName() != "All Items"))
+	if (!isPanelActive("All Items"))
 	{
 		items.push_back(std::string("Show in Main Panel"));
 	}
@@ -976,7 +1004,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
 
 	items.push_back(std::string("Delete"));
 
-	if (!isItemRemovable())
+	if (!isItemRemovable() || isPanelActive("Favorite Items"))
 	{
 		disabled_items.push_back(std::string("Delete"));
 	}
@@ -3997,6 +4025,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 		disabled_items.push_back(std::string("New Clothes"));
 		disabled_items.push_back(std::string("New Body Parts"));
 		disabled_items.push_back(std::string("upload_def"));
+		disabled_items.push_back(std::string("Set Favorites folder"));
 	}
 	if (favorites == mUUID)
 	{
@@ -4024,6 +4053,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 		disabled_items.push_back(std::string("New Clothes"));
 		disabled_items.push_back(std::string("New Body Parts"));
 		disabled_items.push_back(std::string("upload_def"));
+		disabled_items.push_back(std::string("Set Favorites folder"));
     }
     if (marketplace_listings_id == mUUID)
     {
@@ -4032,14 +4062,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
         disabled_items.push_back(std::string("Cut"));
         disabled_items.push_back(std::string("Delete"));
     }
+
+	if (isPanelActive("Favorite Items"))
+	{
+		disabled_items.push_back(std::string("Delete"));
+	}
 	if(trash_id == mUUID)
 	{
-		bool is_recent_panel = false;
-		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
-		if (active_panel && (active_panel->getName() == "Recent Items"))
-		{
-			is_recent_panel = true;
-		}
+		bool is_recent_panel = isPanelActive("Recent Items");
 
 		// This is the trash.
 		items.push_back(std::string("Empty Trash"));
@@ -4087,6 +4117,11 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
                     items.push_back(std::string("New Clothes"));
                     items.push_back(std::string("New Body Parts"));
                     items.push_back(std::string("upload_def"));
+
+                    if (!LLFolderType::lookupIsProtectedType(getPreferredType()) && !isParentSystemFolder(model, mUUID))
+                    {
+                        items.push_back(std::string("Set Favorites folder"));
+                    }
                 }
 			}
 			getClipboardEntries(false, items, disabled_items, flags);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index c49d61df31..3cd38a5122 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -542,6 +542,11 @@ const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::
         cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));
         break;
     }
+    case LLFolderType::FT_FAVORITE:
+    {
+        cat_id = LLUUID(gSavedPerAccountSettings.getString("FavoritesFolder"));
+        break;
+    }
     default:
         break;
     }
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 6f461673ee..d7598bae91 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -169,6 +169,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
 	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));
 	mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.SetFavoritesFolder", boost::bind(&LLInventoryPanel::setFavoritesFolder, this, _2));
 }
 
 LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
@@ -1344,6 +1345,11 @@ void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
     }
 }
 
+void LLInventoryPanel::setFavoritesFolder(const LLSD& userdata)
+{
+    gSavedPerAccountSettings.setString("FavoritesFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
+}
+
 void LLInventoryPanel::purgeSelectedItems()
 {
     if (!mFolderRoot.get()) return;
@@ -1729,6 +1735,95 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
 }
 
+static LLDefaultChildRegistry::Register<LLInventoryFavoriteItemsPanel> t_favorites_inventory_panel("favorites_inventory_panel");
+
+LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params)
+    : LLInventoryPanel(params)
+{
+    std::string ctrl_name = "FavoritesFolder";
+    if (gSavedPerAccountSettings.controlExists(ctrl_name))
+    {
+        LLPointer<LLControlVariable> cntrl_ptr = gSavedPerAccountSettings.getControl(ctrl_name);
+        if (cntrl_ptr.notNull())
+        {
+            mFolderChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder, this));
+        }
+    }
+}
+
+void LLInventoryFavoriteItemsPanel::setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb)
+{
+    if (mFolderRoot.get())
+    {
+        mFolderRoot.get()->setSelectCallback(cb);
+        mSelectionCallback = cb;
+    }
+}
+
+void LLInventoryFavoriteItemsPanel::initFromParams(const Params& p)
+{
+    Params fav_params(p);
+    fav_params.start_folder.id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+    LLInventoryPanel::initFromParams(fav_params);
+    updateFavoritesRootFolder();
+}
+
+void LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder()
+{
+    const LLUUID& folder_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+
+    bool is_favorites_set = (folder_id != gInventory.findCategoryUUIDForTypeInRoot(LLFolderType::FT_FAVORITE, true, gInventory.getRootFolderID()));
+
+    if (!is_favorites_set || folder_id != getRootFolderID())
+    {
+        LLUUID root_id = folder_id;
+        if (mFolderRoot.get())
+        {
+            removeItemID(getRootFolderID());
+            mFolderRoot.get()->destroyView();
+        }
+
+        mCommitCallbackRegistrar.pushScope();
+        {
+            LLFolderView* folder_view = createFolderRoot(root_id);
+            mFolderRoot = folder_view->getHandle();
+
+            addItemID(root_id, mFolderRoot.get());
+
+
+            LLRect scroller_view_rect = getRect();
+            scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+            LLScrollContainer::Params scroller_params(mParams.scroll());
+            scroller_params.rect(scroller_view_rect);
+
+            if (mScroller)
+            {
+                removeChild(mScroller);
+                delete mScroller;
+                mScroller = NULL;
+            }
+            mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+            addChild(mScroller);
+            mScroller->addChild(mFolderRoot.get());
+            mFolderRoot.get()->setScrollContainer(mScroller);
+            mFolderRoot.get()->setFollowsAll();
+            mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox);
+
+            if (!mSelectionCallback.empty())
+            {
+                mFolderRoot.get()->setSelectCallback(mSelectionCallback);
+            }
+        }
+        mCommitCallbackRegistrar.popScope();
+        mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+        if (is_favorites_set)
+        {
+            buildNewViews(folder_id);
+        }
+        mFolderRoot.get()->setShowEmptyMessage(!is_favorites_set);
+    }
+}
 namespace LLInitParam
 {
 	void TypeValues<LLFolderType::EType>::declareValues()
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 12001f5a2b..7d6adad9f3 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -205,6 +205,7 @@ public:
 	void doCreate(const LLSD& userdata);
 	bool beginIMSession();
 	void fileUploadLocation(const LLSD& userdata);
+	void setFavoritesFolder(const LLSD& userdata);
 	void purgeSelectedItems();
 	bool attachObject(const LLSD& userdata);
 	static void idle(void* user_data);
@@ -322,4 +323,24 @@ private:
 	bool				mViewsInitialized; // Views have been generated
 };
 
+
+class LLInventoryFavoriteItemsPanel : public LLInventoryPanel
+{
+public:
+    struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+    {};
+
+    void initFromParams(const Params& p);
+    bool isSelectionRemovable() { return false; }
+    void setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
+
+protected:
+    LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params);
+    ~LLInventoryFavoriteItemsPanel() { mFolderChangedSignal.disconnect(); }
+    void updateFavoritesRootFolder();
+
+    boost::signals2::connection mFolderChangedSignal;
+    boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)> mSelectionCallback;
+    friend class LLUICtrlFactory;
+};
 #endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index f63e604927..0eb9ed0ed9 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -184,6 +184,16 @@ BOOL LLPanelMainInventory::postBuild()
 		worn_filter.markDefault();
 		mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
 	}
+
+	mFavoriteItemsPanel = getChild<LLInventoryFavoriteItemsPanel>("Favorite Items");
+	if (mFavoriteItemsPanel)
+	{
+		LLInventoryFilter& recent_filter = mFavoriteItemsPanel->getFilter();
+		recent_filter.setEmptyLookupMessage("InventoryFavoritItemsNotSelected");
+		recent_filter.markDefault();
+		mFavoriteItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mFavoriteItemsPanel, _1, _2));
+	}
+
 	mSearchTypeCombo  = getChild<LLComboBox>("search_type");
 	if(mSearchTypeCombo)
 	{
@@ -1390,7 +1400,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "delete")
 	{
-		return getActivePanel()->isSelectionRemovable();
+		return getActivePanel()->isSelectionRemovable() && (getActivePanel() != mFavoriteItemsPanel);
 	}
 	if (command_name == "save_texture")
 	{
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 732a3b04e3..bcb4f6737f 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -37,6 +37,7 @@
 class LLComboBox;
 class LLFolderViewItem;
 class LLInventoryPanel;
+class LLInventoryFavoriteItemsPanel;
 class LLSaveFolderState;
 class LLFilterEditor;
 class LLTabContainer;
@@ -136,6 +137,7 @@ private:
 	LLHandle<LLFloater>			mFinderHandle;
 	LLInventoryPanel*			mActivePanel;
 	LLInventoryPanel*			mWornItemsPanel;
+	LLInventoryFavoriteItemsPanel* mFavoriteItemsPanel;
 	bool						mResortActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 3bdbbb04d7..52fcdc5b58 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -358,6 +358,13 @@
          parameter="model" />
       </menu_item_call>
     </menu>
+      <menu_item_call
+       label="Use as Favorites folder"
+       layout="topleft"
+       name="Set Favorites folder">
+        <menu_item_call.on_click
+         function="Inventory.SetFavoritesFolder"/>
+      </menu_item_call>
     <menu
      label="Change Type"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index d77fbdec0a..2745b9d302 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -117,20 +117,32 @@
      name="Recent Items"
      show_item_link_overlays="true"
      width="290" />
-       <inventory_panel
-      name="Worn Items"
-      label="WORN"
-      show_empty_message="false"
-      follows="all"
-      layout="topleft"
-      width="290"
-      bg_opaque_color="DkGray2"
-      bg_alpha_color="DkGray2"
-      background_visible="true"
-      border="false"
-      bevel_style="none"
-      scroll.reserve_scroll_corner="false">
-  </inventory_panel>
+    <inventory_panel
+     name="Worn Items"
+     label="WORN"
+     show_empty_message="false"
+     follows="all"
+     layout="topleft"
+     width="290"
+     bg_opaque_color="DkGray2"
+     bg_alpha_color="DkGray2"
+     background_visible="true"
+     border="false"
+     bevel_style="none"
+     scroll.reserve_scroll_corner="false"/>
+    <favorites_inventory_panel
+     name="Favorite Items"
+     label="FAVORITES"
+     show_empty_message="false"
+     follows="all"
+     layout="topleft"
+     width="290"
+     bg_opaque_color="DkGray2"
+     bg_alpha_color="DkGray2"
+     background_visible="true"
+     border="false"
+     bevel_style="none"
+     scroll.reserve_scroll_corner="false"/>
   </tab_container>
   <layout_stack
    animate="false"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 0594e18c96..39627f7225 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2291,6 +2291,7 @@ For AI Character: Get the closest navigable point to the point provided.
 	<!-- inventory -->
 	<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
 	<string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string>
+	<string name="InventoryFavoritItemsNotSelected">Click "Use as Favorites folder" on a folder of your choice. You can choose a different folder at any time. System folders cannot be used for Favorites.</string>
 	<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
 	<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
 	<string name="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</string>
-- 
cgit v1.2.3


From 25fd4c2ba7bc00a0603bf58f5897ac550ff02446 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Tue, 28 Jan 2020 14:50:32 +0200
Subject: SL-12475 Mac buildfix

---
 indra/newview/llinventorypanel.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 7d6adad9f3..cdbbe2bf35 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -335,7 +335,7 @@ public:
     void setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
 
 protected:
-    LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params);
+    LLInventoryFavoriteItemsPanel(const Params& params);
     ~LLInventoryFavoriteItemsPanel() { mFolderChangedSignal.disconnect(); }
     void updateFavoritesRootFolder();
 
-- 
cgit v1.2.3


From 31b1dcc7efb84ae3a454804d5e4b321fd75d9ee4 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 30 Jan 2020 14:35:43 +0200
Subject: SL-12598 FIXED The buttons have cropped names in the 'Preferences'
 floater

---
 .../newview/skins/default/xui/de/panel_preferences_graphics1.xml  | 8 ++++----
 indra/newview/skins/default/xui/de/panel_preferences_setup.xml    | 2 +-
 indra/newview/skins/default/xui/es/panel_preferences_advanced.xml | 2 +-
 .../newview/skins/default/xui/es/panel_preferences_graphics1.xml  | 8 ++++----
 .../newview/skins/default/xui/fr/panel_preferences_graphics1.xml  | 8 ++++----
 .../newview/skins/default/xui/it/panel_preferences_graphics1.xml  | 6 +++---
 indra/newview/skins/default/xui/it/panel_preferences_setup.xml    | 2 +-
 .../newview/skins/default/xui/pt/panel_preferences_graphics1.xml  | 8 ++++----
 indra/newview/skins/default/xui/pt/panel_preferences_setup.xml    | 2 +-
 indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml | 2 +-
 .../newview/skins/default/xui/ru/panel_preferences_graphics1.xml  | 2 +-
 11 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index e0aa9fe4a9..16fdb69509 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -32,10 +32,10 @@
 	</text>
 	<check_box initial_value="true" label="Freunde immer darstellen" name="AlwaysRenderFriends"/>
 	<button label="Ausnahmen..." name="RenderExceptionsButton"/>
-	<button label="Einstellungen als Voreinstellung speichern..." name="PrefSaveButton"/>
-	<button label="Voreinstellung laden..." name="PrefLoadButton"/>
+	<button label="Einstellungen als Voreinstellung speichern" name="PrefSaveButton" width="235" left="5"/>
+	<button label="Voreinstellung laden" name="PrefLoadButton" width="120"/>
 	min_val=&quot;0.125&quot;
-	<button label="Voreinstellung löschen..." name="PrefDeleteButton"/>
-	<button label="Auf empfohlene Einstellungen zurücksetzen" name="Defaults"/>
+	<button label="Voreinstellung löschen" name="PrefDeleteButton" width="130"/>
+	<button label="Auf empfohlene Einstellungen zurücksetzen" name="Defaults" width="248"/>
 	<button label="Erweiterte Einstellungen..." name="AdvancedSettings"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 1435b7f87d..a8509cabac 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -35,5 +35,5 @@
 	<text name="Proxy Settings:">
 		Proxy-Einstellungen:
 	</text>
-	<button label="Proxy-Einstellungen ändern" label_selected="Durchsuchen" name="set_proxy"/>
+	<button label="Proxy-Einstellungen ändern" label_selected="Durchsuchen" name="set_proxy" width="160"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index 007101b8fe..0ba676898f 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -28,5 +28,5 @@
 	<check_box label="Mostrar la selección de cuadrícula al iniciar sesión" name="show_grid_selection_check"/>
 	<check_box label="Mostrar el menú Avanzado" name="show_advanced_menu_check"/>
 	<check_box label="Mostrar el menú Desarrollar" name="show_develop_menu_check"/>
-	<button label="Permisos de creación predeterminados" name="default_creation_permissions"/>
+	<button label="Permisos de creación predeterminados" name="default_creation_permissions" width="235"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 816c698548..47815d0296 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -32,10 +32,10 @@
 	</text>
 	<check_box initial_value="true" label="Renderizar siempre los amigos" name="AlwaysRenderFriends"/>
 	<button label="Excepciones..." name="RenderExceptionsButton"/>
-	<button label="Guardar configuración como valor predefinido..." name="PrefSaveButton"/>
-	<button label="Cargar predefinido..." name="PrefLoadButton"/>
+	<button label="Guardar configuración como valor predefinido" name="PrefSaveButton" width="260" left="5"/>
+	<button label="Cargar predefinido" name="PrefLoadButton" left_pad="7"/>
 	min_val=&quot;0.125&quot;
-	<button label="Eliminar predefinido..." name="PrefDeleteButton"/>
-	<button label="Restablecer la configuración recomendada" name="Defaults"/>
+	<button label="Eliminar predefinido" name="PrefDeleteButton"  width="117" left_pad="7"/>
+	<button label="Restablecer la configuración recomendada" name="Defaults" width="248"/>
 	<button label="Configuración avanzada..." name="AdvancedSettings"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 7117ace7e1..46d6305290 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -32,10 +32,10 @@
 	</text>
 	<check_box initial_value="true" label="Toujours effectuer le rendu des amis" name="AlwaysRenderFriends"/>
 	<button label="Exceptions..." name="RenderExceptionsButton"/>
-	<button label="Enregistrer les paramètres comme préréglage..." name="PrefSaveButton"/>
-	<button label="Charger un préréglage..." name="PrefLoadButton"/>
+	<button label="Enregistrer les paramètres comme préréglage" name="PrefSaveButton" width="260" />
+	<button label="Charger un préréglage" name="PrefLoadButton" width="132"/>
 	min_val=&quot;0,125&quot;
-	<button label="Supprimer un préréglage..." name="PrefDeleteButton"/>
-	<button label="Réinitialiser les paramètres recommandés" name="Defaults"/>
+	<button label="Supprimer un préréglage" name="PrefDeleteButton" width="148" top_delta="30" left_pad="-220"/>
+	<button label="Réinitialiser les paramètres recommandés" name="Defaults" width="255" top_delta="35"/>
 	<button label="Paramètres avancés" name="AdvancedSettings"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index f3ca9fafb3..c7739b8472 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -32,10 +32,10 @@
 	</text>
 	<check_box initial_value="true" label="Esegui sempre il rendering degli amici" name="AlwaysRenderFriends"/>
 	<button label="Eccezioni..." name="RenderExceptionsButton"/>
-	<button label="Salva impostazioni come valori predefiniti..." name="PrefSaveButton"/>
-	<button label="Carica valore predefinito..." name="PrefLoadButton"/>
+	<button label="Salva impostazioni come valori predefiniti" name="PrefSaveButton" width="240" left="4"/>
+	<button label="Carica valore predefinito" name="PrefLoadButton" width="145" left_pad="7"/>
 	min_val=&quot;0.125&quot;
-	<button label="Elimina valore predefinito..." name="PrefDeleteButton"/>
+	<button label="Elimina valore predefinito" name="PrefDeleteButton" width="148" left_pad="7"/>
 	<button label="Ripristina impostazioni consigliate" name="Defaults"/>
 	<button label="Impostazioni avanzate..." name="AdvancedSettings"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index aa3ff53f4a..c9d90539e1 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -35,5 +35,5 @@
 	<text name="Proxy Settings:">
 		Impostazioni proxy:
 	</text>
-	<button label="Regola impostazioni proxy" label_selected="Sfoglia" name="set_proxy"/>
+	<button label="Regola impostazioni proxy" label_selected="Sfoglia" name="set_proxy" width="160"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
index a0f4ea4ed5..d387c4c869 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -33,10 +33,10 @@ rápido
 	</text>
 	<check_box initial_value="true" label="Sempre renderizar amigos" name="AlwaysRenderFriends"/>
 	<button label="Exceções..." name="RenderExceptionsButton"/>
-	<button label="Salvar configurações como predefinição..." name="PrefSaveButton"/>
-	<button label="Carregar predefinição..." name="PrefLoadButton"/>
+	<button label="Salvar configurações como predefinição" name="PrefSaveButton" width="235" left="5"/>
+	<button label="Carregar predefinição" name="PrefLoadButton" width="130" left_pad="8"/>
 	min_val=&quot;0.125&quot;
-	<button label="Excluir predefinição..." name="PrefDeleteButton"/>
-	<button label="Redefinir para configurações recomendadas" left="110" name="Defaults"/>
+	<button label="Excluir predefinição" name="PrefDeleteButton" width="122" left_pad="8"/>
+	<button label="Redefinir para configurações recomendadas" name="Defaults" width="255"/>
 	<button label="Configurações avançadas..." name="AdvancedSettings"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index 03536f28c3..56fc225bc0 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -35,5 +35,5 @@
 	<text name="Proxy Settings:">
 		Configurações de proxy:
 	</text>
-	<button label="Ajustar configurações de proxy" label_selected="Procurar" name="set_proxy"/>
+	<button label="Ajustar configurações de proxy" label_selected="Procurar" name="set_proxy" width="180"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
index dd0cf8e172..79d5cb7960 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
@@ -28,5 +28,5 @@
 	<check_box label="Выбор сетки при входе" name="show_grid_selection_check"/>
 	<check_box label="Показывать расширенное меню" name="show_advanced_menu_check"/>
 	<check_box label="Показать меню разработчика" name="show_develop_menu_check"/>
-	<button label="Стандартные разрешения на создание" name="default_creation_permissions"/>
+	<button label="Стандартные разрешения на создание" name="default_creation_permissions" width="235"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
index 4524fb4d43..f392a1f0b7 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
@@ -32,7 +32,7 @@
 	</text>
 	<check_box initial_value="true" label="Всегда рисовать друзей" name="AlwaysRenderFriends"/>
 	<button label="Исключения..." name="RenderExceptionsButton"/>
-	<button label="Сохранить настройки как пресет..." name="PrefSaveButton"/>
+	<button label="Сохранить настройки как пресет..." name="PrefSaveButton" width="210"/>
 	<button label="Загрузить пресет..." name="PrefLoadButton"/>
 	min_val=&quot;0,125&quot;
 	<button label="Удалить пресет..." name="PrefDeleteButton"/>
-- 
cgit v1.2.3


From c5195905b8c9b30a2b3aab652aa9828e9825c42f Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 31 Jan 2020 15:37:09 +0200
Subject: SL-12554 FIXED The value of the 'Avatar Maximum Complexity' is not
 synchronized on different floaters while editing

---
 indra/newview/llfloaterpreference.cpp | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 390dea092d..9c0f366bf3 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1868,6 +1868,14 @@ void LLFloaterPreference::updateMaxComplexity()
     LLAvatarComplexityControls::updateMax(
         getChild<LLSliderCtrl>("IndirectMaxComplexity"),
         getChild<LLTextBox>("IndirectMaxComplexityText"));
+
+    LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance<LLFloaterPreferenceGraphicsAdvanced>("prefs_graphics_advanced");
+    if (floater_graphics_advanced)
+    {
+        LLAvatarComplexityControls::updateMax(
+            floater_graphics_advanced->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
+            floater_graphics_advanced->getChild<LLTextBox>("IndirectMaxComplexityText"));
+    }
 }
 
 bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
@@ -1915,6 +1923,14 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
     LLAvatarComplexityControls::updateMax(
         getChild<LLSliderCtrl>("IndirectMaxComplexity"),
         getChild<LLTextBox>("IndirectMaxComplexityText"));
+
+    LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+    if (floater_preferences)
+    {
+        LLAvatarComplexityControls::updateMax(
+            floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
+            floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText"));
+    }
 }
 
 void LLFloaterPreference::onChangeMaturity()
-- 
cgit v1.2.3


From c8e89de61dd1b650b9caa4c2593b0327ef295ef3 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 3 Feb 2020 17:29:08 +0000
Subject: SL-2569 More bad alloc checks

---
 indra/newview/llmeshrepository.cpp | 134 ++++++++++++++++++++++++-------------
 indra/newview/llmeshrepository.h   |   6 +-
 2 files changed, 91 insertions(+), 49 deletions(-)

diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index ce41e2bd35..c9c3dffc5a 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1554,7 +1554,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
 
 				if (!zero)
 				{ //attempt to parse
-					if (physicsShapeReceived(mesh_id, buffer, size))
+					if (physicsShapeReceived(mesh_id, buffer, size) == MESH_OK)
 					{
 						delete[] buffer;
 						return true;
@@ -1648,7 +1648,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c
 			LLMeshRepository::sCacheBytesRead += bytes;	
 			++LLMeshRepository::sCacheReads;
 			file.read(buffer, bytes);
-			if (headerReceived(mesh_params, buffer, bytes))
+			if (headerReceived(mesh_params, buffer, bytes) == MESH_OK)
 			{
 				// Found mesh in VFS cache
 				return true;
@@ -1795,7 +1795,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
 	return retval;
 }
 
-bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
+EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
 {
 	const LLUUID mesh_id = mesh_params.getSculptID();
 	LLSD header;
@@ -1803,30 +1803,39 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
 	U32 header_size = 0;
 	if (data_size > 0)
 	{
-		std::string res_str((char*) data, data_size);
+        std::istringstream stream;
+        try
+        {
+            std::string res_str((char*)data, data_size);
 
-		std::string deprecated_header("<? LLSD/Binary ?>");
+            std::string deprecated_header("<? LLSD/Binary ?>");
 
-		if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
-		{
-			res_str = res_str.substr(deprecated_header.size()+1, data_size);
-			header_size = deprecated_header.size()+1;
-		}
-		data_size = res_str.size();
+            if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+            {
+                res_str = res_str.substr(deprecated_header.size() + 1, data_size);
+                header_size = deprecated_header.size() + 1;
+            }
+            data_size = res_str.size();
 
-		std::istringstream stream(res_str);
+            stream.str(res_str);
+        }
+        catch (std::bad_alloc&)
+        {
+            // out of memory, we won't be able to process this mesh
+            return MESH_OUT_OF_MEMORY;
+        }
 
 		if (!LLSDSerialize::fromBinary(header, stream, data_size))
 		{
 			LL_WARNS(LOG_MESH) << "Mesh header parse error.  Not a valid mesh asset!  ID:  " << mesh_id
 							   << LL_ENDL;
-			return false;
+			return MESH_PARSE_FAILURE;
 		}
 
 		if (!header.isMap())
 		{
 			LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL;
-			return false;
+			return MESH_INVALID;
 		}
 
 		if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION)
@@ -1872,7 +1881,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
 		}
 	}
 
-	return true;
+	return MESH_OK;
 }
 
 EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
@@ -1917,18 +1926,25 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
 
 	if (data_size > 0)
 	{
-		std::string res_str((char*) data, data_size);
-
-		std::istringstream stream(res_str);
+        try
+        {
+            std::string res_str((char*)data, data_size);
+            std::istringstream stream(res_str);
 
-		U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size);
-		if (uzip_result != LLUZipHelper::ZR_OK)
-		{
-			LL_WARNS(LOG_MESH) << "Mesh skin info parse error.  Not a valid mesh asset!  ID:  " << mesh_id
-							   << " uzip result" << uzip_result
-							   << LL_ENDL;
-			return false;
-		}
+            U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size);
+            if (uzip_result != LLUZipHelper::ZR_OK)
+            {
+                LL_WARNS(LOG_MESH) << "Mesh skin info parse error.  Not a valid mesh asset!  ID:  " << mesh_id
+                    << " uzip result" << uzip_result
+                    << LL_ENDL;
+                return false;
+            }
+        }
+        catch (std::bad_alloc&)
+        {
+            LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL;
+            return false;
+        }
 	}
 	
 	{
@@ -1950,19 +1966,26 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
 	LLSD decomp;
 
 	if (data_size > 0)
-	{ 
-		std::string res_str((char*) data, data_size);
-
-		std::istringstream stream(res_str);
+    {
+        try
+        {
+            std::string res_str((char*)data, data_size);
+            std::istringstream stream(res_str);
 
-		U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size);
-		if (uzip_result != LLUZipHelper::ZR_OK)
-		{
-			LL_WARNS(LOG_MESH) << "Mesh decomposition parse error.  Not a valid mesh asset!  ID:  " << mesh_id
-							   << " uzip result: " << uzip_result
-							   << LL_ENDL;
-			return false;
-		}
+            U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size);
+            if (uzip_result != LLUZipHelper::ZR_OK)
+            {
+                LL_WARNS(LOG_MESH) << "Mesh decomposition parse error.  Not a valid mesh asset!  ID:  " << mesh_id
+                    << " uzip result: " << uzip_result
+                    << LL_ENDL;
+                return false;
+            }
+        }
+        catch (std::bad_alloc&)
+        {
+            LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL;
+            return false;
+        }
 	}
 	
 	{
@@ -1977,7 +2000,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
 	return true;
 }
 
-bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
 {
 	LLSD physics_shape;
 
@@ -1994,8 +2017,19 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
 		volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
 		volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
 		LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
-		std::string mesh_string((char*) data, data_size);
-		std::istringstream stream(mesh_string);
+
+        std::istringstream stream;
+        try
+        {
+            std::string mesh_string((char*)data, data_size);
+            stream.str(mesh_string);
+        }
+        catch (std::bad_alloc&)
+        {
+            // out of memory, we won't be able to process this mesh
+            delete d;
+            return MESH_OUT_OF_MEMORY;
+        }
 
 		if (volume->unpackVolumeFaces(stream, data_size))
 		{
@@ -2034,7 +2068,7 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
 		LLMutexLock lock(mMutex);
 		mDecompositionQ.push_back(d);
 	}
-	return true;
+	return MESH_OK;
 }
 
 LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
@@ -3143,15 +3177,21 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
 									  U8 * data, S32 data_size)
 {
 	LLUUID mesh_id = mMeshParams.getSculptID();
-	bool success = (! MESH_HEADER_PROCESS_FAILED)
-		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong
-		&& gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);
+    bool success = (!MESH_HEADER_PROCESS_FAILED)
+        && ((data != NULL) == (data_size > 0)); // if we have data but no size or have size but no data, something is wrong;
 	llassert(success);
+    EMeshProcessingResult res = MESH_UNKNOWN;
+    if (success)
+    {
+        res = gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);
+        success = (res == MESH_OK);
+    }
 	if (! success)
 	{
 		// *TODO:  Get real reason for parse failure here.  Might we want to retry?
 		LL_WARNS(LOG_MESH) << "Unable to parse mesh header.  ID:  " << mesh_id
-						   << ", Unknown reason.  Not retrying."
+						   << ", Size: " << data_size
+						   << ", Reason: " << res << " Not retrying."
 						   << LL_ENDL;
 
 		// Can't get the header so none of the LODs will be available
@@ -3431,7 +3471,7 @@ void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S3
 {
 	if ((!MESH_PHYS_SHAPE_PROCESS_FAILED)
 		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong
-		&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
+		&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size) == MESH_OK)
 	{
 		// good fetch from sim, write to VFS for caching
 		LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index bba0c9f2cb..9a627dabcb 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -57,6 +57,8 @@ typedef enum e_mesh_processing_result_enum
     MESH_NO_DATA = 1,
     MESH_OUT_OF_MEMORY,
     MESH_HTTP_REQUEST_FAILED,
+    MESH_PARSE_FAILURE,
+    MESH_INVALID,
     MESH_UNKNOWN
 } EMeshProcessingResult;
 
@@ -336,11 +338,11 @@ public:
 
 	bool fetchMeshHeader(const LLVolumeParams& mesh_params, bool can_retry = true);
 	bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, bool can_retry = true);
-	bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
+	EMeshProcessingResult headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
 	EMeshProcessingResult lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
 	bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
 	bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
-	bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+	EMeshProcessingResult physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
 	LLSD& getMeshHeader(const LLUUID& mesh_id);
 
 	void notifyLoadedMeshes();
-- 
cgit v1.2.3


From 0e7ab122ec0761ca0a82251d63a7367e7147f4be Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 4 Feb 2020 13:12:38 +0000
Subject: SL-10908 LLFace should fully rely onto drawable

---
 indra/newview/llface.cpp | 12 ++++++------
 indra/newview/llface.h   |  9 +++++++--
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 85ee33edb1..5539cfb5df 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -183,6 +183,7 @@ void LLFace::destroy()
 		if(mTexture[i].notNull())
 		{
 			mTexture[i]->removeFace(i, this) ;
+			mTexture[i] = NULL;
 		}
 	}
 	
@@ -202,7 +203,6 @@ void LLFace::destroy()
 		{
 			mDrawPoolp->removeFace(this);
 		}
-	
 		mDrawPoolp = NULL;
 	}
 
@@ -211,7 +211,7 @@ void LLFace::destroy()
 		delete mTextureMatrix;
 		mTextureMatrix = NULL;
 
-		if (mDrawablep.notNull())
+		if (mDrawablep)
 		{
 			LLSpatialGroup* group = mDrawablep->getSpatialGroup();
 			if (group)
@@ -223,7 +223,7 @@ void LLFace::destroy()
 	}
 	
 	setDrawInfo(NULL);
-		
+
 	mDrawablep = NULL;
 	mVObjp = NULL;
 }
@@ -529,7 +529,7 @@ void LLFace::updateCenterAgent()
 
 void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
 {
-	if (mDrawablep->getSpatialGroup() == NULL)
+	if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
 	{
 		return;
 	}
@@ -537,7 +537,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
 	mDrawablep->getSpatialGroup()->rebuildGeom();
 	mDrawablep->getSpatialGroup()->rebuildMesh();
 		
-	if(mDrawablep.isNull() || mVertexBuffer.isNull())
+	if(mVertexBuffer.isNull())
 	{
 		return;
 	}
@@ -2668,7 +2668,7 @@ S32 LLFace::renderElements(const U16 *index_array) const
 
 S32 LLFace::renderIndexed()
 {
-	if(mDrawablep.isNull() || mDrawPoolp == NULL)
+	if(mDrawablep == NULL || mDrawPoolp == NULL)
 	{
 		return 0;
 	}
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 77861f7d2f..fce7f71173 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -275,8 +275,13 @@ private:
 	LLXformMatrix* mXform;
 
 	LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS];
-	
-	LLPointer<LLDrawable> mDrawablep;
+
+	// mDrawablep is not supposed to be null, don't use LLPointer because
+	// mDrawablep owns LLFace and LLPointer is a good way to either cause a
+	// memory leak or a 'delete each other' situation if something deletes
+	// drawable wrongly.
+	LLDrawable* mDrawablep;
+	// LLViewerObject technically owns drawable, but also it should be strictly managed
 	LLPointer<LLViewerObject> mVObjp;
 	S32			mTEOffset;
 
-- 
cgit v1.2.3


From abfc78429ff1f7f9f8c78b4706254b2510d63351 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 4 Feb 2020 16:10:04 +0200
Subject: SL-12179 Change LLVector4a to a struct

---
 indra/llmath/llvector4a.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h
index 222f3cf235..27abf39537 100644
--- a/indra/llmath/llvector4a.h
+++ b/indra/llmath/llvector4a.h
@@ -46,10 +46,10 @@ class LLRotation;
 // of this writing, July 08, 2010) about getting it implemented before you resort to
 // LLVector3/LLVector4. 
 /////////////////////////////////
-class LLVector4a;
+struct LLVector4a;
 
 LL_ALIGN_PREFIX(16)
-class LLVector4a
+struct LLVector4a
 {
 public:
 
@@ -92,6 +92,7 @@ public:
 	// CONSTRUCTORS 
 	////////////////////////////////////
 	
+	//LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it)
 	LLVector4a()
 	{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
 		ll_assert_aligned(this,16);
-- 
cgit v1.2.3


From 0f948988b8c5e13852f765be41f6cf011c1924f1 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Wed, 5 Feb 2020 18:39:02 +0200
Subject: SL-12660 Hide top level domain name and IP address for simulators

---
 indra/newview/llagent.cpp                      | 4 +---
 indra/newview/llappviewer.cpp                  | 5 +++--
 indra/newview/skins/default/xui/en/strings.xml | 2 +-
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 0e43af91df..930075c77c 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -866,9 +866,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
 	if (mRegionp != regionp)
 	{
 
-		std::string ip = regionp->getHost().getString();
-		LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName()
-				<< " located at " << ip << LL_ENDL;
+		LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() << LL_ENDL;
 		if (mRegionp)
 		{
 			// We've changed regions, we're now going to change our agent coordinate frame.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index c94ec70766..da418fbea6 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3118,8 +3118,9 @@ LLSD LLAppViewer::getViewerInfo() const
 		info["POSITION"] = ll_sd_from_vector3d(pos);
 		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
 		info["REGION"] = gAgent.getRegion()->getName();
-		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
-		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
+
+		boost::regex regex("sim[0-9]*.");
+		info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
 		info["SERVER_VERSION"] = gLastVersionChannel;
 		LLSLURL slurl;
 		LLAgentUI::buildSLURL(slurl);
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 5661e7fe96..b4fdfc41f5 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -28,7 +28,7 @@
     <string name="BuildConfig">Build Configuration [BUILD_CONFIG]</string>
 
 	<string name="AboutPosition">
-You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
 SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
 (global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
 [SERVER_VERSION]
-- 
cgit v1.2.3


From cb869700243ddcc3c5f8f33e905e38a3f190ec95 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Fri, 7 Feb 2020 16:45:39 +0200
Subject: SL-12544 FIXED 'New' purchases indicator in 'Received Items' is not
 present next time the viewer runs

---
 indra/newview/llpanelmarketplaceinboxinventory.cpp | 68 +++++++++++++++++++++-
 indra/newview/llpanelmarketplaceinboxinventory.h   | 19 ++++++
 2 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index cea7054d6a..5508bcdd81 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -36,12 +36,15 @@
 #include "llpanellandmarks.h"
 #include "llplacesinventorybridge.h"
 #include "llviewerfoldertype.h"
+#include "llsdserialize.h"
 
 
 #define DEBUGGING_FRESHNESS	0
 
 const LLColor4U DEFAULT_WHITE(255, 255, 255);
 
+const std::string NEW_INBOX_FILENAME("inbox_new_items.xml");
+
 //
 // statics
 //
@@ -57,7 +60,9 @@ static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_
 
 LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
 :	LLInventoryPanel(p)
-{}
+{
+	LLInboxNewItemsStorage::getInstance()->load();
+}
 
 LLInboxInventoryPanel::~LLInboxInventoryPanel()
 {}
@@ -127,7 +132,7 @@ void LLInboxFolderViewFolder::addItem(LLFolderViewItem* item)
     }
 
     // Compute freshness if our parent is the root folder for the inbox
-    if (mParentFolder == mRoot)
+    if ((mParentFolder == mRoot) && !mFresh)
     {
         computeFreshness();
     }
@@ -167,11 +172,12 @@ void LLInboxFolderViewFolder::selectItem()
 
 void LLInboxFolderViewFolder::computeFreshness()
 {
+	LLFolderViewModelItemInventory* view_model = static_cast<LLFolderViewModelItemInventory*>(getViewModelItem());
 	const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
 
 	if (last_expansion_utc > 0)
 	{
-		mFresh = (static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getCreationDate() > last_expansion_utc);
+		mFresh = (view_model->getCreationDate() > last_expansion_utc) || LLInboxNewItemsStorage::getInstance()->isItemFresh(view_model->getUUID());
 
 #if DEBUGGING_FRESHNESS
 		if (mFresh)
@@ -184,6 +190,11 @@ void LLInboxFolderViewFolder::computeFreshness()
 	{
 		mFresh = true;
 	}
+
+	if (mFresh)
+	{
+		LLInboxNewItemsStorage::getInstance()->addFreshItem(view_model->getUUID());
+	}
 }
 
 void LLInboxFolderViewFolder::deFreshify()
@@ -191,6 +202,7 @@ void LLInboxFolderViewFolder::deFreshify()
 	mFresh = false;
 
 	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+	LLInboxNewItemsStorage::getInstance()->removeItem(static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getUUID());
 }
 
 //
@@ -271,5 +283,55 @@ void LLInboxFolderViewItem::deFreshify()
 	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
 }
 
+LLInboxNewItemsStorage::LLInboxNewItemsStorage()
+{
+}
+
+// static
+void LLInboxNewItemsStorage::destroyClass()
+{
+	LLInboxNewItemsStorage::getInstance()->saveNewItemsIds();
+}
+
+void LLInboxNewItemsStorage::saveNewItemsIds()
+{
+	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME);
+	if (!filename.empty())
+	{
+		LLSD uuids_data;
+		for (std::set<LLUUID>::const_iterator it = mNewItemsIDs.begin(); it != mNewItemsIDs.end(); it++)
+		{
+			uuids_data.append((*it));
+		}
+
+		llofstream file;
+		file.open(filename.c_str());
+		if ( file.is_open() )
+		{
+			LLSDSerialize::toPrettyXML(uuids_data, file);
+			file.close();
+		}
+	}
+}
+
+void LLInboxNewItemsStorage::load()
+{
+	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME);
+	if (!filename.empty())
+	{
+		llifstream in_file;
+		in_file.open(filename.c_str());
 
+		LLSD uuids_data;
+		if (in_file.is_open())
+		{
+			LLSDSerialize::fromXML(uuids_data, in_file);
+			in_file.close();
+			for (LLSD::array_iterator i = uuids_data.beginArray(); i != uuids_data.endArray(); ++i)
+			{
+				mNewItemsIDs.insert((*i).asUUID());
+			}
+		}
+	}
+}
 // eof
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
index 0b27818c95..3e508e801b 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.h
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -113,4 +113,23 @@ protected:
 	bool mFresh;
 };
 
+class LLInboxNewItemsStorage : public LLSingleton<LLInboxNewItemsStorage>
+	, public LLDestroyClass<LLInboxNewItemsStorage>
+{
+	LLSINGLETON(LLInboxNewItemsStorage);
+	LOG_CLASS(LLInboxNewItemsStorage);
+public:
+	static void destroyClass();
+	void saveNewItemsIds();
+
+	void load();
+	
+	void addFreshItem(const LLUUID& id) { mNewItemsIDs.insert(id); }
+	void removeItem(const LLUUID& id) { mNewItemsIDs.erase(id); }
+	bool isItemFresh(const LLUUID& id) { return (mNewItemsIDs.find(id) != mNewItemsIDs.end()); }
+
+private:
+	std::set<LLUUID> mNewItemsIDs;
+};
+
 #endif //LL_INBOXINVENTORYPANEL_H
-- 
cgit v1.2.3


From a4e33585e34e141bf08ca20990322d30d01fa140 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 10 Feb 2020 15:07:49 +0200
Subject: SL-12684 [RU] The version for the update is displayed with "\"

---
 indra/newview/skins/default/xui/ru/notifications.xml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 1e4f9e9abb..fe8d38b4c3 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -1612,22 +1612,22 @@
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		Для входа необходима версия \[VERSION]. 
+		Для входа необходима версия [VERSION]. 
 Скачайте обновление с веб-сайта https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
 	<notification name="PauseForUpdate">
-		Для входа необходима версия \[VERSION]. 
+		Для входа необходима версия [VERSION]. 
 Нажмите OK для загрузки и установки.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
 	<notification name="OptionalUpdateReady">
-		Версия \[VERSION] загружена и готова к установке. 
+		Версия [VERSION] загружена и готова к установке. 
 Нажмите OK для установки.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
 	<notification name="PromptOptionalUpdate">
-		Версия \[VERSION] загружена и готова к установке. 
+		Версия [VERSION] загружена и готова к установке. 
 Продолжить?
 		<usetemplate canceltext="Не сейчас" name="yesnocancelbuttons" notext="Пропустить" yestext="Установить"/>
 	</notification>
-- 
cgit v1.2.3


From 51222605155a02320e7744d1235987b58264b25d Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 10 Feb 2020 17:59:24 +0200
Subject: SL-12660 Hide top level domain name

---
 indra/newview/llappviewer.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index da418fbea6..ab3ae1c64b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3119,7 +3119,7 @@ LLSD LLAppViewer::getViewerInfo() const
 		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
 		info["REGION"] = gAgent.getRegion()->getName();
 
-		boost::regex regex("sim[0-9]*.");
+		boost::regex regex("\\.(secondlife|lindenlab)\\..*");
 		info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
 		info["SERVER_VERSION"] = gLastVersionChannel;
 		LLSLURL slurl;
-- 
cgit v1.2.3


From b9f0eb54ce1a95adb0286302e977936ef8ed91d7 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 12 Feb 2020 12:45:56 +0200
Subject: SL-12396 Triple clicking text in a textbox / textarea should only
 select the current line

---
 doc/contributions.txt     |  2 ++
 indra/llui/lltextbase.cpp | 32 +++++++++++++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index c6ad23dc2c..441374ec43 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1431,6 +1431,8 @@ Thickbrick Sleaford
 	STORM-956
 	STORM-1147
 	STORM-1325
+Thoys Pan
+	SL-12396
 Thraxis Epsilon
 	SVC-371
 	VWR-383
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e64078828b..75eb274603 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1015,7 +1015,37 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
 	// handle triple click
 	if (!mTripleClickTimer.hasExpired())
 	{
-		selectAll();
+		S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
+		S32 line_start = -1;
+		S32 line_end = -1;
+		for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
+				it != end_it;
+				++it)
+		{
+			if (it->mLineNum < real_line)
+			{
+				continue;
+			}
+			if (it->mLineNum > real_line)
+			{
+				break;
+			}
+			if (line_start == -1)
+			{
+				line_start = it->mDocIndexStart;
+			}
+			line_end = it->mDocIndexEnd;
+		}
+
+		if (line_start == -1)
+		{
+			return TRUE;
+		}
+
+		mSelectionEnd = line_start;
+		mSelectionStart = line_end;
+		setCursorPos(line_start);
+
 		return TRUE;
 	}
 
-- 
cgit v1.2.3


From c81aa53e7bd8570da82e1794a8b50eb74a3d1bee Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 12 Feb 2020 17:50:49 +0200
Subject: SL-12695 FIXED 'New' badges are not shown for some folders after
 resizing 'Received items' panel

---
 indra/llui/llbadgeowner.cpp                        | 8 ++++++++
 indra/llui/llbadgeowner.h                          | 1 +
 indra/newview/llpanelmarketplaceinboxinventory.cpp | 6 ++++++
 3 files changed, 15 insertions(+)

diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp
index 0557cd4375..5f11c383ef 100644
--- a/indra/llui/llbadgeowner.cpp
+++ b/indra/llui/llbadgeowner.cpp
@@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
 	}
 }
 
+void LLBadgeOwner::reshapeBadge(const LLRect& new_rect)
+{
+	if (mBadge)
+	{
+		mBadge->setShape(new_rect);
+	}
+}
+
 void LLBadgeOwner::setBadgeVisibility(bool visible)
 {
 	if (mBadge)
diff --git a/indra/llui/llbadgeowner.h b/indra/llui/llbadgeowner.h
index 01ed95f3a3..4ce208fa0d 100644
--- a/indra/llui/llbadgeowner.h
+++ b/indra/llui/llbadgeowner.h
@@ -46,6 +46,7 @@ public:
 	bool hasBadgeHolderParent() const { return mHasBadgeHolderParent; };
 	void setBadgeVisibility(bool visible);
 	void setDrawBadgeAtTop(bool draw_at_top);
+	void reshapeBadge(const LLRect& new_rect);
 
 private:
 
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index 5508bcdd81..7a6631448b 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -150,6 +150,12 @@ void LLInboxFolderViewFolder::draw()
 	setBadgeVisibility(mFresh);
 
 	LLFolderViewFolder::draw();
+
+	if (mFresh)
+	{
+		reshapeBadge(getRect());
+	}
+
 }
 
 BOOL LLInboxFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
-- 
cgit v1.2.3


From 1b78d59dc118f6acd20b58c64ba4b197c0a4eac4 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 13 Feb 2020 12:40:24 +0200
Subject: SL-12631 Update llteleportflags.h in the viewer to match the
 simulator

---
 indra/llmessage/llteleportflags.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/llmessage/llteleportflags.h b/indra/llmessage/llteleportflags.h
index b3fcad036e..fd1e702832 100644
--- a/indra/llmessage/llteleportflags.h
+++ b/indra/llmessage/llteleportflags.h
@@ -44,6 +44,8 @@ const U32 TELEPORT_FLAGS_VIA_REGION_ID  	= 1 << 12;
 const U32 TELEPORT_FLAGS_IS_FLYING			= 1 << 13;
 const U32 TELEPORT_FLAGS_SHOW_RESET_HOME	= 1 << 14;
 const U32 TELEPORT_FLAGS_FORCE_REDIRECT		= 1 << 15; // used to force a redirect to some random location - used when kicking someone from land.
+const U32 TELEPORT_FLAGS_VIA_GLOBAL_COORDS	= 1 << 16;
+const U32 TELEPORT_FLAGS_WITHIN_REGION		= 1 << 17;
 
 const U32 TELEPORT_FLAGS_MASK_VIA =   TELEPORT_FLAGS_VIA_LURE 
 									| TELEPORT_FLAGS_VIA_LANDMARK
-- 
cgit v1.2.3


From b99fcdb30ab65be55aefadaa187849525f189500 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 13 Feb 2020 21:44:46 +0200
Subject: SL-12707 Build Fails Without FMOD

Also adds correct working directory to RelWithDebInfoOS and enables OpenAl on OS builds for windows
---
 autobuild.xml                      |  3 ++-
 indra/cmake/Copy3rdPartyLibs.cmake |  4 +++
 indra/llaudio/CMakeLists.txt       |  4 +++
 indra/newview/CMakeLists.txt       | 23 +++++++++++++++++
 indra/newview/viewer_manifest.py   | 51 ++++++++++++++++++++------------------
 5 files changed, 60 insertions(+), 25 deletions(-)

diff --git a/autobuild.xml b/autobuild.xml
index 1f1db48bdc..6b2baf9351 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -3840,9 +3840,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
                 <array>
                   <string>-G</string>
                   <string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
-                  <string>-DUNATTENDED:BOOL=ON</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                   <string>-DUSE_KDU=FALSE</string>
+                  <string>-DOPENAL:BOOL=ON</string>
                 </array>
               </map>
               <key>name</key>
@@ -3913,6 +3913,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
                   <string>-DUNATTENDED:BOOL=ON</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                   <string>-DUSE_KDU=FALSE</string>
+                  <string>-DOPENAL:BOOL=ON</string>
                 </array>
               </map>
               <key>name</key>
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index c73a1fdb47..2781c10f19 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -71,6 +71,10 @@ if(WINDOWS)
         endif(ADDRESS_SIZE EQUAL 32)
     endif (FMODEX)
 
+    if (OPENAL)
+        list(APPEND release_files openal32.dll alut.dll)
+    endif (OPENAL)
+
     #*******************************
     # Copy MS C runtime dlls, required for packaging.
     # *TODO - Adapt this to support VC9
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index e943dd5d5c..b9637c4494 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -60,6 +60,10 @@ if (FMODEX)
 endif (FMODEX)
 
 if (OPENAL)
+  include_directories(
+    ${OPENAL_LIBRARIES}
+    )
+
   list(APPEND llaudio_SOURCE_FILES
     llaudioengine_openal.cpp
     lllistener_openal.cpp
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index ef02a4ba55..9b0c5129d9 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1618,6 +1618,10 @@ if (WINDOWS)
         # causes those systems to run in a Windows 8 compatibility mode, which works.
         LIST(APPEND viewer_SOURCE_FILES windows.manifest)
     endif (ADDRESS_SIZE EQUAL 64)
+
+    if (OPENAL)
+      LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES})
+    endif (OPENAL)
 endif (WINDOWS)
 
 # Add the xui files. This is handy for searching for xui elements
@@ -1841,6 +1845,13 @@ if (WINDOWS)
           )
     endif (FMODEX)
 
+    if (OPENAL)
+      list(APPEND COPY_INPUT_DEPENDENCIES
+           ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
+           ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
+          )
+    endif (OPENAL)
+
     add_custom_command(
       OUTPUT  ${CMAKE_CFG_INTDIR}/copy_touched.bat
       COMMAND ${PYTHON_EXECUTABLE}
@@ -1850,6 +1861,8 @@ if (WINDOWS)
         --arch=${ARCH}
         --artwork=${ARTWORK_DIR}
         "--bugsplat=${BUGSPLAT_DB}"
+        "--fmodex=${FMODEX}"
+        "--openal=${OPENAL}"
         --build=${CMAKE_CURRENT_BINARY_DIR}
         --buildtype=${CMAKE_BUILD_TYPE}
         "--channel=${VIEWER_CHANNEL}"
@@ -1911,6 +1924,8 @@ if (WINDOWS)
           --arch=${ARCH}
           --artwork=${ARTWORK_DIR}
           "--bugsplat=${BUGSPLAT_DB}"
+          "--fmodex=${FMODEX}"
+          "--openal=${OPENAL}"
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
           "--channel=${VIEWER_CHANNEL}"
@@ -2056,6 +2071,8 @@ if (LINUX)
         --arch=${ARCH}
         --artwork=${ARTWORK_DIR}
         "--bugsplat=${BUGSPLAT_DB}"
+        "--fmodex=${FMODEX}"
+        "--openal=${OPENAL}"
         --build=${CMAKE_CURRENT_BINARY_DIR}
         --buildtype=${CMAKE_BUILD_TYPE}
         "--channel=${VIEWER_CHANNEL}"
@@ -2082,6 +2099,8 @@ if (LINUX)
       --arch=${ARCH}
       --artwork=${ARTWORK_DIR}
       "--bugsplat=${BUGSPLAT_DB}"
+      "--fmodex=${FMODEX}"
+      "--openal=${OPENAL}"
       --build=${CMAKE_CURRENT_BINARY_DIR}
       --buildtype=${CMAKE_BUILD_TYPE}
       "--channel=${VIEWER_CHANNEL}"
@@ -2158,6 +2177,8 @@ if (DARWIN)
       --arch=${ARCH}
       --artwork=${ARTWORK_DIR}
       "--bugsplat=${BUGSPLAT_DB}"
+      "--fmodex=${FMODEX}"
+      "--openal=${OPENAL}"
       --build=${CMAKE_CURRENT_BINARY_DIR}
       --buildtype=${CMAKE_BUILD_TYPE}
       --bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
@@ -2192,6 +2213,8 @@ if (DARWIN)
           --arch=${ARCH}
           --artwork=${ARTWORK_DIR}
           "--bugsplat=${BUGSPLAT_DB}"
+          "--fmodex=${FMODEX}"
+          "--openal=${OPENAL}"
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
           "--channel=${VIEWER_CHANNEL}"
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index a403760670..2120e673d4 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -513,14 +513,17 @@ class WindowsManifest(ViewerManifest):
                 print err.message
                 print "Skipping GLOD library (assumming linked statically)"
 
-            # Get fmodex dll, continue if missing
-            try:
-                if(self.address_size == 64):
-                    self.path("fmodex64.dll")
-                else:
-                    self.path("fmodex.dll")
-            except:
-                print "Skipping fmodex audio library(assuming other audio engine)"
+            if self.args['fmodex'] == 'ON':
+                # Get fmodex dll
+               if(self.address_size == 64):
+                   self.path("fmodex64.dll")
+               else:
+                   self.path("fmodex.dll")
+
+            if self.args['openal'] == 'ON':
+                # Get openal dll
+                self.path("OpenAL32.dll")
+                self.path("alut.dll")
 
             # For textures
             self.path("openjpeg.dll")
@@ -1047,17 +1050,18 @@ class DarwinManifest(ViewerManifest):
                     self.path2basename(relpkgdir, libfile)
 
                 # dylibs that vary based on configuration
-                if self.args['configuration'].lower() == 'debug':
-                    for libfile in (
-                                "libfmodexL.dylib",
-                                ):
-                        dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile)
-                else:
-                    for libfile in (
-                                "libfmodex.dylib",
-                                ):
-                        dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
+                if self.args['fmodex'] == 'ON':
+                    if self.args['configuration'].lower() == 'debug':
+                        for libfile in (
+                                    "libfmodexL.dylib",
+                                    ):
+                            dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile)
+                    else:
+                        for libfile in (
+                                    "libfmodex.dylib",
+                                    ):
+                            dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
+ 
                 # our apps
                 executable_path = {}
                 for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),
@@ -1519,13 +1523,9 @@ class Linux_i686_Manifest(LinuxManifest):
                 print "tcmalloc files not found, skipping"
                 pass
 
-            try:
+            if self.args['fmodex'] == 'ON':
                 self.path("libfmodex-*.so")
                 self.path("libfmodex.so")
-                pass
-            except:
-                print "Skipping libfmodex.so - not found"
-                pass
 
 
         # Vivox runtimes
@@ -1552,9 +1552,12 @@ class Linux_x86_64_Manifest(LinuxManifest):
 ################################################################
 
 if __name__ == "__main__":
+    # fmodex and openal can be used simultaneously and controled by environment
     extra_arguments = [
         dict(name='bugsplat', description="""BugSplat database to which to post crashes,
              if BugSplat crash reporting is desired""", default=''),
+        dict(name='fmodex', description="""Indication that fmodex libraries are needed""", default='OFF'),
+        dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'),
         ]
     try:
         main(extra=extra_arguments)
-- 
cgit v1.2.3


From 67fff109f8017861fd8fa73025f0dbe5bfb71f7b Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 14 Feb 2020 15:15:28 +0200
Subject: SL-12547 FIXED The "Parcel media" content doesn't play after logging
 into the viewer

---
 indra/newview/llviewerparcelmedia.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index b1b5275f82..fefdeabdab 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -52,6 +52,7 @@ mMediaParcelLocalID(0)
 	LLMessageSystem* msg = gMessageSystem;
 	msg->setHandlerFunc("ParcelMediaCommandMessage", parcelMediaCommandMessageHandler );
 	msg->setHandlerFunc("ParcelMediaUpdate", parcelMediaUpdateHandler );
+	LLViewerParcelMediaAutoPlay::instance();
 }
 
 LLViewerParcelMedia::~LLViewerParcelMedia()
-- 
cgit v1.2.3


From 85fb2b81d8bffb2d031b56f626d2c4ad95a62d07 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 14 Feb 2020 18:37:25 +0000
Subject: SL-11360 Viewer floods the server with GroupProfileRequest

---
 doc/contributions.txt        |  2 ++
 indra/newview/llgroupmgr.cpp | 40 +++++++++++++++++++++++++++++++++++++++-
 indra/newview/llgroupmgr.h   |  6 ++++++
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 441374ec43..2140e05655 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -258,6 +258,8 @@ Beansy Twine
 Benja Kepler
 	VWR-746
 Benjamin Bigdipper
+Beq Janus
+	BUG-227094
 Beth Walcher
 Bezilon Kasei
 Biancaluce Robbiani
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 088d052533..fcb43bbd63 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -1120,6 +1120,15 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
 	group_datap->mGroupPropertiesDataComplete = true;
 	group_datap->mChanged = TRUE;
 
+    properties_request_map_t::iterator request = LLGroupMgr::getInstance()->mPropRequests.find(group_id);
+    if (request != LLGroupMgr::getInstance()->mPropRequests.end())
+    {
+        LLGroupMgr::getInstance()->mPropRequests.erase(request);
+    }
+    else
+    {
+        LL_DEBUGS() << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
+    }
 	LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
 }
 
@@ -1489,6 +1498,28 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
 	return group_datap;
 }
 
+bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id)
+{
+    properties_request_map_t::iterator existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id);
+    if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end())
+    {
+        if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ)
+        {
+            return true;
+        }
+        else
+        {
+            LLGroupMgr::getInstance()->mPropRequests.erase(existing_req);
+        }
+    }
+    return false;
+}
+
+void LLGroupMgr::addPendingPropertyRequest(const LLUUID& id)
+{
+    LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime;
+}
+
 void LLGroupMgr::notifyObservers(LLGroupChange gc)
 {
 	for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi)
@@ -1570,7 +1601,14 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
 	LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
 	// This will happen when we get the reply
 	//LLGroupMgrGroupData* group_datap = createGroupData(group_id);
-	
+
+    if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
+    {
+        LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
+        return;
+    }
+    LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
+
 	LLMessageSystem* msg = gMessageSystem;
 	msg->newMessage("GroupProfileRequest");
 	msg->nextBlock("AgentData");
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index cf9735e38a..0d25e8fb22 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -448,6 +448,8 @@ private:
 	void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
 	void addGroup(LLGroupMgrGroupData* group_datap);
 	LLGroupMgrGroupData* createGroupData(const LLUUID &id);
+	bool hasPendingPropertyRequest(const LLUUID& id);
+	void addPendingPropertyRequest(const LLUUID& id);
 
 	typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
 	observer_multimap_t mObservers;
@@ -455,6 +457,10 @@ private:
 	typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
 	group_map_t mGroups;
 
+	const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
+	typedef std::map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
+	properties_request_map_t mPropRequests;
+
 	typedef std::set<LLParticularGroupObserver*> observer_set_t;
 	typedef std::map<LLUUID,observer_set_t> observer_map_t;
 	observer_map_t mParticularObservers;
-- 
cgit v1.2.3


From 2ae0d7a9545c51518012e803ebf4aa0c5bb08768 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 17 Feb 2020 17:43:00 +0200
Subject: =?UTF-8?q?SL-11867=20Show=20=E2=80=9CUnable=20to=20buy=E2=80=9D?=
 =?UTF-8?q?=20message=20via=20notification?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 indra/newview/llfloaterbuycurrency.cpp             | 37 +++----------------
 .../skins/default/xui/da/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/de/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/en/floater_buy_currency.xml  | 42 +++-------------------
 .../newview/skins/default/xui/en/notifications.xml | 12 +++++++
 .../skins/default/xui/es/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/fr/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/it/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/ja/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/pl/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/pt/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/ru/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/tr/floater_buy_currency.xml  |  5 ++-
 .../skins/default/xui/zh/floater_buy_currency.xml  |  5 ++-
 14 files changed, 43 insertions(+), 103 deletions(-)

diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 91436e52fe..25348474a1 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -74,7 +74,6 @@ public:
 
 	void onClickBuy();
 	void onClickCancel();
-	void onClickErrorWeb();
 };
 
 LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key)
@@ -132,7 +131,6 @@ BOOL LLFloaterBuyCurrencyUI::postBuild()
 	
 	getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this));
 	getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this));
-	getChild<LLUICtrl>("error_web")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickErrorWeb, this));
 	
 	center();
 	
@@ -173,7 +171,6 @@ void LLFloaterBuyCurrencyUI::updateUI()
 
 	// hide most widgets - we'll turn them on as needed next
 	getChildView("info_buying")->setVisible(FALSE);
-	getChildView("info_cannot_buy")->setVisible(FALSE);
 	getChildView("info_need_more")->setVisible(FALSE);	
 	getChildView("purchase_warning_repurchase")->setVisible(FALSE);
 	getChildView("purchase_warning_notenough")->setVisible(FALSE);
@@ -183,32 +180,16 @@ void LLFloaterBuyCurrencyUI::updateUI()
 	if (hasError)
 	{
 		// display an error from the server
-		getChildView("normal_background")->setVisible(FALSE);
-		getChildView("error_background")->setVisible(TRUE);
-		getChildView("info_cannot_buy")->setVisible(TRUE);
-		getChildView("cannot_buy_message")->setVisible(TRUE);
-		getChildView("balance_label")->setVisible(FALSE);
-		getChildView("balance_amount")->setVisible(FALSE);
-		getChildView("buying_label")->setVisible(FALSE);
-		getChildView("buying_amount")->setVisible(FALSE);
-		getChildView("total_label")->setVisible(FALSE);
-		getChildView("total_amount")->setVisible(FALSE);
-
-        LLTextBox* message = getChild<LLTextBox>("cannot_buy_message");
-        if (message)
-		{
-			message->setText(mManager.errorMessage());
-		}
-
-		getChildView("error_web")->setVisible( !mManager.errorURI().empty());
+		LLSD args;
+		args["TITLE"] = getString("info_cannot_buy");
+		args["MESSAGE"] = mManager.errorMessage();
+		LLNotificationsUtil::add("CouldNotBuyCurrency", args);
+		closeFloater();
 	}
 	else
 	{
 		// display the main Buy L$ interface
 		getChildView("normal_background")->setVisible(TRUE);
-		getChildView("error_background")->setVisible(FALSE);
-		getChildView("cannot_buy_message")->setVisible(FALSE);
-		getChildView("error_web")->setVisible(FALSE);
 
 		if (mHasTarget)
 		{
@@ -278,14 +259,6 @@ void LLFloaterBuyCurrencyUI::onClickCancel()
 	LLStatusBar::sendMoneyBalanceRequest();
 }
 
-void LLFloaterBuyCurrencyUI::onClickErrorWeb()
-{
-	LLWeb::loadURL(mManager.errorURI());
-	closeFloater();
-	// Update L$ balance
-	LLStatusBar::sendMoneyBalanceRequest();
-}
-
 // static
 void LLFloaterBuyCurrency::buyCurrency()
 {
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index 3c0428b2b0..b7ac181dd4 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -60,8 +60,7 @@ objektet.
 	</text>
 	<button label="Køb nu" name="buy_btn"/>
 	<button label="Annullér" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+  <floater.string name="info_cannot_buy">
 		Kan ikke købe
-	</text>
-	<button label="Fortsæt til web" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 65926c088c..eb94df1cad 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="Jetzt kaufen" name="buy_btn"/>
 	<button label="Abbrechen" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+  <floater.string name="info_cannot_buy">
 		Kaufabbruch
-	</text>
-	<button label="Weiter zur Kontoseite" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 553c5d51d0..061af1b67c 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -13,6 +13,10 @@
      name="buy_currency">
         Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
     </floater.string>
+    <floater.string
+     name="info_cannot_buy">
+        Unable to Buy
+    </floater.string>
     <icon
      height="215"
      image_name="Linden_Dollar_Background"
@@ -286,42 +290,4 @@ Re-enter amount to see the latest exchange rate.
      left_pad="10"
      name="cancel_btn"
      width="90"/>
-    <icon
-     height="215"
-     image_name="Linden_Dollar_Alert"
-     layout="topleft"
-     left="0"
-     name="error_background"
-     top="15"
-     use_draw_context_alpha="false"
-     width="350"/>
-    <text
-     type="string"
-     font="SansSerifHuge"
-     left="165"
-     width="360"
-     height="25"
-     top="25"
-     name="info_cannot_buy">
-        Unable to Buy
-    </text>
-     <text
-      type="string"
-      width="176"
-      height="125"
-      top="60"
-      left="165"
-      word_wrap="true"
-      follows="bottom|right"
-      name="cannot_buy_message">
-     </text>
-     <button
-      follows="bottom|left"
-      height="20"
-      label="Continue to the Web"
-      layout="topleft"
-      left="170"
-      name="error_web"
-      top="200"
-      width="160"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 9f103ea51a..478054e0d5 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1321,6 +1321,18 @@ There was a problem uploading a report screenshot due to the following reason: [
 You must agree to the Second Life Terms and Conditions, Privacy Policy, and Terms of Service to continue logging into [SECOND_LIFE].
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="CouldNotBuyCurrency"
+   type="alertmodal">
+[TITLE]
+[MESSAGE]
+   <tag>fail</tag>
+   <usetemplate
+     name="okbutton"
+     yestext="OK"/>
+  </notification>
+  
   <notification
    icon="alertmodal.tga"
    name="CouldNotPutOnOutfit"
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index dbff3fcf0e..086150dd57 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -60,8 +60,7 @@ no el objeto.
 	</text>
 	<button label="Comprar ahora" name="buy_btn"/>
 	<button label="Cancelar" name="cancel_btn"/>
-	<text name="info_cannot_buy" left="150" font="SansSerifBig">
+	<floater.string name="info_cannot_buy">
 		No se pudo hacer la compra
-	</text>
-	<button label="Ir a la web" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index c295172abf..55b0d1825a 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -60,8 +60,7 @@ le Lindex...
 	</text>
 	<button label="Acheter" name="buy_btn"/>
 	<button label="Annuler" name="cancel_btn"/>
-	<text name="info_cannot_buy" left="160" width="200">
+	<floater.string name="info_cannot_buy" left="160" width="200">
 		Achat impossible
-	</text>
-	<button label="Accéder au Web" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 53a2057455..522d26373e 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -60,8 +60,7 @@ l&apos;oggetto.
 	</text>
 	<button label="Acquista" name="buy_btn"/>
 	<button label="Annulla" name="cancel_btn"/>
-	<text name="info_cannot_buy" left="160" font="SansSerifBig">
+	<floater.string name="info_cannot_buy" left="160" font="SansSerifBig">
 		Non in grado di acquistare
-	</text>
-	<button label="Continua sul Web" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index a472f163e3..ac2db917cc 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="購入する" name="buy_btn"/>
 	<button label="取り消し" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+	<floater.string name="info_cannot_buy">
 		購入できません
-	</text>
-	<button label="Web サイトに移動" name="error_web" width="140"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index 72167e0d3c..a1d703a15a 100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -50,8 +50,7 @@
 	</text>
 	<button label="Kup teraz" name="buy_btn" />
 	<button label="Anuluj" name="cancel_btn" />
-	<text name="info_cannot_buy">
+	<floater.string name="info_cannot_buy">
 		Nie można kupić
-	</text>
-	<button label="Odwiedź stronę WWW" name="error_web" />
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index 513400954b..c740b90472 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="Comprar já!" name="buy_btn"/>
 	<button label="Fechar" name="cancel_btn"/>
-	<text name="info_cannot_buy" font="SansSerifBig">
+	<floater.string name="info_cannot_buy">
 		Transação incompleta
-	</text>
-	<button label="Prosseguir para a web" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
index 87e8bd524e..ef55ce58d4 100644
--- a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="Приобрести" name="buy_btn"/>
 	<button label="Отмена" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+	<floater.string name="info_cannot_buy">
 		Нельзя купить
-	</text>
-	<button label="Продолжить в Интернете" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
index d90985dcff..33c4b2287f 100644
--- a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="Şimdi Satın Al" name="buy_btn"/>
 	<button label="İptal" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+	<floater.string name="info_cannot_buy">
 		Satın Alınamıyor
-	</text>
-	<button label="Web&apos;e devam et" name="error_web"/>
+	</floater.string>
 </floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
index fcf2800728..41c8c26ccc 100644
--- a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -59,8 +59,7 @@
 	</text>
 	<button label="立即購買" name="buy_btn"/>
 	<button label="取消" name="cancel_btn"/>
-	<text name="info_cannot_buy">
+	<floater.string name="info_cannot_buy">
 		無法購買
-	</text>
-	<button label="繼續到網頁" name="error_web"/>
+	</floater.string>
 </floater>
-- 
cgit v1.2.3


From 604dd5b2274308db59b807d2091bb026d206eff5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 17 Feb 2020 18:56:51 +0200
Subject: SL-1395 Alpha-masked faces not highlighted when materials present

---
 indra/newview/lldrawpool.h        | 8 ++++----
 indra/newview/lldrawpoolalpha.cpp | 3 +++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index bc299cc89f..dd0540218f 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -138,19 +138,19 @@ public:
 		PASS_POST_BUMP,
 		PASS_MATERIAL,
 		PASS_MATERIAL_ALPHA,
-		PASS_MATERIAL_ALPHA_MASK,
+		PASS_MATERIAL_ALPHA_MASK,              // Diffuse texture used as alpha mask
 		PASS_MATERIAL_ALPHA_EMISSIVE,
 		PASS_SPECMAP,
 		PASS_SPECMAP_BLEND,
-		PASS_SPECMAP_MASK,
+		PASS_SPECMAP_MASK,                     // Diffuse texture used as alpha mask and specular texture(map)
 		PASS_SPECMAP_EMISSIVE,
 		PASS_NORMMAP,
 		PASS_NORMMAP_BLEND,
-		PASS_NORMMAP_MASK,
+		PASS_NORMMAP_MASK,                     // Diffuse texture used as alpha mask and normal map
 		PASS_NORMMAP_EMISSIVE,
 		PASS_NORMSPEC,
 		PASS_NORMSPEC_BLEND,
-		PASS_NORMSPEC_MASK,
+		PASS_NORMSPEC_MASK,                    // Diffuse texture used as alpha mask with normal and specular map
 		PASS_NORMSPEC_EMISSIVE,
 		PASS_GLOW,
 		PASS_ALPHA,
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 0873300cd2..6137f2c0ed 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -327,6 +327,9 @@ void LLDrawPoolAlpha::render(S32 pass)
 
 		gGL.diffuseColor4f(0, 0, 1, 1);
 		pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+		pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+		pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+		pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 
 		gGL.diffuseColor4f(0, 1, 0, 1);
 		pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
-- 
cgit v1.2.3


From 3a990bd2b9edcd01d72adde455402041aaa6c5f9 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 18 Feb 2020 14:07:35 +0200
Subject: SL-1706 Material alpha mask highlight color should be blue

---
 indra/newview/lldrawpool.h        | 2 +-
 indra/newview/lldrawpoolalpha.cpp | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index dd0540218f..d3a96855b9 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -155,7 +155,7 @@ public:
 		PASS_GLOW,
 		PASS_ALPHA,
 		PASS_ALPHA_MASK,
-		PASS_FULLBRIGHT_ALPHA_MASK,
+		PASS_FULLBRIGHT_ALPHA_MASK,            // Diffuse texture used as alpha mask and fullbright
 		PASS_ALPHA_INVISIBLE,
 		NUM_RENDER_TYPES,
 	};
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 6137f2c0ed..7db1c7e7a4 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -322,14 +322,15 @@ void LLDrawPoolAlpha::render(S32 pass)
 							LLVertexBuffer::MAP_TEXCOORD0);
 
 		pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
-		pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 		pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 
+		// Material alpha mask
 		gGL.diffuseColor4f(0, 0, 1, 1);
 		pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 		pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 		pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 		pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+		pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
 
 		gGL.diffuseColor4f(0, 1, 0, 1);
 		pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
-- 
cgit v1.2.3


From fe3a56f343ca04b2bea203ff2adeeffb9d2ffeda Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 18 Feb 2020 16:52:56 +0200
Subject: SL-11360 Added tags to all debug statements in LLGroupMgr

---
 indra/newview/llgroupmgr.cpp | 52 ++++++++++++++++++++++----------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index fcb43bbd63..85178b27f4 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -948,7 +948,7 @@ static void formatDateString(std::string &date_string)
 // static
 void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 {
-	LL_DEBUGS() << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
 	if (gAgent.getID() != agent_id)
@@ -1054,7 +1054,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 //static 
 void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
 {
-	LL_DEBUGS() << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
 	if (!msg)
 	{
 		LL_ERRS() << "Can't access the messaging system" << LL_ENDL;
@@ -1127,7 +1127,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
     }
     else
     {
-        LL_DEBUGS() << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
+        LL_DEBUGS("GrpMgr") << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
     }
 	LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
 }
@@ -1135,7 +1135,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
 // static
 void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
 {
-	LL_DEBUGS() << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
+    LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
 	if (gAgent.getID() != agent_id)
@@ -1196,7 +1196,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
 
 
 
-		LL_DEBUGS() << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
+        LL_DEBUGS("GrpMgr") << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
 		LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count);
 		group_datap->mRoles[role_id] = rd;
 	}
@@ -1220,7 +1220,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
 // static
 void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
 {
-	LL_DEBUGS() << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
 	if (gAgent.getID() != agent_id)
@@ -1281,7 +1281,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
 
 				if (rd && md)
 				{
-					LL_DEBUGS() << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
+					LL_DEBUGS("GrpMgr") << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
 					rd->addMember(member_id);
 					md->addRole(role_id,rd);
 				}
@@ -1333,7 +1333,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
 // static
 void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
 {
-	LL_DEBUGS() << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
 	if (gAgent.getID() != agent_id)
@@ -1366,7 +1366,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
 
 		if (!title.mTitle.empty())
 		{
-			LL_DEBUGS() << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
+			LL_DEBUGS("GrpMgr") << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
 			group_datap->mTitles.push_back(title);
 		}
 	}
@@ -1378,7 +1378,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
 // static
 void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data)
 {
-	LL_DEBUGS() << "processEjectGroupMemberReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "processEjectGroupMemberReply" << LL_ENDL;
 	LLUUID group_id;
 	msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
 	BOOL success;
@@ -1394,7 +1394,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data
 // static
 void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
 {
-	LL_DEBUGS() << "processJoinGroupReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "processJoinGroupReply" << LL_ENDL;
 	LLUUID group_id;
 	BOOL success;
 	msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@@ -1414,7 +1414,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
 // static
 void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data)
 {
-	LL_DEBUGS() << "processLeaveGroupReply" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "processLeaveGroupReply" << LL_ENDL;
 	LLUUID group_id;
 	BOOL success;
 	msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@@ -1598,13 +1598,13 @@ void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap)
 
 void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
 	// This will happen when we get the reply
 	//LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 
     if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
     {
-        LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
+        LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
         return;
     }
     LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
@@ -1621,7 +1621,7 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 	if (group_datap->mMemberRequestID.isNull())
 	{
@@ -1643,7 +1643,7 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 	if (group_datap->mRoleDataRequestID.isNull())
 	{
@@ -1664,7 +1664,7 @@ void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 	
 	if (group_datap->mRoleMembersRequestID.isNull())
@@ -1674,7 +1674,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
 			|| !group_datap->isRoleDataComplete())
 		{
 			// *TODO: KLW FIXME: Should we start a member or role data request?
-			LL_INFOS() << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
+			LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
 				<< " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
 				<< " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
 			group_datap->mPendingRoleMemberRequest = TRUE;
@@ -1698,7 +1698,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 	
 	group_datap->mTitles.clear();
@@ -1717,7 +1717,7 @@ void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
 
 	LLMessageSystem* msg = gMessageSystem;
 	msg->newMessage("GroupTitleUpdate");
@@ -1776,7 +1776,7 @@ void LLGroupMgr::sendCreateGroupRequest(const std::string& name,
 
 void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 
 	LLMessageSystem* msg = gMessageSystem;
@@ -1805,7 +1805,7 @@ void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
 
 void LLGroupMgr::sendGroupRoleMemberChanges(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = createGroupData(group_id);
 
 	if (group_datap->mRoleMemberChanges.empty()) return;
@@ -2352,7 +2352,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
 
 void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = getGroupData(group_id);
 
 	if (group_datap && group_datap->pendingRoleChanges())
@@ -2367,7 +2367,7 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
 
 void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id)
 {
-	LL_DEBUGS() << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
+	LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
 	LLGroupMgrGroupData* group_datap = getGroupData(group_id);
 
 	if (group_datap) group_datap->cancelRoleChanges();
@@ -2401,7 +2401,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
 		std::string action_set_name;
 		if (action_set->getAttributeString("name", action_set_name))
 		{
-			LL_DEBUGS() << "Loading action set " << action_set_name << LL_ENDL;
+			LL_DEBUGS("GrpMgr") << "Loading action set " << action_set_name << LL_ENDL;
 			role_action_data->mName = action_set_name;
 		}
 		else
@@ -2442,7 +2442,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
 			std::string action_name;
 			if (action->getAttributeString("name", action_name))
 			{
-				LL_DEBUGS() << "Loading action " << action_name << LL_ENDL;
+				LL_DEBUGS("GrpMgr") << "Loading action " << action_name << LL_ENDL;
 				role_action->mName = action_name;
 			}
 			else
-- 
cgit v1.2.3


From cfb2b95c8ca3dbd9761bbd2124cf0361a4832bce Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 18 Feb 2020 18:33:28 +0200
Subject: SL-12641 Remade 'Pick: Texture' floater to eliminate translation
 overlaps

---
 indra/llui/llcombobox.cpp                          |  8 +++
 indra/llui/llcombobox.h                            |  2 +
 indra/newview/lltexturectrl.cpp                    | 28 +++++-----
 indra/newview/lltexturectrl.h                      |  5 +-
 .../skins/default/xui/de/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/en/floater_texture_ctrl.xml  | 60 ++++++----------------
 .../skins/default/xui/es/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/fr/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/it/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/ja/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/pl/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/pt/floater_texture_ctrl.xml  | 14 ++---
 .../skins/default/xui/ru/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/tr/floater_texture_ctrl.xml  | 11 ++--
 .../skins/default/xui/zh/floater_texture_ctrl.xml  | 11 ++--
 15 files changed, 83 insertions(+), 133 deletions(-)

diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index c7f0326ed4..52dc908655 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -514,6 +514,14 @@ S32 LLComboBox::getCurrentIndex() const
 	return -1;
 }
 
+void LLComboBox::setEnabledByValue(const LLSD& value, BOOL enabled)
+{
+    LLScrollListItem *found = mList->getItem(value);
+    if (found)
+    {
+        found->setEnabled(enabled);
+    }
+}
 
 void LLComboBox::createLineEditor(const LLComboBox::Params& p)
 {
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 7d38c051a5..4af3313162 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -158,6 +158,8 @@ public:
 	BOOL			setCurrentByIndex( S32 index );
 	S32				getCurrentIndex() const;
 
+	void			setEnabledByValue(const LLSD& value, BOOL enabled);
+
 	void			createLineEditor(const Params&);
 
 	//========================================================================
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index fd1c5373ae..5f18fad9d5 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -140,17 +140,17 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
 
 		if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
 		{
-			if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2)
+			if ( mBakeTextureEnabled && mModeSelector->getValue().asInteger() != 2)
 			{
-				mModeSelector->setSelectedIndex(2, 0);
+				mModeSelector->selectByValue(2);
 				onModeSelect(0,this);
 			}
 		}
 		else
 		{
-			if (mModeSelector->getSelectedIndex() == 2)
+			if (mModeSelector->getValue().asInteger() == 2)
 			{
-				mModeSelector->setSelectedIndex(0, 0);
+				mModeSelector->selectByValue(0);
 				onModeSelect(0,this);
 			}
 			
@@ -347,7 +347,7 @@ BOOL LLFloaterTexturePicker::postBuild()
 	}
 	mTentativeLabel = getChild<LLTextBox>("Multiple");
 
-	mResolutionLabel = getChild<LLTextBox>("unknown");
+	mResolutionLabel = getChild<LLTextBox>("size_lbl");
 
 
 	childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
@@ -363,9 +363,9 @@ BOOL LLFloaterTexturePicker::postBuild()
 
 	mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
 
-	mModeSelector = getChild<LLRadioGroup>("mode_selection");
+	mModeSelector = getChild<LLComboBox>("mode_selection");
 	mModeSelector->setCommitCallback(onModeSelect, this);
-	mModeSelector->setSelectedIndex(0, 0);
+	mModeSelector->selectByValue(0);
 
 	if(mInventoryPanel)
 	{
@@ -756,7 +756,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
 void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
 {
 	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
-	int mode = self->mModeSelector->getSelectedIndex();
+	U32 mode = self->mModeSelector->getValue().asInteger();
 
 	self->getChild<LLButton>("Default")->setVisible(mode == 0);
 	self->getChild<LLButton>("Blank")->setVisible(mode == 0);
@@ -1083,7 +1083,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
 
 void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled)
 {
-	mModeSelector->setIndexEnabled(1,enabled);
+    mModeSelector->setEnabledByValue(1, enabled);
 }
 
 void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
@@ -1091,18 +1091,18 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
 	BOOL changed = (enabled != mBakeTextureEnabled);
 
 	mBakeTextureEnabled = enabled;
-	mModeSelector->setIndexEnabled(2, enabled);
+	mModeSelector->setEnabledByValue(2, enabled);
 
-	if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2))
+	if (!mBakeTextureEnabled && (mModeSelector->getValue().asInteger() == 2))
 	{
-		mModeSelector->setSelectedIndex(0, 0);
+		mModeSelector->selectByValue(0);
 	}
 	
 	if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
 	{
-		if (mModeSelector->getSelectedIndex() != 2)
+		if (mModeSelector->getValue().asInteger() != 2)
 		{
-			mModeSelector->setSelectedIndex(2, 0);
+			mModeSelector->selectByValue(2);
 		}
 	}
 	onModeSelect(0, this);
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index b2a34a37c4..c705c34e21 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -36,7 +36,6 @@
 #include "llstring.h"
 #include "lluictrl.h"
 #include "llpermissionsflags.h"
-#include "llradiogroup.h"
 #include "lltextbox.h" // for params
 #include "llviewerinventory.h"
 #include "llviewborder.h" // for params
@@ -44,7 +43,7 @@
 #include "llviewertexture.h"
 #include "llwindow.h"
 
-class LLButton;
+class LLComboBox;
 class LLFloaterTexturePicker;
 class LLInventoryItem;
 class LLViewerFetchedTexture;
@@ -367,7 +366,7 @@ protected:
 	LLSaveFolderState	mSavedFolderState;
 	BOOL				mSelectedItemPinned;
 
-	LLRadioGroup*		mModeSelector;
+	LLComboBox*			mModeSelector;
 	LLScrollListCtrl*	mLocalScrollCtrl;
 
 private:
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index b794d879f0..fee703147c 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Mehrere Texturen
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Inventar" name="inventory" value="0"/>
-		<radio_item label="Lokal" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Größe: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Inventar" name="inventory" value="0"/>
+		<combo_box.item label="Lokal" name="local" value="1"/>
+	</combo_box>
 	<button label="Standard" label_selected="Standard" name="Default"/>
 	<button label="Leer" label_selected="Leer" name="Blank"/>
 	<button label="Keine" label_selected="Keine" name="None"/>
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index c2af4f54d0..b33604f926 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -48,42 +48,28 @@
     </text>
 	
 	<!-- mode selector -->
-	   <radio_group
+    <combo_box
      control_name="mode_selection"
      height="20"
      layout="topleft"
-     left="0"
-     top_pad="80"
+     left="6"
+     top_pad="77"
      name="mode_selection"
-     follows="left|top">
-        <radio_item
+     follows="left|top"
+     width="120">
+      <combo_box.item
          label="Inventory"
          name="inventory"
-         top_delta="20" 
-         layout="topleft"
-         height="16" 
-         left="0" 
-         value="0"
-         width="70" />
-        <radio_item
+         value="0" />
+      <combo_box.item
          label="Local"
-         left_pad="0"
-         layout="topleft"
-         top_delta="0" 
-         height="16" 
          name="local"
-         value="1"
-         width="50" />
-       <radio_item
+         value="1" />
+      <combo_box.item
          label="Bake"
-         left_pad="0"
-         layout="topleft"
-         top_delta="0"
-         height="16"
          name="bake"
-         value="2"
-         width="50" />
-    </radio_group>
+         value="2" />
+    </combo_box>
 	<!-- -->
 	
     <text
@@ -92,20 +78,8 @@
      follows="left|top"
      height="14"
      layout="topleft"
-     left_delta="12"
+     left="8"
      name="size_lbl"
-     top_pad="4">
-        Size:
-    </text>
-
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="14"
-     layout="topleft"
-     left_delta="0"
-     name="unknown"
      top_pad="4">
         [DIMENSIONS]
     </text>
@@ -149,8 +123,8 @@
      image_selected="eye_button_active.tga"
      image_unselected="eye_button_inactive.tga"
      layout="topleft"
-     left_delta="-80"
-     top_delta="-10"
+     left="18"
+     top_delta="-23"
      name="Pipette"
      width="28" />
    <text
@@ -327,7 +301,7 @@
      label="OK"
      label_selected="OK"
      layout="topleft"
-     left="95"
+     left="176"
      top="-30"
      name="Select"
      width="100" />
@@ -350,5 +324,5 @@
      left="6"
      name="apply_immediate_check"
      top_delta="0"
-     width="120" />
+     width="150" />
 </floater>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
index 01b024bc3e..4720cb76fc 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Texturas múltiples
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Inventario" name="inventory" value="0"/>
-		<radio_item label="Local" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Tamaño: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Inventario" name="inventory" value="0"/>
+		<combo_box.item label="Local" name="local" value="1"/>
+	</combo_box>
 	<button label="Por defecto" label_selected="Por defecto" name="Default" width="84"/>
 	<button label="Blanca" label_selected="Blanca" name="Blank"/>
 	<button label="Ninguna" label_selected="Ninguna" left="90" name="None"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index eace67026c..02ab7ffb8b 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Textures multiples
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Inventaire" name="inventory" value="0"/>
-		<radio_item label="Local" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Taille : [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Inventaire" name="inventory" value="0"/>
+		<combo_box.item label="Local" name="local" value="1"/>
+	</combo_box>
 	<button label="Défaut" label_selected="Défaut" name="Default" width="60"/>
 	<button label="Vierge" label_selected="Vierge" name="Blank" width="60"/>
 	<button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
index 27a17868a7..8a7569adfa 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Texture multiple
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Inventario" name="inventory" value="0"/>
-		<radio_item label="Locale" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Dimensioni: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Inventario" name="inventory" value="0"/>
+		<combo_box.item label="Locale" name="local" value="1"/>
+	</combo_box>
 	<button label="Default" label_selected="Default" name="Default"/>
 	<button label="Vuoto" label_selected="Vuoto" name="Blank"/>
 	<button label="Niente" label_selected="Niente" name="None"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 37233d3e68..7a2d648a56 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		複数のテクスチャ
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="インベントリ" name="inventory" value="0"/>
-		<radio_item label="ローカル" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		サイズ: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="インベントリ" name="inventory" value="0"/>
+		<combo_box.item label="ローカル" name="local" value="1"/>
+	</combo_box>
 	<button label="デフォルト" label_selected="デフォルト" name="Default"/>
 	<button label="ブランク" label_selected="ブランク" name="Blank"/>
 	<button label="なし" label_selected="なし" name="None"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index 8ac158b462..2425213160 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Wiele tekstur
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Szafa" name="inventory" />
-		<radio_item label="Lokalna" name="local" />
-	</radio_group>
-	<text name="unknown">
-		Rozm.: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Szafa" name="inventory" />
+		<combo_box.item label="Lokalna" name="local" />
+	</combo_box>
 	<button label="Domyślna" label_selected="Domyślna" name="Default" />
 	<button label="Pusta" label_selected="Pusta" name="Blank" />
 	<button label="Przezrocz." label_selected="Przezrocz." name="None" />
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index 5ec005bd1a..51556b67ea 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -9,16 +9,10 @@
 	<text name="Multiple">
 		Multiplas texturas
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Inventário" name="inventory" value="0"/>
-		<radio_item label="Local" name="local" value="1"/>
-	</radio_group>
-	<text name="size_lbl">
-		Tamanho:
-	</text>
-	<text name="unknown">
-		[DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Inventário" name="inventory" value="0"/>
+		<combo_box.item label="Local" name="local" value="1"/>
+	</combo_box>
 	<button label="Padrão" label_selected="Padrão" name="Default"/>
 	<button label="Branco" label_selected="Branco" name="Blank"/>
 	<button label="Nenhum" label_selected="Nenhum" name="None"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
index c9e117362f..9bb5da4d79 100644
--- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Несколько текстур
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Инвентарь" name="inventory" value="0"/>
-		<radio_item label="Локально" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Размер: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Инвентарь" name="inventory" value="0"/>
+		<combo_box.item label="Локально" name="local" value="1"/>
+	</combo_box>
 	<button label="По умолчанию" label_selected="По умолчанию" name="Default"/>
 	<button label="Очистить" label_selected="Очистить" name="Blank"/>
 	<button label="Нет" label_selected="Нет" name="None"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
index 42483c09e1..1582f26ef1 100644
--- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		Birden çok doku
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="Envanter" name="inventory" value="0"/>
-		<radio_item label="Yerel" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		Büyüklük: [DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="Envanter" name="inventory" value="0"/>
+		<combo_box.item label="Yerel" name="local" value="1"/>
+	</combo_box>
 	<button label="Varsayılan" label_selected="Varsayılan" name="Default"/>
 	<button label="Boş" label_selected="Boş" name="Blank"/>
 	<button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
index 02d06323d4..36bff3a934 100644
--- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -9,13 +9,10 @@
 	<text name="Multiple">
 		多重材質
 	</text>
-	<radio_group name="mode_selection">
-		<radio_item label="收納區" name="inventory" value="0"/>
-		<radio_item label="本地" name="local" value="1"/>
-	</radio_group>
-	<text name="unknown">
-		尺寸:[DIMENSIONS]
-	</text>
+	<combo_box name="mode_selection">
+		<combo_box.item label="收納區" name="inventory" value="0"/>
+		<combo_box.item label="本地" name="local" value="1"/>
+	</combo_box>
 	<button label="預設" label_selected="預設" name="Default"/>
 	<button label="空白" label_selected="空白" name="Blank"/>
 	<button label="無" label_selected="無" name="None"/>
-- 
cgit v1.2.3


From 583f532b172e25aaf8da531f2cd407df9b2793fa Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 21 Feb 2020 11:52:46 +0200
Subject: SL-12708 (Windows) Eliminate DirectX SDK June 2010 Install
 Requirement

---
 indra/cmake/DirectX.cmake | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/indra/cmake/DirectX.cmake b/indra/cmake/DirectX.cmake
index 25163d0322..1741dc111f 100644
--- a/indra/cmake/DirectX.cmake
+++ b/indra/cmake/DirectX.cmake
@@ -1,8 +1,15 @@
 # -*- cmake -*-
 
 if (WINDOWS)
+  if(ADDRESS_SIZE EQUAL 32)
+    set(PROGRAMFILES_x86 $ENV{PROGRAMFILES})
+  else(ADDRESS_SIZE EQUAL 32)
+    set(PROGRAMFILES_x86 $ENV{PROGRAMFILES\(X86\)})
+  endif(ADDRESS_SIZE EQUAL 32)
+
   find_path(DIRECTX_INCLUDE_DIR dxdiag.h
             "$ENV{DXSDK_DIR}/Include"
+            "${PROGRAMFILES_x86}/Windows Kits/8.1/Include/um"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2010)/Include"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2009)/Include"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2009)/Include"
@@ -26,6 +33,7 @@ if (WINDOWS)
 
   find_path(DIRECTX_LIBRARY_DIR dxguid.lib
             "$ENV{DXSDK_DIR}/Lib/x86"
+            "${PROGRAMFILES_x86}/Windows Kits/8.1/Lib/winv6.3/um/x86"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2010)/Lib/x86"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2009)/Lib/x86"
             "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2009)/Lib/x86"
-- 
cgit v1.2.3


From 08b75b5ee72518ae423be0838ace61a148d4bb7a Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 24 Feb 2020 17:26:16 +0200
Subject: SL-12733 FIXED Default Creation Permissions for Objects is ignored
 after a relog

---
 indra/newview/llfloaterperms.cpp | 3 +--
 indra/newview/llviewerregion.cpp | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 2281ea1496..528632a866 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -177,7 +177,6 @@ void LLFloaterPermsDefault::sendInitialPerms()
 	if(!mCapSent)
 	{
 		updateCap();
-		setCapSent(true);
 	}
 }
 
@@ -239,7 +238,7 @@ void LLFloaterPermsDefault::updateCapCoro(std::string url)
         {
             const std::string& reason = status.toString();
             // Do not display the same error more than once in a row
-            if (reason != previousReason)
+            if ((reason != previousReason) && mCapSent)
             {
                 previousReason = reason;
                 LLSD args;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 75e707aaa3..e91f71733b 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -3137,7 +3137,7 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
 	{
 		mCapabilitiesReceivedSignal(getRegionID());
 
-		//LLFloaterPermsDefault::sendInitialPerms();
+		LLFloaterPermsDefault::sendInitialPerms();
 
 		// This is a single-shot signal. Forget callbacks to save resources.
 		mCapabilitiesReceivedSignal.disconnect_all_slots();
-- 
cgit v1.2.3


From 02dba611b21f1a1e72083ab36475b627489779e7 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 21 Feb 2020 16:57:37 +0200
Subject: SL-10326 Develop submenu option Allow Select Avatar was defective

Viewer should now filter out position changes from server when avatar is being edited.
---
 indra/newview/llagentcamera.cpp | 12 +++++++++
 indra/newview/llselectmgr.cpp   | 54 ++++++++++++++++++++++++++++++++---------
 indra/newview/llselectmgr.h     |  7 ++++++
 3 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 85b7d7b06f..26b60b89f5 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -355,6 +355,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
 	}
 
 	mHUDTargetZoom = 1.f;
+
+    if (LLSelectMgr::getInstance()->mAllowSelectAvatar)
+    {
+        // resetting camera also resets position overrides in debug mode 'AllowSelectAvatar'
+        LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection();
+        if (selected_handle->getObjectCount() == 1
+            && selected_handle->getFirstObject() != NULL
+            && selected_handle->getFirstObject()->isAvatar())
+        {
+            LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle);
+        }
+    }
 }
 
 // Allow camera to be moved somewhere other than behind avatar.
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index aee6bcb05e..9d491e0e00 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -304,6 +304,27 @@ void LLSelectMgr::updateEffects()
 	}
 }
 
+void LLSelectMgr::resetObjectOverrides()
+{
+    resetObjectOverrides(getSelection());
+}
+
+void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)
+{
+    struct f : public LLSelectedNodeFunctor
+    {
+        virtual bool apply(LLSelectNode* node)
+        {
+            node->mLastPositionLocal.setVec(0, 0, 0);
+            node->mLastRotation = LLQuaternion();
+            node->mLastScale.setVec(0, 0, 0);
+            return true;
+        }
+    } func;
+
+    selected_handle->applyToNodes(&func);
+}
+
 void LLSelectMgr::overrideObjectUpdates()
 {
 	//override any position updates from simulator on objects being edited
@@ -5131,18 +5152,27 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
 
 	bool link_operation = message_name == "ObjectLink";
 
-	//clear update override data (allow next update through)
-	struct f : public LLSelectedNodeFunctor
-	{
-		virtual bool apply(LLSelectNode* node)
-		{
-			node->mLastPositionLocal.setVec(0,0,0);
-			node->mLastRotation = LLQuaternion();
-			node->mLastScale.setVec(0,0,0);
-			return true;
-		}
-	} func;
-	selected_handle->applyToNodes(&func);
+    if (mAllowSelectAvatar)
+    {
+        if (selected_handle->getObjectCount() == 1
+            && selected_handle->getFirstObject() != NULL
+            && selected_handle->getFirstObject()->isAvatar())
+        {
+            // Server doesn't move avatars at the moment, it is a local debug feature,
+            // but server does update position regularly, so do not drop mLastPositionLocal
+            // Position override for avatar gets reset in LLAgentCamera::resetView().
+        }
+        else
+        {
+            // drop mLastPositionLocal (allow next update through)
+            resetObjectOverrides(selected_handle);
+        }
+    }
+    else
+    {
+        //clear update override data (allow next update through)
+        resetObjectOverrides(selected_handle);
+    }
 
 	std::queue<LLSelectNode*> nodes_to_send;
 
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 3bed484b58..75d11dd06b 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -458,6 +458,13 @@ public:
 	void clearSelections();
 	void update();
 	void updateEffects(); // Update HUD effects
+
+	// When we edit object's position/rotation/scale we set local
+	// overrides and ignore any updates (override received valeus).
+	// When we send data to server, we send local values and reset
+	// overrides
+	void resetObjectOverrides();
+	void resetObjectOverrides(LLObjectSelectionHandle selected_handle);
 	void overrideObjectUpdates();
 
 	// Returns the previous value of mForceSelection
-- 
cgit v1.2.3


From 85f6feb14a727d09ddd7a67fc557dcae67e00727 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 2 Mar 2020 17:45:25 +0200
Subject: SL-12599 The 'Appearance' floater has cropped tabs in some languages

Scroll hiding was added in SL-3738, but there should be no need to disable it, tab container should be smart enough to know when to hide arrows.
---
 indra/newview/skins/default/xui/en/panel_outfits_inventory.xml | 1 -
 indra/newview/skins/default/xui/en/sidepanel_appearance.xml    | 6 +++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index eeb930485e..6c8cc9d39a 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -30,7 +30,6 @@
      tab_height="30"
      tab_position="top"
      halign="center"
-     hide_scroll_arrows="true"
      top="8"
      width="315">
          <panel
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 2a1eb425ed..1777a0db05 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -32,7 +32,7 @@ width="333">
    top="5"
    follows="left|top|right"
    layout="topleft"
-   width="303"
+   width="307"
    height="33"
    name="panel_currentlook"
    >
@@ -118,14 +118,14 @@ width="333">
    name="Filter"
    search_button_visible="true"
    top_pad="10"
-   width="303" />
+   width="307" />
    <panel
    class="panel_outfits_inventory"
    filename="panel_outfits_inventory.xml"
    name="panel_outfits_inventory"
    height="493"
    min_height="410"
-   width="320"
+   width="325"
    visible="false"
    left="0"
    tab_group="1"
-- 
cgit v1.2.3


From 82e5f6c24ffef1fdc6ef2a1df8be21e0bf27b715 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 4 Mar 2020 17:39:22 +0200
Subject: SL-12421 Viewer's certificate validation does not reject connections

---
 indra/llcorehttp/_httpoprequest.cpp   |  4 ++--
 indra/newview/llxmlrpctransaction.cpp | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index 0f76ff23ea..6978b8d08b 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -1010,8 +1010,8 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
 	if (op->mCallbackSSLVerify)
 	{
 		SSL_CTX * ctx = (SSL_CTX *)sslctx;
-		// disable any default verification for server certs
-		SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+		// verification for ssl certs
+		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
 		// set the verification callback.
 		SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata);
 		// the calls are void
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 8e2539606b..32c8ce66a0 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -240,16 +240,16 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
 
 	if (!status)
 	{
+        mImpl->setHttpStatus(status);
+        LLSD errordata = status.getErrorData();
+        mImpl->mErrorCertData = errordata;
+
 		if ((status.toULong() != CURLE_SSL_PEER_CERTIFICATE) &&
 			(status.toULong() != CURLE_SSL_CACERT))
 		{
 			// if we have a curl error that's not already been handled
-			// (a non cert error), then generate the error message as
+			// (a non cert error), then generate the warning message as
 			// appropriate
-			mImpl->setHttpStatus(status);
-			LLSD errordata = status.getErrorData();
-            mImpl->mErrorCertData = errordata;
-
 			LL_WARNS() << "LLXMLRPCTransaction error "
 				<< status.toHex() << ": " << status.toString() << LL_ENDL;
 			LL_WARNS() << "LLXMLRPCTransaction request URI: "
-- 
cgit v1.2.3


From 4e98602746d513ec82a9264a814a05a23ea22d5b Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 5 Mar 2020 13:43:58 +0200
Subject: SL-12421 Don't fail silently, show an error

---
 indra/newview/llsechandler_basic.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 55e49100c3..8e52480644 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -78,16 +78,14 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert,
 	BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length());
 	if(pem_bio == NULL)
 	{
-		LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
-		LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
+		LL_ERRS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
 	}
 	mCert = NULL;
 	PEM_read_bio_X509(pem_bio, &mCert, 0, NULL);
 	BIO_free(pem_bio);
 	if (!mCert)
 	{
-		LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
-		LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
+		LL_ERRS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
 	}
 }
 
-- 
cgit v1.2.3


From 57b32eb01cd35bbac440569df885036eb24f2369 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 6 Mar 2020 16:49:23 +0200
Subject: SL-12805 FIXED The Group Chat history can't be opened from the
 conversations floater

---
 indra/newview/llfloaterconversationpreview.cpp | 5 +----
 indra/newview/lllogchat.cpp                    | 4 ++--
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index 44725cab70..dd2baacb7e 100644
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -84,10 +84,7 @@ BOOL LLFloaterConversationPreview::postBuild()
 		file = "chat";
 	}
 	mChatHistoryFileName = file;
-	if (mIsGroup)
-	{
-		mChatHistoryFileName += GROUP_CHAT_SUFFIX;
-	}
+
 	LLStringUtil::format_map_t args;
 	args["[NAME]"] = name;
 	std::string title = getString("Title", args);
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 0c64531783..354f5a453b 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -761,8 +761,8 @@ bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
 	{
 		std::string file_name;
 		gCacheName->getGroupName(avatar_id, file_name);
-		file_name = makeLogFileName(file_name);
-		return isTranscriptFileFound(makeLogFileName(file_name));
+		file_name = makeLogFileName(file_name + GROUP_CHAT_SUFFIX);
+		return isTranscriptFileFound(file_name);
 	}
 	return false;
 }
-- 
cgit v1.2.3


From 5bc97f1fa3a3e9632ad68fad94887da9659f0fa7 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 10 Mar 2020 17:40:33 +0200
Subject: SL-12503 FIXED Voice notification isn't displayed near the "Speak"
 button

---
 indra/newview/llimview.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index d5142a4496..56c95bb77d 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -515,6 +515,7 @@ LLIMModel::LLIMModel()
 {
 	addNewMsgCallback(boost::bind(&LLFloaterIMSession::newIMCallback, _1));
 	addNewMsgCallback(boost::bind(&on_new_message, _1));
+	LLCallDialogManager::instance();
 }
 
 LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg)
-- 
cgit v1.2.3


From 6a9658a6504ac60b0a932900cb73524dc0d1f7c9 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 11 Mar 2020 17:34:42 +0200
Subject: SL-12452 FIXED The moderator can't unmute himself in the group call
 after turning on 'Mute everyone' option

---
 indra/newview/llfloaterimcontainer.cpp | 39 +++++++++++++++++++++-------------
 indra/newview/llfloaterimcontainer.h   |  2 +-
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 21420b122b..bd834b4260 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -455,7 +455,7 @@ void LLFloaterIMContainer::idleUpdate()
             while (current_participant_model != end_participant_model)
             {
                 LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
-                participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID);
+                participant_model->setModeratorOptionsVisible(is_moderator);
                 participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID);
 
                 current_participant_model++;
@@ -1409,12 +1409,21 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
     {
 		return is_single_select;
 	}
-	
-	// Beyond that point, if only the user agent is selected, everything is disabled
-	if (is_single_select && (single_id == gAgentID))
-	{
-		return false;
-	}
+
+    bool is_moderator_option = ("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item);
+
+    // Beyond that point, if only the user agent is selected, everything is disabled
+    if (is_single_select && (single_id == gAgentID))
+    {
+        if (is_moderator_option)
+        {
+            return enableModerateContextMenuItem(item, true);
+        }
+        else
+        {
+            return false;
+        }
+    }
 
 	// If the user agent is selected with others, everything is disabled
 	for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
@@ -1480,11 +1489,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
     {
    		return canBanSelectedMember(single_id);
     }
-	else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
-	{
-		// *TODO : get that out of here...
-		return enableModerateContextMenuItem(item);
-	}
+    else if (is_moderator_option)
+    {
+        // *TODO : get that out of here...
+        return enableModerateContextMenuItem(item);
+    }
 
 	// By default, options that not explicitely disabled are enabled
     return true;
@@ -1854,7 +1863,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
 	return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
 }
 
-bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata)
+bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self)
 {
 	// only group moderators can perform actions related to this "enable callback"
 	if (!isGroupModerator())
@@ -1874,7 +1883,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
 	{
 		return voice_channel;
 	}
-	else if ("can_mute" == userdata)
+	else if (("can_mute" == userdata) && !is_self)
 	{
 		return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID());
 	}
@@ -1884,7 +1893,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
 	}
 
 	// The last invoke is used to check whether the "can_allow_text_chat" will enabled
-	return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID());
+	return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()) && !is_self;
 }
 
 bool LLFloaterIMContainer::isGroupModerator()
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 78b3572111..0f7d0a557e 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -164,7 +164,7 @@ private:
     void doToSelectedGroup(const LLSD& userdata);
 
 	static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
-	bool enableModerateContextMenuItem(const std::string& userdata);
+	bool enableModerateContextMenuItem(const std::string& userdata, bool is_self = false);
 	LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
 	LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
 	bool isGroupModerator();
-- 
cgit v1.2.3


From ba3f88c86704eb4565efe7c8902a57559645eedb Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 12 Mar 2020 17:47:51 +0200
Subject: SL-187 FIXED The experience list is unsorted the first time you open
 Experiences

---
 indra/newview/llpanelexperiences.cpp | 13 ++++++++++++-
 indra/newview/llpanelexperiences.h   |  2 ++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelexperiences.cpp b/indra/newview/llpanelexperiences.cpp
index 37981b36a9..91d3b523fb 100644
--- a/indra/newview/llpanelexperiences.cpp
+++ b/indra/newview/llpanelexperiences.cpp
@@ -93,9 +93,20 @@ void LLPanelExperiences::setExperienceList( const LLSD& experiences )
 
         item->init(public_key);
         mExperiencesList->addItem(item, public_key);
+
+        const LLSD& experience_details = LLExperienceCache::instance().get(public_key);
+        if (experience_details.isUndefined())
+        {
+            LLExperienceCache::instance().get(public_key, boost::bind(&LLPanelExperiences::sortExperiencesList, this));
+        }
     }
 
-	mExperiencesList->sort();
+    sortExperiencesList();
+}
+
+void LLPanelExperiences::sortExperiencesList()
+{
+    mExperiencesList->sort();
 }
 
 void LLPanelExperiences::getExperienceIdsList(std::vector<LLUUID>& result)
diff --git a/indra/newview/llpanelexperiences.h b/indra/newview/llpanelexperiences.h
index f29fdfdecb..9d5afd1a6a 100644
--- a/indra/newview/llpanelexperiences.h
+++ b/indra/newview/llpanelexperiences.h
@@ -60,6 +60,8 @@ public:
     void setExperienceList(const LLSD& experiences);
     void getExperienceIdsList(std::vector<LLUUID>& result);
 
+    void sortExperiencesList();
+
     LLExperienceItem* getSelectedExperienceItem();
     void removeExperiences( const LLSD& ids );
     void removeExperience( const LLUUID& id);
-- 
cgit v1.2.3


From 2cdeabe763acaa2f41071f07d12cf3de979c097a Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 16 Mar 2020 15:21:44 +0200
Subject: SL-5668 Background fetch loop

---
 indra/newview/llinventoryfilter.cpp | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index e200b5bc9e..b9481a8f58 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -191,10 +191,15 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
 	// when applying a filter, matching folders get their contents downloaded first
 	// but make sure we are not interfering with pre-download
 	if (isNotDefault()
-		&& !gInventory.isCategoryComplete(folder_id)
 		&& LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
-	{
-		LLInventoryModelBackgroundFetch::instance().start(folder_id);
+    {
+        LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+        if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
+        {
+            // At the moment background fetch only cares about VERSION_UNKNOWN,
+            // so do not check isCategoryComplete that compares descendant count
+            LLInventoryModelBackgroundFetch::instance().start(folder_id);
+        }
 	}
 
 	// Marketplace folder filtering
-- 
cgit v1.2.3


From 3de8342937c6c0a5dba98bf092e491ab76d39bd5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 16 Mar 2020 20:39:21 +0200
Subject: SL-12846 Thai characters missing

---
 indra/newview/skins/default/xui/en/fonts.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index 2d5263b78f..a9f5a7e089 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -12,6 +12,7 @@
       <file>msyh.ttc</file>
       <file load_collection="true">Cambria.ttc</file>
       <file>malgun.ttf</file>
+      <file>micross.ttf</file>
     </os>
     <os name="Mac">
       <file>ヒラギノ角ゴシック W3.ttc</file>  
-- 
cgit v1.2.3


From dbc7827d5b643ce432765927376abd681f0ac942 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Mon, 16 Mar 2020 21:49:13 +0200
Subject: SL-12846 OSX fix for missing Thai characters

---
 indra/newview/skins/default/xui/en/fonts.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index a9f5a7e089..6955707773 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -25,6 +25,7 @@
       <file>华文细黑.ttf</file>
       <file>PingFang.ttc</file>
       <file>STIXGeneral.otf</file>
+      <file>Thonburi.ttc</file>
     </os>
   </font>
 
-- 
cgit v1.2.3


From a7b174967270f34a6a1f576b68a9f92ad1112cfa Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Tue, 17 Mar 2020 16:55:10 +0200
Subject: SL-12860 FIXED Enabling 'Only Friends and Groups can call or IM me'
 still plays New Conversation sound

---
 indra/newview/llimview.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 56c95bb77d..d09d36e77e 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2743,7 +2743,7 @@ void LLIMMgr::addMessage(
 			}
 
 			//Play sound for new conversations
-			if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
+			if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
 			{
 				make_ui_sound("UISndNewIncomingIMSession");
 			}
-- 
cgit v1.2.3


From 9df7f5728b7dd33f3acca15ea6eceb99128b5f1f Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 18 Mar 2020 21:08:34 +0200
Subject: SL-12870 Misleading UI value

---
 indra/newview/llfloaterimagepreview.cpp                      | 11 +++++++++--
 indra/newview/skins/default/xui/en/floater_image_preview.xml |  2 +-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index d4b0fa85ab..1728d81bbc 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -35,6 +35,7 @@
 
 #include "llagent.h"
 #include "llbutton.h"
+#include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "lldrawable.h"
 #include "lldrawpoolavatar.h"
@@ -115,8 +116,14 @@ BOOL LLFloaterImagePreview::postBuild()
 		mSculptedPreview = new LLImagePreviewSculpted(256, 256);
 		mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
 
-		if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
-			getChildView("lossless_check")->setEnabled(TRUE);
+        if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
+        {
+            // We want "lossless_check" to be unchecked when it is disabled, regardless of
+            // LosslessJ2CUpload state, so only assign control when enabling checkbox
+            LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
+            check_box->setEnabled(TRUE);
+            check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
+        }
 	}
 	else
 	{
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 44d2c14cc8..f8cc508e81 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -120,8 +120,8 @@
 Try saving image as 24 bit Targa (.tga).
     </text>
     <check_box
-     control_name="LosslessJ2CUpload"
      enabled="false"
+     initial_value="false"
      follows="bottom|left"
      height="16"
      label="Use lossless compression"
-- 
cgit v1.2.3


From 6c41ea62ceed90658c9d6ab6d51c5d66b8837d8c Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Thu, 19 Mar 2020 16:14:02 +0200
Subject: SL-12871 'Only Friends and Groups can call or IM me' setting should
 be account based.

---
 indra/newview/app_settings/settings.xml                       |  2 +-
 indra/newview/app_settings/settings_per_account.xml           | 11 +++++++++++
 indra/newview/llfloaterpreference.cpp                         | 11 ++++++++---
 indra/newview/llimprocessing.cpp                              |  4 ++--
 indra/newview/llimview.cpp                                    |  4 ++--
 indra/newview/skins/default/xui/en/panel_preferences_chat.xml |  2 +-
 6 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index bbac65ef61..9b6f13ed7e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -14247,7 +14247,7 @@
     <key>VoiceCallsFriendsOnly</key>
     <map>
       <key>Comment</key>
-      <string>Only accept voice calls from residents on your friends list</string>
+      <string>(Deprecated) Only accept voice calls from residents on your friends list</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 5eecf1b9f5..3d77ac43e5 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -220,6 +220,17 @@
         <key>Value</key>
             <integer>1</integer>
         </map>
+    <key>VoiceCallsFriendsOnly</key>
+    <map>
+        <key>Comment</key>
+        <string>Only accept voice calls and receive IMs from residents on your friends list</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
     <key>VoiceEffectDefault</key>
     <map>
         <key>Comment</key>
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 105f728508..5d370394b4 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1760,6 +1760,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
 	getChildView("log_path_button")->setEnabled(TRUE);
 	getChildView("chat_font_size")->setEnabled(TRUE);
 	getChildView("conversation_log_combo")->setEnabled(TRUE);
+	getChild<LLUICtrl>("voice_call_friends_only_check")->setEnabled(TRUE);
+	getChild<LLUICtrl>("voice_call_friends_only_check")->setValue(gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly"));
 }
 
 
@@ -2360,9 +2362,13 @@ void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLS
 
 void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value)
 {
-	if (checkbox && checkbox->getValue())
+	if (checkbox)
 	{
-		LLNotificationsUtil::add("FriendsAndGroupsOnly");
+		gSavedPerAccountSettings.setBOOL("VoiceCallsFriendsOnly", checkbox->getValue().asBoolean());
+		if (checkbox->getValue())
+		{
+			LLNotificationsUtil::add("FriendsAndGroupsOnly");
+		}
 	}
 }
 
@@ -2468,7 +2474,6 @@ class LLPanelPreferencePrivacy : public LLPanelPreference
 public:
 	LLPanelPreferencePrivacy()
 	{
-		mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
 		mAccountIndependentSettings.push_back("AutoDisengageMic");
 	}
 
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 6da7bbe263..0d2553fd55 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -450,7 +450,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
         || (dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id));
     BOOL is_owned_by_me = FALSE;
     BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
-    BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
+    BOOL accept_im_from_only_friend = gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly");
     BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
         LLMuteList::getInstance()->isLinden(name);
 
@@ -1164,7 +1164,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             {
                 return;
             }
-            else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
+            else if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
             {
                 return;
             }
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index d09d36e77e..d17bb982e1 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2684,7 +2684,7 @@ void LLIMMgr::addMessage(
 	}
 	bool skip_message = false;
 	bool from_linden = LLMuteList::getInstance()->isLinden(from);
-	if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
+    if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
 	{
 		// Evaluate if we need to skip this message when that setting is true (default is false)
 		skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);	// Skip non friends...
@@ -3073,7 +3073,7 @@ void LLIMMgr::inviteToSession(
 	if (voice_invite)
 	{
 		bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));
-		bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
+        bool isRejectNonFriendCall = (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
 		if	(isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())
 		{
 			if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index ece6c95080..c023cb036e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -52,7 +52,7 @@
     </check_box>
 
     <check_box
-        control_name="VoiceCallsFriendsOnly"
+        enabled="false"
         height="16"
         label="Only friends and groups can call or IM me"
         layout="topleft"
-- 
cgit v1.2.3


From e77e1ed8ca0a4ae34c642819fd089fa7daa67eb8 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Fri, 20 Mar 2020 16:34:57 +0200
Subject: SL-2222 FIXED Media Control still offers zoom out when already zoomed
 out

---
 indra/newview/llpanelprimmediacontrols.cpp | 13 ++++++++++---
 indra/newview/llpanelprimmediacontrols.h   |  4 ++++
 indra/newview/llviewermediafocus.cpp       |  8 +++++---
 indra/newview/llviewermediafocus.h         |  2 +-
 4 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 3c74aed734..1e301af605 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -73,6 +73,7 @@ bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model);
 const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
 const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
 
+const F32 EXCEEDING_ZOOM_DISTANCE = 0.5f;
 //
 // LLPanelPrimMediaControls
 //
@@ -93,6 +94,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mZoomObjectID(LLUUID::null),
 	mZoomObjectFace(0),
 	mVolumeSliderVisible(0),
+	mZoomedCameraPos(),
 	mWindowShade(NULL),
 	mHideImmediately(false),
     mSecureURL(false),
@@ -256,7 +258,7 @@ void LLPanelPrimMediaControls::focusOnTarget()
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	if(media_impl)
 	{
-		if(!media_impl->hasFocus())
+		if (!media_impl->hasFocus() || isZoomDistExceeding())
 		{	
 			// The current target doesn't have media focus -- focus on it.
 			LLViewerObject* objectp = getTargetObject();
@@ -307,7 +309,8 @@ void LLPanelPrimMediaControls::updateShape()
 
 	bool can_navigate = parcel->getMediaAllowNavigate();
 	bool enabled = false;
-	bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
+	bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace) && !isZoomDistExceeding();
+	
 	// There is no such thing as "has_focus" being different from normal controls set
 	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'
 	// to 'true' (or, actually, we use a setting)
@@ -1117,7 +1120,7 @@ void LLPanelPrimMediaControls::updateZoom()
 	if (zoom_padding > 0.0f)
 	{	
 		// since we only zoom into medium for now, always set zoom_in constraint to true
-		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
+		mZoomedCameraPos = LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
 	}
 	
 	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
@@ -1377,6 +1380,10 @@ bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
 	return mVolumeSliderVisible > 0;
 }
 
+bool LLPanelPrimMediaControls::isZoomDistExceeding()
+{
+	return (gAgentCamera.getCameraPositionGlobal() - mZoomedCameraPos).normalize() >= EXCEEDING_ZOOM_DISTANCE;
+}
 
 void LLPanelPrimMediaControls::clearFaceOnFade()
 {
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 21d5236074..6256ce8411 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -118,6 +118,8 @@ private:
 	void showVolumeSlider();
 	void hideVolumeSlider();
 	bool shouldVolumeSliderBeVisible();
+
+	bool isZoomDistExceeding();
 	
 	static void onScrollUp(void* user_data);
 	static void onScrollUpHeld(void* user_data);
@@ -182,6 +184,8 @@ private:
 	F32 mZoomMediumPadding;
 	F32 mZoomFarPadding;
 	S32 mTopWorldViewAvoidZone;
+
+	LLVector3d mZoomedCameraPos;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 69ab0a71af..76eb61bedf 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -205,8 +205,9 @@ bool LLViewerMediaFocus::getFocus()
 }
 
 // This function selects an ideal viewing distance based on the focused object, pick normal, and padding value
-void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
+LLVector3d LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
 {
+	LLVector3d camera_pos;
 	if (object)
 	{
 		gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
@@ -254,7 +255,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
 		distance += depth * 0.5;
 
 		// Finally animate the camera to this new position and focal point
-		LLVector3d camera_pos, target_pos;
+		LLVector3d target_pos;
 		// The target lookat position is the center of the selection (in global coords)
 		target_pos = center;
 		// Target look-from (camera) position is "distance" away from the target along the normal 
@@ -287,7 +288,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
 		if (zoom_in_only &&
 		    (dist_vec_squared(gAgentCamera.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
 		{
-			return;
+			return camera_pos;
 		}
 
 		gAgentCamera.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
@@ -298,6 +299,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
 		// If we have no object, focus back on the avatar.
 		gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
 	}
+	return camera_pos;
 }
 void LLViewerMediaFocus::onFocusReceived()
 {
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 763a6c1688..d26b35378b 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -62,7 +62,7 @@ public:
 
 	void update();
 	
-	static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
+	static LLVector3d setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
 	static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);
 
 	bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
-- 
cgit v1.2.3


From b576e832d7dd0899a212d8d3a3a9c938ad12a87d Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Mon, 23 Mar 2020 16:59:22 +0200
Subject: SL-3475 Add 'Close All Dialogs' option for Script dialogs

---
 indra/newview/llchiclet.cpp                                | 4 ++++
 indra/newview/skins/default/xui/en/menu_script_chiclet.xml | 8 ++++++++
 2 files changed, 12 insertions(+)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index dedb06c945..8d89455cd4 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1092,6 +1092,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
 	{
 		LLScriptFloaterManager::instance().removeNotification(getSessionId());
 	}
+	else if ("close all" == action)
+	{
+		LLIMWellWindow::getInstance()->closeAll();
+	}
 }
 
 void LLScriptChiclet::createPopupMenu()
diff --git a/indra/newview/skins/default/xui/en/menu_script_chiclet.xml b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml
index db29d9cebc..49e52ebb8d 100644
--- a/indra/newview/skins/default/xui/en/menu_script_chiclet.xml
+++ b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml
@@ -16,4 +16,12 @@
          function="ScriptChiclet.Action"
          parameter="end" />
     </menu_item_call>
+    <menu_item_call
+     label="Close All Dialogs"
+     layout="topleft"
+     name="Close All">
+        <menu_item_call.on_click
+         function="ScriptChiclet.Action"
+         parameter="close all" />
+    </menu_item_call>
 </menu>
-- 
cgit v1.2.3


From 5bb76d9164e8d73cdd14c9088459c584b94cb313 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 23 Mar 2020 21:00:22 +0200
Subject: SL-12237 Small adjustment to render complexity performance

---
 indra/newview/llvoavatar.cpp | 41 +++++++++++++++++++++++++++++++++++++++--
 indra/newview/llvoavatar.h   |  1 +
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 8f6733886a..f337b0ca35 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2413,6 +2413,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
 }
 
 static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE("Avatar Update");
+static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE_COMPLEXITY("Avatar Update Complexity");
 static LLTrace::BlockTimerStatHandle FTM_JOINT_UPDATE("Update Joints");
 
 //------------------------------------------------------------------------
@@ -2462,7 +2463,6 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 
     // Update should be happening max once per frame.
-	const S32 upd_freq = 4; // force update every upd_freq frames.
 	if ((mLastAnimExtents[0]==LLVector3())||
 		(mLastAnimExtents[1])==LLVector3())
 	{
@@ -2470,6 +2470,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 	else
 	{
+		const S32 upd_freq = 4; // force update every upd_freq frames.
 		mNeedsExtentUpdate = ((LLDrawable::getCurrentFrame()+mID.mData[0])%upd_freq==0);
 	}
     
@@ -2554,7 +2555,39 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 		
 	idleUpdateNameTag( mLastRootPos );
-	idleUpdateRenderComplexity();
+
+    // Complexity has stale mechanics, but updates still can be very rapid
+    // so spread avatar complexity calculations over frames to lesen load from
+    // rapid updates and to make sure all avatars are not calculated at once.
+    S32 compl_upd_freq = 20;
+    if (isControlAvatar())
+    {
+        // animeshes do not (or won't) have impostors nor change outfis,
+        // no need for high frequency
+        compl_upd_freq = 100;
+    }
+    else if (mLastRezzedStatus <= 0) //cloud or  init
+    {
+        compl_upd_freq = 60;
+    }
+    else if (isSelf())
+    {
+        compl_upd_freq = 5;
+    }
+    else if (mLastRezzedStatus == 1) //'grey', not fully loaded
+    {
+        compl_upd_freq = 40;
+    }
+    else if (isInMuteList()) //cheap, buffers value from search
+    {
+        compl_upd_freq = 100;
+    }
+
+    if ((LLFrameTimer::getFrameCount() + mID.mData[0]) % compl_upd_freq == 0)
+    {
+        idleUpdateRenderComplexity();
+    }
+    idleUpdateDebugInfo();
 }
 
 void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
@@ -4348,6 +4381,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	}
 	else
 	{
+		// Might be better to do HIDDEN_UPDATE if cloud
 		updateMotions(LLCharacter::NORMAL_UPDATE);
 	}
 
@@ -10161,7 +10195,10 @@ void LLVOAvatar::idleUpdateRenderComplexity()
 
     // Render Complexity
     calculateUpdateRenderComplexity(); // Update mVisualComplexity if needed	
+}
 
+void LLVOAvatar::idleUpdateDebugInfo()
+{
 	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO))
 	{
 		std::string info_line;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 3526142ff5..2f04288825 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -286,6 +286,7 @@ public:
 	static void		invalidateNameTags();
 	void			addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
 	void 			idleUpdateRenderComplexity();
+	void 			idleUpdateDebugInfo();
     void 			accountRenderComplexityForObject(const LLViewerObject *attached_object,
                                                      const F32 max_attachment_complexity,
                                                      LLVOVolume::texture_cost_t& textures,
-- 
cgit v1.2.3


From ad3b60445eb25b1c8786dddd3056a192f6630156 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 24 Mar 2020 16:13:55 +0200
Subject: SL-12237 Invisible avatars don't need detailed updates

---
 indra/newview/llvoavatar.cpp     | 25 ++++++++++++++++++-------
 indra/newview/llvoavatar.h       |  2 +-
 indra/newview/llvoavatarself.cpp |  5 -----
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f337b0ca35..ee9ca213d5 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2585,6 +2585,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 
     if ((LLFrameTimer::getFrameCount() + mID.mData[0]) % compl_upd_freq == 0)
     {
+        LL_RECORD_BLOCK_TIME(FTM_AVATAR_UPDATE_COMPLEXITY);
         idleUpdateRenderComplexity();
     }
     idleUpdateDebugInfo();
@@ -2898,7 +2899,10 @@ F32 LLVOAvatar::calcMorphAmount()
 void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
 {
 	// Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
-	if ( voice_enabled && (LLVoiceClient::getInstance()->lipSyncEnabled()) && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
+    if ( voice_enabled
+        && mLastRezzedStatus > 0 // no point updating lip-sync for clouds
+        && (LLVoiceClient::getInstance()->lipSyncEnabled())
+        && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
 	{
 		F32 ooh_morph_amount = 0.0f;
 		F32 aah_morph_amount = 0.0f;
@@ -3896,15 +3900,16 @@ void LLVOAvatar::updateFootstepSounds()
 }
 
 //------------------------------------------------------------------------
-// computeUpdatePeriod()
+// computeUpdatePeriodAndVisibility()
 // Factored out from updateCharacter()
 // Set new value for mUpdatePeriod based on distance and various other factors.
+// Returs true if character needs an update
 //------------------------------------------------------------------------
-void LLVOAvatar::computeUpdatePeriod()
+BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
 {
 	bool visually_muted = isVisuallyMuted();
-	if (mDrawable.notNull()
-        && isVisible() 
+    BOOL is_visible = isVisible(); // includes drawable check
+    if ( is_visible 
         && (!isSelf() || visually_muted)
         && !isUIAvatar()
         && sUseImpostors
@@ -3932,6 +3937,11 @@ void LLVOAvatar::computeUpdatePeriod()
 		{ //background avatars are REALLY slow updating impostors
 			mUpdatePeriod = 16;
 		}
+		else if (mLastRezzedStatus <= 0)
+		{
+			// Don't update cloud avatars too often
+			mUpdatePeriod = 8;
+		}
 		else if ( shouldImpostor(3) )
 		{ //back 25% of max visible avatars are slow updating impostors
 			mUpdatePeriod = 8;
@@ -3945,10 +3955,12 @@ void LLVOAvatar::computeUpdatePeriod()
 			//nearby avatars, update the impostors more frequently.
 			mUpdatePeriod = 4;
 		}
+		return (LLDrawable::getCurrentFrame() + mID.mData[0]) % mUpdatePeriod == 0 ? TRUE : FALSE;
 	}
 	else
 	{
 		mUpdatePeriod = 1;
+		return is_visible;
 	}
 
 }
@@ -4317,8 +4329,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// The rest should only be done occasionally for far away avatars.
     // Set mUpdatePeriod and visible based on distance and other criteria.
 	//--------------------------------------------------------------------
-    computeUpdatePeriod();
-    visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
+    visible = computeUpdatePeriodAndVisibility();
 
 	//--------------------------------------------------------------------
     // Early out if not visible and not self
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 2f04288825..952c04a1ff 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -264,7 +264,7 @@ public:
 	virtual void	updateDebugText();
 	virtual BOOL 	updateCharacter(LLAgent &agent);
     void			updateFootstepSounds();
-    void			computeUpdatePeriod();
+    BOOL			computeUpdatePeriodAndVisibility();
     void			updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
     void			updateTimeStep();
     void			updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained);
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 16b27fd144..aea12380e8 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2667,11 +2667,6 @@ void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch)
 		{
 			gAgentCamera.changeCameraToCustomizeAvatar();
 		}
-
-#if 0
-		gAgentAvatarp->clearVisualParamWeights();
-		gAgentAvatarp->idleUpdateAppearanceAnimation();
-#endif
 		
 		gAgentAvatarp->invalidateAll(); // mark all bakes as dirty, request updates
 		gAgentAvatarp->updateMeshTextures(); // make sure correct textures are applied to the avatar mesh.
-- 
cgit v1.2.3


From dd2c12b15809c3448ed4c8e7e9f3072a7bab414f Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 24 Mar 2020 17:29:40 +0200
Subject: SL-12237 Small adjustment to render complexity performance

---
 indra/newview/llvoavatar.cpp | 41 +++++++++++++++++++++++++++++++++++++++--
 indra/newview/llvoavatar.h   |  1 +
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 959d7df038..4976846790 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2410,6 +2410,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
 }
 
 static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE("Avatar Update");
+static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE_COMPLEXITY("Avatar Update Complexity");
 static LLTrace::BlockTimerStatHandle FTM_JOINT_UPDATE("Update Joints");
 
 //------------------------------------------------------------------------
@@ -2459,7 +2460,6 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 
     // Update should be happening max once per frame.
-	const S32 upd_freq = 4; // force update every upd_freq frames.
 	if ((mLastAnimExtents[0]==LLVector3())||
 		(mLastAnimExtents[1])==LLVector3())
 	{
@@ -2467,6 +2467,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 	else
 	{
+		const S32 upd_freq = 4; // force update every upd_freq frames.
 		mNeedsExtentUpdate = ((LLDrawable::getCurrentFrame()+mID.mData[0])%upd_freq==0);
 	}
     
@@ -2551,7 +2552,39 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 	}
 		
 	idleUpdateNameTag( mLastRootPos );
-	idleUpdateRenderComplexity();
+
+    // Complexity has stale mechanics, but updates still can be very rapid
+    // so spread avatar complexity calculations over frames to lesen load from
+    // rapid updates and to make sure all avatars are not calculated at once.
+    S32 compl_upd_freq = 20;
+    if (isControlAvatar())
+    {
+        // animeshes do not (or won't) have impostors nor change outfis,
+        // no need for high frequency
+        compl_upd_freq = 100;
+    }
+    else if (mLastRezzedStatus <= 0) //cloud or  init
+    {
+        compl_upd_freq = 60;
+    }
+    else if (isSelf())
+    {
+        compl_upd_freq = 5;
+    }
+    else if (mLastRezzedStatus == 1) //'grey', not fully loaded
+    {
+        compl_upd_freq = 40;
+    }
+    else if (isInMuteList()) //cheap, buffers value from search
+    {
+        compl_upd_freq = 100;
+    }
+
+    if ((LLFrameTimer::getFrameCount() + mID.mData[0]) % compl_upd_freq == 0)
+    {
+        idleUpdateRenderComplexity();
+    }
+    idleUpdateDebugInfo();
 }
 
 void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
@@ -4345,6 +4378,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	}
 	else
 	{
+		// Might be better to do HIDDEN_UPDATE if cloud
 		updateMotions(LLCharacter::NORMAL_UPDATE);
 	}
 
@@ -10075,7 +10109,10 @@ void LLVOAvatar::idleUpdateRenderComplexity()
 
     // Render Complexity
     calculateUpdateRenderComplexity(); // Update mVisualComplexity if needed	
+}
 
+void LLVOAvatar::idleUpdateDebugInfo()
+{
 	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO))
 	{
 		std::string info_line;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 00dccc5d12..aac7a1fae1 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -286,6 +286,7 @@ public:
 	static void		invalidateNameTags();
 	void			addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
 	void 			idleUpdateRenderComplexity();
+	void 			idleUpdateDebugInfo();
     void 			accountRenderComplexityForObject(const LLViewerObject *attached_object,
                                                      const F32 max_attachment_complexity,
                                                      LLVOVolume::texture_cost_t& textures,
-- 
cgit v1.2.3


From 6666fdb5d6f52df3d68bed35a4ad05139f49f93c Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 24 Mar 2020 17:30:34 +0200
Subject: SL-12237 Invisible avatars don't need detailed updates

---
 indra/newview/llvoavatar.cpp     | 25 ++++++++++++++++++-------
 indra/newview/llvoavatar.h       |  2 +-
 indra/newview/llvoavatarself.cpp |  5 -----
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4976846790..1d65d85f50 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2582,6 +2582,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
 
     if ((LLFrameTimer::getFrameCount() + mID.mData[0]) % compl_upd_freq == 0)
     {
+        LL_RECORD_BLOCK_TIME(FTM_AVATAR_UPDATE_COMPLEXITY);
         idleUpdateRenderComplexity();
     }
     idleUpdateDebugInfo();
@@ -2895,7 +2896,10 @@ F32 LLVOAvatar::calcMorphAmount()
 void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
 {
 	// Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
-	if ( voice_enabled && (LLVoiceClient::getInstance()->lipSyncEnabled()) && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
+    if ( voice_enabled
+        && mLastRezzedStatus > 0 // no point updating lip-sync for clouds
+        && (LLVoiceClient::getInstance()->lipSyncEnabled())
+        && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
 	{
 		F32 ooh_morph_amount = 0.0f;
 		F32 aah_morph_amount = 0.0f;
@@ -3893,15 +3897,16 @@ void LLVOAvatar::updateFootstepSounds()
 }
 
 //------------------------------------------------------------------------
-// computeUpdatePeriod()
+// computeUpdatePeriodAndVisibility()
 // Factored out from updateCharacter()
 // Set new value for mUpdatePeriod based on distance and various other factors.
+// Returs true if character needs an update
 //------------------------------------------------------------------------
-void LLVOAvatar::computeUpdatePeriod()
+BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
 {
 	bool visually_muted = isVisuallyMuted();
-	if (mDrawable.notNull()
-        && isVisible() 
+    BOOL is_visible = isVisible(); // includes drawable check
+    if ( is_visible 
         && (!isSelf() || visually_muted)
         && !isUIAvatar()
         && sUseImpostors
@@ -3929,6 +3934,11 @@ void LLVOAvatar::computeUpdatePeriod()
 		{ //background avatars are REALLY slow updating impostors
 			mUpdatePeriod = 16;
 		}
+		else if (mLastRezzedStatus <= 0)
+		{
+			// Don't update cloud avatars too often
+			mUpdatePeriod = 8;
+		}
 		else if ( shouldImpostor(3) )
 		{ //back 25% of max visible avatars are slow updating impostors
 			mUpdatePeriod = 8;
@@ -3942,10 +3952,12 @@ void LLVOAvatar::computeUpdatePeriod()
 			//nearby avatars, update the impostors more frequently.
 			mUpdatePeriod = 4;
 		}
+		return (LLDrawable::getCurrentFrame() + mID.mData[0]) % mUpdatePeriod == 0 ? TRUE : FALSE;
 	}
 	else
 	{
 		mUpdatePeriod = 1;
+		return is_visible;
 	}
 
 }
@@ -4314,8 +4326,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// The rest should only be done occasionally for far away avatars.
     // Set mUpdatePeriod and visible based on distance and other criteria.
 	//--------------------------------------------------------------------
-    computeUpdatePeriod();
-    visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
+    visible = computeUpdatePeriodAndVisibility();
 
 	//--------------------------------------------------------------------
     // Early out if not visible and not self
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index aac7a1fae1..cd9cf00488 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -264,7 +264,7 @@ public:
 	virtual void	updateDebugText();
 	virtual BOOL 	updateCharacter(LLAgent &agent);
     void			updateFootstepSounds();
-    void			computeUpdatePeriod();
+    BOOL			computeUpdatePeriodAndVisibility();
     void			updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
     void			updateTimeStep();
     void			updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained);
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 63ace4fe52..11cfcf784a 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2667,11 +2667,6 @@ void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch)
 		{
 			gAgentCamera.changeCameraToCustomizeAvatar();
 		}
-
-#if 0
-		gAgentAvatarp->clearVisualParamWeights();
-		gAgentAvatarp->idleUpdateAppearanceAnimation();
-#endif
 		
 		gAgentAvatarp->invalidateAll(); // mark all bakes as dirty, request updates
 		gAgentAvatarp->updateMeshTextures(); // make sure correct textures are applied to the avatar mesh.
-- 
cgit v1.2.3


From 672fa8002dbc5d90f827648b7f72b0f766ee2a58 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Tue, 24 Mar 2020 19:25:48 +0200
Subject: SL-1431 settings_per_account.xml file should be attached to
 crashreport

---
 indra/newview/llappdelegate-objc.mm        | 1 +
 indra/newview/llappviewermacosx-for-objc.h | 1 +
 indra/newview/llappviewermacosx.cpp        | 9 +++++----
 indra/newview/llappviewerwin32.cpp         | 3 +++
 indra/newview/llstartup.cpp                | 6 +++---
 5 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index 47fde299c7..a2b7362608 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -294,6 +294,7 @@ struct AttachmentInfo
     std::vector<AttachmentInfo> info{
         AttachmentInfo(metadata.logFilePathname,      "text/plain"),
         AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
+        AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
         AttachmentInfo(metadata.staticDebugPathname,  "text/xml")
     };
 
diff --git a/indra/newview/llappviewermacosx-for-objc.h b/indra/newview/llappviewermacosx-for-objc.h
index 37e8a3917a..79c3efff91 100644
--- a/indra/newview/llappviewermacosx-for-objc.h
+++ b/indra/newview/llappviewermacosx-for-objc.h
@@ -41,6 +41,7 @@ struct CrashMetadata
 {
     std::string logFilePathname;
     std::string userSettingsPathname;
+    std::string accountSettingsPathname;
     std::string staticDebugPathname;
     std::string OSInfo;
     std::string agentFullname;
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 3111540a13..662164af2d 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -199,10 +199,11 @@ CrashMetadataSingleton::CrashMetadataSingleton()
     else
     {
         LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL;
-        logFilePathname      = get_metadata(info, "SLLog");
-        userSettingsPathname = get_metadata(info, "SettingsFilename");
-        OSInfo               = get_metadata(info, "OSInfo");
-        agentFullname        = get_metadata(info, "LoginName");
+        logFilePathname         = get_metadata(info, "SLLog");
+        userSettingsPathname    = get_metadata(info, "SettingsFilename");
+        accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename");
+        OSInfo                  = get_metadata(info, "OSInfo");
+        agentFullname           = get_metadata(info, "LoginName");
         // Translate underscores back to spaces
         LLStringUtil::replaceChar(agentFullname, '_', ' ');
         regionName           = get_metadata(info, "CurrentRegion");
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d208e135bb..293f86f170 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -139,6 +139,9 @@ namespace
             {
                 // user name, when we have it
                 sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
+
+                sBugSplatSender->sendAdditionalFile(
+                    WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
             }
 
             // LL_ERRS message, when there is one
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 38c201d340..ec0b0dc4a8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -913,9 +913,9 @@ bool idle_startup()
 		}
 
 		// Set PerAccountSettingsFile to the default value.
-		gSavedSettings.setString("PerAccountSettingsFile",
-			gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, 
-				LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
+		std::string settings_per_account = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"));
+		gSavedSettings.setString("PerAccountSettingsFile", settings_per_account);
+		gDebugInfo["PerAccountSettingsFilename"] = settings_per_account;
 
 		// Note: can't store warnings files per account because some come up before login
 		
-- 
cgit v1.2.3


From 790dff05d0a9c2341db1c02cd9fb332ac4b6f76f Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Wed, 25 Mar 2020 15:10:33 +0200
Subject: SL-12554 FIXED The value of the 'Avatar Maximum Complexity' is not
 synchronized after closing Advanced settings

---
 indra/newview/llfloaterpreference.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 5d370394b4..0e899d5950 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -948,6 +948,7 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
 	if (userdata.asString() == "closeadvanced")
 	{
 		LLFloaterReg::hideInstance("prefs_graphics_advanced");
+		updateMaxComplexity();
 	}
 	else
 	{
-- 
cgit v1.2.3


From fd2e544d558976aac3b452fabfb4c13aeb16aaf0 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 25 Mar 2020 18:28:23 +0000
Subject: SL-12478 Long names are not beautiful in nametags

---
 indra/newview/llhudnametag.cpp | 58 ++++++++++++++++++++++++++++++++----------
 indra/newview/llhudnametag.h   |  2 +-
 indra/newview/llvoavatar.cpp   | 12 ++++-----
 indra/newview/llvoavatar.h     |  2 +-
 4 files changed, 53 insertions(+), 21 deletions(-)

diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 81d862a827..0701b07856 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -415,7 +415,8 @@ void LLHUDNameTag::clearString()
 void LLHUDNameTag::addLine(const std::string &text_utf8,
 						const LLColor4& color,
 						const LLFontGL::StyleFlags style,
-						const LLFontGL* font)
+						const LLFontGL* font,
+						const bool use_ellipses)
 {
 	LLWString wline = utf8str_to_wstring(text_utf8);
 	if (!wline.empty())
@@ -432,18 +433,49 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
 		tokenizer tokens(wline, sep);
 		tokenizer::iterator iter = tokens.begin();
 
-		while (iter != tokens.end())
-		{
-			U32 line_length = 0;
-			do	
-			{
-				F32 max_pixels = HUD_TEXT_MAX_WIDTH;
-				S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
-				LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
-				mTextSegments.push_back(segment);
-				line_length += segment_length;
-			}
-			while (line_length != iter->size());
+        const F32 max_pixels = HUD_TEXT_MAX_WIDTH;
+        while (iter != tokens.end())
+        {
+            U32 line_length = 0;
+            if (use_ellipses)
+            {
+                // "QualityAssuranceAssuresQuality 1" will end up like "QualityAssuranceAssuresQual..."
+                // "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality 1"
+                do
+                {
+                    S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ONLY_WORD_BOUNDARIES);
+                    if (segment_length == 0)
+                    {
+                        // First word in segment (not nessesary first line) does not fit, need to draw "...".
+                        // Use four dots for ellipsis width to generate padding
+                        const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
+                        S32 elipses_width = font->getWidthF32(dots_pad.c_str());
+                        segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE);
+                        const LLWString dots(utf8str_to_wstring(std::string("...")));
+                        LLHUDTextSegment segment(iter->substr(line_length, segment_length) + dots, style, color, font);
+                        mTextSegments.push_back(segment);
+                        break; // consider it to be complete
+                    }
+                    else
+                    {
+                        LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
+                        mTextSegments.push_back(segment);
+                        line_length += segment_length;
+                    }
+                } while (line_length != iter->size());
+            }
+            else
+            {
+                // "QualityAssuranceAssuresQuality 1" will be split into two lines "QualityAssuranceAssuresQualit" and "y 1"
+                // "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality"
+                do
+                {
+                    S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
+                    LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
+                    mTextSegments.push_back(segment);
+                    line_length += segment_length;
+                } while (line_length != iter->size());
+            }
 			++iter;
 		}
 	}
diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h
index 38a4f18415..20272a8232 100644
--- a/indra/newview/llhudnametag.h
+++ b/indra/newview/llhudnametag.h
@@ -92,7 +92,7 @@ public:
 	void clearString();
 
 	// Add text a line at a time, allowing custom formatting
-	void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL);
+	void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false);
 
 	// For bubble chat, set the part above the chat text
 	void setLabel(const std::string& label_utf8);
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index ee9ca213d5..96a9e8f222 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3250,7 +3250,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 			std::string title_str = title->getString();
 			LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR);
 			addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL,
-				LLFontGL::getFontSansSerifSmall());
+				LLFontGL::getFontSansSerifSmall(), true);
 		}
 
 		static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames", true);
@@ -3270,7 +3270,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 			if (show_display_names)
 			{
 				addNameTagLine(av_name.getDisplayName(), name_tag_color, LLFontGL::NORMAL,
-					LLFontGL::getFontSansSerif());
+					LLFontGL::getFontSansSerif(), true);
 			}
 			// Suppress SLID display if display name matches exactly (ugh)
 			if (show_usernames && !av_name.isDisplayNameDefault())
@@ -3278,14 +3278,14 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 				// *HACK: Desaturate the color
 				LLColor4 username_color = name_tag_color * 0.83f;
 				addNameTagLine(av_name.getUserName(), username_color, LLFontGL::NORMAL,
-					LLFontGL::getFontSansSerifSmall());
+					LLFontGL::getFontSansSerifSmall(), true);
 			}
 		}
 		else
 		{
 			const LLFontGL* font = LLFontGL::getFontSansSerif();
 			std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
-			addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font);
+			addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font, true);
 		}
 
 		mNameAway = is_away;
@@ -3377,7 +3377,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 	}
 }
 
-void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font)
+void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses)
 {
 	llassert(mNameText);
 	if (mVisibleChat)
@@ -3386,7 +3386,7 @@ void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color,
 	}
 	else
 	{
-		mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font);
+		mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses);
 	}
     mNameIsSet |= !line.empty();
 }
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 952c04a1ff..6232c51b49 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -284,7 +284,7 @@ public:
 	static void		invalidateNameTag(const LLUUID& agent_id);
 	// force all name tags to rebuild, useful when display names turned on/off
 	static void		invalidateNameTags();
-	void			addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
+	void			addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses = false);
 	void 			idleUpdateRenderComplexity();
 	void 			idleUpdateDebugInfo();
     void 			accountRenderComplexityForObject(const LLViewerObject *attached_object,
-- 
cgit v1.2.3


From 33633361a37c4b25589e8a4ec34c733a206a8301 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 27 Mar 2020 16:10:31 +0200
Subject: Revert SL-11848 in scope of SL-12824

This reverts commit 8a9a9295999a67e97b16c3e0ff4b9fdfd8298904.
---
 indra/newview/llface.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 5539cfb5df..90929249c0 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -456,7 +456,7 @@ void LLFace::setTextureIndex(U8 index)
 		}
 		else
 		{
-			if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1)
+			if (mDrawInfo && !mDrawInfo->mTextureList.empty())
 			{
 				LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL;
 			}
-- 
cgit v1.2.3


From 764cb898921baafb7c948451660183f39c789e0c Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 27 Mar 2020 16:22:51 +0200
Subject: SL-12824 Imported fix for crash

For "Face with no texture index references indexed texture draw info"
---
 indra/newview/lldrawpoolavatar.cpp   | 15 ++++++++++-----
 indra/newview/llface.cpp             |  8 ++++----
 indra/newview/llface.h               |  1 +
 indra/newview/llspatialpartition.cpp |  2 +-
 indra/newview/llvovolume.cpp         | 10 +++++-----
 5 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 63abadbcf4..3d3d75c5eb 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1604,11 +1604,16 @@ void LLDrawPoolAvatar::getRiggedGeometry(
     LLVolume* volume,
     const LLVolumeFace& vol_face)
 {
-	face->setGeomIndex(0);
-	face->setIndicesIndex(0);
-		
-	//rigged faces do not batch textures
-	face->setTextureIndex(255);
+    face->setGeomIndex(0);
+    face->setIndicesIndex(0);
+
+    if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
+    {
+        face->setDrawInfo(NULL);
+    }
+
+    //rigged faces do not batch textures
+    face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
 
 	if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
 	{
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 90929249c0..880d903499 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -153,7 +153,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
 	}
 
 	mTEOffset		= -1;
-	mTextureIndex = 255;
+	mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES;
 
 	setDrawable(drawablep);
 	mVObjp = objp;
@@ -450,7 +450,7 @@ void LLFace::setTextureIndex(U8 index)
 	{
 		mTextureIndex = index;
 
-		if (mTextureIndex != 255)
+		if (mTextureIndex != FACE_DO_NOT_BATCH_TEXTURES)
 		{
 			mDrawablep->setState(LLDrawable::REBUILD_POSITION);
 		}
@@ -1534,7 +1534,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 
 			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
 
-			U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
+			U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
 
 			S32 val = 0;
 			U8* vp = (U8*) &val;
@@ -2067,7 +2067,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 
 			LLVector4a texIdx;
 
-			S32 index = mTextureIndex < 255 ? mTextureIndex : 0;
+			S32 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
 
 			F32 val = 0.f;
 			S32* vp = (S32*) &val;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index fce7f71173..18235fdc98 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -52,6 +52,7 @@ class LLDrawInfo;
 
 const F32 MIN_ALPHA_SIZE = 1024.f;
 const F32 MIN_TEX_ANIM_SIZE = 512.f;
+const U8 FACE_DO_NOT_BATCH_TEXTURES = 255;
 
 class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16>
 {
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 7e6f3ef7bc..07b9d24dd2 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3445,7 +3445,7 @@ public:
 						U8 index = facep->getTextureIndex();
 						if (facep->mDrawInfo)
 						{
-							if (index < 255)
+							if (index < FACE_DO_NOT_BATCH_TEXTURES)
 							{
 								if (facep->mDrawInfo->mTextureList.size() <= index)
 								{
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 0aeccc7399..fa4880627f 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5059,7 +5059,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 	}
 
 
-	if (index < 255 && idx >= 0)
+	if (index < FACE_DO_NOT_BATCH_TEXTURES && idx >= 0)
 	{
 		if (mat || draw_vec[idx]->mMaterial)
 		{ //can't batch textures when materials are present (yet)
@@ -5105,7 +5105,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 		draw_vec[idx]->mEnd += facep->getGeomCount();
 		draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize());
 
-		if (index < 255 && index >= draw_vec[idx]->mTextureList.size())
+		if (index < FACE_DO_NOT_BATCH_TEXTURES && index >= draw_vec[idx]->mTextureList.size())
 		{
 			draw_vec[idx]->mTextureList.resize(index+1);
 			draw_vec[idx]->mTextureList[index] = tex;
@@ -5192,7 +5192,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 			draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
 		}
 
-		if (index < 255)
+		if (index < FACE_DO_NOT_BATCH_TEXTURES)
 		{ //initialize texture list for texture batching
 			draw_info->mTextureList.resize(index+1);
 			draw_info->mTextureList[index] = tex;
@@ -6319,7 +6319,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 
 					//face has no texture index
 					facep->mDrawInfo = NULL;
-					facep->setTextureIndex(255);
+					facep->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
 
 					if (geom_count + facep->getGeomCount() > max_vertices)
 					{ //cut batches on geom count too big
@@ -6383,7 +6383,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 			facep->setGeomIndex(index_offset);
 			facep->setVertexBuffer(buffer);	
 			
-			if (batch_textures && facep->getTextureIndex() == 255)
+			if (batch_textures && facep->getTextureIndex() == FACE_DO_NOT_BATCH_TEXTURES)
 			{
 				LL_ERRS() << "Invalid texture index." << LL_ENDL;
 			}
-- 
cgit v1.2.3


From 826d6fc591dace753b053d9b3c28a0e710037964 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 3 Apr 2020 18:06:00 +0300
Subject: SL-12968 Wrong avatar was paused on selection

---
 indra/newview/llselectmgr.cpp | 47 ++++++++++---------------------------------
 1 file changed, 11 insertions(+), 36 deletions(-)

diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 9d491e0e00..ae55cbf025 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6882,51 +6882,26 @@ void LLSelectMgr::pauseAssociatedAvatars()
 			
         mSelectedObjects->mSelectType = getSelectTypeForObject(object);
 
-        bool is_attached = false;
-        if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && 
-            isAgentAvatarValid())
+        LLVOAvatar* parent_av = NULL;
+        if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT)
         {
             // Selection can be obsolete, confirm that this is an attachment
-            LLViewerObject* parent = (LLViewerObject*)object->getParent();
-            while (parent != NULL)
-            {
-                if (parent->isAvatar())
-                {
-                    is_attached = true;
-                    break;
-                }
-                else
-                {
-                    parent = (LLViewerObject*)parent->getParent();
-                }
-            }
+            // and find parent avatar
+            parent_av = object->getAvatarAncestor();
         }
 
-
-        if (is_attached)
+        // Can be both an attachment and animated object
+        if (parent_av)
         {
-            if (object->isAnimatedObject())
-            {
-                // Is an animated object attachment.
-                // Pause both the control avatar and the avatar it's attached to.
-                if (object->getControlAvatar())
-                {
-                    mPauseRequests.push_back(object->getControlAvatar()->requestPause());
-                }
-                mPauseRequests.push_back(gAgentAvatarp->requestPause());
-            }
-            else
-            {
-                // Is a regular attachment. Pause the avatar it's attached to.
-                mPauseRequests.push_back(gAgentAvatarp->requestPause());
-            }
+            // It's an attachment. Pause the avatar it's attached to.
+            mPauseRequests.push_back(parent_av->requestPause());
         }
-        else if (object && object->isAnimatedObject() && object->getControlAvatar())
+
+        if (object->isAnimatedObject() && object->getControlAvatar())
         {
-            // Is a non-attached animated object. Pause the control avatar.
+            // It's an animated object. Pause the control avatar.
             mPauseRequests.push_back(object->getControlAvatar()->requestPause());
         }
-
     }
 }
 
-- 
cgit v1.2.3


From 80447f5e6bfd9843413c7a79074d11373e6c4061 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 13 Apr 2020 15:06:11 +0300
Subject: SL-11172 Re-fixed, now should affect 'tab' only

---
 indra/llui/llaccordionctrl.cpp    | 4 ++--
 indra/llui/llaccordionctrl.h      | 2 +-
 indra/llui/llaccordionctrltab.cpp | 4 ++--
 indra/llui/llaccordionctrltab.h   | 2 +-
 indra/llui/lllineeditor.cpp       | 1 +
 indra/llui/llmultisliderctrl.cpp  | 1 +
 indra/llui/llsliderctrl.cpp       | 1 +
 indra/llui/llspinctrl.cpp         | 3 ++-
 indra/llui/lluictrl.cpp           | 4 ++--
 indra/llui/llview.cpp             | 4 ++--
 indra/llui/llview.h               | 2 +-
 11 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 779508df49..962b8e9bb5 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -657,7 +657,7 @@ void	LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
 }
 
 // virtual
-void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl)
+void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
 {
     if (mScrollbar && mScrollbar->getVisible())
     {
@@ -683,7 +683,7 @@ void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl)
         }
     }
 
-    LLUICtrl::onChildGotFocus(cntrl);
+    LLUICtrl::onUpdateScrollToChild(cntrl);
 }
 
 void	LLAccordionCtrl::onOpen		(const LLSD& key)
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 3e30677429..b38a76d27f 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -111,7 +111,7 @@ public:
 	void	draw();
 	
 	void	onScrollPosChangeCallback(S32, LLScrollbar*);
-	virtual void onChildGotFocus(const LLUICtrl * cntrl);
+	virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
 
 	void	onOpen		(const LLSD& key);
 	S32		notifyParent(const LLSD& info);
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index d5c4ad961c..098621b543 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -453,7 +453,7 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
 }
 
 // virtual
-void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl)
+void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
 {
     if (mScrollbar && mScrollbar->getVisible())
     {
@@ -478,7 +478,7 @@ void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl)
         }
     }
 
-    LLUICtrl::onChildGotFocus(cntrl);
+    LLUICtrl::onUpdateScrollToChild(cntrl);
 }
 
 BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 53546ad5a1..2c72e8c036 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -159,7 +159,7 @@ public:
 	 * Raises notifyParent event with "child_visibility_change" = new_visibility
 	 */
 	void onVisibilityChange(BOOL new_visibility);
-	virtual void onChildGotFocus(const LLUICtrl * cntrl);
+	virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
 
 	// Changes expand/collapse state and triggers expand/collapse callbacks
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 3ad504d68d..83cbbe0207 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -2142,6 +2142,7 @@ void LLLineEditor::clear()
 void LLLineEditor::onTabInto()
 {
 	selectAll();
+    LLUICtrl::onTabInto();
 }
 
 //virtual
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index c460a08afc..4026a9e38e 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -474,6 +474,7 @@ void LLMultiSliderCtrl::onTabInto()
 	{
 		mEditor->onTabInto(); 
 	}
+    LLF32UICtrl::onTabInto();
 }
 
 void LLMultiSliderCtrl::reportInvalidData()
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index 0056cb6dc4..f5f160a3d6 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -438,6 +438,7 @@ void LLSliderCtrl::onTabInto()
 	{
 		mEditor->onTabInto(); 
 	}
+    LLF32UICtrl::onTabInto();
 }
 
 void LLSliderCtrl::reportInvalidData()
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index ce3fc29d32..ee78b82429 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -442,7 +442,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
 
 void LLSpinCtrl::onTabInto()
 {
-	mEditor->onTabInto(); 
+	mEditor->onTabInto();
+    LLF32UICtrl::onTabInto();
 }
 
 
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index e1d275c351..544a76e8d5 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -679,7 +679,6 @@ void LLUICtrl::setFocus(BOOL b)
 		if (!hasFocus())
 		{
 			gFocusMgr.setKeyboardFocus( this );
-			onChildGotFocus(this);
 		}
 	}
 	else
@@ -722,8 +721,9 @@ void LLUICtrl::resetDirty()
 }
 
 // virtual
-void LLUICtrl::onTabInto()				
+void LLUICtrl::onTabInto()
 {
+    onUpdateScrollToChild(this);
 }
 
 // virtual
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 9d5cc70580..d81e2cd494 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -641,12 +641,12 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
 }
 
 // virtual
-void LLView::onChildGotFocus(const LLUICtrl * cntrl)
+void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl)
 {
     LLView* parent_view = getParent();
     if (parent_view)
     {
-        parent_view->onChildGotFocus(cntrl);
+        parent_view->onUpdateScrollToChild(cntrl);
     }
 }
 
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 643436eb8c..5c91c37d3c 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -301,7 +301,7 @@ public:
 	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text );
 
 	virtual void	onVisibilityChange ( BOOL new_visibility );
-	virtual void	onChildGotFocus(const LLUICtrl * cntrl);
+	virtual void	onUpdateScrollToChild(const LLUICtrl * cntrl);
 
 	void			pushVisible(BOOL visible)	{ mLastVisible = mVisible; setVisible(visible); }
 	void			popVisible()				{ setVisible(mLastVisible); }
-- 
cgit v1.2.3


From 278853824d5da452f66f7dc4cc8858884f53505d Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 20 Apr 2020 21:44:34 +0300
Subject: Fixed merge conflict and restored SL-1130

---
 indra/llrender/llrender.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index c3345c5c16..4e7c71a374 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1539,8 +1539,15 @@ void LLRender::matrixMode(eMatrixMode mode)
 	{
         U32 tex_index = gGL.getCurrentTexUnitIndex();
         // the shaders don't actually reference anything beyond texture_matrix0/1 outside of terrain rendering
-        llassert_always(tex_index <= 3);
+        llassert(tex_index <= 3);
 		mode = eMatrixMode(MM_TEXTURE0 + gGL.getCurrentTexUnitIndex());
+        if (mode > MM_TEXTURE3)
+        {
+            // getCurrentTexUnitIndex() can go as high as 32 (LL_NUM_TEXTURE_LAYERS)
+            // Large value will result in a crash at mMatrix
+            LL_WARNS_ONCE() << "Attempted to assign matrix mode out of bounds: " << mode << LL_ENDL;
+            mode = MM_TEXTURE0;
+        }
 	}
 
 	mMatrixMode = mode;
-- 
cgit v1.2.3


From 9d26ce372b44412e2e82eb9d73d3608d1327fc06 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 20 Apr 2020 22:48:03 +0300
Subject: Fixed merge conflicts

---
 indra/newview/llappviewer.cpp            | 3 ++-
 indra/newview/llfloatersettingsdebug.cpp | 2 +-
 indra/newview/pipeline.cpp               | 4 ++--
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 05a65207a9..8d425c78c5 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -71,6 +71,7 @@
 #include "llviewermedia.h"
 #include "llviewerparcelaskplay.h"
 #include "llviewerparcelmedia.h"
+#include "llviewershadermgr.h"
 #include "llviewermediafocus.h"
 #include "llviewermessage.h"
 #include "llviewerobjectlist.h"
@@ -569,7 +570,7 @@ static void settings_to_globals()
 
 	LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
 	LLRender::sNsightDebugSupport = gSavedSettings.getBOOL("RenderNsightDebugSupport");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
 	LLVOVolume::sLODFactor				= llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR);
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 73269d0531..8bac13a5f5 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -298,7 +298,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
 				bool bUseVAO = controlp->getName() == "RenderUseVAO";
 				if (bUseVAO)
 				{
-					bool use_shaders = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+					bool use_shaders = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 					getChild<LLUICtrl>("boolean_combo")->setEnabled(use_shaders);
 					getChild<LLUICtrl>("TRUE")->setEnabled(use_shaders);
 					getChild<LLUICtrl>("FALSE")->setEnabled(use_shaders);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 94542606b6..a730c5a75b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -440,7 +440,7 @@ void LLPipeline::init()
 	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
 	sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -7439,7 +7439,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
 	LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
-- 
cgit v1.2.3


From abe5cc57873267724673c767ff3ec87016534a6c Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 21 Apr 2020 10:32:45 +0300
Subject: Fix for 'release' configuration

llassert is not used in 'release' configuration and build fails due to unused tex_index
---
 indra/llrender/llrender.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 4e7c71a374..9b5231ad06 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1540,7 +1540,7 @@ void LLRender::matrixMode(eMatrixMode mode)
         U32 tex_index = gGL.getCurrentTexUnitIndex();
         // the shaders don't actually reference anything beyond texture_matrix0/1 outside of terrain rendering
         llassert(tex_index <= 3);
-		mode = eMatrixMode(MM_TEXTURE0 + gGL.getCurrentTexUnitIndex());
+        mode = eMatrixMode(MM_TEXTURE0 + tex_index);
         if (mode > MM_TEXTURE3)
         {
             // getCurrentTexUnitIndex() can go as high as 32 (LL_NUM_TEXTURE_LAYERS)
-- 
cgit v1.2.3


From f2d7be71842de8158926e181833cae086fd9e8b7 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 21 Feb 2020 23:38:39 +0200
Subject: SL-12678 Removed auto login retry

---
 indra/newview/lllogininstance.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 8a69acb8dc..873531ef22 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -62,7 +62,7 @@
 #include <boost/scoped_ptr.hpp>
 #include <sstream>
 
-const S32 LOGIN_MAX_RETRIES = 3;
+const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
 const F32 LOGIN_SRV_TIMEOUT_MIN = 10;
 const F32 LOGIN_SRV_TIMEOUT_MAX = 120;
 const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time
-- 
cgit v1.2.3


From efc371571328da1298e4801a0338ab340675f60d Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Tue, 5 May 2020 01:31:22 +0300
Subject: Buildfix

---
 indra/newview/lltexturectrl.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index f55dbacd2a..de7551d2fe 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -755,7 +755,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
 void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
 {
 	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
-	int index = self->mModeSelector->getSelectedIndex();
+    int index = self->mModeSelector->getValue().asInteger();
 
 	self->getChild<LLButton>("Default")->setVisible(index == 0 ? TRUE : FALSE);
 	self->getChild<LLButton>("Blank")->setVisible(index == 0 ? TRUE : FALSE);
-- 
cgit v1.2.3


From 3053f624832763e2b3edb9b7961264bb293cef83 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 5 May 2020 01:15:25 +0300
Subject: SL-12527 cursor is not changed to the pointer on the MoTD link when
 teleporting

---
 indra/newview/llappviewer.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 4c3b82b4e2..8cc2812fd9 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4857,13 +4857,14 @@ void LLAppViewer::idle()
     {
 		return;
     }
+
+    gViewerWindow->updateUI();
+
 	if (gTeleportDisplay)
     {
 		return;
     }
 
-	gViewerWindow->updateUI();
-
 	///////////////////////////////////////
 	// Agent and camera movement
 	//
-- 
cgit v1.2.3


From 9c3368bbf60cb1d6f72f8f501981bc1b05a61a66 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Tue, 5 May 2020 19:08:55 +0300
Subject: SL-13178 Improve initial opening time of the landmarks floater

---
 doc/contributions.txt                    |  1 +
 indra/newview/llinventorypanel.cpp       | 34 ----------------------------
 indra/newview/llinventorypanel.h         | 39 ++++++++++++++++++++++++++++++++
 indra/newview/llplacesinventorypanel.cpp |  3 +--
 indra/newview/llplacesinventorypanel.h   |  8 ++++---
 5 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 811499ae28..9fc8fd9992 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -831,6 +831,7 @@ Khyota Wulluf
 Kimar Coba
 Kithrak Kirkorian
 Kitty Barnett
+	BUG-228665
 	VWR-19699
 	STORM-288
 	STORM-799
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 1ed68d72c1..26f1b61fe6 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1850,41 +1850,7 @@ void LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder()
 }
 /************************************************************************/
 /* Asset Pre-Filtered Inventory Panel related class                     */
-/* Exchanges filter's flexibility for speed of generation and           */
-/* improved performance                                                 */
 /************************************************************************/
-class LLAssetFilteredInventoryPanel : public LLInventoryPanel
-{
-public:
-    struct Params
-        : public LLInitParam::Block<Params, LLInventoryPanel::Params>
-    {
-        Mandatory<std::string>	filter_asset_type;
-
-        Params() : filter_asset_type("filter_asset_type") {}
-    };
-
-    void initFromParams(const Params& p);
-protected:
-    LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
-    friend class LLUICtrlFactory;
-public:
-    ~LLAssetFilteredInventoryPanel() {}
-
-    /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-                                       EDragAndDropType cargo_type,
-                                       void* cargo_data,
-                                       EAcceptance* accept,
-                                       std::string& tooltip_msg) override;
-
-protected:
-    /*virtual*/ LLFolderViewItem*	buildNewViews(const LLUUID& id) override;
-    /*virtual*/ void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
-
-private:
-    LLAssetType::EType mAssetType;
-};
-
 
 void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
 {
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 32d122cab8..eda5479cb4 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -359,4 +359,43 @@ protected:
     boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)> mSelectionCallback;
     friend class LLUICtrlFactory;
 };
+
+/************************************************************************/
+/* Asset Pre-Filtered Inventory Panel related class                     */
+/* Exchanges filter's flexibility for speed of generation and           */
+/* improved performance                                                 */
+/************************************************************************/
+
+class LLAssetFilteredInventoryPanel : public LLInventoryPanel
+{
+public:
+    struct Params
+        : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+    {
+        Mandatory<std::string>	filter_asset_type;
+
+        Params() : filter_asset_type("filter_asset_type") {}
+    };
+
+    void initFromParams(const Params& p);
+protected:
+    LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
+    friend class LLUICtrlFactory;
+public:
+    ~LLAssetFilteredInventoryPanel() {}
+
+    /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+        EDragAndDropType cargo_type,
+        void* cargo_data,
+        EAcceptance* accept,
+        std::string& tooltip_msg) override;
+
+protected:
+    /*virtual*/ LLFolderViewItem*	buildNewViews(const LLUUID& id) override;
+    /*virtual*/ void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
+
+private:
+    LLAssetType::EType mAssetType;
+};
+
 #endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index a23830e8e1..1c14acd843 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -43,9 +43,8 @@ static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_invent
 static const LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER;
 
 LLPlacesInventoryPanel::LLPlacesInventoryPanel(const Params& p) : 
-	LLInventoryPanel(p),
+    LLAssetFilteredInventoryPanel(p),
 	mSavedFolderState(NULL)
-
 {
 	mInvFVBridgeBuilder = &PLACES_INVENTORY_BUILDER;
 	mSavedFolderState = new LLSaveFolderState();
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 27d9b83bd1..5629438415 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -32,14 +32,16 @@
 class LLLandmarksPanel;
 class LLFolderView;
 
-class LLPlacesInventoryPanel : public LLInventoryPanel
+class LLPlacesInventoryPanel : public LLAssetFilteredInventoryPanel
 {
 public:
 	struct Params 
-		:	public LLInitParam::Block<Params, LLInventoryPanel::Params>
+		:	public LLInitParam::Block<Params, LLAssetFilteredInventoryPanel::Params>
 	{
 		Params()
-		{}
+		{
+           filter_asset_type = "landmark";
+       }
 	};
 
 	LLPlacesInventoryPanel(const Params& p);
-- 
cgit v1.2.3


From 0828d7375af44aa270635f374c993959ae3e2a28 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Fri, 8 May 2020 11:54:58 +0300
Subject: SL-12396 FIXED Last line can't be removed if it was selected via
 triple-clicking

---
 indra/llui/lltextbase.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index b48a32a622..30bf938591 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1037,6 +1037,7 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
 				line_start = it->mDocIndexStart;
 			}
 			line_end = it->mDocIndexEnd;
+			line_end = llclamp(line_end, 0, getLength());
 		}
 
 		if (line_start == -1)
-- 
cgit v1.2.3


From 9c445f6edca76effd5f86deec6521f7549bbda71 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 10:54:57 +0300
Subject: Revert SL-8191 due to it no longer being valid

This reverts commit 4c006e76e39a8b59dc6f9c890e5a27d38b5ece50.
Since EEP there are no 'basic shaders' and doing this in llfloatersettingsdebug was wrong either way
---
 indra/newview/llappviewer.cpp            |  2 +-
 indra/newview/llfloatersettingsdebug.cpp | 19 -------------------
 indra/newview/pipeline.cpp               |  4 ++--
 3 files changed, 3 insertions(+), 22 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 64004cf922..ad8a3eebf5 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -572,7 +572,7 @@ static void settings_to_globals()
 
 	LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
 	LLRender::sNsightDebugSupport = gSavedSettings.getBOOL("RenderNsightDebugSupport");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
 	LLVOVolume::sLODFactor				= llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR);
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 8bac13a5f5..fb202b4c40 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -34,7 +34,6 @@
 #include "llcolorswatch.h"
 #include "llviewercontrol.h"
 #include "lltexteditor.h"
-#include "llviewershadermgr.h"
 
 
 LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key) 
@@ -208,11 +207,6 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
 	getChildView("val_text")->setVisible( FALSE);
 	mComment->setText(LLStringUtil::null);
 
-    getChild<LLUICtrl>("boolean_combo")->setEnabled(true);
-    getChild<LLUICtrl>("TRUE")->setEnabled(true);
-    getChild<LLUICtrl>("FALSE")->setEnabled(true);
-    getChild<LLUICtrl>("default_btn")->setEnabled(true);
-
 	if (controlp)
 	{
 		eControlType type = controlp->type();
@@ -294,19 +288,6 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
 				{
 					getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(""));
 				}
-
-				bool bUseVAO = controlp->getName() == "RenderUseVAO";
-				if (bUseVAO)
-				{
-					bool use_shaders = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
-					getChild<LLUICtrl>("boolean_combo")->setEnabled(use_shaders);
-					getChild<LLUICtrl>("TRUE")->setEnabled(use_shaders);
-					getChild<LLUICtrl>("FALSE")->setEnabled(use_shaders);
-					getChild<LLUICtrl>("default_btn")->setEnabled(use_shaders);
-					if (!use_shaders) {
-						getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(false));
-					}
-				}
 			}
 			break;
 		  case TYPE_STRING:
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3014fa4a1e..88da291e7b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -440,7 +440,7 @@ void LLPipeline::init()
 	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
 	sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -7439,7 +7439,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
-	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO") && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0;
+	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
 	LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
 	LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
-- 
cgit v1.2.3


From 553e4e55828574ad4e148b532504c2ac854a1322 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 11:28:16 +0300
Subject: SL-12014 fixed wrong pool type check

---
 indra/newview/lldrawpoolavatar.cpp | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 92936dafb0..f38d336434 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1799,13 +1799,9 @@ void LLDrawPoolAvatar::getRiggedGeometry(
 	{
 		face->setPoolType(LLDrawPool::POOL_ALPHA);
 	}
-	else if (type == LLDrawPool::POOL_CONTROL_AV)
-	{
-		face->setPoolType(LLDrawPool::POOL_CONTROL_AV);
-	}
 	else
 	{
-		face->setPoolType(LLDrawPool::POOL_AVATAR);
+		face->setPoolType(mType); // either POOL_AVATAR or POOL_CONTROL_AV
 	}
 
 	//LL_INFOS() << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << LL_ENDL;
-- 
cgit v1.2.3


From 76d843ed20d15f2541de0aecdf0648531d7be6f5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 11:41:31 +0300
Subject: SL-12014 fixed transparency issues caused by merge with eep

---
 indra/newview/pipeline.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 88da291e7b..7cd0b77af4 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9053,6 +9053,7 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
 						 LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
 						 LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
 						 LLPipeline::RENDER_TYPE_AVATAR,
+						 LLPipeline::RENDER_TYPE_CONTROL_AV,
 						 LLPipeline::RENDER_TYPE_ALPHA_MASK,
 						 LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
 						 END_RENDER_TYPES);
@@ -9406,7 +9407,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 						clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
 						if (detail < 3)
 						{
-							clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
+                            clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, LLPipeline::RENDER_TYPE_CONTROL_AV, END_RENDER_TYPES);
 							if (detail < 2)
 							{
 								clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);
@@ -10121,6 +10122,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 					LLPipeline::RENDER_TYPE_BUMP,
 					LLPipeline::RENDER_TYPE_VOLUME,
 					LLPipeline::RENDER_TYPE_AVATAR,
+					LLPipeline::RENDER_TYPE_CONTROL_AV,
 					LLPipeline::RENDER_TYPE_TREE, 
 					LLPipeline::RENDER_TYPE_TERRAIN,
 					LLPipeline::RENDER_TYPE_WATER,
@@ -10937,6 +10939,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 						LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
 						LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
 			LLPipeline::RENDER_TYPE_AVATAR,
+			LLPipeline::RENDER_TYPE_CONTROL_AV,
 			LLPipeline::RENDER_TYPE_ALPHA_MASK,
 			LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
 			LLPipeline::RENDER_TYPE_INVISIBLE,
-- 
cgit v1.2.3


From 7d46d6fb21c21092b7dcaa3357a0698bf9d44794 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 20:37:36 +0300
Subject: SL-12026 Fix issue with constant bridge recreation for animeshes

---
 indra/newview/lldrawable.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index ad19574b44..2219f20272 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -1182,7 +1182,8 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 		{
 			U32 partition_type = mSpatialBridge->asPartition()->mPartitionType;
 			bool is_hud = mVObjp->isHUDAttachment();
-			bool is_attachment = mVObjp->isAttachment() && !is_hud;
+			bool is_animesh = mVObjp->isAnimatedObject() && mVObjp->getControlAvatar() != NULL;
+			bool is_attachment = mVObjp->isAttachment() && !is_hud && !is_animesh;
 			if ((partition_type == LLViewerRegion::PARTITION_HUD) != is_hud)
 			{
 				// Was/became HUD
@@ -1190,7 +1191,7 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
 				mSpatialBridge->markDead();
 				setSpatialBridge(NULL);
 			}
-			else if ((partition_type == LLViewerRegion::PARTITION_CONTROL_AV) != (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar() != NULL))
+			else if ((partition_type == LLViewerRegion::PARTITION_CONTROL_AV) != is_animesh)
 			{
 				// Was/became part of animesh
 				// remove obsolete bridge
-- 
cgit v1.2.3


From a21c0bd128a8c34c90c8fd0a128c608a92959fca Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 22:55:33 +0300
Subject: SL-12237 Remade updates for invisible avatars

---
 indra/newview/llvoavatar.cpp | 33 +++++++++++++++++++--------------
 indra/newview/llvoavatar.h   |  2 +-
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 724af3c8ed..55256746e6 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3901,16 +3901,15 @@ void LLVOAvatar::updateFootstepSounds()
 }
 
 //------------------------------------------------------------------------
-// computeUpdatePeriodAndVisibility()
+// computeUpdatePeriod()
 // Factored out from updateCharacter()
 // Set new value for mUpdatePeriod based on distance and various other factors.
-// Returs true if character needs an update
 //------------------------------------------------------------------------
-BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
+void LLVOAvatar::computeUpdatePeriod()
 {
 	bool visually_muted = isVisuallyMuted();
-    BOOL is_visible = isVisible(); // includes drawable check
-    if ( is_visible 
+	if (mDrawable.notNull()
+        && isVisible() 
         && (!isSelf() || visually_muted)
         && !isUIAvatar()
         && sUseImpostors
@@ -3956,12 +3955,10 @@ BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
 			//nearby avatars, update the impostors more frequently.
 			mUpdatePeriod = 4;
 		}
-		return (LLDrawable::getCurrentFrame() + mID.mData[0]) % mUpdatePeriod == 0 ? TRUE : FALSE;
 	}
 	else
 	{
 		mUpdatePeriod = 1;
-		return is_visible;
 	}
 
 }
@@ -4330,15 +4327,16 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// The rest should only be done occasionally for far away avatars.
     // Set mUpdatePeriod and visible based on distance and other criteria.
 	//--------------------------------------------------------------------
-    visible = computeUpdatePeriodAndVisibility();
+    computeUpdatePeriod();
+    bool needs_update = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
 
 	//--------------------------------------------------------------------
-    // Early out if not visible and not self
+	// Early out if does not need update and not self
 	// don't early out for your own avatar, as we rely on your animations playing reliably
 	// for example, the "turn around" animation when entering customize avatar needs to trigger
 	// even when your avatar is offscreen
 	//--------------------------------------------------------------------
-	if (!visible && !isSelf())
+	if (!needs_update && !isSelf())
 	{
 		updateMotions(LLCharacter::HIDDEN_UPDATE);
 		return FALSE;
@@ -4387,7 +4385,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	mSpeed = speed;
 
 	// update animations
-	if (mSpecialRenderMode == 1) // Animation Preview
+	if (!visible)
+	{
+		updateMotions(LLCharacter::HIDDEN_UPDATE);
+	}
+	else if (mSpecialRenderMode == 1) // Animation Preview
 	{
 		updateMotions(LLCharacter::FORCE_UPDATE);
 	}
@@ -4421,10 +4423,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// Update child joints as needed.
 	mRoot->updateWorldMatrixChildren();
 
-	// System avatar mesh vertices need to be reskinned.
-	mNeedsSkin = TRUE;
+    if (visible)
+    {
+        // System avatar mesh vertices need to be reskinned.
+        mNeedsSkin = TRUE;
+    }
 
-	return TRUE;
+	return visible;
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index cb91c55ba0..4e728ac959 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -264,7 +264,7 @@ public:
 	virtual void	updateDebugText();
 	virtual BOOL 	updateCharacter(LLAgent &agent);
     void			updateFootstepSounds();
-    BOOL			computeUpdatePeriodAndVisibility();
+    void			computeUpdatePeriod();
     void			updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
     void			updateTimeStep();
     void			updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained);
-- 
cgit v1.2.3


From 847cce915dd54166ca3b4fd6bfb8b3c697433abf Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 14 May 2020 22:55:33 +0300
Subject: SL-12237 Remade updates for invisible avatars

---
 indra/newview/llvoavatar.cpp | 33 +++++++++++++++++++--------------
 indra/newview/llvoavatar.h   |  2 +-
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f43391b477..7e8f65a046 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3901,16 +3901,15 @@ void LLVOAvatar::updateFootstepSounds()
 }
 
 //------------------------------------------------------------------------
-// computeUpdatePeriodAndVisibility()
+// computeUpdatePeriod()
 // Factored out from updateCharacter()
 // Set new value for mUpdatePeriod based on distance and various other factors.
-// Returs true if character needs an update
 //------------------------------------------------------------------------
-BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
+void LLVOAvatar::computeUpdatePeriod()
 {
 	bool visually_muted = isVisuallyMuted();
-    BOOL is_visible = isVisible(); // includes drawable check
-    if ( is_visible 
+	if (mDrawable.notNull()
+        && isVisible() 
         && (!isSelf() || visually_muted)
         && !isUIAvatar()
         && sUseImpostors
@@ -3956,12 +3955,10 @@ BOOL LLVOAvatar::computeUpdatePeriodAndVisibility()
 			//nearby avatars, update the impostors more frequently.
 			mUpdatePeriod = 4;
 		}
-		return (LLDrawable::getCurrentFrame() + mID.mData[0]) % mUpdatePeriod == 0 ? TRUE : FALSE;
 	}
 	else
 	{
 		mUpdatePeriod = 1;
-		return is_visible;
 	}
 
 }
@@ -4330,15 +4327,16 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// The rest should only be done occasionally for far away avatars.
     // Set mUpdatePeriod and visible based on distance and other criteria.
 	//--------------------------------------------------------------------
-    visible = computeUpdatePeriodAndVisibility();
+    computeUpdatePeriod();
+    bool needs_update = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0;
 
 	//--------------------------------------------------------------------
-    // Early out if not visible and not self
+	// Early out if does not need update and not self
 	// don't early out for your own avatar, as we rely on your animations playing reliably
 	// for example, the "turn around" animation when entering customize avatar needs to trigger
 	// even when your avatar is offscreen
 	//--------------------------------------------------------------------
-	if (!visible && !isSelf())
+	if (!needs_update && !isSelf())
 	{
 		updateMotions(LLCharacter::HIDDEN_UPDATE);
 		return FALSE;
@@ -4387,7 +4385,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	mSpeed = speed;
 
 	// update animations
-	if (mSpecialRenderMode == 1) // Animation Preview
+	if (!visible)
+	{
+		updateMotions(LLCharacter::HIDDEN_UPDATE);
+	}
+	else if (mSpecialRenderMode == 1) // Animation Preview
 	{
 		updateMotions(LLCharacter::FORCE_UPDATE);
 	}
@@ -4421,10 +4423,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	// Update child joints as needed.
 	mRoot->updateWorldMatrixChildren();
 
-	// System avatar mesh vertices need to be reskinned.
-	mNeedsSkin = TRUE;
+    if (visible)
+    {
+        // System avatar mesh vertices need to be reskinned.
+        mNeedsSkin = TRUE;
+    }
 
-	return TRUE;
+	return visible;
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 7b03a4073f..71a81c2e3d 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -264,7 +264,7 @@ public:
 	virtual void	updateDebugText();
 	virtual BOOL 	updateCharacter(LLAgent &agent);
     void			updateFootstepSounds();
-    BOOL			computeUpdatePeriodAndVisibility();
+    void			computeUpdatePeriod();
     void			updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
     void			updateTimeStep();
     void			updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained);
-- 
cgit v1.2.3

-- 
cgit v1.2.3


From bc31e8eb2f7745a7593d46dfa4280d7047eb2b1a Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Tue, 19 May 2020 22:31:58 +0300
Subject: SL-13273 Updated the SL logo images

---
 .../skins/default/textures/windows/login_sl_logo.png | Bin 21797 -> 5764 bytes
 .../default/textures/windows/login_sl_logo_small.png | Bin 5978 -> 4802 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/indra/newview/skins/default/textures/windows/login_sl_logo.png b/indra/newview/skins/default/textures/windows/login_sl_logo.png
index 9810d00237..1eede80c83 100644
Binary files a/indra/newview/skins/default/textures/windows/login_sl_logo.png and b/indra/newview/skins/default/textures/windows/login_sl_logo.png differ
diff --git a/indra/newview/skins/default/textures/windows/login_sl_logo_small.png b/indra/newview/skins/default/textures/windows/login_sl_logo_small.png
index 0a245442d5..c5933001f0 100644
Binary files a/indra/newview/skins/default/textures/windows/login_sl_logo_small.png and b/indra/newview/skins/default/textures/windows/login_sl_logo_small.png differ
-- 
cgit v1.2.3


From 547361692e485bd8f8f2e6640fa13f55fb8d62ab Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Wed, 3 Jun 2020 00:20:38 +0300
Subject: Post-merge buildfix

---
 indra/newview/viewer_manifest.py | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 5080b93345..e9007fd7b5 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1057,11 +1057,6 @@ class DarwinManifest(ViewerManifest):
                     if self.args['configuration'].lower() == 'debug':
                         for libfile in (
                                     "libfmodL.dylib",
-                # dylibs that vary based on configuration
-                if self.args['fmodex'] == 'ON':
-                    if self.args['configuration'].lower() == 'debug':
-                        for libfile in (
-                                    "libfmodexL.dylib",
                                     ):
                             dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile)
                     else:
@@ -1069,10 +1064,6 @@ class DarwinManifest(ViewerManifest):
                                     "libfmod.dylib",
                                     ):
                             dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
-                                    "libfmodex.dylib",
-                                    ):
-                            dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
  
                 # our apps
                 executable_path = {}
-- 
cgit v1.2.3


From 9b1c8534fbb0e99e9e20142fdc9582f3966c1e01 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Wed, 3 Jun 2020 11:36:13 +0300
Subject: More post-merge cleanup

---
 indra/newview/CMakeLists.txt     | 5 -----
 indra/newview/viewer_manifest.py | 9 ++-------
 2 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a2892f9c7e..8977dcf50d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1939,7 +1939,6 @@ if (WINDOWS)
           --artwork=${ARTWORK_DIR}
           "--bugsplat=${BUGSPLAT_DB}"
           "--fmodstudio=${FMODSTUDIO}"
-          "--fmodex=${FMODEX}"
           "--openal=${OPENAL}"
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
@@ -2087,7 +2086,6 @@ if (LINUX)
         --artwork=${ARTWORK_DIR}
         "--bugsplat=${BUGSPLAT_DB}"
         "--fmodstudio=${FMODSTUDIO}"
-        "--fmodex=${FMODEX}"
         "--openal=${OPENAL}"
         --build=${CMAKE_CURRENT_BINARY_DIR}
         --buildtype=${CMAKE_BUILD_TYPE}
@@ -2116,7 +2114,6 @@ if (LINUX)
       --artwork=${ARTWORK_DIR}
       "--bugsplat=${BUGSPLAT_DB}"
       "--fmodstudio=${FMODSTUDIO}"
-      "--fmodex=${FMODEX}"
       "--openal=${OPENAL}"
       --build=${CMAKE_CURRENT_BINARY_DIR}
       --buildtype=${CMAKE_BUILD_TYPE}
@@ -2195,7 +2192,6 @@ if (DARWIN)
       --artwork=${ARTWORK_DIR}
       "--bugsplat=${BUGSPLAT_DB}"
       "--fmodstudio=${FMODSTUDIO}"
-      "--fmodex=${FMODEX}"
       "--openal=${OPENAL}"
       --build=${CMAKE_CURRENT_BINARY_DIR}
       --buildtype=${CMAKE_BUILD_TYPE}
@@ -2232,7 +2228,6 @@ if (DARWIN)
           --artwork=${ARTWORK_DIR}
           "--bugsplat=${BUGSPLAT_DB}"
           "--fmodstudio=${FMODSTUDIO}"
-          "--fmodex=${FMODEX}"
           "--openal=${OPENAL}"
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index e9007fd7b5..0a96444a7a 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1064,7 +1064,7 @@ class DarwinManifest(ViewerManifest):
                                     "libfmod.dylib",
                                     ):
                             dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
- 
+
                 # our apps
                 executable_path = {}
                 for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),
@@ -1535,10 +1535,6 @@ class Linux_i686_Manifest(LinuxManifest):
                 except:
                     print "Skipping libfmod.so - not found"
                     pass
-            if self.args['fmodex'] == 'ON':
-                self.path("libfmodex-*.so")
-                self.path("libfmodex.so")
-
 
         # Vivox runtimes
         with self.prefix(src=relpkgdir, dst="bin"):
@@ -1564,12 +1560,11 @@ class Linux_x86_64_Manifest(LinuxManifest):
 ################################################################
 
 if __name__ == "__main__":
-    # fmodex and openal can be used simultaneously and controled by environment
+    # fmodstudio and openal can be used simultaneously and controled by environment
     extra_arguments = [
         dict(name='bugsplat', description="""BugSplat database to which to post crashes,
              if BugSplat crash reporting is desired""", default=''),
         dict(name='fmodstudio', description="""Indication if fmod studio libraries are needed""", default='OFF'),
-        dict(name='fmodex', description="""Indication that fmodex libraries are needed""", default='OFF'),
         dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'),
         ]
     try:
-- 
cgit v1.2.3


From b8a7c66bc15539db4a03ffe65076fdbbbce2b36d Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 3 Jun 2020 23:36:28 +0300
Subject: SL-863 Fixed missing render mask

---
 indra/newview/pipeline.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 7cd0b77af4..f3b8ad9008 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -10916,7 +10916,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 	
 	if (visually_muted || too_complex)
 	{
-		andRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
+		andRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR,
+							LLPipeline::RENDER_TYPE_CONTROL_AV,
+							END_RENDER_TYPES);
 	}
 	else
 	{
-- 
cgit v1.2.3


From 846d0d337145597eb98e1e107a273622a183f133 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 5 Jun 2020 17:25:01 +0300
Subject: SL-13390 Fix Openal Builds

---
 indra/llaudio/llaudioengine_openal.cpp | 2 +-
 indra/newview/llprogressview.cpp       | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp
index a38d8291fa..3bdd0302ee 100644
--- a/indra/llaudio/llaudioengine_openal.cpp
+++ b/indra/llaudio/llaudioengine_openal.cpp
@@ -55,7 +55,7 @@ LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
 bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata, const std::string &app_title)
 {
 	mWindGen = NULL;
-	LLAudioEngine::init(num_channels, userdata);
+	LLAudioEngine::init(num_channels, userdata, app_title);
 
 	if(!alutInit(NULL, NULL))
 	{
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index e4c4a0d86b..19c8ef2651 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -385,6 +385,7 @@ void LLProgressView::initLogos()
     const S32 default_pad = 15;
 
     S32 icon_width, icon_height;
+    S32 pad_y = 0;
 
     // We don't know final screen rect yet, so we can't precalculate position fully
     LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
@@ -404,7 +405,7 @@ void LLProgressView::initLogos()
     // with no internal paddings so it gets additional padding
     icon_width = 77;
     icon_height = 21;
-    S32 pad_y = 4;
+    pad_y = 4;
     texture_start_x++;
     loadLogo(temp_str + "fmod_logo.png",
         image_codec,
-- 
cgit v1.2.3


From 0defa9be8304cd80b5562dddb6e0f10219192a7f Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 5 May 2020 12:23:59 -0600
Subject: DRTVWR-510 add code to report Vulkan capability in stats
 (Windows-only)

---
 indra/newview/llviewerstats.cpp | 42 +++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 85d87a43af..eccbefcd3e 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -55,7 +55,6 @@
 #include "llviewerregion.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
-#include "llviewerwindow.h"		// *TODO: remove, only used for width/height
 #include "llworld.h"
 #include "llfeaturemanager.h"
 #include "llviewernetwork.h"
@@ -582,21 +581,32 @@ void send_stats()
 	// If the current revision is recent, ping the previous author before overriding
 	LLSD &misc = body["stats"]["misc"];
 
-	// Screen size so the UI team can figure out how big the widgets
-	// appear and use a "typical" size for end user tests.
-
-	S32 window_width = gViewerWindow->getWindowWidthRaw();
-	S32 window_height = gViewerWindow->getWindowHeightRaw();
-	S32 window_size = (window_width * window_height) / 1024;
-	misc["string_1"] = llformat("%d", window_size);
-	misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds.value());
-
-	F32 unbaked_time = LLVOAvatar::sUnbakedTime * 1000.f / gFrameTimeSeconds;
-	misc["int_1"] = LLSD::Integer(unbaked_time); // Steve: 1.22
-	F32 grey_time = LLVOAvatar::sGreyTime * 1000.f / gFrameTimeSeconds;
-	misc["int_2"] = LLSD::Integer(grey_time); // Steve: 1.22
-
-	LL_INFOS() << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << LL_ENDL;
+#ifdef LL_WINDOWS
+    // Probe for Vulkan capability (Dave Houlton 05/2020)
+    //
+    // Check for presense of a Vulkan loader dll, as a proxy for a Vulkan-capable gpu.
+    // False-positives and false-negatives are possible, but unlikely. We'll get a good
+    // approximation of Vulkan capability within current user systems from this. More
+    // detailed information on versions and extensions can come later.
+    HMODULE vulkanDll = LoadLibraryExA("vulkan-1.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
+    if (NULL == vulkanDll)
+    {
+        misc["string_1"] = llformat("No Vulkan driver detected");
+    }
+    else
+    {
+        misc["string_1"] = llformat("Vulkan driver is detected");
+        FreeLibrary(vulkanDll);
+    }
+#else
+    misc["string_1"] = llformat("Unused");
+#endif // LL_WINDOWS
+
+    misc["string_2"] = llformat("Unused");
+    misc["int_1"] = LLSD::Integer(0);
+    misc["int_2"] = LLSD::Integer(0);
+
+    LL_INFOS() << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << LL_ENDL;
 	LL_INFOS() << "Misc Stats: string_1: " << misc["string_1"] << " string_2: " << misc["string_2"] << LL_ENDL;
 
 	body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");
-- 
cgit v1.2.3


From e1ea8eb7738c2f9a6762dd8c6c22de00607e8ba2 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 6 May 2020 11:55:02 -0600
Subject: DRTVWR-510 cache vulkan-detect result

---
 indra/newview/llviewerstats.cpp | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index eccbefcd3e..04172adde9 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -588,16 +588,22 @@ void send_stats()
     // False-positives and false-negatives are possible, but unlikely. We'll get a good
     // approximation of Vulkan capability within current user systems from this. More
     // detailed information on versions and extensions can come later.
-    HMODULE vulkanDll = LoadLibraryExA("vulkan-1.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
-    if (NULL == vulkanDll)
-    {
-        misc["string_1"] = llformat("No Vulkan driver detected");
-    }
-    else
+    static bool vulkan_oneshot = false;
+    static bool vulkan_detected = false;
+
+    if (!vulkan_oneshot)
     {
-        misc["string_1"] = llformat("Vulkan driver is detected");
-        FreeLibrary(vulkanDll);
+        HMODULE vulkan_loader = LoadLibraryExA("vulkan-1.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
+        if (NULL != vulkan_loader)
+        {
+            vulkan_detected = true;
+            FreeLibrary(vulkan_loader);
+        }
+        vulkan_oneshot = true;
     }
+
+    misc["string_1"] = vulkan_detected ? llformat("Vulkan driver is detected") : llformat("No Vulkan driver detected");
+
 #else
     misc["string_1"] = llformat("Unused");
 #endif // LL_WINDOWS
-- 
cgit v1.2.3


From aabb0bbc49aa15b100dc8c2cbf286202cb084646 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 11 Jun 2020 15:53:18 +0300
Subject: SL-13390 Disable Havok icon when Havok is not included

---
 indra/newview/CMakeLists.txt     |  6 ++++++
 indra/newview/llprogressview.cpp | 13 +++++++------
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8977dcf50d..1adc25090f 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1736,6 +1736,12 @@ if (FMODSTUDIO)
 endif (FMODSTUDIO)
 
 set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
+
+if (HAVOK OR HAVOK_TPV)
+  set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
+endif (HAVOK OR HAVOK_TPV)
+
+# progress view disables/enables icons based on available packages
 set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
 
 list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 19c8ef2651..3e3ab3a676 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -385,7 +385,6 @@ void LLProgressView::initLogos()
     const S32 default_pad = 15;
 
     S32 icon_width, icon_height;
-    S32 pad_y = 0;
 
     // We don't know final screen rect yet, so we can't precalculate position fully
     LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
@@ -405,28 +404,30 @@ void LLProgressView::initLogos()
     // with no internal paddings so it gets additional padding
     icon_width = 77;
     icon_height = 21;
-    pad_y = 4;
+    S32 pad_fmod_y = 4;
     texture_start_x++;
     loadLogo(temp_str + "fmod_logo.png",
         image_codec,
-        LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y),
+        LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y),
         default_clip,
         default_clip);
 
     texture_start_x += icon_width + default_pad + 1;
-#endif
+#endif //LL_FMODSTUDIO
+#ifdef LL_HAVOK
     // original image size is 342x113, central element is on a larger side
     // plus internal padding, so it gets slightly more height than desired 32
     icon_width = 88;
     icon_height = 29;
-    pad_y = -1;
+    S32 pad_havok_y = -1;
     loadLogo(temp_str + "havok_logo.png",
         image_codec,
-        LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y),
+        LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y),
         default_clip,
         default_clip);
 
     texture_start_x += icon_width + default_pad;
+#endif //LL_HAVOK
 
     // 108x41
     icon_width = 74;
-- 
cgit v1.2.3


From 84d30655967fa29cc800783db2cd43df6f28d35e Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 8 Jun 2020 15:47:41 -0600
Subject: SL-13281, add missing srgb->linear conversion for specular

---
 indra/llrender/llimagegl.cpp                       | 80 +++++++++++++---------
 indra/llrender/llrender.cpp                        | 22 +++---
 indra/llrender/llrendertarget.cpp                  | 10 +--
 .../shaders/class1/deferred/multiPointLightF.glsl  |  1 +
 4 files changed, 69 insertions(+), 44 deletions(-)

diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index ff74380217..3b6a49735e 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -985,38 +985,56 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
 		return FALSE;
 	}
 
-	if( !mHasExplicitFormat )
-	{
-		switch (mComponents)
-		{
-			case 1:
-			// Use luminance alpha (for fonts)
-			mFormatInternal = GL_LUMINANCE8;
-			mFormatPrimary = GL_LUMINANCE;
-			mFormatType = GL_UNSIGNED_BYTE;
-			break;
-			case 2:
-			// Use luminance alpha (for fonts)
-			mFormatInternal = GL_LUMINANCE8_ALPHA8;
-			mFormatPrimary = GL_LUMINANCE_ALPHA;
-			mFormatType = GL_UNSIGNED_BYTE;
-			break;
-			case 3:
-			mFormatInternal = GL_RGB8;
-			mFormatPrimary = GL_RGB;
-			mFormatType = GL_UNSIGNED_BYTE;
-			break;
-			case 4:
-			mFormatInternal = GL_RGBA8;
-			mFormatPrimary = GL_RGBA;
-			mFormatType = GL_UNSIGNED_BYTE;
-			break;
-			default:
-			LL_ERRS() << "Bad number of components for texture: " << (U32)getComponents() << LL_ENDL;
-		}
-	}
+    if (!mHasExplicitFormat)
+    {
+        switch (mComponents)
+        {
+            case 1:
+                // Use luminance alpha (for fonts)
+                mFormatInternal = GL_LUMINANCE8;
+                mFormatPrimary  = GL_LUMINANCE;
+                mFormatType     = GL_UNSIGNED_BYTE;
+                break;
+            case 2:
+                // Use luminance alpha (for fonts)
+                mFormatInternal = GL_LUMINANCE8_ALPHA8;
+                mFormatPrimary  = GL_LUMINANCE_ALPHA;
+                mFormatType     = GL_UNSIGNED_BYTE;
+                break;
+            case 3:
+#if USE_SRGB_DECODE
+                if (gGLManager.mHasTexturesRGBDecode)
+                {
+                    mFormatInternal = GL_SRGB8;
+                }
+                else
+#endif
+                {
+                    mFormatInternal = GL_RGB8;
+                }
+                mFormatPrimary = GL_RGB;
+                mFormatType    = GL_UNSIGNED_BYTE;
+                break;
+            case 4:
+#if USE_SRGB_DECODE
+                if (gGLManager.mHasTexturesRGBDecode)
+                {
+                    mFormatInternal = GL_SRGB8_ALPHA8;
+                }
+                else
+#endif
+                {
+                    mFormatInternal = GL_RGBA8;
+                }
+                mFormatPrimary = GL_RGBA;
+                mFormatType    = GL_UNSIGNED_BYTE;
+                break;
+            default:
+                LL_ERRS() << "Bad number of components for texture: " << (U32) getComponents() << LL_ENDL;
+        }
+    }
 
-	mCurrentDiscardLevel = discard_level;	
+    mCurrentDiscardLevel = discard_level;	
 	mDiscardLevelInAtlas = discard_level;
 	mTexelsInAtlas = raw_image->getWidth() * raw_image->getHeight() ;
 	mLastBindTime = sLastFrameTime;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 9b5231ad06..cabf0528f0 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -849,26 +849,32 @@ void LLTexUnit::debugTextureUnit(void)
 	}
 }
 
-void LLTexUnit::setTextureColorSpace(eTextureColorSpace space) {
+void LLTexUnit::setTextureColorSpace(eTextureColorSpace space)
+{
     mTexColorSpace = space;
 
 #if USE_SRGB_DECODE
-    if (gGLManager.mHasTexturesRGBDecode) {
-
-        if (space == TCS_SRGB) {
+    if (gGLManager.mHasTexturesRGBDecode)
+    {
+        if (space == TCS_SRGB)
+        {
             glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
         }
-        else {
+        else
+        {
             glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
         }
 
-        if (gDebugGL) {
+        if (gDebugGL)
+        {
             assert_glerror();
         }
     }
+    else
 #endif
-    glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
-
+    {
+        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
+    }
 }
 
 LLLightState::LLLightState(S32 index)
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 9fb4f7f2b0..e3c0255290 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -501,23 +501,23 @@ U32 LLRenderTarget::getNumTextures() const
 	return mTex.size();
 }
 
-
 void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)
 {
-	gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
+    gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
 
     bool isSRGB = false;
     llassert(mInternalFormat.size() > index);
     switch (mInternalFormat[index])
     {
-        case GL_SRGB_ALPHA:
         case GL_SRGB:
+        case GL_SRGB8:
+        case GL_SRGB_ALPHA:
         case GL_SRGB8_ALPHA8:
             isSRGB = true;
-        break;
+            break;
 
         default:
-        break;
+            break;
     }
 
     gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 0d1cc81786..c6afda375c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -77,6 +77,7 @@ void main()
 	vec3 norm = getNorm(frag.xy);
 
 	vec4 spec = texture2DRect(specularRect, frag.xy);
+    spec.rgb = srgb_to_linear(spec.rgb);
 	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
     diff.rgb = srgb_to_linear(diff.rgb);
 	
-- 
cgit v1.2.3


From 4c8821df9da21e7b3b13d5a8e61df4faaa6ee219 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 8 Jun 2020 16:42:34 -0600
Subject: SL-13821 shader clean up and format

---
 .../shaders/class1/deferred/multiPointLightF.glsl  | 204 ++++++++++-----------
 1 file changed, 98 insertions(+), 106 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index c6afda375c..8c402fcb54 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -1,24 +1,24 @@
-/** 
- * @file multiPointLightF.glsl
+/**
+ * @file class1/deferred/multiPointLightF.glsl
  *
  * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2007, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -36,120 +36,112 @@ out vec4 frag_color;
 uniform sampler2DRect depthMap;
 uniform sampler2DRect diffuseRect;
 uniform sampler2DRect specularRect;
-uniform samplerCube environmentMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
+uniform samplerCube   environmentMap;
+uniform sampler2D     noiseMap;
+uniform sampler2D     lightFunc;
 
-
-uniform vec3 env_mat[3];
+uniform vec3  env_mat[3];
 uniform float sun_wash;
+uniform int   light_count;
+uniform vec4  light[LIGHT_COUNT];
+uniform vec4  light_col[LIGHT_COUNT];
 
-uniform int light_count;
-
-uniform vec4 light[LIGHT_COUNT];
-uniform vec4 light_col[LIGHT_COUNT];
-
-VARYING vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
+uniform vec2  screen_res;
 uniform float far_z;
+uniform mat4  inv_proj;
 
-uniform mat4 inv_proj;
+VARYING vec4 vary_fragcoord;
 
 vec4 getPosition(vec2 pos_screen);
 vec3 getNorm(vec2 pos_screen);
 vec3 srgb_to_linear(vec3 c);
 
-void main() 
+void main()
 {
-	vec3 out_col = vec3(0,0,0);
-
 #if defined(LOCAL_LIGHT_KILL)
-    discard;
-#else
-	vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
-	vec3 pos = getPosition(frag.xy).xyz;
-	if (pos.z < far_z)
-	{
-		discard;
-	}
-	
-	vec3 norm = getNorm(frag.xy);
-
-	vec4 spec = texture2DRect(specularRect, frag.xy);
-    spec.rgb = srgb_to_linear(spec.rgb);
-	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
-    diff.rgb = srgb_to_linear(diff.rgb);
-	
-	float noise = texture2D(noiseMap, frag.xy/128.0).b;
-	vec3 npos = normalize(-pos);
-
-	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
-	for (int i = 0; i < LIGHT_COUNT; ++i)
-	{
-		vec3 lv = light[i].xyz-pos;
-		float dist = length(lv);
-		dist /= light[i].w;
-		if (dist <= 1.0)
-		{
-		float da = dot(norm, lv);
-			if (da > 0.0)
-		{
-			lv = normalize(lv);
-			da = dot(norm, lv);
-			
-			float fa = light_col[i].a+1.0;
-			float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
-			dist_atten *= dist_atten;
-            
-            // Tweak falloff slightly to match pre-EEP attenuation
-			// NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit
-			dist_atten *= 2.0;
-			
-			dist_atten *= noise;
-
-			float lit = da * dist_atten;
-						
-			vec3 col = light_col[i].rgb*lit*diff;
-			
-			//vec3 col = vec3(dist2, light_col[i].a, lit);
-			
-			if (spec.a > 0.0)
-			{
-				lit = min(da*6.0, 1.0) * dist_atten;
-				//vec3 ref = dot(pos+lv, norm);
-				vec3 h = normalize(lv+npos);
-				float nh = dot(norm, h);
-				float nv = dot(norm, npos);
-				float vh = dot(npos, h);
-				float sa = nh;
-				float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-				float gtdenom = 2 * nh;
-				float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-								
-				if (nh > 0.0)
-				{
-					float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-					col += lit*scol*light_col[i].rgb*spec.rgb;
-					//col += spec.rgb;
-				}
-			}
-			
-			out_col += col;
-		}
-	}
-	}
+    discard;  // Bail immediately
 #endif
-	
-	frag_color.rgb = out_col;
-	frag_color.a = 0.0;
+
+    vec3 out_col = vec3(0, 0, 0);
+    vec2 frag    = (vary_fragcoord.xy * 0.5 + 0.5) * screen_res;
+    vec3 pos     = getPosition(frag.xy).xyz;
+    if (pos.z < far_z)
+    {
+        discard;
+    }
+
+    vec3 norm = getNorm(frag.xy);
+
+    vec4 spec = texture2DRect(specularRect, frag.xy);
+    spec.rgb  = srgb_to_linear(spec.rgb);
+    vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
+    diff.rgb  = srgb_to_linear(diff.rgb);
+
+    float noise = texture2D(noiseMap, frag.xy / 128.0).b;
+    vec3  npos  = normalize(-pos);
+
+    // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
+    for (int i = 0; i < LIGHT_COUNT; ++i)
+    {
+        vec3  lv   = light[i].xyz - pos;
+        float dist = length(lv);
+        dist /= light[i].w;
+        if (dist <= 1.0)
+        {
+            float da = dot(norm, lv);
+            if (da > 0.0)
+            {
+                lv = normalize(lv);
+                da = dot(norm, lv);
+
+                float fa         = light_col[i].a + 1.0;
+                float dist_atten = clamp(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 0.0, 1.0);
+                dist_atten *= dist_atten;
+
+                // Tweak falloff slightly to match pre-EEP attenuation
+                // NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit
+                dist_atten *= 2.0;
+
+                dist_atten *= noise;
+
+                float lit = da * dist_atten;
+
+                vec3 col = light_col[i].rgb * lit * diff;
+
+                if (spec.a > 0.0)
+                {
+                    lit        = min(da * 6.0, 1.0) * dist_atten;
+                    vec3  h    = normalize(lv + npos);
+                    float nh   = dot(norm, h);
+                    float nv   = dot(norm, npos);
+                    float vh   = dot(npos, h);
+                    float sa   = nh;
+                    float fres = pow(1 - dot(h, npos), 5) * 0.4 + 0.5;
+
+                    float gtdenom = 2 * nh;
+                    float gt      = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+
+                    if (nh > 0.0)
+                    {
+                        float scol = fres * texture2D(lightFunc, vec2(nh, spec.a)).r * gt / (nh * da);
+                        col += lit * scol * light_col[i].rgb * spec.rgb;
+                    }
+                }
+
+                out_col += col;
+            }
+        }
+    }
+
+    frag_color.rgb = out_col;
+    frag_color.a   = 0.0;
 
 #ifdef IS_AMD_CARD
-	// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts.
-	vec4 dummy1 = light[0];
-	vec4 dummy2 = light_col[0];
-	vec4 dummy3 = light[LIGHT_COUNT-1];
-	vec4 dummy4 = light_col[LIGHT_COUNT-1];
+    // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage
+    // awawy which leads to unfun crashes and artifacts.
+    vec4 dummy1 = light[0];
+    vec4 dummy2 = light_col[0];
+    vec4 dummy3 = light[LIGHT_COUNT - 1];
+    vec4 dummy4 = light_col[LIGHT_COUNT - 1];
 #endif
 }
-- 
cgit v1.2.3


From ea9afd66002dc3de45e9f2a5289a676e55372d59 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 8 Jun 2020 16:42:34 -0600
Subject: SL-13084 Combined commit for the EEP specular color fix

SL-13084: Fix clouds flipped along East/West axis to match texture preview Cloud Image and direction to match Cloud Scroll

SL-13804: Fix clouds flipped along East/West axis to match texture preview Cloud Image and direction to match Cloud Scroll

SL-13084: Fix inverted cloud scroll with ALM is off

SL-13084: Move texture coords section to top in class2/windlight/cloudsV to match class1/deffered/cloudsV

SL-13084: Add references to other common files
---
 .../shaders/class1/deferred/cloudsV.glsl           |  7 +++--
 .../shaders/class2/windlight/cloudsV.glsl          | 36 +++++++++++++---------
 indra/newview/llsettingsvo.cpp                     | 11 ++++++-
 3 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index caa4fe1f65..495daa2db6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -70,15 +70,18 @@ uniform float cloud_scale;
 // NOTE: Keep these in sync!
 //       indra\newview\app_settings\shaders\class1\deferred\skyV.glsl
 //       indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl
+//       indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl
 //       indra\newview\lllegacyatmospherics.cpp
+//       indra\newview\llsettingsvo.cpp
 void main()
 {
-
 	// World / view / projection
 	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
 	// Texture coords
-	vary_texcoord0 = texcoord0;
+    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
+	vary_texcoord0 = vec2( -texcoord0.x, texcoord0.y ); // See: LLSettingsVOSky::applySpecial
+
 	vary_texcoord0.xy -= 0.5;
 	vary_texcoord0.xy /= cloud_scale;
 	vary_texcoord0.xy += 0.5;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 2c1475d547..a4389f62dc 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -36,6 +36,7 @@ ATTRIBUTE vec2 texcoord0;
 VARYING vec4 vary_CloudColorSun;
 VARYING vec4 vary_CloudColorAmbient;
 VARYING float vary_CloudDensity;
+
 VARYING vec2 vary_texcoord0;
 VARYING vec2 vary_texcoord1;
 VARYING vec2 vary_texcoord2;
@@ -66,13 +67,31 @@ uniform vec4 cloud_color;
 
 uniform float cloud_scale;
 
+// NOTE: Keep these in sync!
+//       indra\newview\app_settings\shaders\class1\deferred\skyV.glsl
+//       indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl
+//       indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl
+//       indra\newview\lllegacyatmospherics.cpp
+//       indra\newview\llsettingsvo.cpp
 void main()
 {
-
 	// World / view / projection
 	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
-	vary_texcoord0 = texcoord0;
+	// Texture coords
+    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
+	vary_texcoord0 = vec2( -texcoord0.x, texcoord0.y ); // See: LLSettingsVOSky::applySpecial
+
+	vary_texcoord0.xy -= 0.5;
+	vary_texcoord0.xy /= cloud_scale;
+	vary_texcoord0.xy += 0.5;
+
+	vary_texcoord1 = vary_texcoord0;
+	vary_texcoord1.x += lightnorm.x * 0.0125;
+	vary_texcoord1.y += lightnorm.z * 0.0125;
+
+	vary_texcoord2 = vary_texcoord0 * 16.;
+	vary_texcoord3 = vary_texcoord1 * 16.;
 
 	// Get relative position
 	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
@@ -175,19 +194,6 @@ void main()
 	vary_CloudDensity = 2. * (cloud_shadow - 0.25);
 
 
-	// Texture coords
-	vary_texcoord0 = texcoord0;
-	vary_texcoord0.xy -= 0.5;
-	vary_texcoord0.xy /= cloud_scale;
-	vary_texcoord0.xy += 0.5;
-
-	vary_texcoord1 = vary_texcoord0;
-	vary_texcoord1.x += lightnorm.x * 0.0125;
-	vary_texcoord1.y += lightnorm.z * 0.0125;
-
-	vary_texcoord2 = vary_texcoord0 * 16.;
-	vary_texcoord3 = vary_texcoord1 * 16.;
-
 	// Combine these to minimize register use
 	vary_CloudColorAmbient += oHazeColorBelowCloud;
 
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index c72a0706cd..5a4427a7b7 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -678,8 +678,17 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
 	{
     shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV);        
 
+    // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate")
     LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]);
-    vect_c_p_d1 += LLVector4(LLEnvironment::instance().getCloudScrollDelta());
+    LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() );
+
+    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
+    // Keep in Sync!
+    // * indra\newview\llsettingsvo.cpp
+    // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl
+    // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl
+    cloud_scroll[0] = -cloud_scroll[0];
+    vect_c_p_d1 += cloud_scroll;
     shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, 1, vect_c_p_d1.mV);
 
     LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
-- 
cgit v1.2.3

-- 
cgit v1.2.3


From f854e95116cf6d1be1ea1ba562def2e6017179bf Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 18 Jun 2020 10:39:49 -0700
Subject: SL-9632: Fix most HUD objects incorrectly being effected by the
 environment lighting

---
 .../shaders/class1/objects/simpleV.glsl            | 28 +++++++++++++---------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index a59bd9c0a6..575a641b7a 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -1,4 +1,4 @@
-/** 
+/**
  * @file simpleV.glsl
  *
  * $LicenseInfo:firstyear=2007&license=viewerlgpl$
@@ -28,6 +28,9 @@ uniform mat4 texture_matrix0;
 uniform mat4 modelview_matrix;
 uniform mat4 modelview_projection_matrix;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
+uniform int no_atmo;
+
 ATTRIBUTE vec3 position;
 void passTextureIndex();
 ATTRIBUTE vec2 texcoord0;
@@ -46,19 +49,22 @@ void main()
 {
 	//transform vertex
 	vec4 vert = vec4(position.xyz,1.0);
-	passTextureIndex();
-	vec4 pos = (modelview_matrix * vert);
 	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+	passTextureIndex();
 	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
 	
-	
-	
-	vec3 norm = normalize(normal_matrix * normal);
+	if (no_atmo == 1)
+	{
+		vertex_color = diffuse_color;
+	}
+	else
+	{
+		vec4 pos = (modelview_matrix * vert);
+		vec3 norm = normalize(normal_matrix * normal);
 
-	calcAtmospherics(pos.xyz);
+		calcAtmospherics(pos.xyz);
 
-	vec4 color = calcLighting(pos.xyz, norm, diffuse_color);
-	vertex_color = color;
-
-	
+		vertex_color = calcLighting(pos.xyz, norm, diffuse_color);
+	}
 }
-- 
cgit v1.2.3


From e7883022b252bfffe8f7d133c6dc626bb95dc442 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 18 Jun 2020 15:15:54 -0700
Subject: SL-9632 Fix HUD objects to not use environment lighting

---
 .../shaders/class1/deferred/fullbrightShinyF.glsl  | 38 +++++++++++++---------
 .../class1/lighting/lightFullbrightShinyF.glsl     | 20 +++++++++---
 .../shaders/class1/objects/simpleV.glsl            |  3 +-
 3 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
index bd0ad3bce8..2d40e63eff 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
@@ -42,6 +42,9 @@ VARYING vec4 vary_position;
 
 uniform samplerCube environmentMap;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
+uniform int no_atmo;
+
 vec3 fullbrightShinyAtmosTransport(vec3 light);
 vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
 vec3 fullbrightScaleSoftClip(vec3 light);
@@ -51,7 +54,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
 vec3 linear_to_srgb(vec3 c);
 vec3 srgb_to_linear(vec3 c);
 
-
+// See:
+//   class1\deferred\fullbrightShinyF.glsl
+//   class1\lighting\lightFullbrightShinyF.glsl
 void main()
 {
 #ifdef HAS_DIFFUSE_LOOKUP
@@ -59,25 +64,28 @@ void main()
 #else
 	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
 #endif
-	
+
 	color.rgb *= vertex_color.rgb;
-	vec3 pos = vary_position.xyz/vary_position.w;
 
-	vec3 sunlit;
-	vec3 amblit;
-	vec3 additive;
-	vec3 atten;
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+		vec3 sunlit;
+		vec3 amblit;
+		vec3 additive;
+		vec3 atten;
+		vec3 pos = vary_position.xyz/vary_position.w;
+
+		calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
 
-	calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
-	
-	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	
-	float env_intensity = vertex_color.a;
-	color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+		float env_intensity = vertex_color.a;
 
 	//color.rgb = srgb_to_linear(color.rgb);
-	
-	color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
-	color.rgb = fullbrightScaleSoftClip(color.rgb);
+		color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+		color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
+		color.rgb = fullbrightScaleSoftClip(color.rgb);
+	}
 
 	color.a = 1.0;
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index 567811cd75..3eaaa41866 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -35,20 +35,30 @@ VARYING vec3 vary_texcoord1;
 
 uniform samplerCube environmentMap;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
+uniform int no_atmo;
+
 vec3 fullbrightShinyAtmosTransport(vec3 light);
 vec3 fullbrightScaleSoftClip(vec3 light);
 
+// See:
+//   class1\deferred\fullbrightShinyF.glsl
+//   class1\lighting\lightFullbrightShinyF.glsl
 void fullbright_shiny_lighting()
 {
 	vec4 color = diffuseLookup(vary_texcoord0.xy);
 	color.rgb *= vertex_color.rgb;
-	
-	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	
-	color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
 
-	color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+		color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
+
+		color.rgb = fullbrightShinyAtmosTransport(color.rgb);
 
-	color.rgb = fullbrightScaleSoftClip(color.rgb);
+		color.rgb = fullbrightScaleSoftClip(color.rgb);
+	}
 
 	color.a = 1.0;
 
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index 575a641b7a..9ef7704b70 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -53,7 +53,8 @@ void main()
 
 	passTextureIndex();
 	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
-	
+
+	// SL-9632 HUDs are affected by Atmosphere
 	if (no_atmo == 1)
 	{
 		vertex_color = diffuse_color;
-- 
cgit v1.2.3


From 528a4bc6a1561213b7d384e5a249c46c97f3ded9 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 11:54:46 -0700
Subject: DRTVWR-497: Fix Texture Console flicker on first line

---
 indra/newview/lltextureview.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 0d2edc0268..1c4187d30f 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -549,7 +549,7 @@ void LLGLTexMemBar::draw()
     U32 texFetchLatMed = U32(recording.getMean(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
     U32 texFetchLatMax = U32(recording.getMax(LLTextureFetch::sTexFetchLatency).value() * 1000.0f);
 
-	text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
+	text = llformat("GL Tot: %d/%d MB Bound: %4d/%4d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
 					total_mem.value(),
 					max_total_mem.value(),
 					bound_mem.value(),
-- 
cgit v1.2.3


From 7ad05093b8143bcae443805c71c5517628ca1bc5 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 11:56:32 -0700
Subject: DRTVWR-497 Cleanup: Summarize calcPhi equation

---
 indra/newview/llvowlsky.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 368a3f2335..d428cb1568 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -99,6 +99,9 @@ LLDrawable * LLVOWLSky::createDrawable(LLPipeline * pipeline)
 
 inline F32 LLVOWLSky::calcPhi(U32 i)
 {
+    // Calc: PI/8 * 1-((1-t^4)*(1-t^4))  { 0<t<1 }
+    // Demos: \pi/8*\left(1-((1-x^{4})*(1-x^{4}))\right)\ \left\{0<x\le1\right\}
+
 	// i should range from [0..SKY_STACKS] so t will range from [0.f .. 1.f]
 	F32 t = float(i) / float(getNumStacks());
 
-- 
cgit v1.2.3


From 2805f380743ae56deed97e3ad2c849abd36e7244 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 11:59:52 -0700
Subject: DRTVWR-497 Cleanup: Document which enum order comes from

---
 indra/llrender/llshadermgr.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 1383020873..236ebbd78f 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1180,7 +1180,7 @@ void LLShaderMgr::initAttribsAndUniforms()
 
 	llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
 
-
+    //NOTE: MUST match order in eGLSLReservedUniforms
 	mReservedUniforms.push_back("proj_mat");
 	mReservedUniforms.push_back("proj_near");
 	mReservedUniforms.push_back("proj_p");
-- 
cgit v1.2.3


From 82882d77c41edc3fc3a962ab95ad19fc99604228 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 12:00:42 -0700
Subject: DRTVWR-497: Cleanup: Document algorithm name for normal
 packing/unpacking.

---
 indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl b/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl
index 50e781fa78..6cd2445522 100644
--- a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl
@@ -23,6 +23,9 @@
  * $/LicenseInfo$
  */
 
+// Lambert Azimuthal Equal-Area projection
+// See: https://aras-p.info/texts/CompactNormalStorage.html
+// Also see: A_bit_more_deferred_-_CryEngine3.ppt
 vec2 encode_normal(vec3 n)
 {
 	float f = sqrt(8 * n.z + 8);
-- 
cgit v1.2.3


From 6ea04e8f5ab18b4a9863acde845d34531199812a Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 16:16:59 -0700
Subject: SL-9632 Add note that shiny HUD objects will be fullbright

---
 .../shaders/class1/deferred/fullbrightShinyF.glsl             | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
index 2d40e63eff..6b36d00f97 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
@@ -83,10 +83,21 @@ void main()
 
 	//color.rgb = srgb_to_linear(color.rgb);
 		color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+
 		color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
 		color.rgb = fullbrightScaleSoftClip(color.rgb);
 	}
 
+/*
+	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
+	else
+	{
+		vec3  envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+		float env_intensity = vertex_color.a;
+		color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+	}
+*/
+
 	color.a = 1.0;
 
 	//color.rgb = linear_to_srgb(color.rgb);
-- 
cgit v1.2.3


From a2ea1aac043dcaa8a302de88a157662df4c47cb0 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 17:33:19 -0700
Subject: SL-9632 Add note about shiny HUD objects that will be fullbright for
 both ALM ON and OFF

---
 .../shaders/class1/lighting/lightFullbrightShinyF.glsl           | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index 3eaaa41866..6f7e777d23 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -56,9 +56,16 @@ void fullbright_shiny_lighting()
 		color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
 
 		color.rgb = fullbrightShinyAtmosTransport(color.rgb);
-
 		color.rgb = fullbrightScaleSoftClip(color.rgb);
 	}
+/*
+	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
+	else
+	{
+		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+		color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
+	}
+*/
 
 	color.a = 1.0;
 
-- 
cgit v1.2.3


From 9aaa03a0d2bb2bfd0290744451c898d3705239d3 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 18:17:50 -0700
Subject: SL-9632 Fix Haze effecting HUD objects

---
 .../shaders/class1/lighting/lightAlphaMaskF.glsl            | 12 +++++++++---
 .../shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl  | 13 ++++++++++---
 .../shaders/class1/lighting/lightFullbrightF.glsl           | 12 +++++++++---
 3 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
index ab8b617746..0bb48061e0 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -31,6 +31,9 @@ out vec4 frag_color;
 
 uniform float minimum_alpha;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO;
+uniform int no_atmo;
+
 vec3 atmosLighting(vec3 light);
 vec3 scaleSoftClip(vec3 light);
 
@@ -48,9 +51,12 @@ void default_lighting()
 	
 	color *= vertex_color;
 
-	color.rgb = atmosLighting(color.rgb);
-
-	color.rgb = scaleSoftClip(color.rgb);
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+		color.rgb = atmosLighting(color.rgb);
+		color.rgb = scaleSoftClip(color.rgb);
+	}
 
 	frag_color = color;
 }
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
index 46390e4a0e..0fde2049d5 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
@@ -32,6 +32,9 @@ out vec4 frag_color;
 uniform float minimum_alpha;
 uniform float texture_gamma;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
+uniform int no_atmo;
+
 vec3 fullbrightAtmosTransport(vec3 light);
 vec3 fullbrightScaleSoftClip(vec3 light);
 
@@ -50,9 +53,13 @@ void fullbright_lighting()
 	color.rgb *= vertex_color.rgb;
 
 	color.rgb = pow(color.rgb, vec3(texture_gamma));
-	color.rgb = fullbrightAtmosTransport(color.rgb);
-	
-	color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+		color.rgb = fullbrightAtmosTransport(color.rgb);
+		color.rgb = fullbrightScaleSoftClip(color.rgb);
+	}
 
 	frag_color = color;
 }
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
index b967709c57..5fcdf3107c 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -34,6 +34,9 @@ VARYING vec2 vary_texcoord0;
 
 uniform float texture_gamma;
 
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO;
+uniform int no_atmo;
+
 vec3 fullbrightAtmosTransport(vec3 light);
 vec3 fullbrightScaleSoftClip(vec3 light);
 
@@ -43,9 +46,12 @@ void fullbright_lighting()
 	
 	color.rgb = pow(color.rgb, vec3(texture_gamma));
 
-	color.rgb = fullbrightAtmosTransport(color.rgb);
-	
-	color.rgb = fullbrightScaleSoftClip(color.rgb);
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+		color.rgb = fullbrightAtmosTransport(color.rgb);
+		color.rgb = fullbrightScaleSoftClip(color.rgb);
+	}
 
 	color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
 
-- 
cgit v1.2.3


From ba1d4e508c011c14b5150a56aa14d2f3dd924ebd Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Mon, 29 Jun 2020 18:18:58 -0700
Subject: SL-9632 Cleanup: Add note about potential missing inverse pow()
 texture_gamma

---
 .../shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl          | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
index 0fde2049d5..1855cfceeb 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
@@ -30,7 +30,7 @@ out vec4 frag_color;
 #endif
 
 uniform float minimum_alpha;
-uniform float texture_gamma;
+uniform float texture_gamma; // either 1.0 or 2.2; see: "::TEXTURE_GAMMA"
 
 // render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
 uniform int no_atmo;
@@ -61,6 +61,10 @@ void fullbright_lighting()
 		color.rgb = fullbrightScaleSoftClip(color.rgb);
 	}
 
+	//*TODO: Are we missing an inverse pow() here?
+	// class1\lighting\lightFullbrightF.glsl has:
+    //     color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
+
 	frag_color = color;
 }
 
-- 
cgit v1.2.3


From 45e956d0fb7adc7f26e1ff6b949eda86f3641bf0 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 20 May 2020 15:37:21 -0700
Subject: SL-9756: Take the "session_id" from the offline message that was
 passed.

---
 indra/newview/llimprocessing.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 6da7bbe263..b534fc0b4a 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1608,7 +1608,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             message_data["to_agent_id"].asUUID(),
             IM_OFFLINE,
             (EInstantMessage)message_data["dialog"].asInteger(),
-            LLUUID::null, // session id, since there is none we can only use frienship/group invite caps
+            message_data["session_id"].asUUID(),
             message_data["timestamp"].asInteger(),
             message_data["from_agent_name"].asString(),
             message_data["message"].asString(),
-- 
cgit v1.2.3


From ef2e575c0acf11346669b41cc688f07777cc2657 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Mon, 8 Jun 2020 11:28:05 -0700
Subject: SL-11430, SL-9756: Take transaction-id from offline messages. 
 Correct LLSD names. Use offline flag rather than implicit tests of session_id
 and aux_id.

---
 indra/newview/llimprocessing.cpp | 61 +++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index b534fc0b4a..60f1de4e8c 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -857,7 +857,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else // IM_TASK_INVENTORY_OFFERED
             {
-                if (offline == IM_OFFLINE && session_id.isNull() && aux_id.notNull() && binary_bucket_size > sizeof(S8)* 5)
+                if (offline)
                 {
                     // cap received offline message
                     std::string str_bucket = ll_safe_string((char*)binary_bucket, binary_bucket_size);
@@ -889,9 +889,10 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             info->mIM = dialog;
             info->mFromID = from_id;
             info->mFromGroup = from_group;
-            info->mTransactionID = session_id;
             info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
 
+            info->mTransactionID = session_id.notNull() ? session_id : aux_id;
+
             info->mFromName = name;
             info->mDesc = message;
             info->mHost = sender;
@@ -1569,7 +1570,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
         return;
     }
 
-    if (gAgent.getRegion() == NULL)
+    if (!gAgent.getRegion())
     {
         LL_WARNS("Messaging") << "Region null while attempting to load messages." << LL_ENDL;
         return;
@@ -1577,8 +1578,8 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
 
     LL_INFOS("Messaging") << "Processing offline messages." << LL_ENDL;
 
-    std::vector<U8> data;
-    S32 binary_bucket_size = 0;
+//     std::vector<U8> data;
+//     S32 binary_bucket_size = 0;
     LLHost sender = gAgent.getRegionHost();
 
     LLSD::array_iterator i = messages.beginArray();
@@ -1587,38 +1588,46 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
     {
         const LLSD &message_data(*i);
 
-        LLVector3 position(message_data["local_x"].asReal(), message_data["local_y"].asReal(), message_data["local_z"].asReal());
-        data = message_data["binary_bucket"].asBinary();
-        binary_bucket_size = data.size(); // message_data["count"] always 0
-        U32 parent_estate_id = message_data.has("parent_estate_id") ? message_data["parent_estate_id"].asInteger() : 1; // 1 - IMMainland
+        /* RIDER: Many fields in this message are using a '_' rather than the standard '-'.  This 
+         * should be changed but would require tight coordination with the simulator. 
+         */
+        LLVector3 position;
+        if (message_data.has("position"))
+        {
+            position.setValue(message_data["position"]);
+        }
+        else
+        {
+            position.set(message_data["local_x"].asReal(), message_data["local_y"].asReal(), message_data["local_z"].asReal());
+        }
 
-        // Todo: once dirtsim-369 releases, remove one of the int/str options
-        BOOL from_group;
-        if (message_data["from_group"].isInteger())
+        std::vector<U8> bin_bucket;
+        if (message_data.has("binary_bucket"))
         {
-            from_group = message_data["from_group"].asInteger();
+            bin_bucket = message_data["binary_bucket"].asBinary();
         }
         else
         {
-            from_group = message_data["from_group"].asString() == "Y";
+            bin_bucket.push_back(0);
         }
 
-        LLIMProcessing::processNewMessage(message_data["from_agent_id"].asUUID(),
-            from_group,
+        LLIMProcessing::processNewMessage(
+            message_data["from_id"].asUUID(),
+            message_data["from_group"].asBoolean(),
             message_data["to_agent_id"].asUUID(),
-            IM_OFFLINE,
-            (EInstantMessage)message_data["dialog"].asInteger(),
-            message_data["session_id"].asUUID(),
-            message_data["timestamp"].asInteger(),
-            message_data["from_agent_name"].asString(),
-            message_data["message"].asString(),
-            parent_estate_id,
+            static_cast<U8>(message_data["offline"].asInteger()),
+            static_cast<EInstantMessage>(message_data["dialog"].asInteger()),
+            message_data["transaction-id"].asUUID(),
+            static_cast<U32>(message_data["timestamp"].asInteger()),
+            message_data["from_name"].asString(),
+            (message_data.has("message")) ? message_data["message"].asString() : std::string(),
+            static_cast<U32>((message_data.has("parent_estate_id")) ? message_data["parent_estate_id"].asInteger() : 1), // 1 - IMMainland
             message_data["region_id"].asUUID(),
             position,
-            &data[0],
-            binary_bucket_size,
+            bin_bucket.data(),
+            bin_bucket.size(),
             sender,
-            message_data["asset_id"].asUUID()); // not necessarily an asset
+            message_data["asset_id"].asUUID());
     }
 }
 
-- 
cgit v1.2.3


From 34be4fab98e799ebcc34db4174022f290a82e389 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Thu, 18 Jun 2020 12:56:00 -0700
Subject: SL-9756: Get session_id/transaction id from aux if session is
 missing.

---
 indra/newview/llimprocessing.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 60f1de4e8c..c274267b21 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1628,6 +1628,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             bin_bucket.size(),
             sender,
             message_data["asset_id"].asUUID());
+
     }
 }
 
-- 
cgit v1.2.3


From c118c7863d1dc5159d81bdf40cbd44d6e99be445 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Mon, 22 Jun 2020 10:55:05 -0700
Subject: SL-9756: IM_TASK_INVENTORY_OFFERED bucket offline format conforms to
 the online format.

---
 indra/newview/llimprocessing.cpp | 32 +++++++-------------------------
 1 file changed, 7 insertions(+), 25 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index c274267b21..a2900c553c 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -857,33 +857,15 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else // IM_TASK_INVENTORY_OFFERED
             {
-                if (offline)
+                if (sizeof(S8) != binary_bucket_size)
                 {
-                    // cap received offline message
-                    std::string str_bucket = ll_safe_string((char*)binary_bucket, binary_bucket_size);
-                    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
-                    boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
-                    tokenizer tokens(str_bucket, sep);
-                    tokenizer::iterator iter = tokens.begin();
-
-                    info->mType = (LLAssetType::EType)(atoi((*(iter++)).c_str()));
-                    // Note There is more elements in 'tokens' ...
-
-                    info->mObjectID = LLUUID::null;
-                    info->mFromObject = TRUE;
-                }
-                else
-                {
-                    if (sizeof(S8) != binary_bucket_size)
-                    {
-                        LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
-                        delete info;
-                        break;
-                    }
-                    info->mType = (LLAssetType::EType) binary_bucket[0];
-                    info->mObjectID = LLUUID::null;
-                    info->mFromObject = TRUE;
+                    LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
+                    delete info;
+                    break;
                 }
+                info->mType = (LLAssetType::EType) binary_bucket[0];
+                info->mObjectID = LLUUID::null;
+                info->mFromObject = TRUE;
             }
 
             info->mIM = dialog;
-- 
cgit v1.2.3


From 374652a2d93ad96094c395877d453fc8d6ba8662 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Mon, 22 Jun 2020 16:08:11 -0700
Subject: SL-9756: Get the LLSD names right.

---
 indra/newview/llimprocessing.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index a2900c553c..fc209c2eae 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1594,7 +1594,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
         }
 
         LLIMProcessing::processNewMessage(
-            message_data["from_id"].asUUID(),
+            message_data["from_agent_id"].asUUID(),
             message_data["from_group"].asBoolean(),
             message_data["to_agent_id"].asUUID(),
             static_cast<U8>(message_data["offline"].asInteger()),
-- 
cgit v1.2.3


From b5739323e1a37b3a59eb738b8620c2e2c02a4c55 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Wed, 1 Jul 2020 13:27:19 -0700
Subject: SL-12978: Fix off-axis water dimming

---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index dcb02bd1c1..5bb2d18890 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -81,13 +81,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     haze_weight = vec4(haze_density) / temp1;
 
     //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
-    temp2.y = max(0.0, tmpLightnorm.y);
-    if (abs(temp2.y) > 0.000001f)
-    {
-        temp2.y = 1. / abs(temp2.y);
-    }
-    temp2.y = max(0.0000001f, temp2.y);
-    sunlight *= exp(-light_atten * temp2.y);
+    // SL-12978: temp2.y = 1; optimized away
+    sunlight *= exp(-light_atten);
 
     // main atmospheric scattering line integral
     temp2.z = Plen * dens_mul;
-- 
cgit v1.2.3


From 152db2280b797117edcc0d79e0d8bec9a8dc92af Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Wed, 1 Jul 2020 13:28:11 -0700
Subject: SL-12978: Cleanup

---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl  | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 5bb2d18890..ac0d5f08ee 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -47,13 +47,13 @@ float getAmbientClamp()
 }
 
 
-void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) {
-
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao)
+{
     vec3 P = inPositionEye;
    
     //(TERRAIN) limit altitude
-    if (P.y > max_y) P *= (max_y / P.y);
-    if (P.y < -max_y) P *= (-max_y / P.y); 
+    if (P.y >  max_y) P *= ( max_y / P.y);
+    if (P.y < -max_y) P *= (-max_y / P.y);
 
     vec3 tmpLightnorm = lightnorm.xyz;
 
-- 
cgit v1.2.3


From 9f0225abaa3011de0845a330fb6d7ef60ab20039 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Wed, 1 Jul 2020 13:29:35 -0700
Subject: SL-12978 Add note about similar code in C++ and GLSL

---
 indra/llinventory/llsettingssky.cpp                            |  3 +++
 .../shaders/class1/windlight/atmosphericsFuncs.glsl            | 10 ++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 306c732920..81937dbda5 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -1295,6 +1295,9 @@ void LLSettingsSky::clampColor(LLColor3& color, F32 gamma, F32 scale) const
     color = linear;
 }
 
+// Similar/Shared Algorithms:
+//     indra\llinventory\llsettingssky.cpp                                        -- LLSettingsSky::calculateLightSettings()
+//     indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars()
 void LLSettingsSky::calculateLightSettings() const
 {
     // Initialize temp variables
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index ac0d5f08ee..4d12c5d19a 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -136,11 +136,13 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
         tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
     }
 
+    // Similar/Shared Algorithms:
+    //     indra\llinventory\llsettingssky.cpp                                        -- LLSettingsSky::calculateLightSettings()
+    //     indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars()
     //haze color
-        additive =
-        vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)
-      + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x
-          + tmpAmbient));
+        vec3 cs  = sunlight.rgb * (1.-cloud_shadow);
+        additive = (blue_horizon.rgb * blue_weight.rgb) * (cs           + tmpAmbient.rgb)
+                 + (haze_horizon     * haze_weight.rgb) * (cs * temp2.x + tmpAmbient.rgb);
 
     //brightness of surface both sunlight and ambient
     sunlit = sunlight.rgb * 0.5;
-- 
cgit v1.2.3


From 127f2b3994e91b1dd37a560e7d0328c4cfa7ec1c Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 1 Jul 2020 16:52:44 -0700
Subject: SL-13533: Use the old name for from_agent_name SL-13540: Do not fail
 if binary bucket is too large, attempt to extract the asset type from the old
 style bucket. Notification still not shown.

---
 indra/newview/llimprocessing.cpp | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index fc209c2eae..301b4c9214 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -857,13 +857,28 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else // IM_TASK_INVENTORY_OFFERED
             {
-                if (sizeof(S8) != binary_bucket_size)
+                if (sizeof(S8) == binary_bucket_size)
                 {
-                    LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
-                    delete info;
-                    break;
+                    info->mType = (LLAssetType::EType) binary_bucket[0];
+                }
+                else
+                {
+                    /*RIDER*/ // The previous version of the protocol returned the wrong binary bucket... we 
+                    // still might be able to figure out the type... even though the offer is not retrievable. 
+                    std::string str_bucket(reinterpret_cast<char *>(binary_bucket));
+                    std::string str_type(str_bucket.substr(0, str_bucket.find('|')));
+
+                    std::stringstream type_convert(str_type);
+
+                    S32 type;
+                    type_convert >> type;
+
+                    // We could try AT_UNKNOWN which would be more accurate, but that causes an auto decline
+                    info->mType = static_cast<LLAssetType::EType>(type);
+                    // Don't break in the case of a bad binary bucket.  Go ahead and show the 
+                    // accept/decline popup even though it will not do anything.
+                    LL_WARNS("Messaging") << "Malformed inventory offer from object, type might be " << info->mType << LL_ENDL;
                 }
-                info->mType = (LLAssetType::EType) binary_bucket[0];
                 info->mObjectID = LLUUID::null;
                 info->mFromObject = TRUE;
             }
@@ -1601,8 +1616,8 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             static_cast<EInstantMessage>(message_data["dialog"].asInteger()),
             message_data["transaction-id"].asUUID(),
             static_cast<U32>(message_data["timestamp"].asInteger()),
-            message_data["from_name"].asString(),
-            (message_data.has("message")) ? message_data["message"].asString() : std::string(),
+            message_data["from_agent_name"].asString(),
+            message_data["message"].asString(),
             static_cast<U32>((message_data.has("parent_estate_id")) ? message_data["parent_estate_id"].asInteger() : 1), // 1 - IMMainland
             message_data["region_id"].asUUID(),
             position,
-- 
cgit v1.2.3


From 6f388f2276c4138f34b49ab630b0288c79ca4cec Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 2 Jul 2020 13:03:57 +0300
Subject: SL-13540 Offline scripted inventory offers not shown on non
 drtsim-451

---
 indra/newview/llimprocessing.cpp | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 301b4c9214..5c9d53e0b9 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -865,6 +865,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
                 {
                     /*RIDER*/ // The previous version of the protocol returned the wrong binary bucket... we 
                     // still might be able to figure out the type... even though the offer is not retrievable. 
+
+                    // Should be safe to remove once DRTSIM-451 fully deploys
                     std::string str_bucket(reinterpret_cast<char *>(binary_bucket));
                     std::string str_type(str_bucket.substr(0, str_bucket.find('|')));
 
@@ -1575,8 +1577,6 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
 
     LL_INFOS("Messaging") << "Processing offline messages." << LL_ENDL;
 
-//     std::vector<U8> data;
-//     S32 binary_bucket_size = 0;
     LLHost sender = gAgent.getRegionHost();
 
     LLSD::array_iterator i = messages.beginArray();
@@ -1608,11 +1608,22 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             bin_bucket.push_back(0);
         }
 
+        // Todo: once drtsim-451 releases, remove the string option
+        BOOL from_group;
+        if (message_data["from_group"].isInteger())
+        {
+            from_group = message_data["from_group"].asInteger();
+        }
+        else
+        {
+            from_group = message_data["from_group"].asString() == "Y";
+        }
+
         LLIMProcessing::processNewMessage(
             message_data["from_agent_id"].asUUID(),
-            message_data["from_group"].asBoolean(),
+            from_group,
             message_data["to_agent_id"].asUUID(),
-            static_cast<U8>(message_data["offline"].asInteger()),
+            message_data.has("offline") ? static_cast<U8>(message_data["offline"].asInteger()) : IM_OFFLINE,
             static_cast<EInstantMessage>(message_data["dialog"].asInteger()),
             message_data["transaction-id"].asUUID(),
             static_cast<U32>(message_data["timestamp"].asInteger()),
-- 
cgit v1.2.3


From 3c564f5afcd59bbbce135a6fc531361196bae2f6 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Thu, 2 Jul 2020 21:20:13 +0300
Subject: SL-11625 Fix for skewed baked texture offset values

---
 doc/contributions.txt               |  2 ++
 indra/newview/llviewerjointmesh.cpp | 16 +---------------
 indra/newview/llviewertexlayer.cpp  |  2 +-
 3 files changed, 4 insertions(+), 16 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 7c1986530d..785e849886 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1303,6 +1303,7 @@ Shyotl Kuhr
 	MAINT-2334
 	MAINT-6913
 	STORM-2143
+	SL-11625
 Siana Gearz
 	STORM-960
 	STORM-1088
@@ -1342,6 +1343,7 @@ Sovereign Engineer
     MAINT-7343
     SL-11079
     OPEN-343
+	SL-11625
 SpacedOut Frye
 	VWR-34
 	VWR-45
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 6990f56a08..fdfd22c117 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -253,7 +253,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
 	//----------------------------------------------------------------
 	llassert( !(mTexture.notNull() && mLayerSet) );  // mutually exclusive
 
-	LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
 	LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mLayerSet);
 	if (mTestImageName)
 	{
@@ -280,22 +279,15 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
 			gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
 		}
 	}
-	else
-	if ( !is_dummy && mTexture.notNull() )
+	else if ( !is_dummy && mTexture.notNull() )
 	{
-		if(mTexture->hasGLTexture())
-		{
-			old_mode = mTexture->getAddressMode();
-		}
 		gGL.getTexUnit(diffuse_channel)->bind(mTexture);
-		gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
 	}
 	else
 	{
 		gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
 	}
 	
-	
 	U32 mask = sRenderMask;
 
 	U32 start = mMesh->mFaceVertexOffset;
@@ -341,12 +333,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
 		gGL.getTexUnit(diffuse_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
 	}
 
-	if (mTexture.notNull() && !is_dummy)
-	{
-		gGL.getTexUnit(diffuse_channel)->bind(mTexture);
-		gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode);
-	}
-
 	return triangle_count;
 }
 
diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp
index 7f7d190b92..c501dd0035 100644
--- a/indra/newview/llviewertexlayer.cpp
+++ b/indra/newview/llviewertexlayer.cpp
@@ -54,7 +54,7 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
 										 S32 width, S32 height) :
 	// ORDER_LAST => must render these after the hints are created.
 	LLTexLayerSetBuffer(owner),
-	LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), 
+    LLViewerDynamicTexture(width, height, 4, LLViewerDynamicTexture::ORDER_LAST, FALSE),
 	mNeedsUpdate(TRUE),
 	mNumLowresUpdates(0)
 {
-- 
cgit v1.2.3


From 57147a198e2899be136750f874729aaf817db298 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 2 Jul 2020 14:47:54 -0700
Subject: SL-13539 Fix a white artifact over the water at certain angles

---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl       | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 4d12c5d19a..b7741ff48d 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -100,7 +100,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     temp2.x = dot(Pn, tmpLightnorm.xyz);
 
     // dampen sun additive contrib when not facing it...
-    if (length(light_dir) > 0.01)
+	// SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees.
+    //    if (length(light_dir) > 0.01)
     {
         temp2.x *= max(0.0f, dot(light_dir, Pn));
     }
-- 
cgit v1.2.3


From 97a33b8322ee5c38b13424f8ae3c840f4ffec76f Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 3 Jul 2020 20:40:41 +0300
Subject: SL-13540 Fix line endings

---
 indra/newview/llimprocessing.cpp | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 5c9d53e0b9..79cf49ddb1 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1608,15 +1608,15 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             bin_bucket.push_back(0);
         }
 
-        // Todo: once drtsim-451 releases, remove the string option
-        BOOL from_group;
-        if (message_data["from_group"].isInteger())
-        {
-            from_group = message_data["from_group"].asInteger();
-        }
-        else
-        {
-            from_group = message_data["from_group"].asString() == "Y";
+        // Todo: once drtsim-451 releases, remove the string option
+        BOOL from_group;
+        if (message_data["from_group"].isInteger())
+        {
+            from_group = message_data["from_group"].asInteger();
+        }
+        else
+        {
+            from_group = message_data["from_group"].asString() == "Y";
         }
 
         LLIMProcessing::processNewMessage(
-- 
cgit v1.2.3


From 85cbf2ee3b78d49a4ee8798e65c586566c7922ec Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 9 Jul 2020 15:33:24 +0300
Subject: SL-12478 long names are not beautiful in Name Tags

According to revised behavior names should always fit into single line
---
 indra/newview/llhudnametag.cpp | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 0701b07856..4ed802138d 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -439,17 +439,19 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
             U32 line_length = 0;
             if (use_ellipses)
             {
-                // "QualityAssuranceAssuresQuality 1" will end up like "QualityAssuranceAssuresQual..."
-                // "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality 1"
+                // "QualityAssuranceAssuresQuality1" will end up like "QualityAssuranceAssuresQual..."
+                // "QualityAssuranceAssuresQuality QualityAssuranceAssuresQuality" will end up like "QualityAssuranceAssuresQual..."
+                // "QualityAssurance AssuresQuality1" will end up as "QualityAssurance AssuresQua..." because we are enforcing single line
                 do
                 {
-                    S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ONLY_WORD_BOUNDARIES);
-                    if (segment_length == 0)
+                    S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ANYWHERE);
+                    if (segment_length + line_length < wline.length()) // since we only draw one string, line_length should be 0
                     {
-                        // First word in segment (not nessesary first line) does not fit, need to draw "...".
+                        // token does does not fit into signle line, need to draw "...".
                         // Use four dots for ellipsis width to generate padding
                         const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
                         S32 elipses_width = font->getWidthF32(dots_pad.c_str());
+                        // truncated string length
                         segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE);
                         const LLWString dots(utf8str_to_wstring(std::string("...")));
                         LLHUDTextSegment segment(iter->substr(line_length, segment_length) + dots, style, color, font);
@@ -458,6 +460,7 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
                     }
                     else
                     {
+                        // token fits fully into string
                         LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
                         mTextSegments.push_back(segment);
                         line_length += segment_length;
-- 
cgit v1.2.3


From b495608a8352cfb949d44607ef4967f2516da40a Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Thu, 9 Jul 2020 18:07:57 +0300
Subject: SL-12554 FIXED The value of the 'Avatar Maximum Complexity' is not
 synchronized after closing Advanced settings via Close btn

---
 indra/newview/llfloaterpreference.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 712b41848c..96094dcf14 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2938,6 +2938,7 @@ void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting)
 	{
 		instance->cancel();
 	}
+	updateMaxComplexity();
 }
 
 LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
-- 
cgit v1.2.3


From 3630beed07e5ad61a8afc199ae2541cbb3f2b69b Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 16 Jun 2020 18:09:35 +0300
Subject: Additional logging for SL-13397

---
 indra/newview/llgroupmgr.cpp      | 14 ++++++++++++++
 indra/newview/llviewermessage.cpp |  4 ++++
 2 files changed, 18 insertions(+)

diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index dbf7639539..3ef7b749a6 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -944,9 +944,13 @@ static void formatDateString(std::string &date_string)
 	}
 }
 
+static LLTrace::BlockTimerStatHandle FTM_PROCESS_GROUP_MEMBERS_REPLY("Process Group Members");
+
 // static
 void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 {
+    LL_RECORD_BLOCK_TIME(FTM_PROCESS_GROUP_MEMBERS_REPLY);
+
 	LL_DEBUGS() << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
@@ -1050,9 +1054,13 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 	LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
 }
 
+static LLTrace::BlockTimerStatHandle FTM_PROCESS_GROUP_PROPERTIES_REPLY("Process Group Properties");
+
 //static 
 void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
 {
+    LL_RECORD_BLOCK_TIME(FTM_PROCESS_GROUP_PROPERTIES_REPLY);
+
 	LL_DEBUGS() << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
 	if (!msg)
 	{
@@ -1122,9 +1130,12 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
 	LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
 }
 
+static LLTrace::BlockTimerStatHandle FTM_PROCESS_GROUP_ROLE_DATA_REPLY("Process Group Role Data");
 // static
 void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
 {
+    LL_RECORD_BLOCK_TIME(FTM_PROCESS_GROUP_ROLE_DATA_REPLY);
+
 	LL_DEBUGS() << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
@@ -1207,9 +1218,12 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
 	LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_DATA);
 }
 
+static LLTrace::BlockTimerStatHandle FTM_PROCESS_GROUP_ROLE_MEMBERS_REPLY("Process Group Role Members");
 // static
 void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
 {
+    LL_RECORD_BLOCK_TIME(FTM_PROCESS_GROUP_ROLE_MEMBERS_REPLY);
+
 	LL_DEBUGS() << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index e077626461..e1c44d6be8 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2220,8 +2220,12 @@ protected:
 	}
 };
 
+static LLTrace::BlockTimerStatHandle FTM_PROCESS_IMPROVED_IM("Process IM");
+
 void process_improved_im(LLMessageSystem *msg, void **user_data)
 {
+    LL_RECORD_BLOCK_TIME(FTM_PROCESS_IMPROVED_IM);
+
     LLUUID from_id;
     BOOL from_group;
     LLUUID to_id;
-- 
cgit v1.2.3


From e1e25f9a0d8e8d6f7b89673183ca570854984685 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Fri, 26 Jun 2020 15:10:46 +0300
Subject: SL-13397 Reduce Viewer freeze when opening chat with a large group.

---
 indra/newview/llfloaterimcontainer.cpp  | 50 ++++++++++++++++++++++-----------
 indra/newview/llfloaterimcontainer.h    |  4 +++
 indra/newview/llfloaterimsessiontab.cpp |  7 +++--
 indra/newview/llfloaterimsessiontab.h   |  2 +-
 4 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 21420b122b..feb8cf4277 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -57,6 +57,9 @@
 #include "llviewerobjectlist.h"
 #include "boost/foreach.hpp"
 
+
+const S32 EVENTS_PER_IDLE_LOOP = 100;
+
 //
 // LLFloaterIMContainer
 //
@@ -66,7 +69,8 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param
 	mConversationsRoot(NULL),
 	mConversationsEventStream("ConversationsEvents"),
 	mInitialized(false),
-	mIsFirstLaunch(true)
+	mIsFirstLaunch(true),
+	mConversationEventQueue()
 {
     mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
 	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction,  this, _2));
@@ -424,7 +428,9 @@ void LLFloaterIMContainer::idle(void* user_data)
 {
 	LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data);
 
-    if (!self->getVisible() || self->isMinimized())
+	self->idleProcessEvents();
+
+	if (!self->getVisible() || self->isMinimized())
     {
         return;
     }
@@ -485,13 +491,28 @@ void LLFloaterIMContainer::idleUpdate()
     }
 }
 
+void LLFloaterIMContainer::idleProcessEvents()
+{
+	if (!mConversationEventQueue.empty())
+	{
+		S32 events_to_handle = llmin((S32)mConversationEventQueue.size(), EVENTS_PER_IDLE_LOOP);
+		for (S32 i = 0; i < events_to_handle; i++)
+		{
+			handleConversationModelEvent(mConversationEventQueue.back());
+			mConversationEventQueue.pop_back();
+		}
+	}
+}
+
 bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 {
-	// For debug only
-	//std::ostringstream llsd_value;
-	//llsd_value << LLSDOStreamer<LLSDNotationFormatter>(event) << std::endl;
-	//LL_INFOS() << "LLFloaterIMContainer::onConversationModelEvent, event = " << llsd_value.str() << LL_ENDL;
-	// end debug
+	mConversationEventQueue.push_front(event);
+	return true;
+}
+
+
+void LLFloaterIMContainer::handleConversationModelEvent(const LLSD& event)
+{
 	
 	// Note: In conversations, the model is not responsible for creating the view, which is a good thing. This means that
 	// the model could change substantially and the view could echo only a portion of this model (though currently the 
@@ -508,7 +529,7 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 	if (!session_view)
 	{
 		// We skip events that are not associated with a session
-		return false;
+		return;
 	}
 	LLConversationViewParticipant* participant_view = session_view->findParticipant(participant_id);
     LLFloaterIMSessionTab *conversation_floater = (session_id.isNull() ?
@@ -535,9 +556,9 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 	{
 		LLConversationItemSession* session_model = dynamic_cast<LLConversationItemSession*>(mConversationsItems[session_id]);
 		LLConversationItemParticipant* participant_model = (session_model ? session_model->findParticipant(participant_id) : NULL);
+		LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id);
 		if (!participant_view && session_model && participant_model)
-		{
-			LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id);
+		{	
 			if (session_id.isNull() || (im_sessionp && !im_sessionp->isP2PSessionType()))
 			{
 				participant_view = createConversationViewParticipant(participant_model);
@@ -548,7 +569,8 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 		// Add a participant view to the conversation floater 
 		if (conversation_floater && participant_model)
 		{
-			conversation_floater->addConversationViewParticipant(participant_model);
+			bool skip_updating = im_sessionp && im_sessionp->isGroupChat();
+			conversation_floater->addConversationViewParticipant(participant_model, !skip_updating);
 		}
 	}
 	else if (type == "update_participant")
@@ -571,12 +593,6 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 	
 	mConversationViewModel.requestSortAll();
 	mConversationsRoot->arrangeAll();
-	if (conversation_floater)
-	{
-		conversation_floater->refreshConversation();
-	}
-	
-	return false;
 }
 
 void LLFloaterIMContainer::draw()
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 78b3572111..530a8e66c8 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -181,6 +181,7 @@ private:
 	bool isParticipantListExpanded();
 
 	void idleUpdate(); // for convenience (self) from static idle
+	void idleProcessEvents();
 
 	LLButton* mExpandCollapseBtn;
 	LLButton* mStubCollapseBtn;
@@ -220,6 +221,7 @@ private:
 	LLConversationViewSession* createConversationItemWidget(LLConversationItem* item);
 	LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);
 	bool onConversationModelEvent(const LLSD& event);
+	void handleConversationModelEvent(const LLSD& event);
 
 	// Conversation list data
 	LLPanel* mConversationsListPanel;	// This is the main widget we add conversation widget to
@@ -229,6 +231,8 @@ private:
 	LLFolderView* mConversationsRoot;
 	LLEventStream mConversationsEventStream; 
 
+	std::deque<LLSD> mConversationEventQueue;
+
 	LLTimer mParticipantRefreshTimer;
 };
 
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 3aee08482b..6d326f6850 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -465,9 +465,10 @@ void LLFloaterIMSessionTab::appendMessage(const LLChat& chat, const LLSD &args)
 	}
 }
 
-
+static LLTrace::BlockTimerStatHandle FTM_BUILD_CONVERSATION_VIEW_PARTICIPANT("Build Conversation View");
 void LLFloaterIMSessionTab::buildConversationViewParticipant()
 {
+	LL_RECORD_BLOCK_TIME(FTM_BUILD_CONVERSATION_VIEW_PARTICIPANT);
 	// Clear the widget list since we are rebuilding afresh from the model
 	conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
 	while (widget_it != mConversationsWidgets.end())
@@ -496,14 +497,14 @@ void LLFloaterIMSessionTab::buildConversationViewParticipant()
 	}
 }
 
-void LLFloaterIMSessionTab::addConversationViewParticipant(LLConversationItem* participant_model)
+void LLFloaterIMSessionTab::addConversationViewParticipant(LLConversationItem* participant_model, bool update_view)
 {
 	// Check if the model already has an associated view
 	LLUUID uuid = participant_model->getUUID();
 	LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,uuid);
 	
 	// If not already present, create the participant view and attach it to the root, otherwise, just refresh it
-	if (widget)
+	if (widget && update_view)
 	{
 		updateConversationViewParticipant(uuid); // overkill?
 	}
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 1b4922fd73..5357a14ab9 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -84,7 +84,7 @@ public:
 	/*virtual*/ void setFocus(BOOL focus);
 	
 	// Handle the left hand participant list widgets
-	void addConversationViewParticipant(LLConversationItem* item);
+	void addConversationViewParticipant(LLConversationItem* item, bool update_view = true);
 	void removeConversationViewParticipant(const LLUUID& participant_id);
 	void updateConversationViewParticipant(const LLUUID& participant_id);
 	void refreshConversation();
-- 
cgit v1.2.3


From 4ba11db750b00f0af7ebbb456adc36e84925c2cc Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 26 Jun 2020 16:47:08 +0000
Subject: SL-13443 Reduced viewer stalls after teleport Eliminates stall from
 saveObjectCache() on region deletion

---
 indra/newview/llviewerregion.cpp | 26 ++++++++++++++++++++++++--
 indra/newview/llviewerregion.h   |  6 ++++++
 indra/newview/llworld.cpp        | 18 ++++++++++++++----
 3 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index d56408939e..896896d7b9 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -102,6 +102,7 @@ const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
 BOOL LLViewerRegion::sVOCacheCullingEnabled = FALSE;
 S32  LLViewerRegion::sLastCameraUpdated = 0;
 S32  LLViewerRegion::sNewObjectCreationThrottle = -1;
+LLViewerRegion::vocache_entry_map_t LLViewerRegion::sRegionCacheCleanup;
 
 typedef std::map<std::string, std::string> CapabilityMap;
 
@@ -635,6 +636,9 @@ void LLViewerRegion::initStats()
 	mAlive = false;					// can become false if circuit disconnects
 }
 
+static LLTrace::BlockTimerStatHandle FTM_CLEANUP_REGION_OBJECTS("Cleanup Region Objects");
+static LLTrace::BlockTimerStatHandle FTM_SAVE_REGION_CACHE("Save Region Cache");
+
 LLViewerRegion::~LLViewerRegion() 
 {
 	mDead = TRUE;
@@ -649,7 +653,10 @@ LLViewerRegion::~LLViewerRegion()
 	disconnectAllNeighbors();
 	LLViewerPartSim::getInstance()->cleanupRegion(this);
 
-	gObjectList.killObjects(this);
+    {
+        LL_RECORD_BLOCK_TIME(FTM_CLEANUP_REGION_OBJECTS);
+        gObjectList.killObjects(this);
+    }
 
 	delete mImpl->mCompositionp;
 	delete mParcelOverlay;
@@ -660,7 +667,10 @@ LLViewerRegion::~LLViewerRegion()
 #endif	
 	std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer());
 
-	saveObjectCache();
+    {
+        LL_RECORD_BLOCK_TIME(FTM_SAVE_REGION_CACHE);
+        saveObjectCache();
+    }
 
 	delete mImpl;
 	mImpl = NULL;
@@ -729,6 +739,8 @@ void LLViewerRegion::saveObjectCache()
 		mCacheDirty = FALSE;
 	}
 
+	// Map of LLVOCacheEntry takes time to release, store map for cleanup on idle
+	sRegionCacheCleanup.insert(mImpl->mCacheMap.begin(), mImpl->mCacheMap.end());
 	mImpl->mCacheMap.clear();
 }
 
@@ -1490,6 +1502,16 @@ void LLViewerRegion::idleUpdate(F32 max_update_time)
 	return;
 }
 
+// static
+void LLViewerRegion::idleCleanup(F32 max_update_time)
+{
+    LLTimer update_timer;
+    while (!sRegionCacheCleanup.empty() && (max_update_time - update_timer.getElapsedTimeF32() > 0))
+    {
+        sRegionCacheCleanup.erase(sRegionCacheCleanup.begin());
+    }
+}
+
 //update the throttling number for new object creation
 void LLViewerRegion::calcNewObjectCreationThrottle()
 {
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index f7c50e4de5..477aabb971 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -232,6 +232,9 @@ public:
 
 	F32	getWidth() const						{ return mWidth; }
 
+	// regions are expensive to release, this function gradually releases cache from memory
+	static void idleCleanup(F32 max_update_time);
+
 	void idleUpdate(F32 max_update_time);
 	void lightIdleUpdate();
 	bool addVisibleGroup(LLViewerOctreeGroup* group);
@@ -550,6 +553,9 @@ private:
 
 	LLSD mSimulatorFeatures;
 
+    typedef std::map<U32, LLPointer<LLVOCacheEntry> >	   vocache_entry_map_t;
+    static vocache_entry_map_t sRegionCacheCleanup;
+
 	// the materials capability throttle
 	LLFrameTimer mMaterialsCapThrottleTimer;
 	LLFrameTimer mRenderInfoRequestTimer;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 8989bae96a..c5dd274c33 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -730,11 +730,20 @@ void LLWorld::updateRegions(F32 max_update_time)
 		{
 			//perform some necessary but very light updates.
 			(*iter)->lightIdleUpdate();
-		}		
+		}
+	}
+
+	if(max_time > 0.f)
+	{
+		max_time = llmin((F32)(max_update_time - update_timer.getElapsedTimeF32()), max_update_time * 0.25f);
+	}
+	if(max_time > 0.f)
+	{
+		LLViewerRegion::idleCleanup(max_time);
 	}
 
 	sample(sNumActiveCachedObjects, mNumOfActiveCachedObjects);
-		}
+}
 
 void LLWorld::clearAllVisibleObjects()
 {
@@ -1208,11 +1217,12 @@ public:
 	}
 };
 
+static LLTrace::BlockTimerStatHandle FTM_DISABLE_REGION("Disable Region");
 // disable the circuit to this simulator
 // Called in response to "DisableSimulator" message.
 void process_disable_simulator(LLMessageSystem *mesgsys, void **user_data)
-{	
-	LLHost host = mesgsys->getSender();
+{
+    LL_RECORD_BLOCK_TIME(FTM_DISABLE_REGION);	LLHost host = mesgsys->getSender();
 
 	//LL_INFOS() << "Disabling simulator with message from " << host << LL_ENDL;
 	LLWorld::getInstance()->removeRegion(host);
-- 
cgit v1.2.3


From 8edcb5bf89de420ffd42a24cb1fb22c86e1c7571 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 30 Jun 2020 14:30:48 +0300
Subject: SL-13443 cleanup

---
 indra/newview/llworld.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index c5dd274c33..a1a1db35d6 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1222,7 +1222,9 @@ static LLTrace::BlockTimerStatHandle FTM_DISABLE_REGION("Disable Region");
 // Called in response to "DisableSimulator" message.
 void process_disable_simulator(LLMessageSystem *mesgsys, void **user_data)
 {
-    LL_RECORD_BLOCK_TIME(FTM_DISABLE_REGION);	LLHost host = mesgsys->getSender();
+    LL_RECORD_BLOCK_TIME(FTM_DISABLE_REGION);
+
+    LLHost host = mesgsys->getSender();
 
 	//LL_INFOS() << "Disabling simulator with message from " << host << LL_ENDL;
 	LLWorld::getInstance()->removeRegion(host);
-- 
cgit v1.2.3


From 0e3e720a8d3b7cec6103b1ceea2d9644c52a7436 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 9 Jul 2020 20:12:12 -0700
Subject: SL-12261 Remove redrawing of sky twice and timer causing it not to be
 re-drawn twice 2% of the time

---
 indra/newview/lldrawpoolsky.cpp | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 054e7f32b4..b6f55e800a 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -123,23 +123,12 @@ void LLDrawPoolSky::renderSkyFace(U8 index)
 		return;
 	}
 
-    F32 interp_val = gSky.mVOSkyp ? gSky.mVOSkyp->getInterpVal() : 0.0f;
-
     if (index < 6) // sky tex...interp
     {
         llassert(mSkyTex);
 	    mSkyTex[index].bindTexture(true); // bind the current tex
 
         face->renderIndexed();
-
-        if (interp_val > 0.01f) // iff, we've got enough info to lerp (a to and a from)
-	    {
-		    LLGLEnable blend(GL_BLEND);
-            llassert(mSkyTex);
-	        mSkyTex[index].bindTexture(false); // bind the "other" texture
-		    gGL.diffuseColor4f(1, 1, 1, interp_val); // lighting is disabled
-		    face->renderIndexed();
-	    }
     }
     else // heavenly body faces, no interp...
     {
-- 
cgit v1.2.3


From 55477e74c79228feb9a5a2d8b970bb9cce2e57a1 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 10 Jul 2020 21:07:54 +0300
Subject: Reverted SL-12494

Change was moved to DRTVWR-514
---
 indra/newview/skins/default/xui/en/menu_viewer.xml | 31 +++++-----------------
 1 file changed, 7 insertions(+), 24 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index c7ab26bc22..873b95926b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -56,8 +56,7 @@
       </menu_item_call>
       <menu_item_call
        label="Places..."
-       name="Places"
-       shortcut="control|L">
+       name="Places">
         <menu_item_call.on_click
          function="Floater.ToggleOrBringToFront"
          parameter="places" />
@@ -86,22 +85,11 @@
       <menu_item_separator/>
       <menu_item_call
        label="Camera Controls..."
-       name="Camera Controls"
-       shortcut="control|K">
+       name="Camera Controls">
         <menu_item_call.on_click
          function="Floater.ToggleOrBringToFront"
          parameter="camera" />
       </menu_item_call>
-      <menu_item_call
-       label="Hover Height"
-       name="HoverHeight"
-       shortcut="alt|control|H"
-       visible="false">
-        <menu_item_call.on_click
-         function="HoverHeight"/>
-        <menu_item_call.on_enable
-         function="Edit.EnableHoverHeight"/>
-      </menu_item_call>
       <menu
        create_jump_keys="true"
        label="Movement"
@@ -162,8 +150,7 @@
         </menu_item_check>
         <menu_item_call
          label="Stop Animating Me"
-         name="Stop Animating My Avatar"
-         shortcut="alt|shift|A">
+         name="Stop Animating My Avatar">
           <menu_item_call.on_click
            function="Tools.StopAllAnimations" />
         </menu_item_call>
@@ -471,8 +458,7 @@
         </menu_item_check>
         <menu_item_call
              label="Events"
-             name="Events"
-             shortcut="control|E">
+             name="Events">
             <menu_item_call.on_click
              function="Advanced.ShowURL"
              parameter="https://secondlife.com/my/community/events"/>
@@ -661,8 +647,7 @@
          tear_off="true">
             <menu_item_check
              label="Sunrise"
-             name="Sunrise"
-             shortcut="control|shift|O">
+             name="Sunrise">
                 <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="sunrise" />
@@ -694,8 +679,7 @@
             </menu_item_check>
             <menu_item_check
              label="Midnight"
-             name="Midnight"
-             shortcut="control|shift|Z">
+             name="Midnight">
                 <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="midnight" />
@@ -1333,8 +1317,7 @@ function="World.EnvPreset"
             <menu_item_call
            label="Model..."
            layout="topleft"
-           name="Upload Model"
-           shortcut="alt|control|U">
+           name="Upload Model">
             <menu_item_call.on_click
              function="File.UploadModel"
              parameter="" />
-- 
cgit v1.2.3


From f554fe2ca74ddf275e47cdce8537e04ab40f9f95 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 10 Jul 2020 23:44:55 +0300
Subject: SL-10326 Allow selecting any movable avatars with 'Allow Select
 Avatar' option

---
 indra/newview/llselectmgr.cpp       | 4 ++--
 indra/newview/llselectmgr.h         | 2 +-
 indra/newview/llviewerparcelmgr.cpp | 5 ++++-
 indra/newview/llviewerwindow.cpp    | 2 +-
 4 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 9fd5eb28c1..50884762a8 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -3931,11 +3931,11 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r
 	return TRUE;
 }
 
-BOOL LLSelectMgr::isSelfAvatarSelected()
+BOOL LLSelectMgr::isMovableAvatarSelected()
 {
 	if (mAllowSelectAvatar)
 	{
-		return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp);
+		return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject()->isAvatar()) && getSelection()->getFirstMoveableNode(TRUE);
 	}
 	return FALSE;
 }
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 75d11dd06b..57fdfce152 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -732,7 +732,7 @@ public:
 
 	LLPermissions* findObjectPermissions(const LLViewerObject* object);
 
-	BOOL isSelfAvatarSelected();
+	BOOL isMovableAvatarSelected();
 
 	void selectDelete();							// Delete on simulator
 	void selectForceDelete();			// just delete, no into trash
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index c966b7d4f9..d5365e4ee8 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1906,7 +1906,10 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                             || music_url.substr(0, 8) == "https://")
                         {
                             LLViewerRegion *region = LLWorld::getInstance()->getRegion(msg->getSender());
-                            optionally_start_music(music_url, parcel->mLocalID, region->getRegionID());
+                            if (region)
+                            {
+                                optionally_start_music(music_url, parcel->mLocalID, region->getRegionID());
+                            }
                         }
                         else
                         {
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1e72e2266b..e3b01bf60f 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -3925,7 +3925,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
 
 					BOOL draw_handles = TRUE;
 
-					if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isSelfAvatarSelected())
+					if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isMovableAvatarSelected())
 					{
 						draw_handles = FALSE;
 					}
-- 
cgit v1.2.3


From ff077375b2185d95117237c19f211ffacc5c9608 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Mon, 13 Jul 2020 20:28:05 +0300
Subject: SL-13597 Crash in
 LLFloaterIMSessionTab::addConversationViewParticipant

---
 indra/newview/llfloaterimsessiontab.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 6d326f6850..d604d0a789 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -499,6 +499,12 @@ void LLFloaterIMSessionTab::buildConversationViewParticipant()
 
 void LLFloaterIMSessionTab::addConversationViewParticipant(LLConversationItem* participant_model, bool update_view)
 {
+	if (!participant_model)
+	{
+		// Nothing to do if the model is inexistent
+		return;
+	}
+
 	// Check if the model already has an associated view
 	LLUUID uuid = participant_model->getUUID();
 	LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,uuid);
@@ -525,8 +531,8 @@ void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& part
 	{
 		mConversationsRoot->extractItem(widget);
 		delete widget;
-		mConversationsWidgets.erase(participant_id);
 	}
+	mConversationsWidgets.erase(participant_id);
 }
 
 void LLFloaterIMSessionTab::updateConversationViewParticipant(const LLUUID& participant_id)
-- 
cgit v1.2.3


From 1e801c7eeaf6b37b08a647c1b55cb7298e16fce1 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Thu, 21 May 2020 17:24:21 -0600
Subject: SL-13163 - Fix (revert) EEP specular contribution calculation for
 deferred

---
 .../shaders/class2/deferred/softenLightF.glsl      | 34 +++-------------------
 1 file changed, 4 insertions(+), 30 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index b0dff0c628..40f0f0448a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -127,42 +127,16 @@ void main()
 
         if (spec.a > 0.0) // specular reflection
         {
-
-#if 1 //EEP
-            vec3 npos = -normalize(pos.xyz);
-
-            //vec3 ref = dot(pos+lv, norm);
-            vec3 h = normalize(light_dir.xyz+npos);
-            float nh = dot(norm.xyz, h);
-            float nv = dot(norm.xyz, npos);
-            float vh = dot(npos, h);
-            float sa = nh;
-            float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-            float gtdenom = 2 * nh;
-            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-            
-            if (nh > 0.0)
-            {
-                float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-                vec3 sp = sun_contrib*scontrib / 6.0;
-                sp = clamp(sp, vec3(0), vec3(1));
-                bloom += dot(sp, sp) / 4.0;
-                color += sp * spec.rgb;
-            }
-#else //PRODUCTION
             float sa = dot(refnormpersp, light_dir.xyz);
-            vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r);
-            
+            vec3 dumbshiny = sunlit * (texture2D(lightFunc, vec2(sa, spec.a)).r);
+
             // add the two types of shiny together
             vec3 spec_contrib = dumbshiny * spec.rgb;
             bloom = dot(spec_contrib, spec_contrib) / 6;
             color.rgb += spec_contrib;
-#endif
-
         }
-       
-       color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
+
+        color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
 
         if (envIntensity > 0.0)
         { //add environmentmap
-- 
cgit v1.2.3


From 5fc1d36a2ea9f50412afc8744bc4e51d8107d0ba Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 17 Jun 2020 18:53:05 -0600
Subject: SL-13163 revert 2 more instances of 'new EEP' specular calculation

---
 .../shaders/class1/deferred/materialF.glsl         | 882 +++++++++++----------
 .../shaders/class1/deferred/softenLightF.glsl      |  34 +-
 2 files changed, 447 insertions(+), 469 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 0afd1a9672..80d19102b6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -1,439 +1,443 @@
-/**
-* @file materialF.glsl
-*
-* $LicenseInfo:firstyear=2007&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2007, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
-* $/LicenseInfo$
-*/
-
-/*[EXTRA_CODE_HERE]*/
-
-//class1/deferred/materialF.glsl
-
-// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
-
-#define DIFFUSE_ALPHA_MODE_NONE     0
-#define DIFFUSE_ALPHA_MODE_BLEND    1
-#define DIFFUSE_ALPHA_MODE_MASK     2
-#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
-
-uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise
-uniform int sun_up_factor;
-
-#ifdef WATER_FOG
-vec4 applyWaterFogView(vec3 pos, vec4 color);
-#endif
-
-vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
-vec3 scaleSoftClipFrag(vec3 l);
-
-vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
-
-vec3 srgb_to_linear(vec3 cs);
-vec3 linear_to_srgb(vec3 cs);
-
-#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-#ifdef HAS_SUN_SHADOW
-float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
-#endif
-
-uniform samplerCube environmentMap;
-uniform sampler2D     lightFunc;
-
-// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-uniform mat3 env_mat;
-
-uniform vec3 sun_dir;
-uniform vec3 moon_dir;
-VARYING vec2 vary_fragcoord;
-
-VARYING vec3 vary_position;
-
-uniform mat4 proj_mat;
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-uniform vec4 light_position[8];
-uniform vec3 light_direction[8];
-uniform vec4 light_attenuation[8];
-uniform vec3 light_diffuse[8];
-
-float getAmbientClamp();
-
-vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
-{
-    vec3 col = vec3(0);
-
-    //get light vector
-    vec3 lv = lp.xyz - v;
-
-    //get distance
-    float dist = length(lv);
-    float da = 1.0;
-
-    dist /= la;
-
-    if (dist > 0.0 && la > 0.0)
-    {
-        //normalize light vector
-        lv = normalize(lv);
-
-        //distance attenuation
-        float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
-        dist_atten *= dist_atten;
-        dist_atten *= 2.0f;
-
-        if (dist_atten <= 0.0)
-        {
-            return col;
-        }
-
-        // spotlight coefficient.
-        float spot = max(dot(-ln, lv), is_pointlight);
-        da *= spot*spot; // GL_SPOT_EXPONENT=2
-
-        //angular attenuation
-        da *= dot(n, lv);
-
-        float lit = 0.0f;
-
-        float amb_da = ambiance;
-        if (da >= 0)
-        {
-            lit = max(da * dist_atten, 0.0);
-            col = lit * light_col * diffuse;
-            amb_da += (da*0.5 + 0.5) * ambiance;
-        }
-        amb_da += (da*da*0.5 + 0.5) * ambiance;
-        amb_da *= dist_atten;
-        amb_da = min(amb_da, 1.0f - lit);
-
-        // SL-10969 need to see why these are blown out
-        //col.rgb += amb_da * light_col * diffuse;
-
-        if (spec.a > 0.0)
-        {
-            //vec3 ref = dot(pos+lv, norm);
-            vec3 h = normalize(lv + npos);
-            float nh = dot(n, h);
-            float nv = dot(n, npos);
-            float vh = dot(npos, h);
-            float sa = nh;
-            float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
-
-            float gtdenom = 2 * nh;
-            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-
-            if (nh > 0.0)
-            {
-                float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
-                vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
-                speccol = clamp(speccol, vec3(0), vec3(1));
-                col += speccol;
-
-                float cur_glare = max(speccol.r, speccol.g);
-                cur_glare = max(cur_glare, speccol.b);
-                glare = max(glare, speccol.r);
-                glare += max(cur_glare, 0.0);
-            }
-        }
-    }
-
-    return max(col, vec3(0.0, 0.0, 0.0));
-}
-
-#else
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-#endif
-
-uniform sampler2D diffuseMap;  //always in sRGB space
-
-#ifdef HAS_NORMAL_MAP
-uniform sampler2D bumpMap;
-#endif
-
-#ifdef HAS_SPECULAR_MAP
-uniform sampler2D specularMap;
-
-VARYING vec2 vary_texcoord2;
-#endif
-
-uniform float env_intensity;
-uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha
-
-#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
-uniform float minimum_alpha;
-#endif
-
-#ifdef HAS_NORMAL_MAP
-VARYING vec3 vary_mat0;
-VARYING vec3 vary_mat1;
-VARYING vec3 vary_mat2;
-VARYING vec2 vary_texcoord1;
-#else
-VARYING vec3 vary_normal;
-#endif
-
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-vec2 encode_normal(vec3 n);
-
-void main()
-{
-    vec2 pos_screen = vary_texcoord0.xy;
-
-    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
-	diffcol.rgb *= vertex_color.rgb;
-
-#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
-
-    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
-    float bias = 0.001953125; // 1/512, or half an 8-bit quantization
-    if (diffcol.a < minimum_alpha-bias)
-    {
-        discard;
-    }
-#endif
-
-#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
-	vec3 gamma_diff = diffcol.rgb;
-	diffcol.rgb = srgb_to_linear(diffcol.rgb);
-#endif
-
-#ifdef HAS_SPECULAR_MAP
-    vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
-    spec.rgb *= specular_color.rgb;
-#else
-    vec4 spec = vec4(specular_color.rgb, 1.0);
-#endif
-
-#ifdef HAS_NORMAL_MAP
-	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
-
-	norm.xyz = norm.xyz * 2 - 1;
-
-	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
-			  dot(norm.xyz,vary_mat1),
-			  dot(norm.xyz,vary_mat2));
-#else
-	vec4 norm = vec4(0,0,0,1.0);
-	vec3 tnorm = vary_normal;
-#endif
-
-    norm.xyz = normalize(tnorm.xyz);
-
-    vec2 abnormal = encode_normal(norm.xyz);
-
-    vec4 final_color = diffcol;
-
-#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
-	final_color.a = emissive_brightness;
-#else
-	final_color.a = max(final_color.a, emissive_brightness);
-#endif
-
-    vec4 final_specular = spec;
-    
-#ifdef HAS_SPECULAR_MAP
-    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
-	final_specular.a = specular_color.a * norm.a;
-#else
-	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
-	final_specular.a = specular_color.a;
-#endif
-
-#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
-
-    //forward rendering, output just lit sRGBA
-    vec3 pos = vary_position;
-
-    float shadow = 1.0f;
-
-#ifdef HAS_SUN_SHADOW
-    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
-#endif
-
-    spec = final_specular;
-    vec4 diffuse = final_color;
-    float envIntensity = final_normal.z;
-
-    vec3 color = vec3(0,0,0);
-
-    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
-
-    float bloom = 0.0;
-    vec3 sunlit;
-    vec3 amblit;
-    vec3 additive;
-    vec3 atten;
-
-    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
-    
-        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
-        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
-        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
-        //color = fullbrightScaleSoftClip(color);
-
-    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
-
-    //we're in sRGB space, so gamma correct this dot product so 
-    // lighting from the sun stays sharp
-    float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
-    da = pow(da, 1.0 / 1.3);
-
-    color = amblit;
-
-    //darken ambient for normals perpendicular to light vector so surfaces in shadow 
-    // and facing away from light still have some definition to them.
-    // do NOT gamma correct this dot product so ambient lighting stays soft
-    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
-    ambient *= 0.5;
-    ambient *= ambient;
-    ambient = (1.0 - ambient);
-
-    vec3 sun_contrib = min(da, shadow) * sunlit;
-    
-    color *= ambient;
-
-    color += sun_contrib;
-
-    color *= gamma_diff.rgb;
-
-    float glare = 0.0;
-
-    if (spec.a > 0.0) // specular reflection
-    {
-#if 1 //EEP
-
-        vec3 npos = -normalize(pos.xyz);
-
-        //vec3 ref = dot(pos+lv, norm);
-        vec3 h = normalize(light_dir.xyz + npos);
-        float nh = dot(norm.xyz, h);
-        float nv = dot(norm.xyz, npos);
-        float vh = dot(npos, h);
-        float sa = nh;
-        float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
-
-        float gtdenom = 2 * nh;
-        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-
-        if (nh > 0.0)
-        {
-            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
-            vec3 sp = sun_contrib*scol / 6.0f;
-            sp = clamp(sp, vec3(0), vec3(1));
-            bloom = dot(sp, sp) / 4.0;
-            color += sp * spec.rgb;
-        }
-#else // PRODUCTION
-        float sa = dot(refnormpersp, sun_dir.xyz);
-		vec3 dumbshiny = sunlit*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r);
-							
-		// add the two types of shiny together
-		vec3 spec_contrib = dumbshiny * spec.rgb;
-		bloom = dot(spec_contrib, spec_contrib) / 6;
-
-		glare = max(spec_contrib.r, spec_contrib.g);
-		glare = max(glare, spec_contrib.b);
-
-		color += spec_contrib;
-#endif
-    }
-
-    color = mix(color.rgb, diffcol.rgb, diffuse.a);
-    
-    if (envIntensity > 0.0)
-    {
-        //add environmentmap
-        vec3 env_vec = env_mat * refnormpersp;
-
-        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
-
-        color = mix(color, reflected_color, envIntensity);
-
-        float cur_glare = max(reflected_color.r, reflected_color.g);
-        cur_glare = max(cur_glare, reflected_color.b);
-        cur_glare *= envIntensity*4.0;
-        glare += cur_glare;
-    }
-
-    color = atmosFragLighting(color, additive, atten);
-    color = scaleSoftClipFrag(color);
-
-    //convert to linear before adding local lights
-    color = srgb_to_linear(color);
-
-    vec3 npos = normalize(-pos.xyz);
-
-    vec3 light = vec3(0, 0, 0);
-    
-#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
-
-    LIGHT_LOOP(1)
-        LIGHT_LOOP(2)
-        LIGHT_LOOP(3)
-        LIGHT_LOOP(4)
-        LIGHT_LOOP(5)
-        LIGHT_LOOP(6)
-        LIGHT_LOOP(7)
-
-    color += light;
-
-    glare = min(glare, 1.0);
-    float al = max(diffcol.a, glare)*vertex_color.a;
-
-    //convert to srgb as this color is being written post gamma correction
-    color = linear_to_srgb(color);
-
-#ifdef WATER_FOG
-    vec4 temp = applyWaterFogView(pos, vec4(color, al));
-    color = temp.rgb;
-    al = temp.a;
-#endif
-
-    frag_color = vec4(color, al);
-
-#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer 
-
-    // deferred path
-    frag_data[0] = final_color; //gbuffer is sRGB
-    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
-    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
-#endif
-}
-
+/**
+* @file materialF.glsl
+*
+* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2007, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+/*[EXTRA_CODE_HERE]*/
+
+//class1/deferred/materialF.glsl
+
+// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
+
+#define DIFFUSE_ALPHA_MODE_NONE     0
+#define DIFFUSE_ALPHA_MODE_BLEND    1
+#define DIFFUSE_ALPHA_MODE_MASK     2
+#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
+
+uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise
+uniform int sun_up_factor;
+
+#ifdef WATER_FOG
+vec4 applyWaterFogView(vec3 pos, vec4 color);
+#endif
+
+vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
+vec3 scaleSoftClipFrag(vec3 l);
+
+vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
+
+vec3 srgb_to_linear(vec3 cs);
+vec3 linear_to_srgb(vec3 cs);
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+#ifdef HAS_SUN_SHADOW
+float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
+#endif
+
+uniform samplerCube environmentMap;
+uniform sampler2D     lightFunc;
+
+// Inputs
+uniform vec4 morphFactor;
+uniform vec3 camPosLocal;
+uniform mat3 env_mat;
+
+uniform vec3 sun_dir;
+uniform vec3 moon_dir;
+VARYING vec2 vary_fragcoord;
+
+VARYING vec3 vary_position;
+
+uniform mat4 proj_mat;
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec4 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float getAmbientClamp();
+
+vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
+{
+    vec3 col = vec3(0);
+
+    //get light vector
+    vec3 lv = lp.xyz - v;
+
+    //get distance
+    float dist = length(lv);
+    float da = 1.0;
+
+    dist /= la;
+
+    if (dist > 0.0 && la > 0.0)
+    {
+        //normalize light vector
+        lv = normalize(lv);
+
+        //distance attenuation
+        float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
+        dist_atten *= dist_atten;
+        dist_atten *= 2.0f;
+
+        if (dist_atten <= 0.0)
+        {
+            return col;
+        }
+
+        // spotlight coefficient.
+        float spot = max(dot(-ln, lv), is_pointlight);
+        da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+        //angular attenuation
+        da *= dot(n, lv);
+
+        float lit = 0.0f;
+
+        float amb_da = ambiance;
+        if (da >= 0)
+        {
+            lit = max(da * dist_atten, 0.0);
+            col = lit * light_col * diffuse;
+            amb_da += (da*0.5 + 0.5) * ambiance;
+        }
+        amb_da += (da*da*0.5 + 0.5) * ambiance;
+        amb_da *= dist_atten;
+        amb_da = min(amb_da, 1.0f - lit);
+
+        // SL-10969 need to see why these are blown out
+        //col.rgb += amb_da * light_col * diffuse;
+
+        if (spec.a > 0.0)
+        {
+            //vec3 ref = dot(pos+lv, norm);
+            vec3 h = normalize(lv + npos);
+            float nh = dot(n, h);
+            float nv = dot(n, npos);
+            float vh = dot(npos, h);
+            float sa = nh;
+            float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
+
+            float gtdenom = 2 * nh;
+            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+
+            if (nh > 0.0)
+            {
+                float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
+                vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
+                speccol = clamp(speccol, vec3(0), vec3(1));
+                col += speccol;
+
+                float cur_glare = max(speccol.r, speccol.g);
+                cur_glare = max(cur_glare, speccol.b);
+                glare = max(glare, speccol.r);
+                glare += max(cur_glare, 0.0);
+            }
+        }
+    }
+
+    return max(col, vec3(0.0, 0.0, 0.0));
+}
+
+#else
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+#endif
+
+uniform sampler2D diffuseMap;  //always in sRGB space
+
+#ifdef HAS_NORMAL_MAP
+uniform sampler2D bumpMap;
+#endif
+
+#ifdef HAS_SPECULAR_MAP
+uniform sampler2D specularMap;
+
+VARYING vec2 vary_texcoord2;
+#endif
+
+uniform float env_intensity;
+uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
+uniform float minimum_alpha;
+#endif
+
+#ifdef HAS_NORMAL_MAP
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec2 vary_texcoord1;
+#else
+VARYING vec3 vary_normal;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec2 encode_normal(vec3 n);
+
+void main()
+{
+    vec2 pos_screen = vary_texcoord0.xy;
+
+    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
+	diffcol.rgb *= vertex_color.rgb;
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
+
+    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
+    float bias = 0.001953125; // 1/512, or half an 8-bit quantization
+    if (diffcol.a < minimum_alpha-bias)
+    {
+        discard;
+    }
+#endif
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+	vec3 gamma_diff = diffcol.rgb;
+	diffcol.rgb = srgb_to_linear(diffcol.rgb);
+#endif
+
+#ifdef HAS_SPECULAR_MAP
+    vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
+    spec.rgb *= specular_color.rgb;
+#else
+    vec4 spec = vec4(specular_color.rgb, 1.0);
+#endif
+
+#ifdef HAS_NORMAL_MAP
+	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
+
+	norm.xyz = norm.xyz * 2 - 1;
+
+	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
+			  dot(norm.xyz,vary_mat1),
+			  dot(norm.xyz,vary_mat2));
+#else
+	vec4 norm = vec4(0,0,0,1.0);
+	vec3 tnorm = vary_normal;
+#endif
+
+    norm.xyz = normalize(tnorm.xyz);
+
+    vec2 abnormal = encode_normal(norm.xyz);
+
+    vec4 final_color = diffcol;
+
+#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
+	final_color.a = emissive_brightness;
+#else
+	final_color.a = max(final_color.a, emissive_brightness);
+#endif
+
+    vec4 final_specular = spec;
+    
+#ifdef HAS_SPECULAR_MAP
+    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
+	final_specular.a = specular_color.a * norm.a;
+#else
+	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
+	final_specular.a = specular_color.a;
+#endif
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+
+    //forward rendering, output just lit sRGBA
+    vec3 pos = vary_position;
+
+    float shadow = 1.0f;
+
+#ifdef HAS_SUN_SHADOW
+    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
+#endif
+
+    spec = final_specular;
+    vec4 diffuse = final_color;
+    float envIntensity = final_normal.z;
+
+    vec3 color = vec3(0,0,0);
+
+    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
+
+    float bloom = 0.0;
+    vec3 sunlit;
+    vec3 amblit;
+    vec3 additive;
+    vec3 atten;
+
+    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
+    
+        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
+        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
+        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
+        //color = fullbrightScaleSoftClip(color);
+
+    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+
+    //we're in sRGB space, so gamma correct this dot product so 
+    // lighting from the sun stays sharp
+    float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
+    da = pow(da, 1.0 / 1.3);
+
+    color = amblit;
+
+    //darken ambient for normals perpendicular to light vector so surfaces in shadow 
+    // and facing away from light still have some definition to them.
+    // do NOT gamma correct this dot product so ambient lighting stays soft
+    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    ambient *= 0.5;
+    ambient *= ambient;
+    ambient = (1.0 - ambient);
+
+    vec3 sun_contrib = min(da, shadow) * sunlit;
+    
+    color *= ambient;
+
+    color += sun_contrib;
+
+    color *= gamma_diff.rgb;
+
+    float glare = 0.0;
+
+    if (spec.a > 0.0)  // specular reflection
+    {
+        /*  // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020
+            // Preserving the refactored version as a comment for potential reconsideration,
+            // overriding the general rule to avoid pollutiong the source with commented code.
+            //
+            //  If you're reading this in 2021+, feel free to obliterate.
+
+        vec3 npos = -normalize(pos.xyz);
+
+        //vec3 ref = dot(pos+lv, norm);
+        vec3 h = normalize(light_dir.xyz + npos);
+        float nh = dot(norm.xyz, h);
+        float nv = dot(norm.xyz, npos);
+        float vh = dot(npos, h);
+        float sa = nh;
+        float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
+
+        float gtdenom = 2 * nh;
+        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+
+        if (nh > 0.0)
+        {
+            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
+            vec3 sp = sun_contrib*scol / 6.0f;
+            sp = clamp(sp, vec3(0), vec3(1));
+            bloom = dot(sp, sp) / 4.0;
+            color += sp * spec.rgb;
+        }
+        */
+
+        float sa        = dot(refnormpersp, sun_dir.xyz);
+        vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+        // add the two types of shiny together
+        vec3 spec_contrib = dumbshiny * spec.rgb;
+        bloom             = dot(spec_contrib, spec_contrib) / 6;
+
+        glare = max(spec_contrib.r, spec_contrib.g);
+        glare = max(glare, spec_contrib.b);
+
+        color += spec_contrib;
+    }
+
+    color = mix(color.rgb, diffcol.rgb, diffuse.a);
+
+    if (envIntensity > 0.0)
+    {
+        //add environmentmap
+        vec3 env_vec = env_mat * refnormpersp;
+
+        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
+
+        color = mix(color, reflected_color, envIntensity);
+
+        float cur_glare = max(reflected_color.r, reflected_color.g);
+        cur_glare = max(cur_glare, reflected_color.b);
+        cur_glare *= envIntensity*4.0;
+        glare += cur_glare;
+    }
+
+    color = atmosFragLighting(color, additive, atten);
+    color = scaleSoftClipFrag(color);
+
+    //convert to linear before adding local lights
+    color = srgb_to_linear(color);
+
+    vec3 npos = normalize(-pos.xyz);
+
+    vec3 light = vec3(0, 0, 0);
+    
+#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
+
+    LIGHT_LOOP(1)
+        LIGHT_LOOP(2)
+        LIGHT_LOOP(3)
+        LIGHT_LOOP(4)
+        LIGHT_LOOP(5)
+        LIGHT_LOOP(6)
+        LIGHT_LOOP(7)
+
+    color += light;
+
+    glare = min(glare, 1.0);
+    float al = max(diffcol.a, glare)*vertex_color.a;
+
+    //convert to srgb as this color is being written post gamma correction
+    color = linear_to_srgb(color);
+
+#ifdef WATER_FOG
+    vec4 temp = applyWaterFogView(pos, vec4(color, al));
+    color = temp.rgb;
+    al = temp.a;
+#endif
+
+    frag_color = vec4(color, al);
+
+#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer 
+
+    // deferred path
+    frag_data[0] = final_color; //gbuffer is sRGB
+    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
+    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
+#endif
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index a5804220bc..f80f1a985a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -124,41 +124,15 @@ void main()
 
         if (spec.a > 0.0) // specular reflection
         {
+            float sa        = dot(refnormpersp, light_dir.xyz);
+            vec3  dumbshiny = sunlit * (texture2D(lightFunc, vec2(sa, spec.a)).r);
 
-#if 1 //EEP
-            vec3 npos = -normalize(pos.xyz);
-
-            //vec3 ref = dot(pos+lv, norm);
-            vec3 h = normalize(light_dir.xyz+npos);
-            float nh = dot(norm.xyz, h);
-            float nv = dot(norm.xyz, npos);
-            float vh = dot(npos, h);
-            float sa = nh;
-            float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-            float gtdenom = 2 * nh;
-            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-            
-            if (nh > 0.0)
-            {
-                float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-                vec3 sp = sun_contrib*scontrib / 6.0;
-                sp = clamp(sp, vec3(0), vec3(1));
-                bloom += dot(sp, sp) / 4.0;
-                color += sp * spec.rgb;
-            }
-#else //PRODUCTION
-            float sa = dot(refnormpersp, light_dir.xyz);
-            vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r);
-            
             // add the two types of shiny together
             vec3 spec_contrib = dumbshiny * spec.rgb;
-            bloom = dot(spec_contrib, spec_contrib) / 6;
+            bloom             = dot(spec_contrib, spec_contrib) / 6;
             color.rgb += spec_contrib;
-#endif
-
         }
-       
+
        color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
 
         if (envIntensity > 0.0)
-- 
cgit v1.2.3


From 2597ed7553fbd42775cf7d85f194ab7f67a04d50 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 17 Jul 2020 00:24:32 +0300
Subject: SL-13443 Reduce stalls on writing cache to file

---
 indra/newview/llvocache.cpp | 51 ++++++++++++++++++---------------------------
 1 file changed, 20 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 07660ca6ac..689eeee0e3 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -347,36 +347,24 @@ void LLVOCacheEntry::dump() const
 
 BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
 {
-	BOOL success;
-	success = check_write(apr_file, (void*)&mLocalID, sizeof(U32));
-	if(success)
-	{
-		success = check_write(apr_file, (void*)&mCRC, sizeof(U32));
-	}
-	if(success)
-	{
-		success = check_write(apr_file, (void*)&mHitCount, sizeof(S32));
-	}
-	if(success)
-	{
-		success = check_write(apr_file, (void*)&mDupeCount, sizeof(S32));
-	}
-	if(success)
-	{
-		success = check_write(apr_file, (void*)&mCRCChangeCount, sizeof(S32));
-	}
-	if(success)
-	{
-		S32 size = mDP.getBufferSize();
-		success = check_write(apr_file, (void*)&size, sizeof(S32));
-	
-		if(success)
-		{
-			success = check_write(apr_file, (void*)mBuffer, size);
-		}
-	}
-
-	return success ;
+    static const S32 data_buffer_size = 6 * sizeof(S32);
+    static U8 data_buffer[data_buffer_size];
+    S32 size = mDP.getBufferSize();
+
+    memcpy(data_buffer, &mLocalID, sizeof(U32));
+    memcpy(data_buffer + sizeof(U32), &mCRC, sizeof(U32));
+    memcpy(data_buffer + (2 * sizeof(U32)), &mHitCount, sizeof(S32));
+    memcpy(data_buffer + (3 * sizeof(U32)), &mDupeCount, sizeof(S32));
+    memcpy(data_buffer + (4 * sizeof(U32)), &mCRCChangeCount, sizeof(S32));
+    memcpy(data_buffer + (5 * sizeof(U32)), &size, sizeof(S32));
+
+    BOOL success = check_write(apr_file, (void*)data_buffer, data_buffer_size);
+    if (success)
+    {
+        success = check_write(apr_file, (void*)mBuffer, size);
+    }
+
+    return success;
 }
 
 //static 
@@ -1537,7 +1525,8 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
 		{
 			S32 num_entries = cache_entry_map.size() ;
 			success = check_write(&apr_file, &num_entries, sizeof(S32));
-	
+
+			// This can have a lot of entries, so might be better to dump them into buffer first and write in one go.
 			for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter)
 			{
 				if(!removal_enabled || iter->second->isValid())
-- 
cgit v1.2.3


From af8848c18a3e8f82f5092d35f357c5373cd3ea9d Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 20 Jul 2020 16:55:16 -0600
Subject: DRTVWR-497 trigger new build

---
 indra/edit-me-to-trigger-new-build.txt | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
index fd40910d9e..d00491fd7e 100644
--- a/indra/edit-me-to-trigger-new-build.txt
+++ b/indra/edit-me-to-trigger-new-build.txt
@@ -1,4 +1 @@
-
-
-
-
+1
-- 
cgit v1.2.3


From afea9a525c70a16049215aef2864f5040d6cf4ab Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 21 Jul 2020 10:18:09 -0600
Subject: DRTVWR-497 trigger another new build

---
 indra/edit-me-to-trigger-new-build.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
index d00491fd7e..48082f72f0 100644
--- a/indra/edit-me-to-trigger-new-build.txt
+++ b/indra/edit-me-to-trigger-new-build.txt
@@ -1 +1 @@
-1
+12
-- 
cgit v1.2.3


From c21fe67dddd8e4f09b6a7143cd9467849e751260 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 19 Jun 2020 16:41:19 -0600
Subject: SL-13416 eliminate sun/moon specular on shadowed surfaces

---
 .../shaders/class2/deferred/softenLightF.glsl      | 169 +++++++++------------
 1 file changed, 76 insertions(+), 93 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 40f0f0448a..f4db53e0b7 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -1,24 +1,24 @@
-/** 
+/**
  * @file class2/deferred/softenLightF.glsl
  *
  * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2007, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -39,7 +39,7 @@ uniform sampler2DRect specularRect;
 uniform sampler2DRect normalMap;
 uniform sampler2DRect lightMap;
 uniform sampler2DRect depthMap;
-uniform samplerCube environmentMap;
+uniform samplerCube   environmentMap;
 uniform sampler2D     lightFunc;
 
 uniform float blur_size;
@@ -50,7 +50,7 @@ uniform mat3 env_mat;
 
 uniform vec3 sun_dir;
 uniform vec3 moon_dir;
-uniform int sun_up_factor;
+uniform int  sun_up_factor;
 VARYING vec2 vary_fragcoord;
 
 uniform mat4 inv_proj;
@@ -61,10 +61,10 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth);
 
 void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
 float getAmbientClamp();
-vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
-vec3 scaleSoftClipFrag(vec3 l);
-vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
-vec3 fullbrightScaleSoftClip(vec3 light);
+vec3  atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
+vec3  scaleSoftClipFrag(vec3 l);
+vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
+vec3  fullbrightScaleSoftClip(vec3 light);
 
 vec3 linear_to_srgb(vec3 c);
 vec3 srgb_to_linear(vec3 c);
@@ -73,102 +73,85 @@ vec3 srgb_to_linear(vec3 c);
 vec4 applyWaterFogView(vec3 pos, vec4 color);
 #endif
 
-void main() 
+void main()
 {
-    vec2 tc = vary_fragcoord.xy;
-    float depth = texture2DRect(depthMap, tc.xy).r;
-    vec4 pos = getPositionWithDepth(tc, depth);
-    vec4 norm = texture2DRect(normalMap, tc);
+    vec2  tc           = vary_fragcoord.xy;
+    float depth        = texture2DRect(depthMap, tc.xy).r;
+    vec4  pos          = getPositionWithDepth(tc, depth);
+    vec4  norm         = texture2DRect(normalMap, tc);
     float envIntensity = norm.z;
-    norm.xyz = getNorm(tc);
-    
-    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
-    float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
-    float light_gamma = 1.0/1.3;
-    da = pow(da, light_gamma);
-    
+    norm.xyz           = getNorm(tc);
+
+    vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;
+    float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
+    float light_gamma = 1.0 / 1.3;
+    da                = pow(da, light_gamma);
+
     vec4 diffuse = texture2DRect(diffuseRect, tc);
-    
-    vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
+    vec4 spec    = texture2DRect(specularRect, vary_fragcoord.xy);
 
     vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
-    scol_ambocc = pow(scol_ambocc, vec2(light_gamma));
+    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma));
+    float scol       = max(scol_ambocc.r, diffuse.a);
+    float ambocc     = scol_ambocc.g;
 
-    float scol = max(scol_ambocc.r, diffuse.a); 
+    vec3  color = vec3(0);
+    float bloom = 0.0;
 
-    float ambocc = scol_ambocc.g;
+    vec3 sunlit;
+    vec3 amblit;
+    vec3 additive;
+    vec3 atten;
+    calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
 
-    vec3 color = vec3(0);
-    float bloom = 0.0;
+    color.rgb = amblit;
+
+    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    ambient *= 0.5;
+    ambient *= ambient;
+    ambient = (1.0 - ambient);
+    color.rgb *= ambient;
+
+    vec3 sun_contrib = min(da, scol) * sunlit;
+    color.rgb += sun_contrib;
+    color.rgb *= diffuse.rgb;
+
+    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+
+    if (spec.a > 0.0)  // specular reflection
     {
-        vec3 sunlit;
-        vec3 amblit;
-        vec3 additive;
-        vec3 atten;
-    
-        calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
-
-        color.rgb = amblit;
-
-        float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
-        ambient *= 0.5;
-        ambient *= ambient;
-        ambient = (1.0 - ambient);
-
-        color.rgb *= ambient;
-
-        vec3 sun_contrib = min(da, scol) * sunlit;
-
-        color.rgb += sun_contrib;
-
-        color.rgb *= diffuse.rgb;
-
-        vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
-
-        if (spec.a > 0.0) // specular reflection
-        {
-            float sa = dot(refnormpersp, light_dir.xyz);
-            vec3 dumbshiny = sunlit * (texture2D(lightFunc, vec2(sa, spec.a)).r);
-
-            // add the two types of shiny together
-            vec3 spec_contrib = dumbshiny * spec.rgb;
-            bloom = dot(spec_contrib, spec_contrib) / 6;
-            color.rgb += spec_contrib;
-        }
-
-        color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
-
-        if (envIntensity > 0.0)
-        { //add environmentmap
-            vec3 env_vec = env_mat * refnormpersp;
-            vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
-            color = mix(color.rgb, reflected_color, envIntensity);
-        }
-       
-        if (norm.w < 0.5)
-        {
-            color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
-            color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
-        }
-
-        #ifdef WATER_FOG
-            vec4 fogged = applyWaterFogView(pos.xyz,vec4(color, bloom));
-            color = fogged.rgb;
-            bloom = fogged.a;
-        #endif
+        float sa        = dot(refnormpersp, light_dir.xyz);
+        vec3  dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+        // add the two types of shiny together
+        vec3 spec_contrib = dumbshiny * spec.rgb;
+        bloom             = dot(spec_contrib, spec_contrib) / 6;
+        color.rgb += spec_contrib;
+    }
+
+    color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
+
+    if (envIntensity > 0.0)
+    {  // add environmentmap
+        vec3 env_vec         = env_mat * refnormpersp;
+        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
+        color                = mix(color.rgb, reflected_color, envIntensity);
+    }
 
+    if (norm.w < 0.5)
+    {
+        color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
+        color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
     }
 
-// linear debuggables
-//color.rgb = vec3(final_da);
-//color.rgb = vec3(ambient);
-//color.rgb = vec3(scol);
-//color.rgb = diffuse_srgb.rgb;
+#ifdef WATER_FOG
+    vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom));
+    color       = fogged.rgb;
+    bloom       = fogged.a;
+#endif
 
     // convert to linear as fullscreen lights need to sum in linear colorspace
     // and will be gamma (re)corrected downstream...
-    
     frag_color.rgb = srgb_to_linear(color.rgb);
-    frag_color.a = bloom;
+    frag_color.a   = bloom;
 }
-
-- 
cgit v1.2.3


From 21cf868f3886452019d21f6e6333551527dbd891 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 24 Jul 2020 10:07:28 -0600
Subject: SL-13406, disable glow no longer disables all post passes

---
 indra/newview/llviewerdisplay.cpp |  90 +++++----------
 indra/newview/pipeline.cpp        | 236 +++++++++++++++++++-------------------
 indra/newview/pipeline.h          |   2 +-
 3 files changed, 146 insertions(+), 182 deletions(-)

diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 2b1f4b138f..dad36da280 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -705,9 +705,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		LLGLState::checkTextureChannels();
 		LLGLState::checkClientArrays();
 
-		BOOL to_texture = gPipeline.canUseVertexShaders() &&
-						LLPipeline::sRenderGlow;
-
 		LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
 		
 		{ 
@@ -914,29 +911,26 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 		stop_glerror();
 
-		if (to_texture)
-		{
-			gGL.setColorMask(true, true);
+		gGL.setColorMask(true, true);
 					
-			if (LLPipeline::sRenderDeferred)
-			{
-				gPipeline.mDeferredScreen.bindTarget();
-				glClearColor(1,0,1,1);
-				gPipeline.mDeferredScreen.clear();
-			}
-			else
+		if (LLPipeline::sRenderDeferred)
+		{
+			gPipeline.mDeferredScreen.bindTarget();
+			glClearColor(1,0,1,1);
+			gPipeline.mDeferredScreen.clear();
+		}
+		else
+		{
+			gPipeline.mScreen.bindTarget();
+			if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
 			{
-				gPipeline.mScreen.bindTarget();
-				if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
-				{
-					const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor();
-					glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
-				}
-				gPipeline.mScreen.clear();
+				const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor();
+				glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
 			}
-			
-			gGL.setColorMask(true, false);
+			gPipeline.mScreen.clear();
 		}
+			
+		gGL.setColorMask(true, false);
 		
 		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom");
 		
@@ -1002,33 +996,15 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");		
 		
-		if (to_texture)
-		{
-			if (LLPipeline::sRenderDeferred)
-			{
-				gPipeline.mDeferredScreen.flush();
-				if(LLRenderTarget::sUseFBO)
-				{
-					LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), 
-															  gPipeline.mDeferredScreen.getHeight(), 0, 0, 
-															  gPipeline.mDeferredScreen.getWidth(), 
-															  gPipeline.mDeferredScreen.getHeight(), 
-															  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-				}
-			}
-			else
-			{
-				gPipeline.mScreen.flush();
-				if(LLRenderTarget::sUseFBO)
-				{				
-					LLRenderTarget::copyContentsToFramebuffer(gPipeline.mScreen, 0, 0, gPipeline.mScreen.getWidth(), 
-															  gPipeline.mScreen.getHeight(), 0, 0, 
-															  gPipeline.mScreen.getWidth(), 
-															  gPipeline.mScreen.getHeight(), 
-															  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-				}
-			}
-		}
+        
+        LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mDeferredScreen : gPipeline.mScreen);
+        rt.flush();
+
+        if (rt.sUseFBO)
+        {
+            LLRenderTarget::copyContentsToFramebuffer(rt, 0, 0, rt.getWidth(), rt.getHeight(), 0, 0, rt.getWidth(), rt.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
+        }
+
 
 		if (LLPipeline::sRenderDeferred)
 		{
@@ -1295,19 +1271,11 @@ void render_ui(F32 zoom_factor, int subfield)
 		gGL.popMatrix();
 	}
 
-	{
-		BOOL to_texture = gPipeline.canUseVertexShaders() &&
-							LLPipeline::sRenderGlow;
-
-		if (to_texture)
-		{
-			gPipeline.renderBloom(gSnapshot, zoom_factor, subfield);
-		}
+	gPipeline.renderPost(gSnapshot, zoom_factor, subfield);
 		
-		LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
-		render_hud_elements();
-		render_hud_attachments();
-	}
+	LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
+	render_hud_elements();
+	render_hud_attachments();
 
 	LLGLSDefault gls_default;
 	LLGLSUIDefault gls_ui;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f3b8ad9008..60fd34552a 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1052,19 +1052,13 @@ void LLPipeline::updateRenderBump()
 //static
 void LLPipeline::updateRenderDeferred()
 {
-	bool deferred = (bool(RenderDeferred && 
+	sRenderDeferred = (bool(RenderDeferred &&
 					 LLRenderTarget::sUseFBO &&
 					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&	 
 					 LLPipeline::sRenderBump &&
 					 RenderAvatarVP &&
 					 WindLightUseAtmosShaders)) &&
 					!gUseWireframe;
-
-	sRenderDeferred = deferred;	
-	if (deferred)
-	{ //must render glow when rendering deferred since post effect pass is needed to present any lighting at all
-		sRenderGlow = true;
-	}
 }
 
 //static
@@ -1260,7 +1254,7 @@ void LLPipeline::createGLBuffers()
 	GLuint resX = gViewerWindow->getWorldViewWidthRaw();
 	GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
-	if (LLPipeline::sRenderGlow)
+	if (1)
 	{ //screen space glow buffers
 		const U32 glow_res = llmax(1, 
 			llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
@@ -7544,14 +7538,8 @@ void LLPipeline::bindScreenToTexture()
 
 static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
 
-void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield)
+void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
 {
-	if (!(gPipeline.canUseVertexShaders() &&
-		sRenderGlow))
-	{
-		return;
-	}
-
 	LLVertexBuffer::unbind();
 	LLGLState::checkStates();
 	LLGLState::checkTextureChannels();
@@ -7587,121 +7575,129 @@ void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield)
 	gGL.setColorMask(true, true);
 	glClearColor(0,0,0,0);
 		
-	{
-		{
-			LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO);
-			mGlow[2].bindTarget();
-			mGlow[2].clear();
-		}
-		
-		gGlowExtractProgram.bind();
-		F32 minLum = llmax((F32) RenderGlowMinLuminance, 0.0f);
-		F32 maxAlpha = RenderGlowMaxExtractAlpha;		
-		F32 warmthAmount = RenderGlowWarmthAmount;	
-		LLVector3 lumWeights = RenderGlowLumWeights;
-		LLVector3 warmthWeights = RenderGlowWarmthWeights;
-
-
-		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum);
-		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha);
-		gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
-		gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
-		gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
-		LLGLEnable blend_on(GL_BLEND);
-		LLGLEnable test(GL_ALPHA_TEST);
-		
-		gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
-		
-		mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT);
-		
-		gGL.color4f(1,1,1,1);
-		gPipeline.enableLightsFullbright();
-		gGL.begin(LLRender::TRIANGLE_STRIP);
-		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-		gGL.vertex2f(-1,-1);
-		
-		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-		gGL.vertex2f(-1,3);
-		
-		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-		gGL.vertex2f(3,-1);
-		
-		gGL.end();
-		
-		gGL.getTexUnit(0)->unbind(mScreen.getUsage());
+    if (sRenderGlow)
+    {
+        {
+            LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO);
+            mGlow[2].bindTarget();
+            mGlow[2].clear();
+        }
 
-		mGlow[2].flush();
-	}
+        gGlowExtractProgram.bind();
+        F32 minLum = llmax((F32)RenderGlowMinLuminance, 0.0f);
+        F32 maxAlpha = RenderGlowMaxExtractAlpha;
+        F32 warmthAmount = RenderGlowWarmthAmount;
+        LLVector3 lumWeights = RenderGlowLumWeights;
+        LLVector3 warmthWeights = RenderGlowWarmthWeights;
 
-	tc1.setVec(0,0);
-	tc2.setVec(2,2);
 
-	// power of two between 1 and 1024
-	U32 glowResPow = RenderGlowResolutionPow;
-	const U32 glow_res = llmax(1, 
-		llmin(1024, 1 << glowResPow));
+        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum);
+        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha);
+        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
+        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
+        gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
+        LLGLEnable blend_on(GL_BLEND);
+        LLGLEnable test(GL_ALPHA_TEST);
 
-	S32 kernel = RenderGlowIterations*2;
-	F32 delta = RenderGlowWidth / glow_res;
-	// Use half the glow width if we have the res set to less than 9 so that it looks
-	// almost the same in either case.
-	if (glowResPow < 9)
-	{
-		delta *= 0.5f;
-	}
-	F32 strength = RenderGlowStrength;
+        gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
 
-	gGlowProgram.bind();
-	gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength);
+        mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT);
 
-	for (S32 i = 0; i < kernel; i++)
-	{
-		{
-			LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO);
-			mGlow[i%2].bindTarget();
-			mGlow[i%2].clear();
-		}
-			
-		if (i == 0)
-		{
-			gGL.getTexUnit(0)->bind(&mGlow[2]);
-		}
-		else
-		{
-			gGL.getTexUnit(0)->bind(&mGlow[(i-1)%2]);
-		}
+        gGL.color4f(1, 1, 1, 1);
+        gPipeline.enableLightsFullbright();
+        gGL.begin(LLRender::TRIANGLE_STRIP);
+        gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+        gGL.vertex2f(-1, -1);
 
-		if (i%2 == 0)
-		{
-			gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0);
-		}
-		else
-		{
-			gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
-		}
+        gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+        gGL.vertex2f(-1, 3);
 
-		gGL.begin(LLRender::TRIANGLE_STRIP);
-		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-		gGL.vertex2f(-1,-1);
-		
-		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-		gGL.vertex2f(-1,3);
-		
-		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-		gGL.vertex2f(3,-1);
-		
-		gGL.end();
-		
-		mGlow[i%2].flush();
-	}
+        gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+        gGL.vertex2f(3, -1);
 
-	gGlowProgram.unbind();
+        gGL.end();
 
-	/*if (LLRenderTarget::sUseFBO)
-	{
-		LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO);
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
-	}*/
+        gGL.getTexUnit(0)->unbind(mScreen.getUsage());
+
+        mGlow[2].flush();
+
+
+        tc1.setVec(0, 0);
+        tc2.setVec(2, 2);
+
+        // power of two between 1 and 1024
+        U32 glowResPow = RenderGlowResolutionPow;
+        const U32 glow_res = llmax(1,
+            llmin(1024, 1 << glowResPow));
+
+        S32 kernel = RenderGlowIterations * 2;
+        F32 delta = RenderGlowWidth / glow_res;
+        // Use half the glow width if we have the res set to less than 9 so that it looks
+        // almost the same in either case.
+        if (glowResPow < 9)
+        {
+            delta *= 0.5f;
+        }
+        F32 strength = RenderGlowStrength;
+
+        if (!sRenderGlow)
+        {
+            strength = 0.0f;
+            kernel = 2;
+        }
+
+        gGlowProgram.bind();
+        gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength);
+
+        for (S32 i = 0; i < kernel; i++)
+        {
+            {
+                LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM_FBO);
+                mGlow[i % 2].bindTarget();
+                mGlow[i % 2].clear();
+            }
+
+            if (i == 0)
+            {
+                gGL.getTexUnit(0)->bind(&mGlow[2]);
+            }
+            else
+            {
+                gGL.getTexUnit(0)->bind(&mGlow[(i - 1) % 2]);
+            }
+
+            if (i % 2 == 0)
+            {
+                gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0);
+            }
+            else
+            {
+                gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
+            }
+
+            gGL.begin(LLRender::TRIANGLE_STRIP);
+            gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+            gGL.vertex2f(-1, -1);
+
+            gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+            gGL.vertex2f(-1, 3);
+
+            gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+            gGL.vertex2f(3, -1);
+
+            gGL.end();
+
+            mGlow[i % 2].flush();
+        }
+
+        gGlowProgram.unbind();
+    }
+    else // !sRenderGlow, skip the glow ping-pong and just clear the result target
+    {
+        mGlow[1].bindTarget();
+        mGlow[1].clear();
+        mGlow[1].flush();
+    }
 
 	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
 	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 5a07bdebe3..fe60eb69f8 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -139,7 +139,7 @@ public:
 	void resetVertexBuffers(LLDrawable* drawable);
 	void generateImpostor(LLVOAvatar* avatar);
 	void bindScreenToTexture();
-	void renderBloom(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
+	void renderPost(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
 
 	void init();
 	void cleanup();
-- 
cgit v1.2.3


From fb45ca014c812f7166c750da112984fd8dd88bc8 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 24 Jul 2020 10:32:54 -0600
Subject: SL-13406, cleanup and format changes

---
 indra/newview/llviewerdisplay.cpp |  67 +--
 indra/newview/pipeline.cpp        | 941 +++++++++++++++++++-------------------
 indra/newview/pipeline.h          |   2 +-
 3 files changed, 497 insertions(+), 513 deletions(-)

diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index dad36da280..95f8785c90 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -911,28 +911,28 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 		stop_glerror();
 
-		gGL.setColorMask(true, true);
-					
-		if (LLPipeline::sRenderDeferred)
-		{
-			gPipeline.mDeferredScreen.bindTarget();
-			glClearColor(1,0,1,1);
-			gPipeline.mDeferredScreen.clear();
-		}
-		else
-		{
-			gPipeline.mScreen.bindTarget();
-			if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
-			{
-				const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor();
-				glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
-			}
-			gPipeline.mScreen.clear();
-		}
-			
-		gGL.setColorMask(true, false);
-		
-		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom");
+        gGL.setColorMask(true, true);
+
+        if (LLPipeline::sRenderDeferred)
+        {
+            gPipeline.mDeferredScreen.bindTarget();
+            glClearColor(1, 0, 1, 1);
+            gPipeline.mDeferredScreen.clear();
+        }
+        else
+        {
+            gPipeline.mScreen.bindTarget();
+            if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
+            {
+                const LLColor4 &col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor();
+                glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
+            }
+            gPipeline.mScreen.clear();
+        }
+
+        gGL.setColorMask(true, false);
+
+        LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom");
 		
 		if (!(LLAppViewer::instance()->logoutRequestSent() && LLAppViewer::instance()->hasSavedFinalSnapshot())
 				&& !gRestoreGL)
@@ -994,20 +994,20 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 			}
 		}
 
-		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");		
-		
-        
+		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
+
         LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mDeferredScreen : gPipeline.mScreen);
         rt.flush();
 
         if (rt.sUseFBO)
         {
-            LLRenderTarget::copyContentsToFramebuffer(rt, 0, 0, rt.getWidth(), rt.getHeight(), 0, 0, rt.getWidth(), rt.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
+            LLRenderTarget::copyContentsToFramebuffer(rt, 0, 0, rt.getWidth(), rt.getHeight(), 0, 0, rt.getWidth(),
+                                                      rt.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
+                                                      GL_NEAREST);
         }
 
-
-		if (LLPipeline::sRenderDeferred)
-		{
+        if (LLPipeline::sRenderDeferred)
+        {
 			gPipeline.renderDeferredLighting(&gPipeline.mScreen);
 		}
 
@@ -1271,10 +1271,11 @@ void render_ui(F32 zoom_factor, int subfield)
 		gGL.popMatrix();
 	}
 
-	gPipeline.renderPost(gSnapshot, zoom_factor, subfield);
-		
-	LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
-	render_hud_elements();
+    // Finalize scene
+    gPipeline.renderFinalize();
+
+    LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
+    render_hud_elements();
 	render_hud_attachments();
 
 	LLGLSDefault gls_default;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 60fd34552a..3f8f7b278f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1049,19 +1049,19 @@ void LLPipeline::updateRenderBump()
 	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
 }
 
-//static
+// static
 void LLPipeline::updateRenderDeferred()
 {
-	sRenderDeferred = (bool(RenderDeferred &&
-					 LLRenderTarget::sUseFBO &&
-					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&	 
-					 LLPipeline::sRenderBump &&
-					 RenderAvatarVP &&
-					 WindLightUseAtmosShaders)) &&
-					!gUseWireframe;
+    sRenderDeferred = !gUseWireframe &&
+                      RenderDeferred &&
+                      LLRenderTarget::sUseFBO &&
+                      LLPipeline::sRenderBump &&
+                      RenderAvatarVP &&
+                      WindLightUseAtmosShaders &&
+                      (bool) LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
 }
 
-//static
+// static
 void LLPipeline::refreshCachedSettings()
 {
 	LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
@@ -1253,24 +1253,20 @@ void LLPipeline::createGLBuffers()
 
 	GLuint resX = gViewerWindow->getWorldViewWidthRaw();
 	GLuint resY = gViewerWindow->getWorldViewHeightRaw();
-	
-	if (1)
-	{ //screen space glow buffers
-		const U32 glow_res = llmax(1, 
-			llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
 
-		for (U32 i = 0; i < 3; i++)
-		{
-			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);
-		}
+    // allocate screen space glow buffers
+    const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
+    for (U32 i = 0; i < 3; i++)
+    {
+        mGlow[i].allocate(512, glow_res, GL_RGBA, FALSE, FALSE);
+    }
 
-		allocateScreenBuffer(resX,resY);
-		mScreenWidth = 0;
-		mScreenHeight = 0;
-	}
-	
-	if (sRenderDeferred)
-	{
+    allocateScreenBuffer(resX, resY);
+    mScreenWidth = 0;
+    mScreenHeight = 0;
+
+    if (sRenderDeferred)
+    {
 		if (!mNoiseMap)
 		{
 			const U32 noiseRes = 128;
@@ -7538,43 +7534,42 @@ void LLPipeline::bindScreenToTexture()
 
 static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
 
-void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
+void LLPipeline::renderFinalize()
 {
-	LLVertexBuffer::unbind();
-	LLGLState::checkStates();
-	LLGLState::checkTextureChannels();
+    LLVertexBuffer::unbind();
+    LLGLState::checkStates();
+    LLGLState::checkTextureChannels();
 
-	assertInitialized();
+    assertInitialized();
 
-	if (gUseWireframe)
-	{
-		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-	}
+    if (gUseWireframe)
+    {
+        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+    }
 
-	LLVector2 tc1(0,0);
-	LLVector2 tc2((F32) mScreen.getWidth()*2,
-				  (F32) mScreen.getHeight()*2);
+    LLVector2 tc1(0, 0);
+    LLVector2 tc2((F32) mScreen.getWidth() * 2, (F32) mScreen.getHeight() * 2);
 
-	LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM);
-	gGL.color4f(1,1,1,1);
-	LLGLDepthTest depth(GL_FALSE);
-	LLGLDisable blend(GL_BLEND);
-	LLGLDisable cull(GL_CULL_FACE);
-	
-	enableLightsFullbright();
+    LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM);
+    gGL.color4f(1, 1, 1, 1);
+    LLGLDepthTest depth(GL_FALSE);
+    LLGLDisable blend(GL_BLEND);
+    LLGLDisable cull(GL_CULL_FACE);
 
-	gGL.matrixMode(LLRender::MM_PROJECTION);
-	gGL.pushMatrix();
-	gGL.loadIdentity();
-	gGL.matrixMode(LLRender::MM_MODELVIEW);
-	gGL.pushMatrix();
-	gGL.loadIdentity();
+    enableLightsFullbright();
 
-	LLGLDisable test(GL_ALPHA_TEST);
+    gGL.matrixMode(LLRender::MM_PROJECTION);
+    gGL.pushMatrix();
+    gGL.loadIdentity();
+    gGL.matrixMode(LLRender::MM_MODELVIEW);
+    gGL.pushMatrix();
+    gGL.loadIdentity();
+
+    LLGLDisable test(GL_ALPHA_TEST);
+
+    gGL.setColorMask(true, true);
+    glClearColor(0, 0, 0, 0);
 
-	gGL.setColorMask(true, true);
-	glClearColor(0,0,0,0);
-		
     if (sRenderGlow)
     {
         {
@@ -7584,17 +7579,18 @@ void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
         }
 
         gGlowExtractProgram.bind();
-        F32 minLum = llmax((F32)RenderGlowMinLuminance, 0.0f);
+        F32 minLum = llmax((F32) RenderGlowMinLuminance, 0.0f);
         F32 maxAlpha = RenderGlowMaxExtractAlpha;
         F32 warmthAmount = RenderGlowWarmthAmount;
         LLVector3 lumWeights = RenderGlowLumWeights;
         LLVector3 warmthWeights = RenderGlowWarmthWeights;
 
-
         gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum);
         gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha);
-        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
-        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
+        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1],
+                                      lumWeights.mV[2]);
+        gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1],
+                                      warmthWeights.mV[2]);
         gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
         LLGLEnable blend_on(GL_BLEND);
         LLGLEnable test(GL_ALPHA_TEST);
@@ -7621,14 +7617,12 @@ void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
 
         mGlow[2].flush();
 
-
         tc1.setVec(0, 0);
         tc2.setVec(2, 2);
 
         // power of two between 1 and 1024
         U32 glowResPow = RenderGlowResolutionPow;
-        const U32 glow_res = llmax(1,
-            llmin(1024, 1 << glowResPow));
+        const U32 glow_res = llmax(1, llmin(1024, 1 << glowResPow));
 
         S32 kernel = RenderGlowIterations * 2;
         F32 delta = RenderGlowWidth / glow_res;
@@ -7640,12 +7634,6 @@ void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
         }
         F32 strength = RenderGlowStrength;
 
-        if (!sRenderGlow)
-        {
-            strength = 0.0f;
-            kernel = 2;
-        }
-
         gGlowProgram.bind();
         gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength);
 
@@ -7699,482 +7687,477 @@ void LLPipeline::renderPost(bool for_snapshot, F32 zoom_factor, int subfield)
         mGlow[1].flush();
     }
 
-	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
-	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
-	gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
-	gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
-	glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+    gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+    gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+    gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+    gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+    glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
 
-	tc2.setVec((F32) mScreen.getWidth(),
-			(F32) mScreen.getHeight());
+    tc2.setVec((F32) mScreen.getWidth(), (F32) mScreen.getHeight());
 
-	gGL.flush();
-	
-	LLVertexBuffer::unbind();
+    gGL.flush();
 
-	if (LLPipeline::sRenderDeferred)
-	{
+    LLVertexBuffer::unbind();
 
-		bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
-			(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
-							RenderDepthOfField;
+    if (LLPipeline::sRenderDeferred)
+    {
 
+        bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
+                           (RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
+                           RenderDepthOfField;
 
-		bool multisample = RenderFSAASamples > 1 && mFXAABuffer.isComplete();
+        bool multisample = RenderFSAASamples > 1 && mFXAABuffer.isComplete();
 
-		gViewerWindow->setup3DViewport();
-				
-		if (dof_enabled)
-		{
-			LLGLSLShader* shader = &gDeferredPostProgram;
-			LLGLDisable blend(GL_BLEND);
+        gViewerWindow->setup3DViewport();
 
-			//depth of field focal plane calculations
-			static F32 current_distance = 16.f;
-			static F32 start_distance = 16.f;
-			static F32 transition_time = 1.f;
+        if (dof_enabled)
+        {
+            LLGLSLShader *shader = &gDeferredPostProgram;
+            LLGLDisable blend(GL_BLEND);
 
-			LLVector3 focus_point;
+            // depth of field focal plane calculations
+            static F32 current_distance = 16.f;
+            static F32 start_distance = 16.f;
+            static F32 transition_time = 1.f;
 
-			LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
-			if (obj && obj->mDrawable && obj->isSelected())
-			{ //focus on selected media object
-				S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
-				if (obj && obj->mDrawable)
-				{
-					LLFace* face = obj->mDrawable->getFace(face_idx);
-					if (face)
-					{
-						focus_point = face->getPositionAgent();
-					}
-				}
-			}
-		
-			if (focus_point.isExactlyZero())
-			{
-				if (LLViewerJoystick::getInstance()->getOverrideCamera())
-				{ //focus on point under cursor
-					focus_point.set(gDebugRaycastIntersection.getF32ptr());
-				}
-				else if (gAgentCamera.cameraMouselook())
-				{ //focus on point under mouselook crosshairs
-					LLVector4a result;
-					result.clear();
+            LLVector3 focus_point;
 
-					gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE,
-													NULL,
-													&result);
+            LLViewerObject *obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+            if (obj && obj->mDrawable && obj->isSelected())
+            { // focus on selected media object
+                S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+                if (obj && obj->mDrawable)
+                {
+                    LLFace *face = obj->mDrawable->getFace(face_idx);
+                    if (face)
+                    {
+                        focus_point = face->getPositionAgent();
+                    }
+                }
+            }
 
-					focus_point.set(result.getF32ptr());
-				}
-				else
-				{
-					//focus on alt-zoom target
-					LLViewerRegion* region = gAgent.getRegion();
-					if (region)
-					{
-						focus_point = LLVector3(gAgentCamera.getFocusGlobal()-region->getOriginGlobal());
-					}
-				}
-			}
+            if (focus_point.isExactlyZero())
+            {
+                if (LLViewerJoystick::getInstance()->getOverrideCamera())
+                { // focus on point under cursor
+                    focus_point.set(gDebugRaycastIntersection.getF32ptr());
+                }
+                else if (gAgentCamera.cameraMouselook())
+                { // focus on point under mouselook crosshairs
+                    LLVector4a result;
+                    result.clear();
 
-			LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
-			F32 target_distance = 16.f;
-			if (!focus_point.isExactlyZero())
-			{
-				target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
-			}
+                    gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, NULL, &result);
 
-			if (transition_time >= 1.f &&
-				fabsf(current_distance-target_distance)/current_distance > 0.01f)
-			{ //large shift happened, interpolate smoothly to new target distance
-				transition_time = 0.f;
-				start_distance = current_distance;
-			}
-			else if (transition_time < 1.f)
-			{ //currently in a transition, continue interpolating
-				transition_time += 1.f/CameraFocusTransitionTime*gFrameIntervalSeconds.value();
-				transition_time = llmin(transition_time, 1.f);
+                    focus_point.set(result.getF32ptr());
+                }
+                else
+                {
+                    // focus on alt-zoom target
+                    LLViewerRegion *region = gAgent.getRegion();
+                    if (region)
+                    {
+                        focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
+                    }
+                }
+            }
 
-				F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
-				current_distance = start_distance + (target_distance-start_distance)*t;
-			}
-			else
-			{ //small or no change, just snap to target distance
-				current_distance = target_distance;
-			}
+            LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+            F32 target_distance = 16.f;
+            if (!focus_point.isExactlyZero())
+            {
+                target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye);
+            }
 
-			//convert to mm
-			F32 subject_distance = current_distance*1000.f;
-			F32 fnumber = CameraFNumber;
-			F32 default_focal_length = CameraFocalLength;
+            if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f)
+            { // large shift happened, interpolate smoothly to new target distance
+                transition_time = 0.f;
+                start_distance = current_distance;
+            }
+            else if (transition_time < 1.f)
+            { // currently in a transition, continue interpolating
+                transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value();
+                transition_time = llmin(transition_time, 1.f);
 
-			F32 fov = LLViewerCamera::getInstance()->getView();
-		
-			const F32 default_fov = CameraFieldOfView * F_PI/180.f;
-		
-			//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
-		
-			F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
+                F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f;
+                current_distance = start_distance + (target_distance - start_distance) * t;
+            }
+            else
+            { // small or no change, just snap to target distance
+                current_distance = target_distance;
+            }
 
-			F32 focal_length = dv/(2*tanf(fov/2.f));
-		 
-			//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
-	
-			// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
-			// where	 N = fnumber
-			//			 s2 = dot distance
-			//			 s1 = subject distance
-			//			 f = focal length
-			//	
+            // convert to mm
+            F32 subject_distance = current_distance * 1000.f;
+            F32 fnumber = CameraFNumber;
+            F32 default_focal_length = CameraFocalLength;
 
-			F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
-			blur_constant /= 1000.f; //convert to meters for shader
-			F32 magnification = focal_length/(subject_distance-focal_length);
+            F32 fov = LLViewerCamera::getInstance()->getView();
 
-			{ //build diffuse+bloom+CoF
-				mDeferredLight.bindTarget();
-				shader = &gDeferredCoFProgram;
+            const F32 default_fov = CameraFieldOfView * F_PI / 180.f;
 
-				bindDeferredShader(*shader);
+            // F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
 
-				S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
-				if (channel > -1)
-				{
-					mScreen.bindTexture(0, channel);
-				}
+            F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f);
 
-				shader->uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance/1000.f);
-				shader->uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
-				shader->uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f/LLDrawable::sCurPixelAngle));
-				shader->uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
-				shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
-				shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+            F32 focal_length = dv / (2 * tanf(fov / 2.f));
 
-				gGL.begin(LLRender::TRIANGLE_STRIP);
-				gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-				gGL.vertex2f(-1,-1);
-		
-				gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-				gGL.vertex2f(-1,3);
-		
-				gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-				gGL.vertex2f(3,-1);
-		
-				gGL.end();
+            // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
 
-				unbindDeferredShader(*shader);
-				mDeferredLight.flush();
-			}
+            // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+            // where	 N = fnumber
+            //			 s2 = dot distance
+            //			 s1 = subject distance
+            //			 f = focal length
+            //
 
-			U32 dof_width = (U32) (mScreen.getWidth()*CameraDoFResScale);
-			U32 dof_height = (U32) (mScreen.getHeight()*CameraDoFResScale);
-			
-			{ //perform DoF sampling at half-res (preserve alpha channel)
-				mScreen.bindTarget();
-				glViewport(0,0, dof_width, dof_height);
-				gGL.setColorMask(true, false);
+            F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length));
+            blur_constant /= 1000.f; // convert to meters for shader
+            F32 magnification = focal_length / (subject_distance - focal_length);
 
-				shader = &gDeferredPostProgram;
-				bindDeferredShader(*shader);
-				S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
-				if (channel > -1)
-				{
-					mDeferredLight.bindTexture(0, channel);
-				}
+            { // build diffuse+bloom+CoF
+                mDeferredLight.bindTarget();
+                shader = &gDeferredCoFProgram;
 
-				shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
-				shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
-				
-				gGL.begin(LLRender::TRIANGLE_STRIP);
-				gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-				gGL.vertex2f(-1,-1);
-		
-				gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-				gGL.vertex2f(-1,3);
-		
-				gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-				gGL.vertex2f(3,-1);
-		
-				gGL.end();
+                bindDeferredShader(*shader);
 
-				unbindDeferredShader(*shader);
-				mScreen.flush();
-				gGL.setColorMask(true, true);
-			}
-	
-			{ //combine result based on alpha
-				if (multisample)
-				{
-					mDeferredLight.bindTarget();
-					glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
-				}
-				else
-				{
-					gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
-					gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
-					gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
-					gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
-					glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
-				}
+                S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+                if (channel > -1)
+                {
+                    mScreen.bindTexture(0, channel);
+                }
 
-				shader = &gDeferredDoFCombineProgram;
-				bindDeferredShader(*shader);
-				
-				S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
-				if (channel > -1)
-				{
-					mScreen.bindTexture(0, channel);
-				}
+                shader->uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f);
+                shader->uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
+                shader->uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle));
+                shader->uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
+                shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+                shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
 
-				shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
-				shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
-				shader->uniform1f(LLShaderMgr::DOF_WIDTH, dof_width-1);
-				shader->uniform1f(LLShaderMgr::DOF_HEIGHT, dof_height-1);
+                gGL.begin(LLRender::TRIANGLE_STRIP);
+                gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+                gGL.vertex2f(-1, -1);
 
-				gGL.begin(LLRender::TRIANGLE_STRIP);
-				gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-				gGL.vertex2f(-1,-1);
-		
-				gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-				gGL.vertex2f(-1,3);
-		
-				gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-				gGL.vertex2f(3,-1);
-		
-				gGL.end();
+                gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+                gGL.vertex2f(-1, 3);
 
-				unbindDeferredShader(*shader);
+                gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+                gGL.vertex2f(3, -1);
 
-				if (multisample)
-				{
-					mDeferredLight.flush();
-				}
-			}
-		}
-		else
-		{
-			if (multisample)
-			{
-				mDeferredLight.bindTarget();
-			}
-			LLGLSLShader* shader = &gDeferredPostNoDoFProgram;
-			
-			bindDeferredShader(*shader);
-							
-			S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
-			if (channel > -1)
-			{
-				mScreen.bindTexture(0, channel);
-			}
+                gGL.end();
 
-			gGL.begin(LLRender::TRIANGLE_STRIP);
-			gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-			gGL.vertex2f(-1,-1);
-		
-			gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-			gGL.vertex2f(-1,3);
-		
-			gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-			gGL.vertex2f(3,-1);
-		
-			gGL.end();
+                unbindDeferredShader(*shader);
+                mDeferredLight.flush();
+            }
 
-			unbindDeferredShader(*shader);
+            U32 dof_width = (U32)(mScreen.getWidth() * CameraDoFResScale);
+            U32 dof_height = (U32)(mScreen.getHeight() * CameraDoFResScale);
 
-			if (multisample)
-			{
-				mDeferredLight.flush();
-			}
-		}
+            { // perform DoF sampling at half-res (preserve alpha channel)
+                mScreen.bindTarget();
+                glViewport(0, 0, dof_width, dof_height);
+                gGL.setColorMask(true, false);
 
-		if (multisample)
-		{
-			//bake out texture2D with RGBL for FXAA shader
-			mFXAABuffer.bindTarget();
-			
-			S32 width = mScreen.getWidth();
-			S32 height = mScreen.getHeight();
-			glViewport(0, 0, width, height);
+                shader = &gDeferredPostProgram;
+                bindDeferredShader(*shader);
+                S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+                if (channel > -1)
+                {
+                    mDeferredLight.bindTexture(0, channel);
+                }
 
-			LLGLSLShader* shader = &gGlowCombineFXAAProgram;
+                shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+                shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
 
-			shader->bind();
-			shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height);
+                gGL.begin(LLRender::TRIANGLE_STRIP);
+                gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+                gGL.vertex2f(-1, -1);
 
-			S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
-			if (channel > -1)
-			{
-				mDeferredLight.bindTexture(0, channel);
-			}
-						
-			gGL.begin(LLRender::TRIANGLE_STRIP);
-			gGL.vertex2f(-1,-1);
-			gGL.vertex2f(-1,3);
-			gGL.vertex2f(3,-1);
-			gGL.end();
+                gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+                gGL.vertex2f(-1, 3);
 
-			gGL.flush();
+                gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+                gGL.vertex2f(3, -1);
 
-			shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
-			shader->unbind();
-			
-			mFXAABuffer.flush();
+                gGL.end();
 
-			shader = &gFXAAProgram;
-			shader->bind();
+                unbindDeferredShader(*shader);
+                mScreen.flush();
+                gGL.setColorMask(true, true);
+            }
 
-			channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAABuffer.getUsage());
-			if (channel > -1)
-			{
-				mFXAABuffer.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
-			}
-			
-			gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
-			gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
-			gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
-			gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
-			glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
-
-			F32 scale_x = (F32) width/mFXAABuffer.getWidth();
-			F32 scale_y = (F32) height/mFXAABuffer.getHeight();
-			shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
-			shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f/width*scale_x, 1.f/height*scale_y);
-			shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f/width*scale_x, -0.5f/height*scale_y, 0.5f/width*scale_x, 0.5f/height*scale_y);
-			shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f/width*scale_x, -2.f/height*scale_y, 2.f/width*scale_x, 2.f/height*scale_y);
-			
-			gGL.begin(LLRender::TRIANGLE_STRIP);
-			gGL.vertex2f(-1,-1);
-			gGL.vertex2f(-1,3);
-			gGL.vertex2f(3,-1);
-			gGL.end();
+            { // combine result based on alpha
+                if (multisample)
+                {
+                    mDeferredLight.bindTarget();
+                    glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
+                }
+                else
+                {
+                    gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+                    gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+                    gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+                    gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+                    glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+                }
 
-			gGL.flush();
-			shader->unbind();
-		}
-	}
-	else
-	{
-		U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
-		LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
-		buff->allocateBuffer(3,0,TRUE);
+                shader = &gDeferredDoFCombineProgram;
+                bindDeferredShader(*shader);
 
-		LLStrider<LLVector3> v;
-		LLStrider<LLVector2> uv1;
-		LLStrider<LLVector2> uv2;
+                S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+                if (channel > -1)
+                {
+                    mScreen.bindTexture(0, channel);
+                }
 
-		buff->getVertexStrider(v);
-		buff->getTexCoord0Strider(uv1);
-		buff->getTexCoord1Strider(uv2);
-		
-		uv1[0] = LLVector2(0, 0);
-		uv1[1] = LLVector2(0, 2);
-		uv1[2] = LLVector2(2, 0);
-		
-		uv2[0] = LLVector2(0, 0);
-		uv2[1] = LLVector2(0, tc2.mV[1]*2.f);
-		uv2[2] = LLVector2(tc2.mV[0]*2.f, 0);
-		
-		v[0] = LLVector3(-1,-1,0);
-		v[1] = LLVector3(-1,3,0);
-		v[2] = LLVector3(3,-1,0);
-				
-		buff->flush();
+                shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+                shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+                shader->uniform1f(LLShaderMgr::DOF_WIDTH, dof_width - 1);
+                shader->uniform1f(LLShaderMgr::DOF_HEIGHT, dof_height - 1);
 
-		LLGLDisable blend(GL_BLEND);
+                gGL.begin(LLRender::TRIANGLE_STRIP);
+                gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+                gGL.vertex2f(-1, -1);
 
-		if (LLGLSLShader::sNoFixedFunction)
-		{
-			gGlowCombineProgram.bind();
-		}
-		else
-		{
-			//tex unit 0
-			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
-			//tex unit 1
-			gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
-		}
-		
-		gGL.getTexUnit(0)->bind(&mGlow[1]);
-		gGL.getTexUnit(1)->bind(&mScreen);
-		
-		LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
-		
-		buff->setBuffer(mask);
-		buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
-		
-		if (LLGLSLShader::sNoFixedFunction)
-		{
-			gGlowCombineProgram.unbind();
-		}
-		else
-		{
-			gGL.getTexUnit(1)->disable();
-			gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+                gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+                gGL.vertex2f(-1, 3);
 
-			gGL.getTexUnit(0)->activate();
-			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
-		}
-		
-	}
+                gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+                gGL.vertex2f(3, -1);
 
-	gGL.setSceneBlendType(LLRender::BT_ALPHA);
+                gGL.end();
 
-	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
-	{
-		if (LLGLSLShader::sNoFixedFunction)
-		{
-			gSplatTextureRectProgram.bind();
-		}
+                unbindDeferredShader(*shader);
 
-		gGL.setColorMask(true, false);
+                if (multisample)
+                {
+                    mDeferredLight.flush();
+                }
+            }
+        }
+        else
+        {
+            if (multisample)
+            {
+                mDeferredLight.bindTarget();
+            }
+            LLGLSLShader *shader = &gDeferredPostNoDoFProgram;
 
-		LLVector2 tc1(0,0);
-		LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
-				  (F32) gViewerWindow->getWorldViewHeightRaw()*2);
+            bindDeferredShader(*shader);
 
-		LLGLEnable blend(GL_BLEND);
-		gGL.color4f(1,1,1,0.75f);
+            S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+            if (channel > -1)
+            {
+                mScreen.bindTexture(0, channel);
+            }
 
-		gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
+            gGL.begin(LLRender::TRIANGLE_STRIP);
+            gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+            gGL.vertex2f(-1, -1);
 
-		gGL.begin(LLRender::TRIANGLES);
-		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-		gGL.vertex2f(-1,-1);
-		
-		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-		gGL.vertex2f(-1,3);
-		
-		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-		gGL.vertex2f(3,-1);
-		
-		gGL.end();
-		gGL.flush();
+            gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+            gGL.vertex2f(-1, 3);
 
-		if (LLGLSLShader::sNoFixedFunction)
-		{
-			gSplatTextureRectProgram.unbind();
-		}
-	}
+            gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+            gGL.vertex2f(3, -1);
 
-	
-	if (LLRenderTarget::sUseFBO)
-	{ //copy depth buffer from mScreen to framebuffer
-		LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(), 
-			0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-	}
-	
+            gGL.end();
 
-	gGL.matrixMode(LLRender::MM_PROJECTION);
-	gGL.popMatrix();
-	gGL.matrixMode(LLRender::MM_MODELVIEW);
-	gGL.popMatrix();
+            unbindDeferredShader(*shader);
 
-	LLVertexBuffer::unbind();
+            if (multisample)
+            {
+                mDeferredLight.flush();
+            }
+        }
 
-	LLGLState::checkStates();
-	LLGLState::checkTextureChannels();
+        if (multisample)
+        {
+            // bake out texture2D with RGBL for FXAA shader
+            mFXAABuffer.bindTarget();
+
+            S32 width = mScreen.getWidth();
+            S32 height = mScreen.getHeight();
+            glViewport(0, 0, width, height);
+
+            LLGLSLShader *shader = &gGlowCombineFXAAProgram;
+
+            shader->bind();
+            shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height);
+
+            S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+            if (channel > -1)
+            {
+                mDeferredLight.bindTexture(0, channel);
+            }
+
+            gGL.begin(LLRender::TRIANGLE_STRIP);
+            gGL.vertex2f(-1, -1);
+            gGL.vertex2f(-1, 3);
+            gGL.vertex2f(3, -1);
+            gGL.end();
+
+            gGL.flush();
+
+            shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+            shader->unbind();
+
+            mFXAABuffer.flush();
+
+            shader = &gFXAAProgram;
+            shader->bind();
+
+            channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAABuffer.getUsage());
+            if (channel > -1)
+            {
+                mFXAABuffer.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
+            }
+
+            gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+            gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+            gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+            gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+            glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+
+            F32 scale_x = (F32) width / mFXAABuffer.getWidth();
+            F32 scale_y = (F32) height / mFXAABuffer.getHeight();
+            shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
+            shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y);
+            shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y,
+                              0.5f / width * scale_x, 0.5f / height * scale_y);
+            shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y,
+                              2.f / width * scale_x, 2.f / height * scale_y);
+
+            gGL.begin(LLRender::TRIANGLE_STRIP);
+            gGL.vertex2f(-1, -1);
+            gGL.vertex2f(-1, 3);
+            gGL.vertex2f(3, -1);
+            gGL.end();
+
+            gGL.flush();
+            shader->unbind();
+        }
+    }
+    else // not deferred
+    {
+        U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
+        LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
+        buff->allocateBuffer(3, 0, TRUE);
+
+        LLStrider<LLVector3> v;
+        LLStrider<LLVector2> uv1;
+        LLStrider<LLVector2> uv2;
+
+        buff->getVertexStrider(v);
+        buff->getTexCoord0Strider(uv1);
+        buff->getTexCoord1Strider(uv2);
+
+        uv1[0] = LLVector2(0, 0);
+        uv1[1] = LLVector2(0, 2);
+        uv1[2] = LLVector2(2, 0);
+
+        uv2[0] = LLVector2(0, 0);
+        uv2[1] = LLVector2(0, tc2.mV[1] * 2.f);
+        uv2[2] = LLVector2(tc2.mV[0] * 2.f, 0);
+
+        v[0] = LLVector3(-1, -1, 0);
+        v[1] = LLVector3(-1, 3, 0);
+        v[2] = LLVector3(3, -1, 0);
+
+        buff->flush();
+
+        LLGLDisable blend(GL_BLEND);
+
+        if (LLGLSLShader::sNoFixedFunction)
+        {
+            gGlowCombineProgram.bind();
+        }
+        else
+        {
+            // tex unit 0
+            gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
+            // tex unit 1
+            gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR,
+                                                    LLTexUnit::TBS_PREV_COLOR);
+        }
+
+        gGL.getTexUnit(0)->bind(&mGlow[1]);
+        gGL.getTexUnit(1)->bind(&mScreen);
+
+        LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
+
+        buff->setBuffer(mask);
+        buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
+
+        if (LLGLSLShader::sNoFixedFunction)
+        {
+            gGlowCombineProgram.unbind();
+        }
+        else
+        {
+            gGL.getTexUnit(1)->disable();
+            gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+
+            gGL.getTexUnit(0)->activate();
+            gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+        }
+    }
+
+    gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+    if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+    {
+        if (LLGLSLShader::sNoFixedFunction)
+        {
+            gSplatTextureRectProgram.bind();
+        }
+
+        gGL.setColorMask(true, false);
+
+        LLVector2 tc1(0, 0);
+        LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw() * 2,
+                      (F32) gViewerWindow->getWorldViewHeightRaw() * 2);
+
+        LLGLEnable blend(GL_BLEND);
+        gGL.color4f(1, 1, 1, 0.75f);
+
+        gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
+
+        gGL.begin(LLRender::TRIANGLES);
+        gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+        gGL.vertex2f(-1, -1);
+
+        gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+        gGL.vertex2f(-1, 3);
+
+        gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+        gGL.vertex2f(3, -1);
+
+        gGL.end();
+        gGL.flush();
+
+        if (LLGLSLShader::sNoFixedFunction)
+        {
+            gSplatTextureRectProgram.unbind();
+        }
+    }
+
+    if (LLRenderTarget::sUseFBO)
+    { // copy depth buffer from mScreen to framebuffer
+        LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(), 0, 0,
+                                                  mScreen.getWidth(), mScreen.getHeight(),
+                                                  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
+    }
+
+    gGL.matrixMode(LLRender::MM_PROJECTION);
+    gGL.popMatrix();
+    gGL.matrixMode(LLRender::MM_MODELVIEW);
+    gGL.popMatrix();
+
+    LLVertexBuffer::unbind();
 
+    LLGLState::checkStates();
+    LLGLState::checkTextureChannels();
 }
 
 static LLTrace::BlockTimerStatHandle FTM_BIND_DEFERRED("Bind Deferred");
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index fe60eb69f8..600bdd9d06 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -139,7 +139,7 @@ public:
 	void resetVertexBuffers(LLDrawable* drawable);
 	void generateImpostor(LLVOAvatar* avatar);
 	void bindScreenToTexture();
-	void renderPost(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
+	void renderFinalize();
 
 	void init();
 	void cleanup();
-- 
cgit v1.2.3


From c09e933012d4ba607a066f0e857c1e5e543a59c3 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 27 Jul 2020 23:06:05 +0300
Subject: SL-13650 Ice level Slider Graduation

---
 indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
index bec793bbee..6f82a0efa1 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
@@ -203,10 +203,10 @@
                         Ice Level:
                     </text>
                     <slider
-                            decimal_digits="1"
+                            decimal_digits="3"
                             follows="left|top"
                             height="14"
-                            increment="0.1"
+                            increment="0.001"
                             initial_value="0"
                             left_delta="5"
                             top_delta="20"
-- 
cgit v1.2.3


From 3236b1a806acf0743d62e9bba18873de8fd4dec1 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 29 Jul 2020 10:45:39 -0600
Subject: SL-13406 fix an end-scope enable error in glow rendering

---
 indra/newview/pipeline.cpp | 39 +++++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3f8f7b278f..df5765c99b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7592,33 +7592,36 @@ void LLPipeline::renderFinalize()
         gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1],
                                       warmthWeights.mV[2]);
         gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
-        LLGLEnable blend_on(GL_BLEND);
-        LLGLEnable test(GL_ALPHA_TEST);
+        
+        {
+            LLGLEnable blend_on(GL_BLEND);
+            LLGLEnable test(GL_ALPHA_TEST);
 
-        gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
+            gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
 
-        mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT);
+            mScreen.bindTexture(0, 0, LLTexUnit::TFO_POINT);
 
-        gGL.color4f(1, 1, 1, 1);
-        gPipeline.enableLightsFullbright();
-        gGL.begin(LLRender::TRIANGLE_STRIP);
-        gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-        gGL.vertex2f(-1, -1);
+            gGL.color4f(1, 1, 1, 1);
+            gPipeline.enableLightsFullbright();
+            gGL.begin(LLRender::TRIANGLE_STRIP);
+            gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+            gGL.vertex2f(-1, -1);
 
-        gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-        gGL.vertex2f(-1, 3);
+            gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+            gGL.vertex2f(-1, 3);
 
-        gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-        gGL.vertex2f(3, -1);
+            gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+            gGL.vertex2f(3, -1);
 
-        gGL.end();
+            gGL.end();
 
-        gGL.getTexUnit(0)->unbind(mScreen.getUsage());
+            gGL.getTexUnit(0)->unbind(mScreen.getUsage());
 
-        mGlow[2].flush();
+            mGlow[2].flush();
 
-        tc1.setVec(0, 0);
-        tc2.setVec(2, 2);
+            tc1.setVec(0, 0);
+            tc2.setVec(2, 2); 
+        }
 
         // power of two between 1 and 1024
         U32 glowResPow = RenderGlowResolutionPow;
-- 
cgit v1.2.3


From 107a7fec34df0160c959de81d0d682ec671b5958 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 4 Aug 2020 17:14:19 -0600
Subject: SL-13521 add an avatar appearance light to deferred mode

---
 indra/llrender/llrender.cpp |  2 +-
 indra/newview/pipeline.cpp  | 20 +++++++++++++-------
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index cabf0528f0..e0d1ee4f4c 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1216,7 +1216,7 @@ void LLRender::syncLightState()
         LLVector3 diffuse_b[8];
         bool      sun_primary[8];
 
-		for (U32 i = 0; i < 8; i++)
+		for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; i++)
 		{
 			LLLightState* light = mLightState[i];
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index df5765c99b..fc382c3bcc 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6435,13 +6435,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
 			F32 x = 3.f;
 		float linatten = x / (light_radius); // % of brightness at radius
 
-		if (LLPipeline::sRenderDeferred)
-		{
-			/*light_color.mV[0] = powf(light_color.mV[0], 2.2f);
-			light_color.mV[1] = powf(light_color.mV[1], 2.2f);
-			light_color.mV[2] = powf(light_color.mV[2], 2.2f);*/
-		}
-
 		mHWLightColors[2] = light_color;
 		LLLightState* light = gGL.getLight(2);
 
@@ -8813,6 +8806,19 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
                         light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF)));
 					}
 				}
+
+                // If we're in avatar editing mode (3), add an avatar appearance light at the camera position 
+                if (gAgentAvatarp && gAgentAvatarp->mSpecialRenderMode == 3)
+                {
+                    // Cam coords (post-transform) are 0,0,0, with radius 15m
+                    fullscreen_lights.push_back(LLVector4(0.f, 0.f, 0.f, 15.0f));
+
+                    // Use a white light
+                    LLVector4 white_light(LLColor4::white.mV);
+                    white_light.mV[3] = 0.0f;
+                    light_colors.push_back(white_light);
+                }
+
 				unbindDeferredShader(gDeferredLightProgram);
 			}
 
-- 
cgit v1.2.3


From 087c294e01de8d44cdcbbc04d26276904da45bb3 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 4 Aug 2020 17:34:43 -0600
Subject: SL-13521, clang-format renderDeferredLighting() for consistency

---
 .clang-format              |  37 +-
 indra/newview/pipeline.cpp | 971 +++++++++++++++++++++++----------------------
 2 files changed, 506 insertions(+), 502 deletions(-)

diff --git a/.clang-format b/.clang-format
index 0b19cae838..61c5acde88 100644
--- a/.clang-format
+++ b/.clang-format
@@ -1,16 +1,17 @@
 ---
+# clang-format version 10.0.0+
 Language:        Cpp
 # BasedOnStyle:  Microsoft
 AccessModifierOffset: -2
 AlignAfterOpenBracket: Align
-AlignConsecutiveMacros: false
-AlignConsecutiveAssignments: false
-AlignConsecutiveDeclarations: false
-AlignEscapedNewlines: Right
+AlignConsecutiveMacros: true
+AlignConsecutiveAssignments: true
+AlignConsecutiveDeclarations: true
+AlignEscapedNewlines: Left
 AlignOperands:   true
 AlignTrailingComments: true
-AllowAllArgumentsOnNextLine: true
-AllowAllConstructorInitializersOnNextLine: true
+AllowAllArgumentsOnNextLine: false
+AllowAllConstructorInitializersOnNextLine: false
 AllowAllParametersOfDeclarationOnNextLine: true
 AllowShortBlocksOnASingleLine: Always
 AllowShortCaseLabelsOnASingleLine: false
@@ -22,21 +23,21 @@ AlwaysBreakAfterDefinitionReturnType: None
 AlwaysBreakAfterReturnType: None
 AlwaysBreakBeforeMultilineStrings: false
 AlwaysBreakTemplateDeclarations: MultiLine
-BinPackArguments: true
-BinPackParameters: true
+BinPackArguments: false
+BinPackParameters: false
 BreakBeforeBinaryOperators: None
 BreakBeforeBraces: Allman
 BreakBeforeInheritanceComma: false
 BreakInheritanceList: BeforeColon
 BreakBeforeTernaryOperators: true
-BreakConstructorInitializersBeforeComma: false
-BreakConstructorInitializers: BeforeColon
+BreakConstructorInitializersBeforeComma: true
+BreakConstructorInitializers: AfterColon
 BreakAfterJavaFieldAnnotations: false
 BreakStringLiterals: true
-ColumnLimit:     120
+ColumnLimit:     140
 CommentPragmas:  '^ IWYU pragma:'
 CompactNamespaces: false
-ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
 ConstructorInitializerIndentWidth: 4
 ContinuationIndentWidth: 4
 Cpp11BracedListStyle: true
@@ -62,18 +63,18 @@ IncludeCategories:
     SortPriority:    0
 IncludeIsMainRegex: '(Test)?$'
 IncludeIsMainSourceRegex: ''
-IndentCaseLabels: false
+IndentCaseLabels: true
 IndentGotoLabels: true
 IndentPPDirectives: None
 IndentWidth:     4
 IndentWrappedFunctionNames: false
 JavaScriptQuotes: Leave
 JavaScriptWrapImports: true
-KeepEmptyLinesAtTheStartOfBlocks: true
+KeepEmptyLinesAtTheStartOfBlocks: false
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
 MaxEmptyLinesToKeep: 1
-NamespaceIndentation: None
+NamespaceIndentation: Inner
 ObjCBinPackProtocolList: Auto
 ObjCBlockIndentWidth: 2
 ObjCSpaceAfterProperty: false
@@ -94,16 +95,16 @@ SpaceAfterCStyleCast: true
 SpaceAfterLogicalNot: false
 SpaceAfterTemplateKeyword: true
 SpaceBeforeAssignmentOperators: true
-SpaceBeforeCpp11BracedList: false
+SpaceBeforeCpp11BracedList: true
 SpaceBeforeCtorInitializerColon: true
 SpaceBeforeInheritanceColon: true
 SpaceBeforeParens: ControlStatements
 SpaceBeforeRangeBasedForLoopColon: true
 SpaceInEmptyBlock: false
 SpaceInEmptyParentheses: false
-SpacesBeforeTrailingComments: 1
+SpacesBeforeTrailingComments: 2
 SpacesInAngles:  false
-SpacesInContainerLiterals: true
+SpacesInContainerLiterals: false
 SpacesInCStyleCastParentheses: false
 SpacesInParentheses: false
 SpacesInSquareBrackets: false
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index fc382c3bcc..456b98b1e8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8433,292 +8433,301 @@ static LLTrace::BlockTimerStatHandle FTM_FULLSCREEN_LIGHTS("Fullscreen Lights");
 static LLTrace::BlockTimerStatHandle FTM_PROJECTORS("Projectors");
 static LLTrace::BlockTimerStatHandle FTM_POST("Post");
 
-
-void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
+void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
 {
-	if (!sCull)
-	{
-		return;
-	}
+    if (!sCull)
+    {
+        return;
+    }
 
-    LLRenderTarget* deferred_target       = &mDeferredScreen;
-    LLRenderTarget* deferred_depth_target = &mDeferredDepth;
-    LLRenderTarget* deferred_light_target = &mDeferredLight;
+    LLRenderTarget *deferred_target       = &mDeferredScreen;
+    LLRenderTarget *deferred_depth_target = &mDeferredDepth;
+    LLRenderTarget *deferred_light_target = &mDeferredLight;
 
-	{
-		LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);
-		LLViewerCamera* camera = LLViewerCamera::getInstance();
-		{
-			LLGLDepthTest depth(GL_TRUE);
-            deferred_depth_target->copyContents(*deferred_target, 0, 0, deferred_target->getWidth(), deferred_target->getHeight(),
-                            0, 0, deferred_depth_target->getWidth(), deferred_depth_target->getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);  
-		}
+    {
+        LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);
+        LLViewerCamera *camera = LLViewerCamera::getInstance();
+        {
+            LLGLDepthTest depth(GL_TRUE);
+            deferred_depth_target->copyContents(*deferred_target,
+                                                0,
+                                                0,
+                                                deferred_target->getWidth(),
+                                                deferred_target->getHeight(),
+                                                0,
+                                                0,
+                                                deferred_depth_target->getWidth(),
+                                                deferred_depth_target->getHeight(),
+                                                GL_DEPTH_BUFFER_BIT,
+                                                GL_NEAREST);
+        }
 
-		LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
+        LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
 
-		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
-		{
-			gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
-		}
+        if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
+        {
+            gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
+        }
 
-		//ati doesn't seem to love actually using the stencil buffer on FBO's
-		LLGLDisable stencil(GL_STENCIL_TEST);
-		//glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
-		//glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+        // ati doesn't seem to love actually using the stencil buffer on FBO's
+        LLGLDisable stencil(GL_STENCIL_TEST);
+        // glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
+        // glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 
-		gGL.setColorMask(true, true);
-		
-		//draw a cube around every light
-		LLVertexBuffer::unbind();
+        gGL.setColorMask(true, true);
 
-		LLGLEnable cull(GL_CULL_FACE);
-		LLGLEnable blend(GL_BLEND);
+        // draw a cube around every light
+        LLVertexBuffer::unbind();
+
+        LLGLEnable cull(GL_CULL_FACE);
+        LLGLEnable blend(GL_BLEND);
 
         glh::matrix4f mat = copy_matrix(gGLModelView);
 
-		LLStrider<LLVector3> vert; 
-		mDeferredVB->getVertexStrider(vert);
-		
-		vert[0].set(-1,1,0);
-		vert[1].set(-1,-3,0);
-		vert[2].set(3,1,0);
-		
-        setupHWLights(NULL); //to set mSun/MoonDir;
+        LLStrider<LLVector3> vert;
+        mDeferredVB->getVertexStrider(vert);
+
+        vert[0].set(-1, 1, 0);
+        vert[1].set(-1, -3, 0);
+        vert[2].set(3, 1, 0);
+
+        setupHWLights(NULL);  // to set mSun/MoonDir;
 
         glh::vec4f tc(mSunDir.mV);
-			mat.mult_matrix_vec(tc);
-			mTransformedSunDir.set(tc.v);
+        mat.mult_matrix_vec(tc);
+        mTransformedSunDir.set(tc.v);
 
         glh::vec4f tc_moon(mMoonDir.mV);
         mat.mult_matrix_vec(tc_moon);
         mTransformedMoonDir.set(tc_moon.v);
 
-		gGL.pushMatrix();
-		gGL.loadIdentity();
-		gGL.matrixMode(LLRender::MM_PROJECTION);
-		gGL.pushMatrix();
-		gGL.loadIdentity();
+        gGL.pushMatrix();
+        gGL.loadIdentity();
+        gGL.matrixMode(LLRender::MM_PROJECTION);
+        gGL.pushMatrix();
+        gGL.loadIdentity();
 
-		if (RenderDeferredSSAO || RenderShadowDetail > 0)
-		{
+        if (RenderDeferredSSAO || RenderShadowDetail > 0)
+        {
             deferred_light_target->bindTarget();
-			{ //paint shadow/SSAO light map (direct lighting lightmap)
-				LL_RECORD_BLOCK_TIME(FTM_SUN_SHADOW);
+            {  // paint shadow/SSAO light map (direct lighting lightmap)
+                LL_RECORD_BLOCK_TIME(FTM_SUN_SHADOW);
                 bindDeferredShader(gDeferredSunProgram, deferred_light_target);
-				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-				glClearColor(1,1,1,1);
+                mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+                glClearColor(1, 1, 1, 1);
                 deferred_light_target->clear(GL_COLOR_BUFFER_BIT);
-				glClearColor(0,0,0,0);
+                glClearColor(0, 0, 0, 0);
 
                 glh::matrix4f inv_trans = get_current_modelview().inverse().transpose();
 
-				const U32 slice = 32;
-				F32 offset[slice*3];
-				for (U32 i = 0; i < 4; i++)
-				{
-					for (U32 j = 0; j < 8; j++)
-					{
-						glh::vec3f v;
-						v.set_value(sinf(6.284f/8*j), cosf(6.284f/8*j), -(F32) i);
-						v.normalize();
-						inv_trans.mult_matrix_vec(v);
-						v.normalize();
-						offset[(i*8+j)*3+0] = v.v[0];
-						offset[(i*8+j)*3+1] = v.v[2];
-						offset[(i*8+j)*3+2] = v.v[1];
-					}
-				}
+                const U32 slice = 32;
+                F32       offset[slice * 3];
+                for (U32 i = 0; i < 4; i++)
+                {
+                    for (U32 j = 0; j < 8; j++)
+                    {
+                        glh::vec3f v;
+                        v.set_value(sinf(6.284f / 8 * j), cosf(6.284f / 8 * j), -(F32) i);
+                        v.normalize();
+                        inv_trans.mult_matrix_vec(v);
+                        v.normalize();
+                        offset[(i * 8 + j) * 3 + 0] = v.v[0];
+                        offset[(i * 8 + j) * 3 + 1] = v.v[2];
+                        offset[(i * 8 + j) * 3 + 2] = v.v[1];
+                    }
+                }
 
-				gDeferredSunProgram.uniform3fv(sOffset, slice, offset);
-                gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, deferred_light_target->getWidth(), deferred_light_target->getHeight());
-				
-				{
-					LLGLDisable blend(GL_BLEND);
-					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
-					stop_glerror();
-					mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-					stop_glerror();
-				}
-				
-				unbindDeferredShader(gDeferredSunProgram);
-			}
+                gDeferredSunProgram.uniform3fv(sOffset, slice, offset);
+                gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
+                                              deferred_light_target->getWidth(),
+                                              deferred_light_target->getHeight());
+
+                {
+                    LLGLDisable   blend(GL_BLEND);
+                    LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+                    stop_glerror();
+                    mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                    stop_glerror();
+                }
+
+                unbindDeferredShader(gDeferredSunProgram);
+            }
             deferred_light_target->flush();
-		}
-		
-		if (RenderDeferredSSAO)
-		{ //soften direct lighting lightmap
-			LL_RECORD_BLOCK_TIME(FTM_SOFTEN_SHADOW);
-			//blur lightmap
+        }
+
+        if (RenderDeferredSSAO)
+        {  // soften direct lighting lightmap
+            LL_RECORD_BLOCK_TIME(FTM_SOFTEN_SHADOW);
+            // blur lightmap
             screen_target->bindTarget();
-			glClearColor(1,1,1,1);
+            glClearColor(1, 1, 1, 1);
             screen_target->clear(GL_COLOR_BUFFER_BIT);
-			glClearColor(0,0,0,0);
-			
-			bindDeferredShader(gDeferredBlurLightProgram);
-			mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-			LLVector3 go = RenderShadowGaussian;
-			const U32 kern_length = 4;
-			F32 blur_size = RenderShadowBlurSize;
-			F32 dist_factor = RenderShadowBlurDistFactor;
+            glClearColor(0, 0, 0, 0);
 
-			// sample symmetrically with the middle sample falling exactly on 0.0
-			F32 x = 0.f;
+            bindDeferredShader(gDeferredBlurLightProgram);
+            mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+            LLVector3 go          = RenderShadowGaussian;
+            const U32 kern_length = 4;
+            F32       blur_size   = RenderShadowBlurSize;
+            F32       dist_factor = RenderShadowBlurDistFactor;
 
-			LLVector3 gauss[32]; // xweight, yweight, offset
+            // sample symmetrically with the middle sample falling exactly on 0.0
+            F32 x = 0.f;
 
-			for (U32 i = 0; i < kern_length; i++)
-			{
-				gauss[i].mV[0] = llgaussian(x, go.mV[0]);
-				gauss[i].mV[1] = llgaussian(x, go.mV[1]);
-				gauss[i].mV[2] = x;
-				x += 1.f;
-			}
+            LLVector3 gauss[32];  // xweight, yweight, offset
+
+            for (U32 i = 0; i < kern_length; i++)
+            {
+                gauss[i].mV[0] = llgaussian(x, go.mV[0]);
+                gauss[i].mV[1] = llgaussian(x, go.mV[1]);
+                gauss[i].mV[2] = x;
+                x += 1.f;
+            }
+
+            gDeferredBlurLightProgram.uniform2f(sDelta, 1.f, 0.f);
+            gDeferredBlurLightProgram.uniform1f(sDistFactor, dist_factor);
+            gDeferredBlurLightProgram.uniform3fv(sKern, kern_length, gauss[0].mV);
+            gDeferredBlurLightProgram.uniform1f(sKernScale, blur_size * (kern_length / 2.f - 0.5f));
+
+            {
+                LLGLDisable   blend(GL_BLEND);
+                LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+                stop_glerror();
+                mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                stop_glerror();
+            }
 
-			gDeferredBlurLightProgram.uniform2f(sDelta, 1.f, 0.f);
-			gDeferredBlurLightProgram.uniform1f(sDistFactor, dist_factor);
-			gDeferredBlurLightProgram.uniform3fv(sKern, kern_length, gauss[0].mV);
-			gDeferredBlurLightProgram.uniform1f(sKernScale, blur_size * (kern_length/2.f - 0.5f));
-		
-			{
-				LLGLDisable blend(GL_BLEND);
-				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
-				stop_glerror();
-				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-				stop_glerror();
-			}
-			
             screen_target->flush();
-			unbindDeferredShader(gDeferredBlurLightProgram);
+            unbindDeferredShader(gDeferredBlurLightProgram);
 
             bindDeferredShader(gDeferredBlurLightProgram, screen_target);
 
-			mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+            mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
             deferred_light_target->bindTarget();
 
-			gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f);
+            gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f);
 
-			{
-				LLGLDisable blend(GL_BLEND);
-				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
-				stop_glerror();
-				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-				stop_glerror();
-			}
+            {
+                LLGLDisable   blend(GL_BLEND);
+                LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+                stop_glerror();
+                mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                stop_glerror();
+            }
             deferred_light_target->flush();
-			unbindDeferredShader(gDeferredBlurLightProgram);
-		}
+            unbindDeferredShader(gDeferredBlurLightProgram);
+        }
 
-		stop_glerror();
-		gGL.popMatrix();
-		stop_glerror();
-		gGL.matrixMode(LLRender::MM_MODELVIEW);
-		stop_glerror();
-		gGL.popMatrix();
-		stop_glerror();
+        stop_glerror();
+        gGL.popMatrix();
+        stop_glerror();
+        gGL.matrixMode(LLRender::MM_MODELVIEW);
+        stop_glerror();
+        gGL.popMatrix();
+        stop_glerror();
 
         screen_target->bindTarget();
-		// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
-		glClearColor(0,0,0,0);
+        // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
+        glClearColor(0, 0, 0, 0);
         screen_target->clear(GL_COLOR_BUFFER_BIT);
-		
-		if (RenderDeferredAtmospheric)
-		{ //apply sunlight contribution 
-            LLGLSLShader& soften_shader = LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram;
 
-			LL_RECORD_BLOCK_TIME(FTM_ATMOSPHERICS);
-            bindDeferredShader(soften_shader);  
+        if (RenderDeferredAtmospheric)
+        {  // apply sunlight contribution
+            LLGLSLShader &soften_shader = LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram;
+
+            LL_RECORD_BLOCK_TIME(FTM_ATMOSPHERICS);
+            bindDeferredShader(soften_shader);
 
-            LLEnvironment& environment = LLEnvironment::instance();
+            LLEnvironment &environment = LLEnvironment::instance();
             soften_shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);
             soften_shader.uniform4fv(LLShaderMgr::LIGHTNORM, 1, environment.getClampedLightNorm().mV);
 
-			{
-				LLGLDepthTest depth(GL_FALSE);
-				LLGLDisable blend(GL_BLEND);
-				LLGLDisable test(GL_ALPHA_TEST);
+            {
+                LLGLDepthTest depth(GL_FALSE);
+                LLGLDisable   blend(GL_BLEND);
+                LLGLDisable   test(GL_ALPHA_TEST);
 
-				//full screen blit
-				gGL.pushMatrix();
-				gGL.loadIdentity();
-				gGL.matrixMode(LLRender::MM_PROJECTION);
-				gGL.pushMatrix();
-				gGL.loadIdentity();
+                // full screen blit
+                gGL.pushMatrix();
+                gGL.loadIdentity();
+                gGL.matrixMode(LLRender::MM_PROJECTION);
+                gGL.pushMatrix();
+                gGL.loadIdentity();
 
-				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-				
-				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
 
-				gGL.popMatrix();
-				gGL.matrixMode(LLRender::MM_MODELVIEW);
-				gGL.popMatrix();
-			}
+                mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
 
-			unbindDeferredShader(LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram);
-		}
+                gGL.popMatrix();
+                gGL.matrixMode(LLRender::MM_MODELVIEW);
+                gGL.popMatrix();
+            }
 
-		{ //render non-deferred geometry (fullbright, alpha, etc)
-			LLGLDisable blend(GL_BLEND);
-			LLGLDisable stencil(GL_STENCIL_TEST);
-			gGL.setSceneBlendType(LLRender::BT_ALPHA);
+            unbindDeferredShader(LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram);
+        }
 
-			gPipeline.pushRenderTypeMask();
-			
-			gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
-										LLPipeline::RENDER_TYPE_CLOUDS,
-										LLPipeline::RENDER_TYPE_WL_SKY,
-										LLPipeline::END_RENDER_TYPES);
-								
-			
-			renderGeomPostDeferred(*LLViewerCamera::getInstance(), false);
-			gPipeline.popRenderTypeMask();
-		}
+        {  // render non-deferred geometry (fullbright, alpha, etc)
+            LLGLDisable blend(GL_BLEND);
+            LLGLDisable stencil(GL_STENCIL_TEST);
+            gGL.setSceneBlendType(LLRender::BT_ALPHA);
 
-		bool render_local = RenderLocalLights;
-				
-		if (render_local)
-		{
-			gGL.setSceneBlendType(LLRender::BT_ADD);
-			std::list<LLVector4> fullscreen_lights;
-			LLDrawable::drawable_list_t spot_lights;
-			LLDrawable::drawable_list_t fullscreen_spot_lights;
+            gPipeline.pushRenderTypeMask();
 
-			for (U32 i = 0; i < 2; i++)
-			{
-				mTargetShadowSpotLight[i] = NULL;
-			}
+            gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
+                                        LLPipeline::RENDER_TYPE_CLOUDS,
+                                        LLPipeline::RENDER_TYPE_WL_SKY,
+                                        LLPipeline::END_RENDER_TYPES);
 
-			std::list<LLVector4> light_colors;
+            renderGeomPostDeferred(*LLViewerCamera::getInstance(), false);
+            gPipeline.popRenderTypeMask();
+        }
 
-			LLVertexBuffer::unbind();
+        bool render_local = RenderLocalLights;
 
-			{
-				bindDeferredShader(gDeferredLightProgram);
-				
-				if (mCubeVB.isNull())
-				{
-					mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
-				}
+        if (render_local)
+        {
+            gGL.setSceneBlendType(LLRender::BT_ADD);
+            std::list<LLVector4>        fullscreen_lights;
+            LLDrawable::drawable_list_t spot_lights;
+            LLDrawable::drawable_list_t fullscreen_spot_lights;
 
-				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-				
-				LLGLDepthTest depth(GL_TRUE, GL_FALSE);
-				for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
-				{
-					LLDrawable* drawablep = *iter;
-					
-					LLVOVolume* volume = drawablep->getVOVolume();
-					if (!volume)
-					{
-						continue;
-					}
+            for (U32 i = 0; i < 2; i++)
+            {
+                mTargetShadowSpotLight[i] = NULL;
+            }
 
-					if (volume->isAttachment())
-					{
-						if (!sRenderAttachedLights)
-						{
-							continue;
-						}
-					}
+            std::list<LLVector4> light_colors;
+
+            LLVertexBuffer::unbind();
+
+            {
+                bindDeferredShader(gDeferredLightProgram);
+
+                if (mCubeVB.isNull())
+                {
+                    mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
+                }
+
+                mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+                LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+                for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
+                {
+                    LLDrawable *drawablep = *iter;
+
+                    LLVOVolume *volume = drawablep->getVOVolume();
+                    if (!volume)
+                    {
+                        continue;
+                    }
+
+                    if (volume->isAttachment())
+                    {
+                        if (!sRenderAttachedLights)
+                        {
+                            continue;
+                        }
+                    }
 
                     const LLViewerObject *vobj = drawablep->getVObj();
                     if (vobj)
@@ -8736,78 +8745,75 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
                         continue;
                     }
 
-					LLVector4a center;
-					center.load3(position.mV);
-					const F32* c = center.getF32ptr();
-					F32 s = volume->getLightRadius()*1.5f;
+                    LLVector4a center;
+                    center.load3(position.mV);
+                    const F32 *c = center.getF32ptr();
+                    F32        s = volume->getLightRadius() * 1.5f;
 
-                    //send light color to shader in linear space
+                    // send light color to shader in linear space
                     LLColor3 col = volume->getLightLinearColor();
-					
-					if (col.magVecSquared() < 0.001f)
-					{
-						continue;
-					}
 
-					if (s <= 0.001f)
-					{
-						continue;
-					}
+                    if (col.magVecSquared() < 0.001f)
+                    {
+                        continue;
+                    }
 
-					LLVector4a sa;
-					sa.splat(s);
-					if (camera->AABBInFrustumNoFarClip(center, sa) == 0)
-					{
-						continue;
-					}
+                    if (s <= 0.001f)
+                    {
+                        continue;
+                    }
 
-					sVisibleLightCount++;
-										
-					if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
-						camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
-						camera->getOrigin().mV[1] > c[1] + s + 0.2f ||
-						camera->getOrigin().mV[1] < c[1] - s - 0.2f ||
-						camera->getOrigin().mV[2] > c[2] + s + 0.2f ||
-						camera->getOrigin().mV[2] < c[2] - s - 0.2f)
-					{ //draw box if camera is outside box
-						if (render_local)
-						{
-							if (volume->isLightSpotlight())
-							{
-								drawablep->getVOVolume()->updateSpotLightPriority();
-								spot_lights.push_back(drawablep);
-								continue;
-							}
-							
-							LL_RECORD_BLOCK_TIME(FTM_LOCAL_LIGHTS);
-							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
-							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
-							gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+                    LLVector4a sa;
+                    sa.splat(s);
+                    if (camera->AABBInFrustumNoFarClip(center, sa) == 0)
+                    {
+                        continue;
+                    }
+
+                    sVisibleLightCount++;
+
+                    if (camera->getOrigin().mV[0] > c[0] + s + 0.2f || camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
+                        camera->getOrigin().mV[1] > c[1] + s + 0.2f || camera->getOrigin().mV[1] < c[1] - s - 0.2f ||
+                        camera->getOrigin().mV[2] > c[2] + s + 0.2f || camera->getOrigin().mV[2] < c[2] - s - 0.2f)
+                    {  // draw box if camera is outside box
+                        if (render_local)
+                        {
+                            if (volume->isLightSpotlight())
+                            {
+                                drawablep->getVOVolume()->updateSpotLightPriority();
+                                spot_lights.push_back(drawablep);
+                                continue;
+                            }
+
+                            LL_RECORD_BLOCK_TIME(FTM_LOCAL_LIGHTS);
+                            gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
+                            gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
+                            gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
                             gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF));
-							gGL.syncMatrices();
-							
-							mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
-							stop_glerror();
-						}
-					}
-					else
-					{	
-						if (volume->isLightSpotlight())
-						{
-							drawablep->getVOVolume()->updateSpotLightPriority();
-							fullscreen_spot_lights.push_back(drawablep);
-							continue;
-						}
+                            gGL.syncMatrices();
 
-						glh::vec3f tc(c);
-						mat.mult_matrix_vec(tc);
-					
-						fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s));
+                            mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
+                            stop_glerror();
+                        }
+                    }
+                    else
+                    {
+                        if (volume->isLightSpotlight())
+                        {
+                            drawablep->getVOVolume()->updateSpotLightPriority();
+                            fullscreen_spot_lights.push_back(drawablep);
+                            continue;
+                        }
+
+                        glh::vec3f tc(c);
+                        mat.mult_matrix_vec(tc);
+
+                        fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s));
                         light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF)));
-					}
-				}
+                    }
+                }
 
-                // If we're in avatar editing mode (3), add an avatar appearance light at the camera position 
+                // If we're in avatar editing mode (3), add an avatar appearance light at the camera position
                 if (gAgentAvatarp && gAgentAvatarp->mSpecialRenderMode == 3)
                 {
                     // Cam coords (post-transform) are 0,0,0, with radius 15m
@@ -8819,256 +8825,253 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
                     light_colors.push_back(white_light);
                 }
 
-				unbindDeferredShader(gDeferredLightProgram);
-			}
+                unbindDeferredShader(gDeferredLightProgram);
+            }
 
-			if (!spot_lights.empty())
-			{
-				LLGLDepthTest depth(GL_TRUE, GL_FALSE);
-				bindDeferredShader(gDeferredSpotLightProgram);
+            if (!spot_lights.empty())
+            {
+                LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+                bindDeferredShader(gDeferredSpotLightProgram);
 
-				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+                mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
 
-				gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+                gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
 
-				for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)
-				{
-					LL_RECORD_BLOCK_TIME(FTM_PROJECTORS);
-					LLDrawable* drawablep = *iter;
+                for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)
+                {
+                    LL_RECORD_BLOCK_TIME(FTM_PROJECTORS);
+                    LLDrawable *drawablep = *iter;
 
-					LLVOVolume* volume = drawablep->getVOVolume();
+                    LLVOVolume *volume = drawablep->getVOVolume();
 
-					LLVector4a center;
-					center.load3(drawablep->getPositionAgent().mV);
-					const F32* c = center.getF32ptr();
-					F32 s = volume->getLightRadius()*1.5f;
+                    LLVector4a center;
+                    center.load3(drawablep->getPositionAgent().mV);
+                    const F32 *c = center.getF32ptr();
+                    F32        s = volume->getLightRadius() * 1.5f;
 
-					sVisibleLightCount++;
+                    sVisibleLightCount++;
 
-					setupSpotLight(gDeferredSpotLightProgram, drawablep);
-					
-                    //send light color to shader in linear space
+                    setupSpotLight(gDeferredSpotLightProgram, drawablep);
+
+                    // send light color to shader in linear space
                     LLColor3 col = volume->getLightLinearColor();
-					
-					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
-					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
-					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+
+                    gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
+                    gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
+                    gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
                     gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF));
-					gGL.syncMatrices();
-										
-					mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
-				}
-				gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
-				unbindDeferredShader(gDeferredSpotLightProgram);
-			}
+                    gGL.syncMatrices();
 
-			//reset mDeferredVB to fullscreen triangle
-			mDeferredVB->getVertexStrider(vert);
-			vert[0].set(-1,1,0);
-			vert[1].set(-1,-3,0);
-			vert[2].set(3,1,0);
+                    mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
+                }
+                gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+                unbindDeferredShader(gDeferredSpotLightProgram);
+            }
 
-			{
-				LLGLDepthTest depth(GL_FALSE);
+            // reset mDeferredVB to fullscreen triangle
+            mDeferredVB->getVertexStrider(vert);
+            vert[0].set(-1, 1, 0);
+            vert[1].set(-1, -3, 0);
+            vert[2].set(3, 1, 0);
 
-				//full screen blit
-				gGL.pushMatrix();
-				gGL.loadIdentity();
-				gGL.matrixMode(LLRender::MM_PROJECTION);
-				gGL.pushMatrix();
-				gGL.loadIdentity();
+            {
+                LLGLDepthTest depth(GL_FALSE);
 
-				U32 count = 0;
+                // full screen blit
+                gGL.pushMatrix();
+                gGL.loadIdentity();
+                gGL.matrixMode(LLRender::MM_PROJECTION);
+                gGL.pushMatrix();
+                gGL.loadIdentity();
 
-				const U32 max_count = LL_DEFERRED_MULTI_LIGHT_COUNT;
-				LLVector4 light[max_count];
-				LLVector4 col[max_count];
+                U32 count = 0;
 
-				F32 far_z = 0.f;
+                const U32 max_count = LL_DEFERRED_MULTI_LIGHT_COUNT;
+                LLVector4 light[max_count];
+                LLVector4 col[max_count];
 
-				while (!fullscreen_lights.empty())
-				{
-					LL_RECORD_BLOCK_TIME(FTM_FULLSCREEN_LIGHTS);
-					light[count] = fullscreen_lights.front();
-					fullscreen_lights.pop_front();
-					col[count] = light_colors.front();
-					light_colors.pop_front();
-
-					far_z = llmin(light[count].mV[2]-light[count].mV[3], far_z);
-					count++;
-					if (count == max_count || fullscreen_lights.empty())
-					{
-						U32 idx = count-1;
-						bindDeferredShader(gDeferredMultiLightProgram[idx]);
-						gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
-						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light);
-						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);
-						gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
-						far_z = 0.f;
-						count = 0; 
-      mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-						mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-						unbindDeferredShader(gDeferredMultiLightProgram[idx]);
-					}
-				}
-				
-				bindDeferredShader(gDeferredMultiSpotLightProgram);
+                F32 far_z = 0.f;
 
-				gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+                while (!fullscreen_lights.empty())
+                {
+                    LL_RECORD_BLOCK_TIME(FTM_FULLSCREEN_LIGHTS);
+                    light[count] = fullscreen_lights.front();
+                    fullscreen_lights.pop_front();
+                    col[count] = light_colors.front();
+                    light_colors.pop_front();
+
+                    far_z = llmin(light[count].mV[2] - light[count].mV[3], far_z);
+                    count++;
+                    if (count == max_count || fullscreen_lights.empty())
+                    {
+                        U32 idx = count - 1;
+                        bindDeferredShader(gDeferredMultiLightProgram[idx]);
+                        gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
+                        gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat *) light);
+                        gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat *) col);
+                        gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
+                        far_z = 0.f;
+                        count = 0;
+                        mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+                        mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                        unbindDeferredShader(gDeferredMultiLightProgram[idx]);
+                    }
+                }
 
-				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+                bindDeferredShader(gDeferredMultiSpotLightProgram);
 
-				for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter)
-				{
-					LL_RECORD_BLOCK_TIME(FTM_PROJECTORS);
-					LLDrawable* drawablep = *iter;
-					
-					LLVOVolume* volume = drawablep->getVOVolume();
+                gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
 
-					LLVector3 center = drawablep->getPositionAgent();
-					F32* c = center.mV;
-                    F32 light_size_final = volume->getLightRadius()*1.5f;
-                    F32 light_falloff_final = volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF);
+                mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
 
-					sVisibleLightCount++;
+                for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter)
+                {
+                    LL_RECORD_BLOCK_TIME(FTM_PROJECTORS);
+                    LLDrawable *drawablep           = *iter;
+                    LLVOVolume *volume              = drawablep->getVOVolume();
+                    LLVector3   center              = drawablep->getPositionAgent();
+                    F32 *       c                   = center.mV;
+                    F32         light_size_final    = volume->getLightRadius() * 1.5f;
+                    F32         light_falloff_final = volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF);
 
-					glh::vec3f tc(c);
-					mat.mult_matrix_vec(tc);
-					
-					setupSpotLight(gDeferredMultiSpotLightProgram, drawablep);
+                    sVisibleLightCount++;
 
-                    //send light color to shader in linear space
+                    glh::vec3f tc(c);
+                    mat.mult_matrix_vec(tc);
+
+                    setupSpotLight(gDeferredMultiSpotLightProgram, drawablep);
+
+                    // send light color to shader in linear space
                     LLColor3 col = volume->getLightLinearColor();
-					
-					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+
+                    gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
                     gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, light_size_final);
-					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+                    gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
                     gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, light_falloff_final);
-					mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-				}
+                    mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+                }
 
-				gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
-				unbindDeferredShader(gDeferredMultiSpotLightProgram);
+                gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+                unbindDeferredShader(gDeferredMultiSpotLightProgram);
 
-				gGL.popMatrix();
-				gGL.matrixMode(LLRender::MM_MODELVIEW);
-				gGL.popMatrix();
-			}
-		}
+                gGL.popMatrix();
+                gGL.matrixMode(LLRender::MM_MODELVIEW);
+                gGL.popMatrix();
+            }
+        }
 
-		gGL.setColorMask(true, true);
-	}
+        gGL.setColorMask(true, true);
+    }
 
     screen_target->flush();
 
-	//gamma correct lighting
-	gGL.matrixMode(LLRender::MM_PROJECTION);
-	gGL.pushMatrix();
-	gGL.loadIdentity();
-	gGL.matrixMode(LLRender::MM_MODELVIEW);
-	gGL.pushMatrix();
-	gGL.loadIdentity();
+    // gamma correct lighting
+    gGL.matrixMode(LLRender::MM_PROJECTION);
+    gGL.pushMatrix();
+    gGL.loadIdentity();
+    gGL.matrixMode(LLRender::MM_MODELVIEW);
+    gGL.pushMatrix();
+    gGL.loadIdentity();
 
-	{
-		LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+    {
+        LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
-		LLVector2 tc1(0,0);
-        LLVector2 tc2((F32) screen_target->getWidth()*2,
-                  (F32) screen_target->getHeight()*2);
+        LLVector2 tc1(0, 0);
+        LLVector2 tc2((F32) screen_target->getWidth() * 2, (F32) screen_target->getHeight() * 2);
 
         screen_target->bindTarget();
-		// Apply gamma correction to the frame here.
-		gDeferredPostGammaCorrectProgram.bind();
-		//mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-		S32 channel = 0;
-        channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage());
-		if (channel > -1)
-		{
+        // Apply gamma correction to the frame here.
+        gDeferredPostGammaCorrectProgram.bind();
+        // mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+        S32 channel = 0;
+        channel     = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage());
+        if (channel > -1)
+        {
             screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT);
-		}
-		
+        }
+
         gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, screen_target->getWidth(), screen_target->getHeight());
-		
-		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
 
-		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
-		
-		gGL.begin(LLRender::TRIANGLE_STRIP);
-		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-		gGL.vertex2f(-1,-1);
-		
-		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-		gGL.vertex2f(-1,3);
-		
-		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-		gGL.vertex2f(3,-1);
-		
-		gGL.end();
-		
+        F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
+
+        gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f / 2.2f));
+
+        gGL.begin(LLRender::TRIANGLE_STRIP);
+        gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+        gGL.vertex2f(-1, -1);
+
+        gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+        gGL.vertex2f(-1, 3);
+
+        gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+        gGL.vertex2f(3, -1);
+
+        gGL.end();
+
         gGL.getTexUnit(channel)->unbind(screen_target->getUsage());
-		gDeferredPostGammaCorrectProgram.unbind();
+        gDeferredPostGammaCorrectProgram.unbind();
         screen_target->flush();
-	}
+    }
 
-	gGL.matrixMode(LLRender::MM_PROJECTION);
-	gGL.popMatrix();
-	gGL.matrixMode(LLRender::MM_MODELVIEW);
-	gGL.popMatrix();	
+    gGL.matrixMode(LLRender::MM_PROJECTION);
+    gGL.popMatrix();
+    gGL.matrixMode(LLRender::MM_MODELVIEW);
+    gGL.popMatrix();
 
     screen_target->bindTarget();
 
-	{ //render non-deferred geometry (alpha, fullbright, glow)
-		LLGLDisable blend(GL_BLEND);
-		LLGLDisable stencil(GL_STENCIL_TEST);
+    {  // render non-deferred geometry (alpha, fullbright, glow)
+        LLGLDisable blend(GL_BLEND);
+        LLGLDisable stencil(GL_STENCIL_TEST);
+
+        pushRenderTypeMask();
+        andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA,
+                          LLPipeline::RENDER_TYPE_FULLBRIGHT,
+                          LLPipeline::RENDER_TYPE_VOLUME,
+                          LLPipeline::RENDER_TYPE_GLOW,
+                          LLPipeline::RENDER_TYPE_BUMP,
+                          LLPipeline::RENDER_TYPE_PASS_SIMPLE,
+                          LLPipeline::RENDER_TYPE_PASS_ALPHA,
+                          LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
+                          LLPipeline::RENDER_TYPE_PASS_BUMP,
+                          LLPipeline::RENDER_TYPE_PASS_POST_BUMP,
+                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
+                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
+                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY,
+                          LLPipeline::RENDER_TYPE_PASS_GLOW,
+                          LLPipeline::RENDER_TYPE_PASS_GRASS,
+                          LLPipeline::RENDER_TYPE_PASS_SHINY,
+                          LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
+                          LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
+                          LLPipeline::RENDER_TYPE_AVATAR,
+                          LLPipeline::RENDER_TYPE_CONTROL_AV,
+                          LLPipeline::RENDER_TYPE_ALPHA_MASK,
+                          LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
+                          END_RENDER_TYPES);
+
+        renderGeomPostDeferred(*LLViewerCamera::getInstance());
+        popRenderTypeMask();
+    }
 
-		pushRenderTypeMask();
-		andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA,
-						 LLPipeline::RENDER_TYPE_FULLBRIGHT,
-						 LLPipeline::RENDER_TYPE_VOLUME,
-						 LLPipeline::RENDER_TYPE_GLOW,
-						 LLPipeline::RENDER_TYPE_BUMP,
-						 LLPipeline::RENDER_TYPE_PASS_SIMPLE,
-						 LLPipeline::RENDER_TYPE_PASS_ALPHA,
-						 LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
-						 LLPipeline::RENDER_TYPE_PASS_BUMP,
-						 LLPipeline::RENDER_TYPE_PASS_POST_BUMP,
-						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
-						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
-						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY,
-						 LLPipeline::RENDER_TYPE_PASS_GLOW,
-						 LLPipeline::RENDER_TYPE_PASS_GRASS,
-						 LLPipeline::RENDER_TYPE_PASS_SHINY,
-						 LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
-						 LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
-						 LLPipeline::RENDER_TYPE_AVATAR,
-						 LLPipeline::RENDER_TYPE_CONTROL_AV,
-						 LLPipeline::RENDER_TYPE_ALPHA_MASK,
-						 LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
-						 END_RENDER_TYPES);
-		
-		renderGeomPostDeferred(*LLViewerCamera::getInstance());
-		popRenderTypeMask();
-	}
+    {
+        // render highlights, etc.
+        renderHighlights();
+        mHighlightFaces.clear();
 
-	{
-		//render highlights, etc.
-		renderHighlights();
-		mHighlightFaces.clear();
+        renderDebug();
 
-		renderDebug();
+        LLVertexBuffer::unbind();
 
-		LLVertexBuffer::unbind();
-
-		if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
-		{
-			// Render debugging beacons.
-			gObjectList.renderObjectBeacons();
-			gObjectList.resetObjectBeacons();
+        if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+        {
+            // Render debugging beacons.
+            gObjectList.renderObjectBeacons();
+            gObjectList.resetObjectBeacons();
             gSky.addSunMoonBeacons();
-		}
-	}
+        }
+    }
 
-	screen_target->flush();                        
+    screen_target->flush();
 }
 
 void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
-- 
cgit v1.2.3


From 8b314a646f67c8b0ebb81c8b81400b6509c51737 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 5 Aug 2020 12:05:23 -0600
Subject: SL-13521, stamp out some remaining hard-coded 8s

---
 indra/llrender/llrender.cpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index e0d1ee4f4c..5208db48d2 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1209,12 +1209,12 @@ void LLRender::syncLightState()
 	{
 		shader->mLightHash = mLightHash;
 
-		LLVector4 position[8];
-		LLVector3 direction[8];
-		LLVector4 attenuation[8];
-		LLVector3 diffuse[8];
-        LLVector3 diffuse_b[8];
-        bool      sun_primary[8];
+		LLVector4 position[LL_NUM_LIGHT_UNITS];
+		LLVector3 direction[LL_NUM_LIGHT_UNITS];
+		LLVector4 attenuation[LL_NUM_LIGHT_UNITS];
+		LLVector3 diffuse[LL_NUM_LIGHT_UNITS];
+        LLVector3 diffuse_b[LL_NUM_LIGHT_UNITS];
+        bool      sun_primary[LL_NUM_LIGHT_UNITS];
 
 		for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; i++)
 		{
@@ -1228,10 +1228,10 @@ void LLRender::syncLightState()
             sun_primary[i] = light->mSunIsPrimary;
 		}
 
-		shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, 8, position[0].mV);
-		shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, 8, direction[0].mV);
-		shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, 8, attenuation[0].mV);
-		shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
+		shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, LL_NUM_LIGHT_UNITS, position[0].mV);
+		shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, LL_NUM_LIGHT_UNITS, direction[0].mV);
+		shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, LL_NUM_LIGHT_UNITS, attenuation[0].mV);
+		shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, LL_NUM_LIGHT_UNITS, diffuse[0].mV);
 		shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
         shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
         shader->uniform4fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
-- 
cgit v1.2.3


From 92ee1be5cf08158a40113a4bab5b7c5a9fc42055 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 5 Aug 2020 12:30:24 -0600
Subject: SL-13521, clang-format LLRender::syncLightState() (whitespace)

---
 indra/llrender/llrender.cpp | 50 ++++++++++++++++++++++-----------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 5208db48d2..11d9ef3f57 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1198,46 +1198,46 @@ void LLRender::refreshState(void)
 
 void LLRender::syncLightState()
 {
-	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+    LLGLSLShader *shader = LLGLSLShader::sCurBoundShaderPtr;
 
-	if (!shader)
-	{
-		return;
-	}
+    if (!shader)
+    {
+        return;
+    }
 
-	if (shader->mLightHash != mLightHash)
-	{
-		shader->mLightHash = mLightHash;
+    if (shader->mLightHash != mLightHash)
+    {
+        shader->mLightHash = mLightHash;
 
-		LLVector4 position[LL_NUM_LIGHT_UNITS];
-		LLVector3 direction[LL_NUM_LIGHT_UNITS];
-		LLVector4 attenuation[LL_NUM_LIGHT_UNITS];
-		LLVector3 diffuse[LL_NUM_LIGHT_UNITS];
+        LLVector4 position[LL_NUM_LIGHT_UNITS];
+        LLVector3 direction[LL_NUM_LIGHT_UNITS];
+        LLVector4 attenuation[LL_NUM_LIGHT_UNITS];
+        LLVector3 diffuse[LL_NUM_LIGHT_UNITS];
         LLVector3 diffuse_b[LL_NUM_LIGHT_UNITS];
         bool      sun_primary[LL_NUM_LIGHT_UNITS];
 
-		for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; i++)
-		{
-			LLLightState* light = mLightState[i];
+        for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; i++)
+        {
+            LLLightState *light = mLightState[i];
 
-			position[i] = light->mPosition;
-			direction[i] = light->mSpotDirection;
+            position[i]  = light->mPosition;
+            direction[i] = light->mSpotDirection;
             attenuation[i].set(light->mLinearAtten, light->mQuadraticAtten, light->mSpecular.mV[2], light->mSpecular.mV[3]);
-			diffuse[i].set(light->mDiffuse.mV);
+            diffuse[i].set(light->mDiffuse.mV);
             diffuse_b[i].set(light->mDiffuseB.mV);
             sun_primary[i] = light->mSunIsPrimary;
-		}
+        }
 
-		shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, LL_NUM_LIGHT_UNITS, position[0].mV);
-		shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, LL_NUM_LIGHT_UNITS, direction[0].mV);
-		shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, LL_NUM_LIGHT_UNITS, attenuation[0].mV);
-		shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, LL_NUM_LIGHT_UNITS, diffuse[0].mV);
-		shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
+        shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, LL_NUM_LIGHT_UNITS, position[0].mV);
+        shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, LL_NUM_LIGHT_UNITS, direction[0].mV);
+        shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, LL_NUM_LIGHT_UNITS, attenuation[0].mV);
+        shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, LL_NUM_LIGHT_UNITS, diffuse[0].mV);
+        shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
         shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
         shader->uniform4fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
         shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
         shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
-	}
+    }
 }
 
 void LLRender::syncMatrices()
-- 
cgit v1.2.3


From 31924129227eb28bae6949e4b2b8fd6d5cffed61 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Sun, 16 Aug 2020 14:16:17 -0700
Subject: SL-13465 Partially restore atmospheric effects for the moon.

---
 .../newview/app_settings/shaders/class1/deferred/moonF.glsl  | 12 ++++++++++++
 .../newview/app_settings/shaders/class1/windlight/moonF.glsl |  9 +++++++++
 2 files changed, 21 insertions(+)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
index 80f232948a..4fac46fdfb 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
@@ -45,6 +45,12 @@ uniform float blend_factor; // interp factor between moon A/B
 VARYING vec2 vary_texcoord0;
 
 vec3 srgb_to_linear(vec3 c);
+
+vec3 getAdditiveColor();
+
+/// Soft clips the light with a gamma correction
+vec3 scaleSoftClip(vec3 light);
+
 void main() 
 {
     vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
@@ -65,6 +71,12 @@ void main()
 
     //c.rgb *= moonlight_color.rgb;
 
+    // Partial atmospherics calculation
+    vec3 ac = getAdditiveColor();
+    c.rgb += ac;
+
+    c.rgb = scaleSoftClip(c.rgb);
+
     frag_data[0] = vec4(c.rgb, c.a);
     frag_data[1] = vec4(0.0);
     frag_data[2] = vec4(0.0f);
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
index 24f3992e32..310bb15fdf 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
@@ -44,6 +44,9 @@ uniform sampler2D altDiffuseMap;
 uniform float blend_factor; // interp factor between moon A/B
 VARYING vec2 vary_texcoord0;
 
+vec3 getAdditiveColor();
+vec3 scaleSoftClip(vec3 light);
+
 void main() 
 {
     vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
@@ -59,6 +62,12 @@ void main()
     c.rgb = pow(c.rgb, exp);
     //c.rgb *= moonlight_color.rgb;
 
+    // Partial atmospherics calculation
+    vec3 ac = getAdditiveColor();
+    c.rgb += ac;
+
+    c.rgb = scaleSoftClip(c.rgb);
+
     frag_color = vec4(c.rgb, c.a);
 }
 
-- 
cgit v1.2.3


From f156730f3b3671be15bc769c0f17c5a7f4cb3faa Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Sun, 16 Aug 2020 14:19:54 -0700
Subject: SL-13465 Fix local scalar mix masking global mix() function.

---
 indra/newview/app_settings/shaders/class1/deferred/moonF.glsl  | 4 ++--
 indra/newview/app_settings/shaders/class1/windlight/moonF.glsl | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
index 4fac46fdfb..4366945214 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
@@ -64,9 +64,9 @@ void main()
     vec3 luma_weights = vec3(0.3, 0.5, 0.3);
 
     vec4 light_color = max(sunlight_color, moonlight_color);
-    float mix = 1.0 - dot(normalize(light_color.rgb), luma_weights);
+    float blend = 1.0 - dot(normalize(light_color.rgb), luma_weights);
 
-    vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0  - 1.0;
+    vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0  - 1.0;
     c.rgb = pow(c.rgb, exp);
 
     //c.rgb *= moonlight_color.rgb;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
index 310bb15fdf..72d2c4cdfa 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
@@ -56,9 +56,9 @@ void main()
     // mix factor which blends when sunlight is brighter
     // and shows true moon color at night
     vec3 luma_weights = vec3(0.3, 0.5, 0.3);
-    float mix = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights);
+    float blend = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights);
 
-    vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0 - 1.0;
+    vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0 - 1.0;
     c.rgb = pow(c.rgb, exp);
     //c.rgb *= moonlight_color.rgb;
 
-- 
cgit v1.2.3


From 80fe2157fe43e46f16b33fc75ab8ef7de428d275 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Sat, 15 Aug 2020 12:36:27 +0300
Subject: SL-13783 Workaround for enqueueCoprocedure() crash with asset storage

---
 indra/llmessage/llcoproceduremanager.cpp | 6 ++++++
 indra/llmessage/llcoproceduremanager.h   | 1 +
 2 files changed, 7 insertions(+)

diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 74cdff2b00..e1ca388dd7 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -137,6 +137,12 @@ LLCoprocedureManager::~LLCoprocedureManager()
 
 }
 
+void LLCoprocedureManager::initSingleton()
+{
+    // workaround until we get mutex into initializePool
+    initializePool("VAssetStorage");
+}
+
 LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::string &poolName)
 {
     // Attempt to look up a pool size in the configuration.  If found use that
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 7d0e83180c..f323b16878 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -39,6 +39,7 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
 {
     LLSINGLETON(LLCoprocedureManager);
     virtual ~LLCoprocedureManager();
+    /*virtual*/ void initSingleton();
 
 public:
     typedef boost::function<U32(const std::string &)> SettingQuery_t;
-- 
cgit v1.2.3


From 5ff63f0d7b2c50b7a88f9b40ef0224c8f15336c3 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 17 Aug 2020 21:46:08 +0300
Subject: SL-13789 Crash 'Enqueue failed' due to viewer requesting over 4K
 landmarks

---
 indra/newview/lllandmarklist.cpp | 31 +++++++++++++++++++++++++++++++
 indra/newview/lllandmarklist.h   |  7 ++++---
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index c58540914e..1fc70cd6d6 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -39,6 +39,11 @@
 // Globals
 LLLandmarkList gLandmarkList;
 
+// number is mostly arbitrary, but it should be below DEFAULT_QUEUE_SIZE pool size,
+// which is 4096, to not overfill the pool if user has more than 4K of landmarks,
+// and low number helps with not flooding server with requests
+const S32 MAX_SIMULTANEOUS_REQUESTS = 512;
+
 
 ////////////////////////////////////////////////////////////////////////////
 // LLLandmarkList
@@ -69,6 +74,11 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
 		{
 			return NULL;
 		}
+	    if ( mWaitList.find(asset_uuid) != mWaitList.end() )
+		{
+            // Landmark is sheduled for download, but not requested yet
+			return NULL;
+		}
 		
 		landmark_requested_list_t::iterator iter = mRequestedList.find(asset_uuid);
 		if (iter != mRequestedList.end())
@@ -86,6 +96,13 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
 			mLoadedCallbackMap.insert(vt);
 		}
 
+        if (mRequestedList.size() > MAX_SIMULTANEOUS_REQUESTS)
+        {
+            // Postpone download till queu is emptier
+            mWaitList.insert(asset_uuid);
+            return NULL;
+        }
+
 		gAssetStorage->getAssetData(asset_uuid,
 									LLAssetType::AT_LANDMARK,
 									LLLandmarkList::processGetAssetReply,
@@ -155,8 +172,22 @@ void LLLandmarkList::processGetAssetReply(
 		}
 
 		gLandmarkList.mBadList.insert(uuid);
+        gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests
+        // todo: this should clean mLoadedCallbackMap!
 	}
 
+    if (!gLandmarkList.mWaitList.empty())
+    {
+        // start new download from wait list
+        landmark_uuid_list_t::iterator iter = gLandmarkList.mWaitList.begin();
+        LLUUID asset_uuid = *iter;
+        gLandmarkList.mWaitList.erase(iter);
+        gAssetStorage->getAssetData(asset_uuid,
+            LLAssetType::AT_LANDMARK,
+            LLLandmarkList::processGetAssetReply,
+            NULL);
+        gLandmarkList.mRequestedList[asset_uuid] = gFrameTimeSeconds;
+    }
 }
 
 BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid)
diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h
index 3356f866ce..2e7bd25610 100644
--- a/indra/newview/lllandmarklist.h
+++ b/indra/newview/lllandmarklist.h
@@ -70,9 +70,10 @@ protected:
 	typedef std::map<LLUUID, LLLandmark*> landmark_list_t;
 	landmark_list_t mList;
 
-	typedef std::set<LLUUID> landmark_bad_list_t;
-	landmark_bad_list_t mBadList;
-	
+	typedef std::set<LLUUID> landmark_uuid_list_t;
+	landmark_uuid_list_t mBadList;
+	landmark_uuid_list_t mWaitList;
+
 	typedef std::map<LLUUID,F32> landmark_requested_list_t;
 	landmark_requested_list_t mRequestedList;
 	
-- 
cgit v1.2.3


From 58ba75f6dd4c7c5c93ea9f14cef7f2194aa00e08 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 18 Aug 2020 16:00:25 +0300
Subject: SL-13783 Workaround for enqueueCoprocedure() crash #2

---
 indra/llmessage/llcoproceduremanager.cpp | 11 +++++------
 indra/llmessage/llcoproceduremanager.h   |  1 -
 indra/newview/llviewerassetstorage.cpp   |  1 +
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 0684f47df2..3f55bda1e3 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -140,12 +140,6 @@ LLCoprocedureManager::~LLCoprocedureManager()
     close();
 }
 
-void LLCoprocedureManager::initSingleton()
-{
-    // workaround until we get mutex into initializePool
-    initializePool("VAssetStorage");
-}
-
 LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::string &poolName)
 {
     // Attempt to look up a pool size in the configuration.  If found use that
@@ -197,8 +191,13 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s
 
 void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn)
 {
+    // functions to discover and store the pool sizes
     mPropertyQueryFn = queryfn;
     mPropertyDefineFn = updatefn;
+
+    // workaround until we get mutex into initializePool
+    initializePool("VAssetStorage");
+    initializePool("Upload");
 }
 
 //-------------------------------------------------------------------------
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 8540ced8cc..70204ba02b 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -40,7 +40,6 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
 {
     LLSINGLETON(LLCoprocedureManager);
     virtual ~LLCoprocedureManager();
-    /*virtual*/ void initSingleton();
 
 public:
     typedef boost::function<U32(const std::string &)> SettingQuery_t;
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index cacdee7e83..54f80a2995 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -49,6 +49,7 @@
 /// LLViewerAssetRequest
 ///----------------------------------------------------------------------------
 
+ // There is also PoolSizeVAssetStorage value in setting that should mirror this name
 static const std::string VIEWER_ASSET_STORAGE_CORO_POOL = "VAssetStorage";
 
 /**
-- 
cgit v1.2.3


From acfbb41f4ddb59cd1fe0509949b7b1cf05ac4c9a Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Thu, 20 Aug 2020 19:49:23 +0300
Subject: SL-13813 The current line is not selected after triple-clicking text
 in notecard on the macOS

---
 indra/llwindow/llopenglview-objc.mm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 5b9dce02c4..d2c5b11c3d 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -359,10 +359,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
         callRightMouseDown(mMousePos, [theEvent modifierFlags]);
         mSimulatedRightClick = true;
     } else {
-        if ([theEvent clickCount] >= 2)
+        if ([theEvent clickCount] == 2)
         {
             callDoubleClick(mMousePos, [theEvent modifierFlags]);
-        } else if ([theEvent clickCount] == 1) {
+        } else if ([theEvent clickCount] >= 1) {
             callLeftMouseDown(mMousePos, [theEvent modifierFlags]);
         }
     }
-- 
cgit v1.2.3


From e4350fb9ef1a44416f0ef7873595db41b05dafc4 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 19 Aug 2020 21:27:58 +0300
Subject: SL-13811 Crash on coroprocedure

Coroprosedure should stop on 'stop' exception
---
 indra/llmessage/llcoproceduremanager.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 3f55bda1e3..969cd162fb 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -415,6 +415,14 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
         {
             coproc->mProc(httpAdapter, coproc->mId);
         }
+        catch (const LLCoros::Stop &)
+        {
+            LL_INFOS("CoProcMgr") << "Viewer is shutting Down. Stopping coprocedure('" << coproc->mName
+                                   << "', id=" << coproc->mId.asString()
+                                   << ") in pool '" << mPoolName << "'" << LL_ENDL;
+            mActiveCoprocs.erase(itActive);
+            throw; // let toplevel handle this as LLContinueError
+        }
         catch (...)
         {
             LOG_UNHANDLED_EXCEPTION(STRINGIZE("Coprocedure('" << coproc->mName
-- 
cgit v1.2.3


From d77b7bdc5484fab731f7537a15d690a1e022c246 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Thu, 20 Aug 2020 15:08:47 -0600
Subject: SL-13565, remove SL-10625 throttling erroneously applied to all GPUs

Remove the sleep throttle applied in 10625 to work around an Intel GPU driver
bug. It was erroneously being applied to all GPUs, and also as of Intel driver
26.20.100.7755 (1/9/2020) it appears that the driver bug no longer exists.
---
 indra/newview/llappviewer.cpp | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f7a3898b73..780dd62d5b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1482,21 +1482,6 @@ bool LLAppViewer::doFrame()
 
 				display();
 
-				static U64 last_call = 0;
-				if (!gTeleportDisplay || gGLManager.mIsIntel) // SL-10625...throttle early, throttle often with Intel
-				{
-					// Frame/draw throttling
-					U64 elapsed_time = LLTimer::getTotalTime() - last_call;
-					if (elapsed_time < mMinMicroSecPerFrame)
-					{
-						LL_RECORD_BLOCK_TIME(FTM_SLEEP);
-						// llclamp for when time function gets funky
-						U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6);
-						micro_sleep(sleep_time, 0);
-					}
-				}
-				last_call = LLTimer::getTotalTime();
-
 				pingMainloopTimeout("Main:Snapshot");
 				LLFloaterSnapshot::update(); // take snapshots
 					LLFloaterOutfitSnapshot::update();
-- 
cgit v1.2.3


From 6c1a15d936763dc14f368e10bd53c6e351bf0136 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Thu, 20 Aug 2020 17:08:15 -0600
Subject: SL-13565, clean up now-orphaned throttling variable and handling code

---
 indra/newview/app_settings/settings.xml | 11 -----------
 indra/newview/llappviewer.cpp           | 20 +-------------------
 indra/newview/llappviewer.h             |  7 +------
 3 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index a00aa86d78..39724e20cc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -812,17 +812,6 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>FramePerSecondLimit</key>
-    <map>
-      <key>Comment</key>
-      <string>Controls upper limit of frames per second</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>U32</string>
-      <key>Value</key>
-      <integer>120</integer>
-    </map>
     <key>BackgroundYieldTime</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 780dd62d5b..84c69ed941 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -689,8 +689,7 @@ LLAppViewer::LLAppViewer()
 	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
 	mFastTimerLogThread(NULL),
 	mSettingsLocationList(NULL),
-	mIsFirstRun(false),
-	mMinMicroSecPerFrame(0.f)
+	mIsFirstRun(false)
 {
 	if(NULL != sInstance)
 	{
@@ -1259,10 +1258,6 @@ bool LLAppViewer::init()
 
 	joystick = LLViewerJoystick::getInstance();
 	joystick->setNeedsReset(true);
-	/*----------------------------------------------------------------------*/
-
-	gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2));
-	onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));
 
 	return true;
 }
@@ -5419,19 +5414,6 @@ void LLAppViewer::disconnectViewer()
 	LLUrlEntryParcel::setDisconnected(gDisconnected);
 }
 
-bool LLAppViewer::onChangeFrameLimit(LLSD const & evt)
-{
-	if (evt.asInteger() > 0)
-	{
-		mMinMicroSecPerFrame = (U64)(1000000.0f / F32(evt.asInteger()));
-	}
-	else
-	{
-		mMinMicroSecPerFrame = 0;
-	}
-	return false;
-}
-
 void LLAppViewer::forceErrorLLError()
 {
    	LL_ERRS() << "This is a deliberate llerror" << LL_ENDL;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index e8b3464c6e..8f0f54de3b 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -255,8 +255,6 @@ private:
     void sendLogoutRequest();
     void disconnectViewer();
 
-	bool onChangeFrameLimit(LLSD const & evt);
-
 	// *FIX: the app viewer class should be some sort of singleton, no?
 	// Perhaps its child class is the singleton and this should be an abstract base.
 	static LLAppViewer* sInstance; 
@@ -313,10 +311,7 @@ private:
 	// llcorehttp library init/shutdown helper
 	LLAppCoreHttp mAppCoreHttp;
 
-        bool mIsFirstRun;
-	U64 mMinMicroSecPerFrame; // frame throttling
-
-
+    bool mIsFirstRun;
 };
 
 // consts from viewer.h
-- 
cgit v1.2.3


From f72b5b8fd829a266316de743432545430810affb Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Fri, 21 Aug 2020 00:21:46 +0300
Subject: SL-13828 Fixed the Media URL editing on the media prim

---
 indra/newview/llpanelprimmediacontrols.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 67cd23d2ee..2bd78f40ba 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -258,7 +258,7 @@ void LLPanelPrimMediaControls::focusOnTarget()
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	if(media_impl)
 	{
-		if (!media_impl->hasFocus() || isZoomDistExceeding())
+		if (!media_impl->hasFocus())
 		{	
 			// The current target doesn't have media focus -- focus on it.
 			LLViewerObject* objectp = getTargetObject();
-- 
cgit v1.2.3


From b856745048212175eac19536e40cf563b874f6b4 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 21 Aug 2020 20:14:26 +0300
Subject: SL-13835 SSL verification should not crash on invalid certificate

---
 indra/newview/llappcorehttp.cpp                | 22 +++++++++++-----------
 indra/newview/llsecapi.h                       | 10 ++++++++++
 indra/newview/llsechandler_basic.cpp           |  6 ++++--
 indra/newview/llstartup.cpp                    | 21 +++++++++++++++++++--
 indra/newview/skins/default/xui/en/strings.xml |  1 +
 5 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index afa4414968..134a34137b 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -522,20 +522,20 @@ void LLAppCoreHttp::refreshSettings(bool initial)
 LLCore::HttpStatus LLAppCoreHttp::sslVerify(const std::string &url, 
 	const LLCore::HttpHandler::ptr_t &handler, void *appdata)
 {
-	X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
-	LLCore::HttpStatus result;
-	LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
-	LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
-	LLSD validation_params = LLSD::emptyMap();
-	LLURI uri(url);
+    LLCore::HttpStatus result;
+    try
+    {
+        X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
+        LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
+        LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
+        LLSD validation_params = LLSD::emptyMap();
+        LLURI uri(url);
 
-	validation_params[CERT_HOSTNAME] = uri.hostName();
+        validation_params[CERT_HOSTNAME] = uri.hostName();
 
-	// *TODO: In the case of an exception while validating the cert, we need a way
-	// to pass the offending(?) cert back out. *Rider*
+        // *TODO: In the case of an exception while validating the cert, we need a way
+        // to pass the offending(?) cert back out. *Rider*
 
-	try
-	{
 		// don't validate hostname.  Let libcurl do it instead.  That way, it'll handle redirects
 		store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
 	}
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 69b6b32923..ae87cac53c 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -345,6 +345,16 @@ protected:
 	LLSD mCertData;
 };
 
+class LLAllocationCertException : public LLCertException
+{
+public:
+    LLAllocationCertException(const LLSD& cert_data) : LLCertException(cert_data, "CertAllocationFailure")
+    {
+    }
+    virtual ~LLAllocationCertException() throw() {}
+protected:
+};
+
 class LLInvalidCertificate : public LLCertException
 {
 public:
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 8e52480644..8a922aee4f 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -78,14 +78,16 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert,
 	BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length());
 	if(pem_bio == NULL)
 	{
-		LL_ERRS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+        LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+        LLTHROW(LLAllocationCertException(LLSD::emptyMap()));
 	}
 	mCert = NULL;
 	PEM_read_bio_X509(pem_bio, &mCert, 0, NULL);
 	BIO_free(pem_bio);
 	if (!mCert)
 	{
-		LL_ERRS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
+        LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
+        LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
 	}
 }
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 1257add71d..b130fd281c 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1106,7 +1106,7 @@ bool idle_startup()
 				// If optional was skipped this case shouldn't 
 				// be reached.
 
-				LL_INFOS() << "Forcing a quit due to update." << LL_ENDL;
+				LL_INFOS("LLStartup") << "Forcing a quit due to update." << LL_ENDL;
 				LLLoginInstance::getInstance()->disconnect();
 				LLAppViewer::instance()->forceQuit();
 			}
@@ -1127,7 +1127,24 @@ bool idle_startup()
 					{
 						// This was a certificate error, so grab the certificate
 						// and throw up the appropriate dialog.
-						LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
+                        LLPointer<LLCertificate> certificate;
+                        try
+                        {
+                            certificate = gSecAPIHandler->getCertificate(response["certificate"]);
+                        }
+                        catch (LLCertException &cert_exception)
+                        {
+                            LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate()" << LL_ENDL;
+                            LLSD args;
+                            args["REASON"] = LLTrans::getString(cert_exception.what());
+
+                            LLNotificationsUtil::add("GeneralCertificateError", args, response,
+                                general_cert_done);
+
+                            reset_login();
+                            gSavedSettings.setBOOL("AutoLogin", FALSE);
+                            show_connect_box = true;
+                        }
 						if(certificate)
 						{
 							LLSD args = transform_cert_args(certificate);
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 73ee8332cc..30416768cd 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -108,6 +108,7 @@ Voice Server Version: [VOICE_VERSION]
 	<string name="CertKeyUsage">The certificate returned by the server could not be used for SSL.  Please contact your Grid administrator.</string>
 	<string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain.  Please contact your Grid administrator.</string>
 	<string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified.  Please contact your Grid administrator.</string>
+	<string name="CertAllocationFailure">Failed to allocate openssl memory for certificate.</string>
 
 	<string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
 	<string name="LoginFailed">Login failed.</string>
-- 
cgit v1.2.3


From 64a78b8c7f82641ce58761432d04458f0ebea721 Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@gmail.com>
Date: Wed, 29 Jul 2020 13:52:24 -0700
Subject: Small change to CMake options to only enable the
 PreferredToolArchitecture=x64 option (required for 32bit TeamCity builds) on
 32 bit builds generally - removes a ton of 'unknown option, ignored' spam in
 the build output

---
 indra/cmake/00-Common.cmake | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 865c057e33..fc0642bbed 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -63,7 +63,12 @@ if (WINDOWS)
   # Without PreferredToolArchitecture=x64, as of 2020-06-26 the 32-bit
   # compiler on our TeamCity build hosts has started running out of virtual
   # memory for the precompiled header file.
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /p:PreferredToolArchitecture=x64")
+  # CP changed to only append the flag for 32bit builds - on 64bit builds,
+  # locally at least, the build output is spammed with 1000s of 'D9002'
+  # warnings about this switch being ignored.
+  if( ADDRESS_SIZE EQUAL 32 )
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /p:PreferredToolArchitecture=x64")  
+  endif()
 
   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
       "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zo"
-- 
cgit v1.2.3


From 0e0ba2fd866e6f6f3b89008dbe7d3a8e0c826ff5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Sat, 22 Aug 2020 00:37:23 +0300
Subject: SL-13830 One more coroutine crash

---
 indra/newview/llvoicevivox.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 42a1cf95a7..970570b135 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -411,6 +411,7 @@ void LLVivoxVoiceClient::terminate()
 	}
 	else
 	{
+		mRelogRequested = false;
 		killGateway();
 	}
 }
@@ -660,12 +661,18 @@ void LLVivoxVoiceClient::voiceControlCoro()
 
     U32 retry = 0;
 
-    while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
+    while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !LLApp::isExiting())
     {
         LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
         llcoro::suspendUntilTimeout(1.0);
     }
 
+    if (LLApp::isExiting())
+    {
+        mIsCoroutineActive = false;
+        return;
+    }
+
     do
     {
         bool success = startAndConnectSession();
-- 
cgit v1.2.3


From 9de1f91daedaa7676909d09a7524afb8d9a23d92 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 21 Aug 2020 16:49:11 -0600
Subject: SL-13743 revert part of SL-12978 change that broke low-angle sunlight

---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index b7741ff48d..140d788fff 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -81,8 +81,13 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     haze_weight = vec4(haze_density) / temp1;
 
     //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
-    // SL-12978: temp2.y = 1; optimized away
-    sunlight *= exp(-light_atten);
+    temp2.y = max(0.0, tmpLightnorm.y);
+    if (abs(temp2.y) > 0.000001f)
+    {
+        temp2.y = 1. / abs(temp2.y);
+    }
+    temp2.y = max(0.0000001f, temp2.y);
+    sunlight *= exp(-light_atten * temp2.y);
 
     // main atmospheric scattering line integral
     temp2.z = Plen * dens_mul;
-- 
cgit v1.2.3


From 85e03a7ad749a702a48da4a6a6d6997c433e8eaa Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Sat, 22 Aug 2020 10:29:33 +0300
Subject: SL-13830 One more coroutine exit crash

LLWorld is supposed to first remove region from list, then delete the region, but in case of this crash region was returned by handle from llworld yet was mDead and cleaned up, all in main thread.
---
 indra/newview/llviewerregion.cpp | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 2ca045b0c9..b9cf4b07dc 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -298,6 +298,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
 
         ++mSeedCapAttempts;
 
+        if (LLApp::isExiting())
+        {
+            return;
+        }
+
         regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);
         if (!regionp) //region was removed
         {
@@ -412,6 +417,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)
             break;  // no retry
         }
 
+        if (LLApp::isExiting())
+        {
+            break;
+        }
+
         regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);
         if (!regionp) //region was removed
         {
@@ -515,6 +525,11 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region
             continue;  
         }
 
+        if (LLApp::isExiting())
+        {
+            break;
+        }
+
         // remove the http_result from the llsd
         result.erase("http_result");
 
-- 
cgit v1.2.3


From 0af47fe707bee4f07cfa81f1e3edbe73b250e53e Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 24 Aug 2020 13:33:24 -0600
Subject: DRTVWR-497 tweak clang-format rules for argument packing

---
 .clang-format | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.clang-format b/.clang-format
index 61c5acde88..ee8a8a8c92 100644
--- a/.clang-format
+++ b/.clang-format
@@ -12,7 +12,7 @@ AlignOperands:   true
 AlignTrailingComments: true
 AllowAllArgumentsOnNextLine: false
 AllowAllConstructorInitializersOnNextLine: false
-AllowAllParametersOfDeclarationOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: false
 AllowShortBlocksOnASingleLine: Always
 AllowShortCaseLabelsOnASingleLine: false
 AllowShortFunctionsOnASingleLine: All
@@ -23,8 +23,8 @@ AlwaysBreakAfterDefinitionReturnType: None
 AlwaysBreakAfterReturnType: None
 AlwaysBreakBeforeMultilineStrings: false
 AlwaysBreakTemplateDeclarations: MultiLine
-BinPackArguments: false
-BinPackParameters: false
+BinPackArguments: true
+BinPackParameters: true
 BreakBeforeBinaryOperators: None
 BreakBeforeBraces: Allman
 BreakBeforeInheritanceComma: false
@@ -44,7 +44,7 @@ Cpp11BracedListStyle: true
 DeriveLineEnding: true
 DerivePointerAlignment: false
 DisableFormat:   false
-ExperimentalAutoDetectBinPacking: false
+ExperimentalAutoDetectBinPacking: true
 FixNamespaceComments: true
 ForEachMacros:
   - foreach
-- 
cgit v1.2.3


From 7a2237a3a6815676cdaf3929f7fe36ef2649281a Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 24 Aug 2020 15:58:04 -0600
Subject: DRTVWR-497 restore parallel builds for x64 VS2017

---
 indra/cmake/00-Common.cmake | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index fc0642bbed..8aea50e02b 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -66,8 +66,9 @@ if (WINDOWS)
   # CP changed to only append the flag for 32bit builds - on 64bit builds,
   # locally at least, the build output is spammed with 1000s of 'D9002'
   # warnings about this switch being ignored.
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")  
   if( ADDRESS_SIZE EQUAL 32 )
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /p:PreferredToolArchitecture=x64")  
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /p:PreferredToolArchitecture=x64")  
   endif()
 
   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
-- 
cgit v1.2.3


From 1cd65a244736d0c11f5740f8a19f8d5459d5d4b6 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 25 Aug 2020 22:21:46 +0300
Subject: SL-13498 Crash at ~LLPersistentNotificationChannel

Callstack is clearly broken since it points to LLNotifications::instance().clear(); after 'Goodbye!', my suspicion is that something reinitialized singleton so I fixed cleanup and added some logging to see if there is a dupplicate init
---
 indra/llui/llnotifications.cpp | 32 +++++++++++++++++++-------------
 indra/llui/llnotifications.h   |  2 ++
 2 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 6a7075301b..06ec648178 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -255,7 +255,7 @@ LLNotificationForm::LLNotificationForm(const LLSD& sd)
 	}
 	else
 	{
-		LL_WARNS() << "Invalid form data " << sd << LL_ENDL;
+		LL_WARNS("Notifications") << "Invalid form data " << sd << LL_ENDL;
 		mFormData = LLSD::emptyArray();
 	}
 }
@@ -448,11 +448,11 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
 		mUniqueContext.push_back(context.value);
 	}
 	
-	LL_DEBUGS() << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
+	LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
 	
 	BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
 	{
-		LL_DEBUGS() << "    tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
+		LL_DEBUGS("Notifications") << "    tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
 		mTags.push_back(tag.value);
 	}
 
@@ -1398,8 +1398,14 @@ void LLNotifications::initSingleton()
 	createDefaultChannels();
 }
 
+void LLNotifications::cleanupSingleton()
+{
+    clear();
+}
+
 void LLNotifications::createDefaultChannels()
 {
+    LL_INFOS("Notifications") << "Generating default notification channels" << LL_ENDL;
 	// now construct the various channels AFTER loading the notifications,
 	// because the history channel is going to rewrite the stored notifications file
 	mDefaultChannels.push_back(new LLNotificationChannel("Enabled", "",
@@ -1455,7 +1461,7 @@ void LLNotifications::forceResponse(const LLNotification::Params& params, S32 op
 	
 	if (selected_item.isUndefined())
 	{
-		LL_WARNS() << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
+		LL_WARNS("Notifications") << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
 		return;
 	}
 	response[selected_item["name"].asString()] = true;
@@ -1489,12 +1495,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
 			if (found != replacements.end())
 			{
 				replacement = found->second;
-				LL_DEBUGS() << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
+				LL_DEBUGS("Notifications") << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
 				it->second->setValue(replacement);
 			}
 			else
 			{
-				LL_WARNS() << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
+				LL_WARNS("Notifications") << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
 			}
 		}
 	}
@@ -1533,7 +1539,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& path
 
 bool LLNotifications::loadTemplates()
 {
-	LL_INFOS() << "Reading notifications template" << LL_ENDL;
+	LL_INFOS("Notifications") << "Reading notifications template" << LL_ENDL;
 	// Passing findSkinnedFilenames(constraint=LLDir::ALL_SKINS) makes it
 	// output all relevant pathnames instead of just the ones from the most
 	// specific skin.
@@ -1604,7 +1610,7 @@ bool LLNotifications::loadTemplates()
 		mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
 	}
 
-	LL_INFOS() << "...done" << LL_ENDL;
+	LL_INFOS("Notifications") << "...done" << LL_ENDL;
 
 	return true;
 }
@@ -1832,7 +1838,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
 	for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
 	{
 		// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
-		LL_DEBUGS() 
+		LL_DEBUGS("Notifications")
 			<< "notification \"" << n->getName() << "\" " 
 			<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
 			<< "name = \"" << (*it)->mName << "\" "
@@ -1877,7 +1883,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
 			if((*it)->mResponse.empty())
 			{
 				// Response property is empty.  Cancel this notification.
-				LL_DEBUGS() << "cancelling notification " << n->getName() << LL_ENDL;
+				LL_DEBUGS("Notifications") << "cancelling notification " << n->getName() << LL_ENDL;
 
 				cancel(n);
 			}
@@ -1888,7 +1894,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
 				// TODO: verify that the response template has an item with the correct name
 				response[(*it)->mResponse] = true;
 
-				LL_DEBUGS() << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
+				LL_DEBUGS("Notifications") << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
 				
 				n->respond(response);
 			}
@@ -1900,7 +1906,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
 		break;
 	}
 	
-	LL_DEBUGS() << "allowing notification " << n->getName() << LL_ENDL;
+	LL_DEBUGS("Notifications") << "allowing notification " << n->getName() << LL_ENDL;
 
 	return true;
 }
@@ -1961,7 +1967,7 @@ void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id,
 	// from PE merge - we should figure out if this is the right thing to do
 	if (name.empty())
 	{
-		LL_WARNS() << "Empty name received for Id: " << agent_id << LL_ENDL;
+		LL_WARNS("Notifications") << "Empty name received for Id: " << agent_id << LL_ENDL;
 		name = SYSTEM_FROM;
 	}
 	
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index cac687f53d..2f4578da17 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -957,6 +957,7 @@ public:
 	
 private:
 	/*virtual*/ void initSingleton();
+	/*virtual*/ void cleanupSingleton();
 	
 	void loadPersistentNotifications();
 
@@ -1069,6 +1070,7 @@ public:
 	LLPersistentNotificationChannel() 
 		:	LLNotificationChannel("Persistent", "Visible", &notificationFilter)
 	{}
+	virtual ~LLPersistentNotificationChannel() {}
 
 	typedef std::vector<LLNotificationPtr> history_list_t;
 	history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }
-- 
cgit v1.2.3


From 31c13ffe251a6b638ace0f14e20ccbfaf9adcb1b Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 26 Aug 2020 16:27:16 +0300
Subject: SL-10326 Fixed avatar rotation of selected avatars and selected self

---
 indra/newview/llmaniprotate.cpp  | 23 ++++++++++++++++++++++-
 indra/newview/llmaniprotate.h    |  1 +
 indra/newview/llviewerwindow.cpp |  2 +-
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index f158aae3d2..c3e39429a2 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -447,6 +447,7 @@ BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
 	}
 
 	mMouseCur = mMouseDown;
+	mAgentSelfAtAxis = gAgent.getAtAxis(); // no point checking if avatar was selected, just save the value
 
 	// Route future Mouse messages here preemptively.  (Release on mouse up.)
 	setMouseCapture( TRUE );
@@ -610,6 +611,26 @@ void LLManipRotate::drag( S32 x, S32 y )
 			else
 			{
 				object->setRotation(new_rot, damped);
+                LLVOAvatar* avatar = object->asAvatar();
+                if (avatar && avatar->isSelf()
+                    && LLSelectMgr::getInstance()->mAllowSelectAvatar
+                    && !object->getParent())
+                {
+                    // Normal avatars use object's orienttion, but self uses
+                    // separate LLCoordFrame
+                    // See LVOAvatar::updateOrientation()
+                    if (gAgentCamera.getFocusOnAvatar())
+                    {
+                        //Don't rotate camera with avatar
+                        gAgentCamera.setFocusOnAvatar(false, false, false);
+                    }
+
+                    LLVector3 at_axis = mAgentSelfAtAxis;
+                    at_axis *= mRotation;
+                    at_axis.mV[VZ] = 0.f;
+                    at_axis.normalize();
+                    gAgent.resetAxes(at_axis);
+                }
 				rebuild(object);
 			}
 
@@ -717,7 +738,7 @@ void LLManipRotate::drag( S32 x, S32 y )
 		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
 		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
 			((root_object == NULL) || !root_object->isPermanentEnforced()) &&
-			!cur->isAvatar())
+			(!cur->isAvatar() || LLSelectMgr::getInstance()->mAllowSelectAvatar))
 		{
 			selectNode->mLastRotation = cur->getRotation();
 			selectNode->mLastPositionLocal = cur->getPosition();
diff --git a/indra/newview/llmaniprotate.h b/indra/newview/llmaniprotate.h
index e8f1c24c58..dc36ef796a 100644
--- a/indra/newview/llmaniprotate.h
+++ b/indra/newview/llmaniprotate.h
@@ -95,6 +95,7 @@ private:
 	
 	LLVector3			mMouseDown;
 	LLVector3			mMouseCur;
+	LLVector3			mAgentSelfAtAxis; // Own agent uses separate rotation method
 	F32					mRadiusMeters;
 	
 	LLVector3			mCenterToCam;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 347acfe15f..5b83cf7163 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -3930,7 +3930,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
 						draw_handles = FALSE;
 					}
 
-					if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move)
+					if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isMovableAvatarSelected())
 					{
 						draw_handles = FALSE;
 					}
-- 
cgit v1.2.3


From bca624b3fced41e01371560e5e58a5912e35c6a7 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Wed, 26 Aug 2020 17:45:32 -0700
Subject: SL-13721 Fix incorrect water reflection

---
 indra/newview/pipeline.cpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 456b98b1e8..d3f4b7c73c 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9288,6 +9288,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 		
 		gPipeline.pushRenderTypeMask();
 
+        glh::matrix4f current    = get_current_modelview();
         glh::matrix4f projection = get_current_projection();
 		glh::matrix4f mat;
 
@@ -9327,8 +9328,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 			//disable occlusion culling for reflection map for now
 			LLPipeline::sUseOcclusion = 0;
 
-        glh::matrix4f current = get_current_modelview();
-
         if (!camera_is_underwater)
         {   //generate planar reflection map
 
@@ -9337,15 +9336,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
             gGL.matrixMode(LLRender::MM_MODELVIEW);
             gGL.pushMatrix();
 
-            glh::matrix4f mat;
-            camera.getOpenGLTransform(mat.m);
-
-            glh::matrix4f scal;
-            scal.set_scale(glh::vec3f(1, 1, -1));
-            mat = scal * mat;
+            mat.set_scale(glh::vec3f(1, 1, -1));
+            mat.set_translate(glh::vec3f(0,0,water_height*2.f));
+            mat = current * mat;
 
-            // convert from CFR to OGL coord sys...
-            mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat;
 
             mReflectionModelView = mat;
 
@@ -9354,6 +9348,12 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
 			LLViewerCamera::updateFrustumPlanes(camera, FALSE, TRUE);
 
+            glh::vec3f    origin(0, 0, 0);
+            glh::matrix4f inv_mat = mat.inverse();
+            inv_mat.mult_matrix_vec(origin);
+
+            camera.setOrigin(origin.v);
+
 			glCullFace(GL_FRONT);
 
 			if (LLDrawPoolWater::sNeedsReflectionUpdate)
-- 
cgit v1.2.3


From be48bee98f3da0e956a777f4478e010fed7c66eb Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 27 Aug 2020 12:33:32 +0300
Subject: SL-13835 Fixed warning for certificate

---
 indra/newview/llstartup.cpp                          |  4 ++--
 indra/newview/skins/default/xui/en/notifications.xml | 11 +++++++++++
 indra/newview/skins/default/xui/en/strings.xml       |  1 +
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index b130fd281c..3ef2d47d37 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1134,11 +1134,11 @@ bool idle_startup()
                         }
                         catch (LLCertException &cert_exception)
                         {
-                            LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate()" << LL_ENDL;
+                            LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate("<< response["certificate"] << ")" << LL_ENDL;
                             LLSD args;
                             args["REASON"] = LLTrans::getString(cert_exception.what());
 
-                            LLNotificationsUtil::add("GeneralCertificateError", args, response,
+                            LLNotificationsUtil::add("GeneralCertificateErrorShort", args, response,
                                 general_cert_done);
 
                             reset_login();
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 32a801e1a3..a0d56a0d08 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3691,6 +3691,17 @@ Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the curr
      yestext="OK"/>
   </notification>
 
+  <notification icon="alertmodal.tga"
+		name="GeneralCertificateErrorShort"
+		type="alertmodal">
+Could not connect to the server.
+[REASON]
+    <tag>fail</tag>
+    <usetemplate
+     name="okbutton"
+     yestext="OK"/>
+  </notification>
+
   <notification icon="alertmodal.tga"
 		name="GeneralCertificateError"
 		type="alertmodal">
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 30416768cd..8a7923dd26 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -107,6 +107,7 @@ Voice Server Version: [VOICE_VERSION]
 	<string name="CertExpired">The certificate returned by the Grid appears to be expired.  Please check your system clock, or contact your Grid administrator.</string>
 	<string name="CertKeyUsage">The certificate returned by the server could not be used for SSL.  Please contact your Grid administrator.</string>
 	<string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain.  Please contact your Grid administrator.</string>
+	<string name="CertInvalid">Could not load cetrificate. Please contact your Grid administrator.</string>
 	<string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified.  Please contact your Grid administrator.</string>
 	<string name="CertAllocationFailure">Failed to allocate openssl memory for certificate.</string>
 
-- 
cgit v1.2.3


From a8b5ca77dc7bb3afb64df7910a3751d799c1ac74 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 27 Aug 2020 17:27:11 +0300
Subject: SL-13835 Typo

---
 indra/newview/skins/default/xui/en/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 8a7923dd26..585cf3f001 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -107,7 +107,7 @@ Voice Server Version: [VOICE_VERSION]
 	<string name="CertExpired">The certificate returned by the Grid appears to be expired.  Please check your system clock, or contact your Grid administrator.</string>
 	<string name="CertKeyUsage">The certificate returned by the server could not be used for SSL.  Please contact your Grid administrator.</string>
 	<string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain.  Please contact your Grid administrator.</string>
-	<string name="CertInvalid">Could not load cetrificate. Please contact your Grid administrator.</string>
+	<string name="CertInvalid">Could not load certificate. Please contact your Grid administrator.</string>
 	<string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified.  Please contact your Grid administrator.</string>
 	<string name="CertAllocationFailure">Failed to allocate openssl memory for certificate.</string>
 
-- 
cgit v1.2.3


From 71bfdd57d72f5a12ab1a361dd160283acc85a0bb Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 27 Aug 2020 12:11:04 -0700
Subject: SL-13721 Cleanup saved matrix names

---
 indra/newview/pipeline.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index d3f4b7c73c..9516273396 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9288,8 +9288,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 		
 		gPipeline.pushRenderTypeMask();
 
-        glh::matrix4f current    = get_current_modelview();
-        glh::matrix4f projection = get_current_projection();
+        glh::matrix4f saved_modelview  = get_current_modelview();
+        glh::matrix4f saved_projection = get_current_projection();
 		glh::matrix4f mat;
 
         S32 detail = RenderReflectionDetail;
@@ -9338,7 +9338,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
             mat.set_scale(glh::vec3f(1, 1, -1));
             mat.set_translate(glh::vec3f(0,0,water_height*2.f));
-            mat = current * mat;
+            mat = saved_modelview * mat;
 
 
             mReflectionModelView = mat;
@@ -9406,7 +9406,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 						}
 					}
 
-                    LLGLUserClipPlane clip_plane(plane, mReflectionModelView, projection);
+                    LLGLUserClipPlane clip_plane(plane, mReflectionModelView, saved_projection);
 					LLGLDisable cull(GL_CULL_FACE);
                     updateCull(camera, mReflectedObjects, -water_clip, &plane);
                     stateSort(camera, mReflectedObjects);
@@ -9420,7 +9420,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
             gGL.matrixMode(LLRender::MM_MODELVIEW);
 			gGL.popMatrix();
             
-            set_current_modelview(current);         
+            set_current_modelview(saved_modelview);
 		}
 
         //LLPipeline::sUseOcclusion = occlusion;
@@ -9476,7 +9476,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
                 //clip out geometry on the same side of water as the camera w/ enough margin to not include the water geo itself,
                 // but not so much as to clip out parts of avatars that should be seen under the water in the distortion map
                 LLPlane plane(-pnorm, water_dist);
-                LLGLUserClipPlane clip_plane(plane, current, projection);
+                LLGLUserClipPlane clip_plane(plane, saved_modelview, saved_projection);
 
 				gGL.setColorMask(true, true);
 				mWaterDis.clear();
-- 
cgit v1.2.3


From 2f52a37e6a240a4a950779f2ef769a4fbd3baaf5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Sat, 22 Aug 2020 23:01:20 +0300
Subject: SL-13811 Crash on coroprocedure

---
 indra/llmessage/llcoproceduremanager.cpp | 21 ++++++++-------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 969cd162fb..2494c31613 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -77,12 +77,12 @@ public:
     ///
     inline size_t countActive() const
     {
-        return mActiveCoprocs.size();
+        return mActiveCoprocsCount;
     }
 
     /// Returns the total number of coprocedures either queued or in active processing.
     ///
-    inline size_t count() const
+    inline S32 count() const
     {
         return countPending() + countActive();
     }
@@ -113,12 +113,10 @@ private:
     // because the consuming coroutine might outlive this LLCoprocedurePool
     // instance.
     typedef boost::shared_ptr<CoprocQueue_t> CoprocQueuePtr;
-    typedef std::map<LLUUID, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> ActiveCoproc_t;
 
     std::string     mPoolName;
-    size_t          mPoolSize, mPending{0};
+    size_t          mPoolSize, mActiveCoprocsCount, mPending;
     CoprocQueuePtr  mPendingCoprocs;
-    ActiveCoproc_t  mActiveCoprocs;
     LLTempBoundListener mStatusListener;
 
     typedef std::map<std::string, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> CoroAdapterMap_t;
@@ -281,6 +279,8 @@ void LLCoprocedureManager::close(const std::string &pool)
 LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
     mPoolName(poolName),
     mPoolSize(size),
+    mActiveCoprocsCount(0),
+    mPending(0),
     mPendingCoprocs(boost::make_shared<CoprocQueue_t>(DEFAULT_QUEUE_SIZE)),
     mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
     mCoroMapping()
@@ -406,8 +406,7 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
         }
         // we actually popped an item
         --mPending;
-
-        ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first;
+        mActiveCoprocsCount++;
 
         LL_DEBUGS("CoProcMgr") << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\" (" << mPending << " left)" << LL_ENDL;
 
@@ -417,10 +416,6 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
         }
         catch (const LLCoros::Stop &)
         {
-            LL_INFOS("CoProcMgr") << "Viewer is shutting Down. Stopping coprocedure('" << coproc->mName
-                                   << "', id=" << coproc->mId.asString()
-                                   << ") in pool '" << mPoolName << "'" << LL_ENDL;
-            mActiveCoprocs.erase(itActive);
             throw; // let toplevel handle this as LLContinueError
         }
         catch (...)
@@ -429,13 +424,13 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
                                               << "', id=" << coproc->mId.asString()
                                               << ") in pool '" << mPoolName << "'"));
             // must NOT omit this or we deplete the pool
-            mActiveCoprocs.erase(itActive);
+            mActiveCoprocsCount--;
             continue;
         }
 
         LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL;
 
-        mActiveCoprocs.erase(itActive);
+        mActiveCoprocsCount--;
     }
 }
 
-- 
cgit v1.2.3


From a42045994dacbf687cb986d8f1a644f0399cffb5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 28 Aug 2020 01:22:35 +0300
Subject: SL-13555 'Second Life quit unexpectedly' error message

---
 indra/llmessage/llcoproceduremanager.cpp |  4 +++-
 indra/newview/llappearancemgr.cpp        | 13 +++++++++++++
 indra/newview/llvoicevivox.cpp           | 15 ++++++++++++++-
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index 2494c31613..26684a4d9e 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -414,8 +414,10 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
         {
             coproc->mProc(httpAdapter, coproc->mId);
         }
-        catch (const LLCoros::Stop &)
+        catch (const LLCoros::Stop &e)
         {
+            LL_INFOS("LLCoros") << "coprocedureInvokerCoro terminating because "
+                << e.what() << LL_ENDL;
             throw; // let toplevel handle this as LLContinueError
         }
         catch (...)
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 1a33059188..168b8eb47a 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -3582,6 +3582,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
     }
 
     llcoro::suspend();
+    if (LLApp::isQuitting())
+    {
+        return;
+    }
     S32 retryCount(0);
     bool bRetry;
     do
@@ -3645,6 +3649,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
 
         LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
 
+        if (LLApp::isQuitting())
+        {
+            return;
+        }
+
         LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
         LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
 
@@ -3680,6 +3689,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
                 LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
 
                 llcoro::suspendUntilTimeout(timeout); 
+                if (LLApp::isQuitting())
+                {
+                    return;
+                }
                 bRetry = true;
                 continue;
             }
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 970570b135..7b6d9613ac 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -1740,6 +1740,12 @@ bool LLVivoxVoiceClient::waitForChannel()
             mIsProcessingChannels = true;
             llcoro::suspend();
 
+            if (LLApp::isExiting())
+            {
+                mRelogRequested = false;
+                break;
+            }
+
             if (mTuningMode)
             {
                 performMicTuning();
@@ -1784,6 +1790,13 @@ bool LLVivoxVoiceClient::waitForChannel()
             {
                 llcoro::suspendUntilTimeout(1.0);
             }
+
+            if (LLApp::isExiting())
+            {
+                mRelogRequested = false;
+                break;
+            }
+
         } while (mVoiceEnabled && !mRelogRequested);
 
         LL_DEBUGS("Voice")
@@ -1813,7 +1826,7 @@ bool LLVivoxVoiceClient::waitForChannel()
         << " RelogRequested=" << mRelogRequested
         << " VoiceEnabled=" << mVoiceEnabled
         << LL_ENDL;
-    return true;
+    return !LLApp::isExiting();
 }
 
 bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
-- 
cgit v1.2.3


From 7396879ef6ba11ea387bb799b4ab89c82e569f45 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 28 Aug 2020 09:50:01 -0600
Subject: SL-13768 remove moon glow from sky and clouds

---
 indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl  | 3 ++-
 indra/newview/app_settings/shaders/class1/deferred/skyV.glsl     | 3 ++-
 indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl | 3 ++-
 indra/newview/app_settings/shaders/class2/windlight/skyV.glsl    | 5 +++--
 indra/newview/lldrawpoolwlsky.cpp                                | 3 ++-
 5 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index 495daa2db6..b9c19981d2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -161,7 +161,8 @@ void main()
     temp2.x *= sun_moon_glow_factor;
 
 	// Add "minimum anti-solar illumination"
-	temp2.x += .25;
+    // For sun, add to glow.  For moon, remove glow entirely. SL-13768
+    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
index ead754ec76..f779cf54ce 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -131,7 +131,8 @@ void main()
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
 	// Add "minimum anti-solar illumination"
-	temp2.x += .25;
+    // For sun, add to glow.  For moon, remove glow entirely. SL-13768
+    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
 
     vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
                 + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index a4389f62dc..7d736b8fcc 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -161,7 +161,8 @@ void main()
     temp2.x *= sun_moon_glow_factor;
 
 	// Add "minimum anti-solar illumination"
-	temp2.x += .25;
+    // For sun, add to glow.  For moon, remove glow entirely. SL-13768
+    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 0d141342ce..1361f6a11d 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -127,7 +127,8 @@ void main()
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
 	// Add "minimum anti-solar illumination"
-	temp2.x += .25;
+    // For sun, add to glow.  For moon, remove glow entirely. SL-13768
+    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
 
     vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
                 + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
@@ -156,6 +157,6 @@ void main()
 	color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
 
     // Haze color above cloud
-	vary_HazeColor = color;	
+    vary_HazeColor = color;
 }
 
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index fbac523ff0..b0eb1a405b 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -216,10 +216,11 @@ void LLDrawPoolWLSky::renderSkyHaze(const LLVector3& camPosLocal, F32 camHeightL
 
 	if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
 	{
+        LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
         LLGLSPipelineDepthTestSkyBox sky(true, false);
         sky_shader->bind();
         sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, 1);
-        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, 1.0f);
+        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor());
         renderDome(origin, camHeightLocal, sky_shader);	
 		sky_shader->unbind();
     }
-- 
cgit v1.2.3


From 0f80162dcf0f669630e8e338e358910b95cac196 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 28 Aug 2020 10:33:48 -0600
Subject: SL-13768 de-obfuscate cloud/sky vertex shaders

---
 .../shaders/class1/deferred/cloudsV.glsl           | 78 ++++++++++------------
 .../app_settings/shaders/class1/deferred/skyV.glsl | 64 ++++++++----------
 .../shaders/class2/windlight/cloudsV.glsl          | 76 +++++++++------------
 .../shaders/class2/windlight/skyV.glsl             | 64 ++++++++----------
 4 files changed, 123 insertions(+), 159 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index b9c19981d2..bf4e6b8e61 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -94,75 +94,66 @@ void main()
 	vary_texcoord3 = vary_texcoord1 * 16.;
 
 	// Get relative position
-	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
 
-    altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0);
+    altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
 	// Set altitude
-	if (P.y > 0.)
+	if (rel_pos.y > 0.)
 	{
-		P *= (max_y / P.y);
+		rel_pos *= (max_y / rel_pos.y);
 	}
 	else
 	{
 		altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon
-		P *= (-32000. / P.y);
+		rel_pos *= (-32000. / rel_pos.y);
 	}
 
 	// Can normalize then
-	vec3 Pn = normalize(P);
-	float  Plen = length(P);
+	vec3 rel_pos_norm = normalize(rel_pos);
+	float  rel_pos_len = length(rel_pos);
 
 	// Initialize temp variables
-	vec4 temp1 = vec4(0.);
-	vec4 temp2 = vec4(0.);
-	vec4 blue_weight;
-	vec4 haze_weight;
-	//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 	vec4 sunlight = sunlight_color;
 	vec4 light_atten;
 
-    float dens_mul = density_multiplier;
-
-	// Sunlight attenuation effect (hue and brightness) due to atmosphere
+    // Sunlight attenuation effect (hue and brightness) due to atmosphere
 	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
 	// Calculate relative weights
-	temp1 = abs(blue_density) + vec4(abs(haze_density));
-	blue_weight = blue_density / temp1;
-	haze_weight = haze_density / temp1;
+	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight = blue_density / combined_haze;
+	vec4 haze_weight = haze_density / combined_haze;
 
-	// Compute sunlight from P & lightnorm (for long rays like sky)
-	temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
-	temp2.y = 1. / temp2.y;
-	sunlight *= exp( - light_atten * temp2.y);
+	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
+    sunlight *= exp( - light_atten * off_axis);
 
 	// Distance
-	temp2.z = Plen * dens_mul;
+	float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> temp1)
-	// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+	// Transparency (-> combined_haze)
+	// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
 	// compiler gets confused.
-	temp1 = exp(-temp1 * temp2.z);
+	combined_haze = exp(-combined_haze * density_dist);
 
 
 	// Compute haze glow
-	temp2.x = dot(Pn, lightnorm.xyz);
-	temp2.x = 1. - temp2.x;
-		// temp2.x is 0 at the sun and increases away from sun
-	temp2.x = max(temp2.x, .001);	
+    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
+    // haze_glow is 0 at the sun and increases away from sun
+	haze_glow = max(haze_glow, .001);	
 		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	temp2.x *= glow.x;
+	haze_glow *= glow.x;
 		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	temp2.x = pow(temp2.x, glow.z);
+	haze_glow = pow(haze_glow, glow.z);
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
-    temp2.x *= sun_moon_glow_factor;
+    haze_glow *= sun_moon_glow_factor;
 
 	// Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
-    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
+    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
@@ -173,23 +164,22 @@ void main()
 
 	// Haze color below cloud
 	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
 			 );	
 
 	// CLOUDS
-	temp2.y = max(0., lightnorm.y * 2.);
-	temp2.y = 1. / temp2.y;
-	sunlight *= exp( - light_atten * temp2.y);
+	off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
+	sunlight *= exp( - light_atten * off_axis);
 
 	// Cloud color out
-	vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
+	vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
 	vary_CloudColorAmbient = tmpAmbient * cloud_color;
 	
 	// Attenuate cloud color by atmosphere
-	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds
-	vary_CloudColorSun *= temp1;
-	vary_CloudColorAmbient *= temp1;
-	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
+	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
+	vary_CloudColorSun *= combined_haze;
+	vary_CloudColorAmbient *= combined_haze;
+	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
 
 	// Make a nice cloud density based on the cloud_shadow value that was passed in.
 	vary_CloudDensity = 2. * (cloud_shadow - 0.25);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
index f779cf54ce..cd19fa460b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -70,77 +70,69 @@ void main()
 	gl_Position = pos;
 	
 	// Get relative position
-	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
 
 	// Set altitude
-	if (P.y > 0.)
+	if (rel_pos.y > 0.)
 	{
-		P *= (max_y / P.y);
+		rel_pos *= (max_y / rel_pos.y);
 	}
 	else
 	{
-		P *= (-32000. / P.y);
+		rel_pos *= (-32000. / rel_pos.y);
 	}
 
 	// Can normalize then
-	vec3 Pn = normalize(P);
+	vec3 rel_pos_norm = normalize(rel_pos);
 
-	float Plen = length(P);
+	float rel_pos_len = length(rel_pos);
 
 	// Initialize temp variables
-	vec4 temp1 = vec4(0.);
-	vec4 temp2 = vec4(0.);
-	vec4 blue_weight;
-	vec4 haze_weight;
 	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 	vec4 light_atten;
 
-    float dens_mul = density_multiplier;
-
 	// Sunlight attenuation effect (hue and brightness) due to atmosphere
 	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
 	// Calculate relative weights
-	temp1 = abs(blue_density) + vec4(abs(haze_density));
-	blue_weight = blue_density / temp1;
-	haze_weight = haze_density / temp1;
+	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight = blue_density / combined_haze;
+    vec4 haze_weight = haze_density / combined_haze;
 
-	// Compute sunlight from P & lightnorm (for long rays like sky)
-    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
-    temp2.y = 1. / temp2.y;
-    sunlight *= exp( - light_atten * temp2.y);
+	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
+    sunlight *= exp( - light_atten * off_axis);
 
 	// Distance
-	temp2.z = Plen * dens_mul;
+	float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> temp1)
-    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+	// Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
     // compiler gets confused.
-    temp1 = exp(-temp1 * temp2.z);
+    combined_haze = exp(-combined_haze * density_dist);
 
 	// Compute haze glow
-	temp2.x = dot(Pn, lightnorm.xyz);
-	temp2.x = 1. - temp2.x;
-		// temp2.x is 0 at the sun and increases away from sun
-	temp2.x = max(temp2.x, .001);	
+    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
+    // haze_glow is 0 at the sun and increases away from sun
+	haze_glow = max(haze_glow, .001);	
 		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	temp2.x *= glow.x;
+	haze_glow *= glow.x;
 		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	temp2.x = pow(temp2.x, glow.z);
+	haze_glow = pow(haze_glow, glow.z);
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
 	// Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
-    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
+    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
     vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
+                + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)
              );
 
 
     // Final atmosphere additive
-    color *= (1. - temp1);
+    color *= (1. - combined_haze);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
@@ -151,14 +143,14 @@ void main()
 
 	// Haze color below cloud
 	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
 			 );	
 
 	// Attenuate cloud color by atmosphere
-	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds
+	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
 
 	// At horizon, blend high altitude sky color towards the darker color below the clouds
-	color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
+	color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
 
     // Haze color above cloud
 	vary_HazeColor = color;	
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 7d736b8fcc..e4c36ee657 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -94,75 +94,66 @@ void main()
 	vary_texcoord3 = vary_texcoord1 * 16.;
 
 	// Get relative position
-	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
 
     // fade clouds beyond a certain point so the bottom of the sky dome doesn't look silly at high altitude
-    altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0);
+    altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
 	// Set altitude
-	if (P.y > 0.)
+	if (rel_pos.y > 0.)
 	{
-		P *= (max_y / P.y);
+		rel_pos *= (max_y / rel_pos.y);
 	}
 	else
 	{
-		P *= (-32000. / P.y);
+		rel_pos *= (-32000. / rel_pos.y);
 	}
 
 	// Can normalize then
-	vec3 Pn = normalize(P);
-	float  Plen = length(P);
+	vec3 rel_pos_norm = normalize(rel_pos);
+	float rel_pos_len = length(rel_pos);
 
 	// Initialize temp variables
-	vec4 temp1 = vec4(0.);
-	vec4 temp2 = vec4(0.);
-	vec4 blue_weight;
-	vec4 haze_weight;
-	//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 	vec4 sunlight = sunlight_color;
 	vec4 light_atten;
 
-    float dens_mul = density_multiplier;
-
 	// Sunlight attenuation effect (hue and brightness) due to atmosphere
 	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
 	// Calculate relative weights
-	temp1 = abs(blue_density) + vec4(abs(haze_density));
-	blue_weight = blue_density / temp1;
-	haze_weight = haze_density / temp1;
+	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight = blue_density / combined_haze;
+    vec4 haze_weight = haze_density / combined_haze;
 
-	// Compute sunlight from P & lightnorm (for long rays like sky)
-	temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
-	temp2.y = 1. / temp2.y;
-	sunlight *= exp( - light_atten * temp2.y);
+	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
+    sunlight *= exp( - light_atten * off_axis);
 
 	// Distance
-	temp2.z = Plen * dens_mul;
+	float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> temp1)
-	// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+	// Transparency (-> combined_haze)
+	// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
 	// compiler gets confused.
-	temp1 = exp(-temp1 * temp2.z);
+	combined_haze = exp(-combined_haze * density_dist);
 
 
 	// Compute haze glow
-	temp2.x = dot(Pn, lightnorm.xyz);
-	temp2.x = 1. - temp2.x;
-		// temp2.x is 0 at the sun and increases away from sun
-	temp2.x = max(temp2.x, .001);	
+    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
+    // haze_glow is 0 at the sun and increases away from sun
+	haze_glow = max(haze_glow, .001);	
 		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	temp2.x *= glow.x;
+	haze_glow *= glow.x;
 		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	temp2.x = pow(temp2.x, glow.z);
+	haze_glow = pow(haze_glow, glow.z);
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
-    temp2.x *= sun_moon_glow_factor;
+    haze_glow *= sun_moon_glow_factor;
 
 	// Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
-    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
+    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
@@ -173,23 +164,22 @@ void main()
 
 	// Haze color below cloud
 	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
 			 );	
 
 	// CLOUDS
-	temp2.y = max(0., lightnorm.y * 2.);
-	temp2.y = 1. / temp2.y;
-	sunlight *= exp( - light_atten * temp2.y);
+	off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
+	sunlight *= exp( - light_atten * off_axis);
 
 	// Cloud color out
-	vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
+	vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
 	vary_CloudColorAmbient = tmpAmbient * cloud_color;
 	
 	// Attenuate cloud color by atmosphere
-	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds
-	vary_CloudColorSun *= temp1;
-	vary_CloudColorAmbient *= temp1;
-	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
+	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
+	vary_CloudColorSun *= combined_haze;
+	vary_CloudColorAmbient *= combined_haze;
+	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
 
 	// Make a nice cloud density based on the cloud_shadow value that was passed in.
 	vary_CloudDensity = 2. * (cloud_shadow - 0.25);
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 1361f6a11d..1ee9c33c1a 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -66,77 +66,69 @@ void main()
 	gl_Position = pos;
 	
 	// Get relative position
-	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
 
 	// Set altitude
-	if (P.y > 0.)
+	if (rel_pos.y > 0.)
 	{
-		P *= (max_y / P.y);
+		rel_pos *= (max_y / rel_pos.y);
 	}
 	else
 	{
-		P *= (-32000. / P.y);
+		rel_pos *= (-32000. / rel_pos.y);
 	}
 
 	// Can normalize then
-	vec3 Pn = normalize(P);
+	vec3 rel_pos_norm = normalize(rel_pos);
 
-	float Plen = length(P);
+	float rel_pos_len = length(rel_pos);
 
 	// Initialize temp variables
-	vec4 temp1 = vec4(0.);
-	vec4 temp2 = vec4(0.);
-	vec4 blue_weight;
-	vec4 haze_weight;
 	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 	vec4 light_atten;
 
-    float dens_mul = density_multiplier;
-
 	// Sunlight attenuation effect (hue and brightness) due to atmosphere
 	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
 	// Calculate relative weights
-	temp1 = abs(blue_density) + vec4(abs(haze_density));
-	blue_weight = blue_density / temp1;
-	haze_weight = haze_density / temp1;
+	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+	vec4 blue_weight = blue_density / combined_haze;
+    vec4 haze_weight = haze_density / combined_haze;
 
-	// Compute sunlight from P & lightnorm (for long rays like sky)
-    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
-    temp2.y = 1. / temp2.y;
-    sunlight *= exp( - light_atten * temp2.y);
+	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
+    sunlight *= exp( - light_atten * off_axis);
 
 	// Distance
-	temp2.z = Plen * dens_mul;
+	float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> temp1)
-    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+	// Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
     // compiler gets confused.
-    temp1 = exp(-temp1 * temp2.z);
+    combined_haze = exp(-combined_haze * density_dist);
 
 	// Compute haze glow
-	temp2.x = dot(Pn, lightnorm.xyz);
-	temp2.x = 1. - temp2.x;
-		// temp2.x is 0 at the sun and increases away from sun
-	temp2.x = max(temp2.x, .001);	
+    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
+    // haze_glow is 0 at the sun and increases away from sun
+	haze_glow = max(haze_glow, .001);	
 		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	temp2.x *= glow.x;
+	haze_glow *= glow.x;
 		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	temp2.x = pow(temp2.x, glow.z);
+	haze_glow = pow(haze_glow, glow.z);
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
 	// Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
-    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (temp2.x + 0.25);
+    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
     vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
+                + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)
              );
 
 
     // Final atmosphere additive
-    color *= (1. - temp1);
+    color *= (1. - combined_haze);
 
 	// Increase ambient when there are more clouds
 	vec4 tmpAmbient = ambient_color;
@@ -147,14 +139,14 @@ void main()
 
 	// Haze color below cloud
 	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
 			 );	
 
 	// Attenuate cloud color by atmosphere
-	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds
+	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
 
 	// At horizon, blend high altitude sky color towards the darker color below the clouds
-	color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
+	color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
 
     // Haze color above cloud
     vary_HazeColor = color;
-- 
cgit v1.2.3


From 16be7c27c6b092a658ebe054994ccaa88c08b412 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Fri, 28 Aug 2020 10:54:23 -0600
Subject: SL-13768 clang-format shader files (whitespace)

---
 .../shaders/class1/deferred/cloudsV.glsl           | 204 ++++++++++---------
 .../app_settings/shaders/class1/deferred/skyV.glsl | 145 +++++++-------
 .../shaders/class2/windlight/cloudsV.glsl          | 216 ++++++++++-----------
 .../shaders/class2/windlight/skyV.glsl             | 145 +++++++-------
 4 files changed, 346 insertions(+), 364 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index bf4e6b8e61..b59862bb3b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -1,24 +1,24 @@
-/** 
+/**
  * @file WLCloudsV.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2005, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -33,26 +33,26 @@ ATTRIBUTE vec2 texcoord0;
 ///////////////////////////////////////////////////////////////////////////////
 
 // Output parameters
-VARYING vec4 vary_CloudColorSun;
-VARYING vec4 vary_CloudColorAmbient;
+VARYING vec4  vary_CloudColorSun;
+VARYING vec4  vary_CloudColorAmbient;
 VARYING float vary_CloudDensity;
 
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
+VARYING vec2  vary_texcoord0;
+VARYING vec2  vary_texcoord1;
+VARYING vec2  vary_texcoord2;
+VARYING vec2  vary_texcoord3;
 VARYING float altitude_blend_factor;
 
 // Inputs
 uniform vec3 camPosLocal;
 
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 
@@ -60,7 +60,7 @@ uniform float cloud_shadow;
 uniform float density_multiplier;
 uniform float max_y;
 
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float sun_moon_glow_factor;
 
 uniform vec4 cloud_color;
@@ -75,122 +75,118 @@ uniform float cloud_scale;
 //       indra\newview\llsettingsvo.cpp
 void main()
 {
-	// World / view / projection
-	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+    // World / view / projection
+    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
-	// Texture coords
+    // Texture coords
     // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
-	vary_texcoord0 = vec2( -texcoord0.x, texcoord0.y ); // See: LLSettingsVOSky::applySpecial
+    vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y);  // See: LLSettingsVOSky::applySpecial
 
-	vary_texcoord0.xy -= 0.5;
-	vary_texcoord0.xy /= cloud_scale;
-	vary_texcoord0.xy += 0.5;
+    vary_texcoord0.xy -= 0.5;
+    vary_texcoord0.xy /= cloud_scale;
+    vary_texcoord0.xy += 0.5;
 
-	vary_texcoord1 = vary_texcoord0;
-	vary_texcoord1.x += lightnorm.x * 0.0125;
-	vary_texcoord1.y += lightnorm.z * 0.0125;
+    vary_texcoord1 = vary_texcoord0;
+    vary_texcoord1.x += lightnorm.x * 0.0125;
+    vary_texcoord1.y += lightnorm.z * 0.0125;
 
-	vary_texcoord2 = vary_texcoord0 * 16.;
-	vary_texcoord3 = vary_texcoord1 * 16.;
+    vary_texcoord2 = vary_texcoord0 * 16.;
+    vary_texcoord3 = vary_texcoord1 * 16.;
 
-	// Get relative position
-	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+    // Get relative position
+    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
     altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
-	// Set altitude
-	if (rel_pos.y > 0.)
-	{
-		rel_pos *= (max_y / rel_pos.y);
-	}
-	else
-	{
-		altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon
-		rel_pos *= (-32000. / rel_pos.y);
-	}
-
-	// Can normalize then
-	vec3 rel_pos_norm = normalize(rel_pos);
-	float  rel_pos_len = length(rel_pos);
-
-	// Initialize temp variables
-	vec4 sunlight = sunlight_color;
-	vec4 light_atten;
+    // Set altitude
+    if (rel_pos.y > 0.)
+    {
+        rel_pos *= (max_y / rel_pos.y);
+    }
+    else
+    {
+        altitude_blend_factor = 0;  // SL-11589 Fix clouds drooping below horizon
+        rel_pos *= (-32000. / rel_pos.y);
+    }
+
+    // Can normalize then
+    vec3  rel_pos_norm = normalize(rel_pos);
+    float rel_pos_len  = length(rel_pos);
+
+    // Initialize temp variables
+    vec4 sunlight = sunlight_color;
+    vec4 light_atten;
 
     // Sunlight attenuation effect (hue and brightness) due to atmosphere
-	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
-
-	// Calculate relative weights
-	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
-    vec4 blue_weight = blue_density / combined_haze;
-	vec4 haze_weight = haze_density / combined_haze;
+    // this is used later for sunlight modulation at various altitudes
+    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
-	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
-    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
-    sunlight *= exp( - light_atten * off_axis);
+    // Calculate relative weights
+    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = haze_density / combined_haze;
 
-	// Distance
-	float density_dist = rel_pos_len * density_multiplier;
+    // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
+    sunlight *= exp(-light_atten * off_axis);
 
-	// Transparency (-> combined_haze)
-	// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
-	// compiler gets confused.
-	combined_haze = exp(-combined_haze * density_dist);
+    // Distance
+    float density_dist = rel_pos_len * density_multiplier;
 
+    // Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
+    // compiler gets confused.
+    combined_haze = exp(-combined_haze * density_dist);
 
-	// Compute haze glow
+    // Compute haze glow
     float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
     // haze_glow is 0 at the sun and increases away from sun
-	haze_glow = max(haze_glow, .001);	
-		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	haze_glow *= glow.x;
-		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	haze_glow = pow(haze_glow, glow.z);
-		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
+    haze_glow = max(haze_glow, .001);
+    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    haze_glow *= glow.x;
+    // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    haze_glow = pow(haze_glow, glow.z);
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     haze_glow *= sun_moon_glow_factor;
 
-	// Add "minimum anti-solar illumination"
+    // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
     haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
-	// Increase ambient when there are more clouds
-	vec4 tmpAmbient = ambient_color;
-	tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; 
+    // Increase ambient when there are more clouds
+    vec4 tmpAmbient = ambient_color;
+    tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
 
-	// Dim sunlight by cloud shadow percentage
-	sunlight *= (1. - cloud_shadow);
+    // Dim sunlight by cloud shadow percentage
+    sunlight *= (1. - cloud_shadow);
 
-	// Haze color below cloud
-	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
-			 );	
+    // Haze color below cloud
+    vec4 additiveColorBelowCloud =
+        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
 
-	// CLOUDS
-	off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
-	sunlight *= exp( - light_atten * off_axis);
+    // CLOUDS
+    off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
+    sunlight *= exp(-light_atten * off_axis);
 
-	// Cloud color out
-	vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
-	vary_CloudColorAmbient = tmpAmbient * cloud_color;
-	
-	// Attenuate cloud color by atmosphere
-	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
-	vary_CloudColorSun *= combined_haze;
-	vary_CloudColorAmbient *= combined_haze;
-	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
+    // Cloud color out
+    vary_CloudColorSun     = (sunlight * haze_glow) * cloud_color;
+    vary_CloudColorAmbient = tmpAmbient * cloud_color;
 
-	// Make a nice cloud density based on the cloud_shadow value that was passed in.
-	vary_CloudDensity = 2. * (cloud_shadow - 0.25);
+    // Attenuate cloud color by atmosphere
+    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds
+    vary_CloudColorSun *= combined_haze;
+    vary_CloudColorAmbient *= combined_haze;
+    vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
 
+    // Make a nice cloud density based on the cloud_shadow value that was passed in.
+    vary_CloudDensity = 2. * (cloud_shadow - 0.25);
 
-	// Combine these to minimize register use
-	vary_CloudColorAmbient += oHazeColorBelowCloud;
+    // Combine these to minimize register use
+    vary_CloudColorAmbient += oHazeColorBelowCloud;
 
-	// needs this to compile on mac
-	//vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+    // needs this to compile on mac
+    // vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
 
-	// END CLOUDS
+    // END CLOUDS
 }
-
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
index cd19fa460b..b35a32dbbf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -1,24 +1,24 @@
-/** 
+/**
  * @file WLSkyV.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2005, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;
 // Inputs
 uniform vec3 camPosLocal;
 
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 
@@ -52,7 +52,7 @@ uniform float density_multiplier;
 uniform float distance_multiplier;
 uniform float max_y;
 
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float sun_moon_glow_factor;
 
 uniform vec4 cloud_color;
@@ -63,96 +63,91 @@ uniform vec4 cloud_color;
 //       indra\newview\lllegacyatmospherics.cpp
 void main()
 {
-
-	// World / view / projection
+    // World / view / projection
     vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
-	gl_Position = pos;
-	
-	// Get relative position
-	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+    gl_Position = pos;
+
+    // Get relative position
+    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
-	// Set altitude
-	if (rel_pos.y > 0.)
-	{
-		rel_pos *= (max_y / rel_pos.y);
-	}
-	else
-	{
-		rel_pos *= (-32000. / rel_pos.y);
-	}
+    // Set altitude
+    if (rel_pos.y > 0.)
+    {
+        rel_pos *= (max_y / rel_pos.y);
+    }
+    else
+    {
+        rel_pos *= (-32000. / rel_pos.y);
+    }
 
-	// Can normalize then
-	vec3 rel_pos_norm = normalize(rel_pos);
+    // Can normalize then
+    vec3 rel_pos_norm = normalize(rel_pos);
 
-	float rel_pos_len = length(rel_pos);
+    float rel_pos_len = length(rel_pos);
 
-	// Initialize temp variables
-	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
-	vec4 light_atten;
+    // Initialize temp variables
+    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
+    vec4 light_atten;
 
-	// Sunlight attenuation effect (hue and brightness) due to atmosphere
-	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
+    // Sunlight attenuation effect (hue and brightness) due to atmosphere
+    // this is used later for sunlight modulation at various altitudes
+    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
-	// Calculate relative weights
-	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
-    vec4 blue_weight = blue_density / combined_haze;
-    vec4 haze_weight = haze_density / combined_haze;
+    // Calculate relative weights
+    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = haze_density / combined_haze;
 
-	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
-    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
-    sunlight *= exp( - light_atten * off_axis);
+    // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
+    sunlight *= exp(-light_atten * off_axis);
 
-	// Distance
-	float density_dist = rel_pos_len * density_multiplier;
+    // Distance
+    float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> combined_haze)
+    // Transparency (-> combined_haze)
     // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
     // compiler gets confused.
     combined_haze = exp(-combined_haze * density_dist);
 
-	// Compute haze glow
+    // Compute haze glow
     float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
     // haze_glow is 0 at the sun and increases away from sun
-	haze_glow = max(haze_glow, .001);	
-		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	haze_glow *= glow.x;
-		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	haze_glow = pow(haze_glow, glow.z);
-		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
-	// Add "minimum anti-solar illumination"
+    haze_glow = max(haze_glow, .001);
+    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    haze_glow *= glow.x;
+    // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    haze_glow = pow(haze_glow, glow.z);
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+    // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
     haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
-    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-                + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)
-             );
-
+    vec4 color =
+        (blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));
 
     // Final atmosphere additive
     color *= (1. - combined_haze);
 
-	// Increase ambient when there are more clouds
-	vec4 tmpAmbient = ambient_color;
-	tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; 
+    // Increase ambient when there are more clouds
+    vec4 tmpAmbient = ambient_color;
+    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
 
-	// Dim sunlight by cloud shadow percentage
-	sunlight *= max(0.0, (1. - cloud_shadow));
+    // Dim sunlight by cloud shadow percentage
+    sunlight *= max(0.0, (1. - cloud_shadow));
 
-	// Haze color below cloud
-	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
-			 );	
+    // Haze color below cloud
+    vec4 additiveColorBelowCloud =
+        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
 
-	// Attenuate cloud color by atmosphere
-	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
+    // Attenuate cloud color by atmosphere
+    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds
 
-	// At horizon, blend high altitude sky color towards the darker color below the clouds
-	color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
+    // At horizon, blend high altitude sky color towards the darker color below the clouds
+    color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
 
     // Haze color above cloud
-	vary_HazeColor = color;	
+    vary_HazeColor = color;
 }
-
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index e4c36ee657..75e074cbf8 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -1,24 +1,24 @@
-/** 
+/**
  * @file class2\wl\cloudsV.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2005, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -33,26 +33,26 @@ ATTRIBUTE vec2 texcoord0;
 ///////////////////////////////////////////////////////////////////////////////
 
 // Output parameters
-VARYING vec4 vary_CloudColorSun;
-VARYING vec4 vary_CloudColorAmbient;
+VARYING vec4  vary_CloudColorSun;
+VARYING vec4  vary_CloudColorAmbient;
 VARYING float vary_CloudDensity;
 
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
+VARYING vec2  vary_texcoord0;
+VARYING vec2  vary_texcoord1;
+VARYING vec2  vary_texcoord2;
+VARYING vec2  vary_texcoord3;
 VARYING float altitude_blend_factor;
 
 // Inputs
 uniform vec3 camPosLocal;
 
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 
@@ -60,7 +60,7 @@ uniform float cloud_shadow;
 uniform float density_multiplier;
 uniform float max_y;
 
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float sun_moon_glow_factor;
 
 uniform vec4 cloud_color;
@@ -75,122 +75,118 @@ uniform float cloud_scale;
 //       indra\newview\llsettingsvo.cpp
 void main()
 {
-	// World / view / projection
-	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+    // World / view / projection
+    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
-	// Texture coords
+    // Texture coords
     // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
-	vary_texcoord0 = vec2( -texcoord0.x, texcoord0.y ); // See: LLSettingsVOSky::applySpecial
+    vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y);  // See: LLSettingsVOSky::applySpecial
 
-	vary_texcoord0.xy -= 0.5;
-	vary_texcoord0.xy /= cloud_scale;
-	vary_texcoord0.xy += 0.5;
+    vary_texcoord0.xy -= 0.5;
+    vary_texcoord0.xy /= cloud_scale;
+    vary_texcoord0.xy += 0.5;
 
-	vary_texcoord1 = vary_texcoord0;
-	vary_texcoord1.x += lightnorm.x * 0.0125;
-	vary_texcoord1.y += lightnorm.z * 0.0125;
+    vary_texcoord1 = vary_texcoord0;
+    vary_texcoord1.x += lightnorm.x * 0.0125;
+    vary_texcoord1.y += lightnorm.z * 0.0125;
 
-	vary_texcoord2 = vary_texcoord0 * 16.;
-	vary_texcoord3 = vary_texcoord1 * 16.;
+    vary_texcoord2 = vary_texcoord0 * 16.;
+    vary_texcoord3 = vary_texcoord1 * 16.;
 
-	// Get relative position
-	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+    // Get relative position
+    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
     // fade clouds beyond a certain point so the bottom of the sky dome doesn't look silly at high altitude
     altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
-	// Set altitude
-	if (rel_pos.y > 0.)
-	{
-		rel_pos *= (max_y / rel_pos.y);
-	}
-	else
-	{
-		rel_pos *= (-32000. / rel_pos.y);
-	}
-
-	// Can normalize then
-	vec3 rel_pos_norm = normalize(rel_pos);
-	float rel_pos_len = length(rel_pos);
-
-	// Initialize temp variables
-	vec4 sunlight = sunlight_color;
-	vec4 light_atten;
-
-	// Sunlight attenuation effect (hue and brightness) due to atmosphere
-	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
-
-	// Calculate relative weights
-	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
-    vec4 blue_weight = blue_density / combined_haze;
-    vec4 haze_weight = haze_density / combined_haze;
-
-	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
-    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
-    sunlight *= exp( - light_atten * off_axis);
-
-	// Distance
-	float density_dist = rel_pos_len * density_multiplier;
-
-	// Transparency (-> combined_haze)
-	// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
-	// compiler gets confused.
-	combined_haze = exp(-combined_haze * density_dist);
-
-
-	// Compute haze glow
+    // Set altitude
+    if (rel_pos.y > 0.)
+    {
+        rel_pos *= (max_y / rel_pos.y);
+    }
+    else
+    {
+        rel_pos *= (-32000. / rel_pos.y);
+    }
+
+    // Can normalize then
+    vec3  rel_pos_norm = normalize(rel_pos);
+    float rel_pos_len  = length(rel_pos);
+
+    // Initialize temp variables
+    vec4 sunlight = sunlight_color;
+    vec4 light_atten;
+
+    // Sunlight attenuation effect (hue and brightness) due to atmosphere
+    // this is used later for sunlight modulation at various altitudes
+    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
+
+    // Calculate relative weights
+    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = haze_density / combined_haze;
+
+    // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
+    sunlight *= exp(-light_atten * off_axis);
+
+    // Distance
+    float density_dist = rel_pos_len * density_multiplier;
+
+    // Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
+    // compiler gets confused.
+    combined_haze = exp(-combined_haze * density_dist);
+
+    // Compute haze glow
     float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
     // haze_glow is 0 at the sun and increases away from sun
-	haze_glow = max(haze_glow, .001);	
-		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	haze_glow *= glow.x;
-		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	haze_glow = pow(haze_glow, glow.z);
-		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
+    haze_glow = max(haze_glow, .001);
+    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    haze_glow *= glow.x;
+    // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    haze_glow = pow(haze_glow, glow.z);
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     haze_glow *= sun_moon_glow_factor;
 
-	// Add "minimum anti-solar illumination"
+    // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
     haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
-	// Increase ambient when there are more clouds
-	vec4 tmpAmbient = ambient_color;
-	tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; 
+    // Increase ambient when there are more clouds
+    vec4 tmpAmbient = ambient_color;
+    tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
 
-	// Dim sunlight by cloud shadow percentage
-	sunlight *= (1. - cloud_shadow);
+    // Dim sunlight by cloud shadow percentage
+    sunlight *= (1. - cloud_shadow);
 
-	// Haze color below cloud
-	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
-			 );	
+    // Haze color below cloud
+    vec4 additiveColorBelowCloud =
+        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
 
-	// CLOUDS
-	off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
-	sunlight *= exp( - light_atten * off_axis);
+    // CLOUDS
+    off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
+    sunlight *= exp(-light_atten * off_axis);
 
-	// Cloud color out
-	vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
-	vary_CloudColorAmbient = tmpAmbient * cloud_color;
-	
-	// Attenuate cloud color by atmosphere
-	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
-	vary_CloudColorSun *= combined_haze;
-	vary_CloudColorAmbient *= combined_haze;
-	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
+    // Cloud color out
+    vary_CloudColorSun     = (sunlight * haze_glow) * cloud_color;
+    vary_CloudColorAmbient = tmpAmbient * cloud_color;
 
-	// Make a nice cloud density based on the cloud_shadow value that was passed in.
-	vary_CloudDensity = 2. * (cloud_shadow - 0.25);
+    // Attenuate cloud color by atmosphere
+    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds
+    vary_CloudColorSun *= combined_haze;
+    vary_CloudColorAmbient *= combined_haze;
+    vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
 
+    // Make a nice cloud density based on the cloud_shadow value that was passed in.
+    vary_CloudDensity = 2. * (cloud_shadow - 0.25);
 
-	// Combine these to minimize register use
-	vary_CloudColorAmbient += oHazeColorBelowCloud;
+    // Combine these to minimize register use
+    vary_CloudColorAmbient += oHazeColorBelowCloud;
 
-	// needs this to compile on mac
-	//vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+    // needs this to compile on mac
+    // vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
 
-	// END CLOUDS
+    // END CLOUDS
 }
-
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 1ee9c33c1a..6528066a4e 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -1,28 +1,28 @@
-/** 
+/**
  * @file class2\wl\skyV.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2005, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
- 
+
 uniform mat4 modelview_projection_matrix;
 
 ATTRIBUTE vec3 position;
@@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;
 // Inputs
 uniform vec3 camPosLocal;
 
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 
@@ -52,103 +52,98 @@ uniform float density_multiplier;
 uniform float distance_multiplier;
 uniform float max_y;
 
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float sun_moon_glow_factor;
 
 uniform vec4 cloud_color;
 
 void main()
 {
-
-	// World / view / projection
+    // World / view / projection
     vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
 
-	gl_Position = pos;
-	
-	// Get relative position
-	vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+    gl_Position = pos;
+
+    // Get relative position
+    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
-	// Set altitude
-	if (rel_pos.y > 0.)
-	{
-		rel_pos *= (max_y / rel_pos.y);
-	}
-	else
-	{
-		rel_pos *= (-32000. / rel_pos.y);
-	}
+    // Set altitude
+    if (rel_pos.y > 0.)
+    {
+        rel_pos *= (max_y / rel_pos.y);
+    }
+    else
+    {
+        rel_pos *= (-32000. / rel_pos.y);
+    }
 
-	// Can normalize then
-	vec3 rel_pos_norm = normalize(rel_pos);
+    // Can normalize then
+    vec3 rel_pos_norm = normalize(rel_pos);
 
-	float rel_pos_len = length(rel_pos);
+    float rel_pos_len = length(rel_pos);
 
-	// Initialize temp variables
-	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
-	vec4 light_atten;
+    // Initialize temp variables
+    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
+    vec4 light_atten;
 
-	// Sunlight attenuation effect (hue and brightness) due to atmosphere
-	// this is used later for sunlight modulation at various altitudes
-	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
+    // Sunlight attenuation effect (hue and brightness) due to atmosphere
+    // this is used later for sunlight modulation at various altitudes
+    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
-	// Calculate relative weights
-	vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
-	vec4 blue_weight = blue_density / combined_haze;
-    vec4 haze_weight = haze_density / combined_haze;
+    // Calculate relative weights
+    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = haze_density / combined_haze;
 
-	// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
-    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); 
-    sunlight *= exp( - light_atten * off_axis);
+    // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
+    sunlight *= exp(-light_atten * off_axis);
 
-	// Distance
-	float density_dist = rel_pos_len * density_multiplier;
+    // Distance
+    float density_dist = rel_pos_len * density_multiplier;
 
-	// Transparency (-> combined_haze)
+    // Transparency (-> combined_haze)
     // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
     // compiler gets confused.
     combined_haze = exp(-combined_haze * density_dist);
 
-	// Compute haze glow
+    // Compute haze glow
     float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
     // haze_glow is 0 at the sun and increases away from sun
-	haze_glow = max(haze_glow, .001);	
-		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-	haze_glow *= glow.x;
-		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-	haze_glow = pow(haze_glow, glow.z);
-		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
-	// Add "minimum anti-solar illumination"
+    haze_glow = max(haze_glow, .001);
+    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    haze_glow *= glow.x;
+    // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    haze_glow = pow(haze_glow, glow.z);
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+    // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
     haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
 
-    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-                + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)
-             );
-
+    vec4 color =
+        (blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));
 
     // Final atmosphere additive
     color *= (1. - combined_haze);
 
-	// Increase ambient when there are more clouds
-	vec4 tmpAmbient = ambient_color;
-	tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; 
+    // Increase ambient when there are more clouds
+    vec4 tmpAmbient = ambient_color;
+    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
 
-	// Dim sunlight by cloud shadow percentage
-	sunlight *= max(0.0, (1. - cloud_shadow));
+    // Dim sunlight by cloud shadow percentage
+    sunlight *= max(0.0, (1. - cloud_shadow));
 
-	// Haze color below cloud
-	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient)
-				+ (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)
-			 );	
+    // Haze color below cloud
+    vec4 additiveColorBelowCloud =
+        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
 
-	// Attenuate cloud color by atmosphere
-	combined_haze = sqrt(combined_haze);	//less atmos opacity (more transparency) below clouds
+    // Attenuate cloud color by atmosphere
+    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds
 
-	// At horizon, blend high altitude sky color towards the darker color below the clouds
-	color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
+    // At horizon, blend high altitude sky color towards the darker color below the clouds
+    color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
 
     // Haze color above cloud
     vary_HazeColor = color;
 }
-
-- 
cgit v1.2.3


From 2fe897940149039d5f9079bcc4bf73b017e03720 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 2 Sep 2020 09:54:31 +0300
Subject: SL-13894 Abuse Report Screenshot should always include UI

---
 indra/newview/llfloaterreporter.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 702d612343..7bfba2a6d7 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -930,7 +930,7 @@ void LLFloaterReporter::takeNewSnapshot()
 
 	// Take a screenshot, but don't draw this floater.
 	setVisible(FALSE);
-    if (!gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, gSavedSettings.getBOOL("RenderHUDInSnapshot"), TRUE, FALSE))
+    if (!gViewerWindow->rawSnapshot(mImageRaw,IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE /*UI*/, TRUE, FALSE))
 	{
 		LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
 		setVisible(TRUE);
-- 
cgit v1.2.3


From 4ebba5b91845b7cccd3af697da3fd71fb0779ab5 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 2 Sep 2020 09:22:46 +0300
Subject: SL-13891 Coroutine creation was requested on exit

---
 indra/llmessage/llexperiencecache.cpp | 16 ++++++++--------
 indra/llmessage/llexperiencecache.h   |  2 +-
 indra/newview/llcompilequeue.cpp      | 18 ++++++++++++++++++
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/indra/llmessage/llexperiencecache.cpp b/indra/llmessage/llexperiencecache.cpp
index 7d96ac4b02..64c01bd9eb 100644
--- a/indra/llmessage/llexperiencecache.cpp
+++ b/indra/llmessage/llexperiencecache.cpp
@@ -85,15 +85,15 @@ const F64 LLExperienceCache::DEFAULT_EXPIRATION	= 600.0;
 const S32 LLExperienceCache::DEFAULT_QUOTA			= 128; // this is megabytes
 const int LLExperienceCache::SEARCH_PAGE_SIZE     = 30;
 
+bool LLExperienceCache::sShutdown = false;
+
 //=========================================================================
-LLExperienceCache::LLExperienceCache():
-    mShutdown(false)
+LLExperienceCache::LLExperienceCache()
 {
 }
 
 LLExperienceCache::~LLExperienceCache()
 {
-
 }
 
 void LLExperienceCache::initSingleton()
@@ -122,7 +122,7 @@ void LLExperienceCache::cleanup()
     {
         cache_stream << (*this);
     }
-    mShutdown = true;
+    sShutdown = true;
 }
 
 //-------------------------------------------------------------------------
@@ -344,7 +344,7 @@ void LLExperienceCache::requestExperiences()
     ostr << urlBase << "?page_size=" << PAGE_SIZE1;
     RequestQueue_t  requests;
 
-    while (!mRequestQueue.empty())
+    while (!mRequestQueue.empty() && !sShutdown)
     {
         RequestQueue_t::iterator it = mRequestQueue.begin();
         LLUUID key = (*it);
@@ -398,8 +398,6 @@ void LLExperienceCache::idleCoro()
     LL_INFOS("ExperienceCache") << "Launching Experience cache idle coro." << LL_ENDL;
     do 
     {
-        llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
-
         if (mEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
         {
             eraseExpired();
@@ -410,7 +408,9 @@ void LLExperienceCache::idleCoro()
             requestExperiences();
         }
 
-    } while (!mShutdown);
+        llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
+
+    } while (!sShutdown);
 
     // The coroutine system will likely be shut down by the time we get to this point
     // (or at least no further cycling will occur on it since the user has decided to quit.)
diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h
index f9ff69c2b6..1c97133723 100644
--- a/indra/llmessage/llexperiencecache.h
+++ b/indra/llmessage/llexperiencecache.h
@@ -142,7 +142,7 @@ private:
     LLFrameTimer    mEraseExpiredTimer;    // Periodically clean out expired entries from the cache
     CapabilityQuery_t mCapability;
     std::string     mCacheFileName;
-    bool            mShutdown;
+    static bool     sShutdown; // control for coroutines, they exist out of LLExperienceCache's scope, so they need a static control
 
     void idleCoro();
 	void eraseExpired();
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 76e16f5a1f..3aaaaf52f5 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -347,6 +347,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
 bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
     const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
 {
+    if (LLApp::isQuitting())
+    {
+        // Reply from coroutine came on shutdown
+        // We are quiting, don't start any more coroutines!
+        return true;
+    }
+
     LLSD result;
     LLCheckedHandle<LLFloaterCompileQueue> floater(hfloater);
     // Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle.
@@ -381,6 +388,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
         result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout,
             LLSDMap("timeout", LLSD::Boolean(true)));
 
+        floater.check();
+
         if (result.has("timeout"))
         {   // A timeout filed in the result will always be true if present.
             LLStringUtil::format_map_t args;
@@ -404,6 +413,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
 
     }
 
+    if (!gAssetStorage)
+    {
+        // viewer likely is shutting down
+        return true;
+    }
+
     {
         HandleScriptUserData    userData(pump.getName());
 
@@ -468,6 +483,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
 
     result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSDMap("timeout", LLSD::Boolean(true)));
 
+    floater.check();
+
     if (result.has("timeout"))
     { // A timeout filed in the result will always be true if present.
         LLStringUtil::format_map_t args;
@@ -797,6 +814,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L
                 // but offers no guarantee of doing so.
                 llcoro::suspend();
             }
+            floater.check();
         }
 
         floater->addStringMessage("Done");
-- 
cgit v1.2.3


From 912afc940bc2e9680630ce2e9b282ecfc9b84050 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 1 Sep 2020 13:45:11 -0600
Subject: SL-12978 refactor sunlight intensity calculation

---
 .../shaders/class1/windlight/atmosphericsFuncs.glsl           | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 140d788fff..bc6b006afa 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -80,14 +80,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     blue_weight = blue_density / temp1;
     haze_weight = vec4(haze_density) / temp1;
 
-    //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
-    temp2.y = max(0.0, tmpLightnorm.y);
-    if (abs(temp2.y) > 0.000001f)
-    {
-        temp2.y = 1. / abs(temp2.y);
-    }
-    temp2.y = max(0.0000001f, temp2.y);
-    sunlight *= exp(-light_atten * temp2.y);
+    //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain)
+    float above_horizon_angle = abs(tmpLightnorm.z);
+    sunlight *= exp(-light_atten * above_horizon_angle);    // for atten and angle in [0..1], this maps to something like [0.3..1]
 
     // main atmospheric scattering line integral
     temp2.z = Plen * dens_mul;
-- 
cgit v1.2.3


From 04eba4c3eae812a18f29fd378901287ad318b4dd Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 1 Sep 2020 13:57:51 -0600
Subject: SL-12978 de-obfuscate, banish the temps

---
 .../class1/windlight/atmosphericsFuncs.glsl        | 68 +++++++++-------------
 1 file changed, 27 insertions(+), 41 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index bc6b006afa..9370118d70 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -46,78 +46,63 @@ float getAmbientClamp()
     return 1.0f;
 }
 
-
 void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao)
 {
-    vec3 P = inPositionEye;
+    vec3 rel_pos = inPositionEye;
    
     //(TERRAIN) limit altitude
-    if (P.y >  max_y) P *= ( max_y / P.y);
-    if (P.y < -max_y) P *= (-max_y / P.y);
-
-    vec3 tmpLightnorm = lightnorm.xyz;
+    rel_pos.y = clamp(rel_pos.y, -max_y, max_y);
 
-    vec3 Pn = normalize(P);
-    float Plen = length(P);
-
-    vec4 temp1 = vec4(0);
-    vec3 temp2 = vec3(0);
-    vec4 blue_weight;
-    vec4 haze_weight;
+    vec3 rel_pos_norm = normalize(rel_pos);
+    float rel_pos_len = length(rel_pos);
     vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
-    vec4 light_atten;
-
-    float dens_mul = density_multiplier;
-    float dist_mul = distance_multiplier;
 
     //sunlight attenuation effect (hue and brightness) due to atmosphere
     //this is used later for sunlight modulation at various altitudes
-    light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+    vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
         //I had thought blue_density and haze_density should have equal weighting,
         //but attenuation due to haze_density tends to seem too strong
 
-    temp1 = blue_density + vec4(haze_density);
-    blue_weight = blue_density / temp1;
-    haze_weight = vec4(haze_density) / temp1;
+    vec4 combined_haze = blue_density + vec4(haze_density);
+    vec4 blue_weight = blue_density / combined_haze;
+    vec4 haze_weight = vec4(haze_density) / combined_haze;
 
     //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain)
-    float above_horizon_angle = abs(tmpLightnorm.z);
+    float above_horizon_angle = abs(lightnorm.z);
     sunlight *= exp(-light_atten * above_horizon_angle);    // for atten and angle in [0..1], this maps to something like [0.3..1]
 
     // main atmospheric scattering line integral
-    temp2.z = Plen * dens_mul;
+    float density_dist = rel_pos_len * density_multiplier;
 
-    // Transparency (-> temp1)
-    // ATI Bugfix -- can't store temp1*temp2.z*dist_mul in a variable because the ati
+    // Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist*distance_multiplier in a variable because the ati
     // compiler gets confused.
-    temp1 = exp(-temp1 * temp2.z * dist_mul);
+    combined_haze = exp(-combined_haze * density_dist * distance_multiplier);
 
     //final atmosphere attenuation factor
-    atten = temp1.rgb;
+    atten = combined_haze.rgb;
     
     //compute haze glow
-    //(can use temp2.x as temp because we haven't used it yet)
-    temp2.x = dot(Pn, tmpLightnorm.xyz);
+    float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
 
     // dampen sun additive contrib when not facing it...
 	// SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees.
     //    if (length(light_dir) > 0.01)
-    {
-        temp2.x *= max(0.0f, dot(light_dir, Pn));
-    }
-    temp2.x = 1. - temp2.x;
-        //temp2.x is 0 at the sun and increases away from sun
-    temp2.x = max(temp2.x, .001);    //was glow.y
+    haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm));
+ 
+    haze_glow = 1. - haze_glow;
+        //haze_glow is 0 at the sun and increases away from sun
+    haze_glow = max(haze_glow, .001);    //was glow.y
         //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-    temp2.x *= glow.x;
+    haze_glow *= glow.x;
         //higher glow.x gives dimmer glow (because next step is 1 / "angle")
-    temp2.x = pow(temp2.x, glow.z);
+    haze_glow = pow(haze_glow, glow.z);
         //glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     //add "minimum anti-solar illumination"
-    temp2.x += .25;
+    haze_glow += .25;
 
-    temp2.x *= sun_moon_glow_factor;
+    haze_glow *= sun_moon_glow_factor;
  
     vec4 amb_color = ambient_color; 
     
@@ -143,10 +128,11 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     //haze color
         vec3 cs  = sunlight.rgb * (1.-cloud_shadow);
         additive = (blue_horizon.rgb * blue_weight.rgb) * (cs           + tmpAmbient.rgb)
-                 + (haze_horizon     * haze_weight.rgb) * (cs * temp2.x + tmpAmbient.rgb);
+                 + (haze_horizon     * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb);
 
     //brightness of surface both sunlight and ambient
     sunlit = sunlight.rgb * 0.5;
     amblit = tmpAmbient.rgb * .25;
-    additive *= vec3(1.0 - temp1);
+    additive *= vec3(1.0 - combined_haze);
 }
+
-- 
cgit v1.2.3


From a027e8d4813c839babe2163943e46bf7f93fa005 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 1 Sep 2020 14:23:39 -0600
Subject: SL-12978 clang-format shader file (whitespace)

---
 .../class1/windlight/atmosphericsFuncs.glsl        | 104 ++++++++++-----------
 1 file changed, 50 insertions(+), 54 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 9370118d70..9c50453898 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -1,75 +1,73 @@
-/** 
+/**
  * @file class1\windlight\atmosphericsFuncs.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2019, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 uniform float cloud_shadow;
 uniform float density_multiplier;
 uniform float distance_multiplier;
 uniform float max_y;
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float scene_light_strength;
-uniform mat3 ssao_effect_mat;
-uniform int no_atmo;
+uniform mat3  ssao_effect_mat;
+uniform int   no_atmo;
 uniform float sun_moon_glow_factor;
 
-float getAmbientClamp()
-{
-    return 1.0f;
-}
+float getAmbientClamp() { return 1.0f; }
 
-void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao)
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive,
+                         out vec3 atten, bool use_ao)
 {
     vec3 rel_pos = inPositionEye;
-   
+
     //(TERRAIN) limit altitude
     rel_pos.y = clamp(rel_pos.y, -max_y, max_y);
 
-    vec3 rel_pos_norm = normalize(rel_pos);
-    float rel_pos_len = length(rel_pos);
-    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
+    vec3  rel_pos_norm = normalize(rel_pos);
+    float rel_pos_len  = length(rel_pos);
+    vec4  sunlight     = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 
-    //sunlight attenuation effect (hue and brightness) due to atmosphere
-    //this is used later for sunlight modulation at various altitudes
+    // sunlight attenuation effect (hue and brightness) due to atmosphere
+    // this is used later for sunlight modulation at various altitudes
     vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
-        //I had thought blue_density and haze_density should have equal weighting,
-        //but attenuation due to haze_density tends to seem too strong
+    // I had thought blue_density and haze_density should have equal weighting,
+    // but attenuation due to haze_density tends to seem too strong
 
     vec4 combined_haze = blue_density + vec4(haze_density);
-    vec4 blue_weight = blue_density / combined_haze;
-    vec4 haze_weight = vec4(haze_density) / combined_haze;
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = vec4(haze_density) / combined_haze;
 
     //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain)
     float above_horizon_angle = abs(lightnorm.z);
-    sunlight *= exp(-light_atten * above_horizon_angle);    // for atten and angle in [0..1], this maps to something like [0.3..1]
+    sunlight *= exp(-light_atten * above_horizon_angle);  // for atten and angle in [0..1], this maps to something like [0.3..1]
 
     // main atmospheric scattering line integral
     float density_dist = rel_pos_len * density_multiplier;
@@ -79,43 +77,43 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     // compiler gets confused.
     combined_haze = exp(-combined_haze * density_dist * distance_multiplier);
 
-    //final atmosphere attenuation factor
+    // final atmosphere attenuation factor
     atten = combined_haze.rgb;
-    
-    //compute haze glow
+
+    // compute haze glow
     float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
 
     // dampen sun additive contrib when not facing it...
-	// SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees.
+    // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees.
     //    if (length(light_dir) > 0.01)
     haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm));
- 
+
     haze_glow = 1. - haze_glow;
-        //haze_glow is 0 at the sun and increases away from sun
-    haze_glow = max(haze_glow, .001);    //was glow.y
-        //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    // haze_glow is 0 at the sun and increases away from sun
+    haze_glow = max(haze_glow, .001);  // set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
     haze_glow *= glow.x;
-        //higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    // higher glow.x gives dimmer glow (because next step is 1 / "angle")
     haze_glow = pow(haze_glow, glow.z);
-        //glow.z should be negative, so we're doing a sort of (1 / "angle") function
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
-    //add "minimum anti-solar illumination"
+    // add "minimum anti-solar illumination"
     haze_glow += .25;
 
     haze_glow *= sun_moon_glow_factor;
- 
-    vec4 amb_color = ambient_color; 
-    
-    //increase ambient when there are more clouds
+
+    vec4 amb_color = ambient_color;
+
+    // increase ambient when there are more clouds
     vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5;
-    
+
     /*  decrease value and saturation (that in HSV, not HSL) for occluded areas
      * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
      * // The following line of code performs the equivalent of:
      * float ambAlpha = tmpAmbient.a;
      * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
      * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
-     * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
+     * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat,
+     * ambAlpha);
      */
     if (use_ao)
     {
@@ -125,14 +123,12 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     // Similar/Shared Algorithms:
     //     indra\llinventory\llsettingssky.cpp                                        -- LLSettingsSky::calculateLightSettings()
     //     indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars()
-    //haze color
-        vec3 cs  = sunlight.rgb * (1.-cloud_shadow);
-        additive = (blue_horizon.rgb * blue_weight.rgb) * (cs           + tmpAmbient.rgb)
-                 + (haze_horizon     * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb);
+    // haze color
+    vec3 cs = sunlight.rgb * (1. - cloud_shadow);
+    additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb);
 
-    //brightness of surface both sunlight and ambient
+    // brightness of surface both sunlight and ambient
     sunlit = sunlight.rgb * 0.5;
     amblit = tmpAmbient.rgb * .25;
     additive *= vec3(1.0 - combined_haze);
 }
-
-- 
cgit v1.2.3


From 267e8fd9a383e333be8d7a0a289523f47bba4fac Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 2 Sep 2020 11:33:40 -0600
Subject: SL-12978 & SL-13743. Remove abrupt changes in sun intensity calc,
 preserve original fall-off.

Had to find a balance in the sunlight intensity calculation that behaves correctly for
both these issues.
---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 9c50453898..05e6e6a9f9 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -65,9 +65,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     vec4 blue_weight   = blue_density / combined_haze;
     vec4 haze_weight   = vec4(haze_density) / combined_haze;
 
-    //(TERRAIN) compute sunlight from lightnorm z component, roughly cosine(sun elevation) (for short rays like terrain)
-    float above_horizon_angle = abs(lightnorm.z);
-    sunlight *= exp(-light_atten * above_horizon_angle);  // for atten and angle in [0..1], this maps to something like [0.3..1]
+    //(TERRAIN) compute sunlight from lightnorm y component. Factor is roughly cosecant(sun elevation) (for short rays like terrain)
+    float above_horizon_factor = 1.0 / max(1e-6, lightnorm.y);
+    sunlight *= exp(-light_atten * above_horizon_factor);  // for sun [horizon..overhead] this maps to an exp curve [0..1]
 
     // main atmospheric scattering line integral
     float density_dist = rel_pos_len * density_multiplier;
-- 
cgit v1.2.3


From 128f0833cf8076a0eb76eb672017ac54c272ca79 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Tue, 1 Sep 2020 23:12:31 +0300
Subject: Updated LLCA to codeticket build 548269

---
 autobuild.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/autobuild.xml b/autobuild.xml
index e6e92b93d3..1416899483 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -2187,16 +2187,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8501cbaa7e0f254614694da784a9c61c</string>
+              <string>b677ee43822212f0a27c838dc8bf3623</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2</string>
             </map>
             <key>name</key>
             <string>common</string>
           </map>
         </map>
         <key>version</key>
-        <string>202008010216.546021</string>
+        <string>202009010215.548269</string>
       </map>
       <key>llphysicsextensions_source</key>
       <map>
-- 
cgit v1.2.3


From 645393c5e976a9a6164453bf7df588ec745f04c5 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Fri, 4 Sep 2020 17:34:57 +0300
Subject: SL-13910 Added the TLS Web Server Authentication certificate check

---
 indra/newview/llsecapi.h             | 1 +
 indra/newview/llsechandler_basic.cpp | 7 +++++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 69b6b32923..c2fdbeb8e9 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -75,6 +75,7 @@
 
 #define CERT_EXTENDED_KEY_USAGE "extendedKeyUsage"
 #define CERT_EKU_SERVER_AUTH SN_server_auth
+#define CERT_EKU_TLS_SERVER_AUTH LN_server_auth
 
 #define CERT_SUBJECT_KEY_IDENTFIER "subjectKeyIdentifier"
 #define CERT_AUTHORITY_KEY_IDENTIFIER "authorityKeyIdentifier"
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 55e49100c3..109a2133b8 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -925,8 +925,11 @@ void _validateCert(int validation_policy,
 		}
 		// only validate EKU if the cert has it
 		if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() &&	   
-		   (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
-									LLSD((std::string)CERT_EKU_SERVER_AUTH))))
+		   (  (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
+                                         LLSD((std::string)CERT_EKU_SERVER_AUTH)))
+           || (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
+                                        LLSD((std::string)CERT_EKU_TLS_SERVER_AUTH)))
+            ))
 		{
 			LLTHROW(LLCertKeyUsageValidationException(current_cert_info));
 		}
-- 
cgit v1.2.3


From 786de05651f25d42aacc92c4905375bf1fbd6562 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Sat, 5 Sep 2020 00:20:49 +0300
Subject: SL-13910 Moved the LLCertException constructor to .cpp

---
 indra/newview/llsecapi.cpp                      | 7 +++++++
 indra/newview/llsecapi.h                        | 6 +-----
 indra/newview/tests/llsechandler_basic_test.cpp | 8 ++++++++
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llsecapi.cpp b/indra/newview/llsecapi.cpp
index 10e510b842..26a2df8270 100644
--- a/indra/newview/llsecapi.cpp
+++ b/indra/newview/llsecapi.cpp
@@ -154,3 +154,10 @@ void LLCredential::authenticatorType(std::string &idType)
 		
 	}
 }
+
+LLCertException::LLCertException(const LLSD& cert_data, const std::string& msg)
+  : LLException(msg),
+    mCertData(cert_data)
+{
+    LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
+}
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index c2fdbeb8e9..9c9c16d5d7 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -335,11 +335,7 @@ std::ostream& operator <<(std::ostream& s, const LLCredential& cred);
 class LLCertException: public LLException
 {
 public:
-	LLCertException(const LLSD& cert_data, const std::string& msg): LLException(msg),
-        mCertData(cert_data)
-	{
-		LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
-	}
+    LLCertException(const LLSD& cert_data, const std::string& msg);
 	virtual ~LLCertException() throw() {}
 	LLSD getCertData() const { return mCertData; }
 protected:
diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp
index 63967fae37..e5d226a2a4 100644
--- a/indra/newview/tests/llsechandler_basic_test.cpp
+++ b/indra/newview/tests/llsechandler_basic_test.cpp
@@ -124,6 +124,14 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
 S32 LLMachineID::init() { return 1; }
 	
 
+LLCertException::LLCertException(const LLSD& cert_data, const std::string& msg)
+    : LLException(msg),
+    mCertData(cert_data)
+{
+    LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
+}
+
+
 // -------------------------------------------------------------------------------------------
 // TUT
 // -------------------------------------------------------------------------------------------
-- 
cgit v1.2.3


From 863eec6676259ef8dc433588972f177d0ee80d6d Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Wed, 9 Sep 2020 00:47:28 +0300
Subject: Revert "SL-12475 Mac buildfix"

This reverts commit 25fd4c2ba7bc00a0603bf58f5897ac550ff02446.
---
 indra/newview/llinventorypanel.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index eda5479cb4..912a4ac92e 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -351,7 +351,7 @@ public:
     void setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
 
 protected:
-    LLInventoryFavoriteItemsPanel(const Params& params);
+    LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params);
     ~LLInventoryFavoriteItemsPanel() { mFolderChangedSignal.disconnect(); }
     void updateFavoritesRootFolder();
 
-- 
cgit v1.2.3


From d50131c0ac43cb5cfc247bd388a10100bc3dfec0 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Wed, 9 Sep 2020 00:49:09 +0300
Subject: Revert "SL-12475 add Inventory Favorites tab"

This reverts commit 92499ce1b43fd60ce7aad71d12f9eef0cef04f7f.

# Conflicts:
#	indra/newview/llinventorybridge.cpp
#	indra/newview/llinventorypanel.cpp
#	indra/newview/llinventorypanel.h
---
 indra/llui/llfolderview.h                          |  2 -
 .../newview/app_settings/settings_per_account.xml  | 11 ---
 indra/newview/llinventorybridge.cpp                | 58 ++-----------
 indra/newview/llinventorymodel.cpp                 |  5 --
 indra/newview/llinventorypanel.cpp                 | 95 ----------------------
 indra/newview/llinventorypanel.h                   | 22 -----
 indra/newview/llpanelmaininventory.cpp             | 12 +--
 indra/newview/llpanelmaininventory.h               |  2 -
 .../skins/default/xui/en/menu_inventory.xml        |  7 --
 .../skins/default/xui/en/panel_main_inventory.xml  | 40 ++++-----
 indra/newview/skins/default/xui/en/strings.xml     |  1 -
 11 files changed, 24 insertions(+), 231 deletions(-)

diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index c175034d75..6bb5e6c02e 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -241,8 +241,6 @@ public:
 	void dumpSelectionInformation();
 
 	virtual S32	notify(const LLSD& info) ;
-
-	void setShowEmptyMessage(bool show_msg) { mShowEmptyMessage = show_msg; }
 	
 	bool useLabelSuffix() { return mUseLabelSuffix; }
 	virtual void updateMenu();
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 3d77ac43e5..537744b44c 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -403,17 +403,6 @@
         <key>Value</key>
         <string></string>
       </map>
-      <key>FavoritesFolder</key>
-      <map>
-        <key>Comment</key>
-        <string>User's chosen folder which will be shown in the Favorites tab (UUID)</string>
-        <key>Persist</key>
-        <integer>1</integer>
-        <key>Type</key>
-        <string>String</string>
-        <key>Value</key>
-        <string></string>
-      </map>
       <key>SnapshotBaseDir</key>
       <map>
         <key>Comment</key>
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 03123689c5..539d80532c 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -138,35 +138,6 @@ bool isMarketplaceSendAction(const std::string& action)
 	return ("send_to_marketplace" == action);
 }
 
-bool isPanelActive(const std::string& panel_name)
-{
-    LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
-    return (active_panel && (active_panel->getName() == panel_name));
-}
-
-bool isParentSystemFolder(const LLInventoryModel* model, const LLUUID& folder_id)
-{
-    if (!model || folder_id.isNull()) return false;
-
-    LLViewerInventoryCategory* cat = model->getCategory(folder_id);
-    if (cat)
-    {
-        if (cat->getPreferredType() == LLFolderType::FT_ROOT_INVENTORY)
-        {
-            return false;
-        }
-        if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
-        {
-            return true;
-        }
-        else
-        {
-            return isParentSystemFolder(model, cat->getParentUUID());
-        }
-    }
-    return false;
-}
-
 // Used by LLFolderBridge as callback for directory fetching recursion
 class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
 {
@@ -917,7 +888,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 		disabled_items.push_back(std::string("Properties"));
 	}
 
-	if (!isPanelActive("All Items"))
+	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+	if (active_panel && (active_panel->getName() != "All Items"))
 	{
 		items.push_back(std::string("Show in Main Panel"));
 	}
@@ -1008,7 +980,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
 
 	items.push_back(std::string("Delete"));
 
-	if (!isItemRemovable() || isPanelActive("Favorite Items"))
+	if (!isItemRemovable())
 	{
 		disabled_items.push_back(std::string("Delete"));
 	}
@@ -4038,7 +4010,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 		disabled_items.push_back(std::string("New Clothes"));
 		disabled_items.push_back(std::string("New Body Parts"));
 		disabled_items.push_back(std::string("upload_def"));
-		disabled_items.push_back(std::string("Set Favorites folder"));
 	}
 	if (favorites == mUUID)
 	{
@@ -4066,7 +4037,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 		disabled_items.push_back(std::string("New Clothes"));
 		disabled_items.push_back(std::string("New Body Parts"));
 		disabled_items.push_back(std::string("upload_def"));
-		disabled_items.push_back(std::string("Set Favorites folder"));
     }
     if (marketplace_listings_id == mUUID)
     {
@@ -4075,14 +4045,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
         disabled_items.push_back(std::string("Cut"));
         disabled_items.push_back(std::string("Delete"));
     }
-
-	if (isPanelActive("Favorite Items"))
-	{
-		disabled_items.push_back(std::string("Delete"));
-	}
 	if(trash_id == mUUID)
 	{
-		bool is_recent_panel = isPanelActive("Recent Items");
+		bool is_recent_panel = false;
+		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+		if (active_panel && (active_panel->getName() == "Recent Items"))
+		{
+			is_recent_panel = true;
+		}
 
 		// This is the trash.
 		items.push_back(std::string("Empty Trash"));
@@ -4131,16 +4101,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
                     items.push_back(std::string("New Body Parts"));
                     items.push_back(std::string("New Settings"));
                     items.push_back(std::string("upload_def"));
-
-                    if (!LLFolderType::lookupIsProtectedType(getPreferredType()) && !isParentSystemFolder(model, mUUID))
-                    {
-                        items.push_back(std::string("Set Favorites folder"));
-                    }
-                    if (!LLEnvironment::instance().isInventoryEnabled())
-                    {
-                        disabled_items.push_back("New Settings");
-                    }
-
                 }
 			}
 			getClipboardEntries(false, items, disabled_items, flags);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index a44a54632c..17e80dca89 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -542,11 +542,6 @@ const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::
         cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));
         break;
     }
-    case LLFolderType::FT_FAVORITE:
-    {
-        cat_id = LLUUID(gSavedPerAccountSettings.getString("FavoritesFolder"));
-        break;
-    }
     default:
         break;
     }
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 26f1b61fe6..7ff1006773 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -179,7 +179,6 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
 	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));
 	mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.SetFavoritesFolder", boost::bind(&LLInventoryPanel::setFavoritesFolder, this, _2));
 }
 
 LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
@@ -1375,11 +1374,6 @@ void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
     }
 }
 
-void LLInventoryPanel::setFavoritesFolder(const LLSD& userdata)
-{
-    gSavedPerAccountSettings.setString("FavoritesFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
-}
-
 void LLInventoryPanel::purgeSelectedItems()
 {
     if (!mFolderRoot.get()) return;
@@ -1759,95 +1753,6 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
 }
 
-static LLDefaultChildRegistry::Register<LLInventoryFavoriteItemsPanel> t_favorites_inventory_panel("favorites_inventory_panel");
-
-LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params)
-    : LLInventoryPanel(params)
-{
-    std::string ctrl_name = "FavoritesFolder";
-    if (gSavedPerAccountSettings.controlExists(ctrl_name))
-    {
-        LLPointer<LLControlVariable> cntrl_ptr = gSavedPerAccountSettings.getControl(ctrl_name);
-        if (cntrl_ptr.notNull())
-        {
-            mFolderChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder, this));
-        }
-    }
-}
-
-void LLInventoryFavoriteItemsPanel::setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb)
-{
-    if (mFolderRoot.get())
-    {
-        mFolderRoot.get()->setSelectCallback(cb);
-        mSelectionCallback = cb;
-    }
-}
-
-void LLInventoryFavoriteItemsPanel::initFromParams(const Params& p)
-{
-    Params fav_params(p);
-    fav_params.start_folder.id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE);
-    LLInventoryPanel::initFromParams(fav_params);
-    updateFavoritesRootFolder();
-}
-
-void LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder()
-{
-    const LLUUID& folder_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE);
-
-    bool is_favorites_set = (folder_id != gInventory.findCategoryUUIDForTypeInRoot(LLFolderType::FT_FAVORITE, true, gInventory.getRootFolderID()));
-
-    if (!is_favorites_set || folder_id != getRootFolderID())
-    {
-        LLUUID root_id = folder_id;
-        if (mFolderRoot.get())
-        {
-            removeItemID(getRootFolderID());
-            mFolderRoot.get()->destroyView();
-        }
-
-        mCommitCallbackRegistrar.pushScope();
-        {
-            LLFolderView* folder_view = createFolderRoot(root_id);
-            mFolderRoot = folder_view->getHandle();
-
-            addItemID(root_id, mFolderRoot.get());
-
-
-            LLRect scroller_view_rect = getRect();
-            scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
-            LLScrollContainer::Params scroller_params(mParams.scroll());
-            scroller_params.rect(scroller_view_rect);
-
-            if (mScroller)
-            {
-                removeChild(mScroller);
-                delete mScroller;
-                mScroller = NULL;
-            }
-            mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
-            addChild(mScroller);
-            mScroller->addChild(mFolderRoot.get());
-            mFolderRoot.get()->setScrollContainer(mScroller);
-            mFolderRoot.get()->setFollowsAll();
-            mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox);
-
-            if (!mSelectionCallback.empty())
-            {
-                mFolderRoot.get()->setSelectCallback(mSelectionCallback);
-            }
-        }
-        mCommitCallbackRegistrar.popScope();
-        mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
-
-        if (is_favorites_set)
-        {
-            buildNewViews(folder_id);
-        }
-        mFolderRoot.get()->setShowEmptyMessage(!is_favorites_set);
-    }
-}
 /************************************************************************/
 /* Asset Pre-Filtered Inventory Panel related class                     */
 /************************************************************************/
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 912a4ac92e..b51dc17cdd 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -214,7 +214,6 @@ public:
 	void doCreate(const LLSD& userdata);
 	bool beginIMSession();
 	void fileUploadLocation(const LLSD& userdata);
-	void setFavoritesFolder(const LLSD& userdata);
 	void purgeSelectedItems();
 	bool attachObject(const LLSD& userdata);
 	static void idle(void* user_data);
@@ -339,27 +338,6 @@ private:
 	bool				mViewsInitialized; // Views have been generated
 };
 
-
-class LLInventoryFavoriteItemsPanel : public LLInventoryPanel
-{
-public:
-    struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
-    {};
-
-    void initFromParams(const Params& p);
-    bool isSelectionRemovable() { return false; }
-    void setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
-
-protected:
-    LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params);
-    ~LLInventoryFavoriteItemsPanel() { mFolderChangedSignal.disconnect(); }
-    void updateFavoritesRootFolder();
-
-    boost::signals2::connection mFolderChangedSignal;
-    boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)> mSelectionCallback;
-    friend class LLUICtrlFactory;
-};
-
 /************************************************************************/
 /* Asset Pre-Filtered Inventory Panel related class                     */
 /* Exchanges filter's flexibility for speed of generation and           */
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 89682d9576..02cd22c307 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -188,16 +188,6 @@ BOOL LLPanelMainInventory::postBuild()
 		worn_filter.markDefault();
 		mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
 	}
-
-	mFavoriteItemsPanel = getChild<LLInventoryFavoriteItemsPanel>("Favorite Items");
-	if (mFavoriteItemsPanel)
-	{
-		LLInventoryFilter& recent_filter = mFavoriteItemsPanel->getFilter();
-		recent_filter.setEmptyLookupMessage("InventoryFavoritItemsNotSelected");
-		recent_filter.markDefault();
-		mFavoriteItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mFavoriteItemsPanel, _1, _2));
-	}
-
 	mSearchTypeCombo  = getChild<LLComboBox>("search_type");
 	if(mSearchTypeCombo)
 	{
@@ -1413,7 +1403,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "delete")
 	{
-		return getActivePanel()->isSelectionRemovable() && (getActivePanel() != mFavoriteItemsPanel);
+		return getActivePanel()->isSelectionRemovable();
 	}
 	if (command_name == "save_texture")
 	{
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index c0b4a7b6fc..a6bdee233d 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -37,7 +37,6 @@
 class LLComboBox;
 class LLFolderViewItem;
 class LLInventoryPanel;
-class LLInventoryFavoriteItemsPanel;
 class LLSaveFolderState;
 class LLFilterEditor;
 class LLTabContainer;
@@ -137,7 +136,6 @@ private:
 	LLHandle<LLFloater>			mFinderHandle;
 	LLInventoryPanel*			mActivePanel;
 	LLInventoryPanel*			mWornItemsPanel;
-	LLInventoryFavoriteItemsPanel* mFavoriteItemsPanel;
 	bool						mResortActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index adefa261aa..9aa84c1bac 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -393,13 +393,6 @@
          parameter="model" />
       </menu_item_call>
     </menu>
-      <menu_item_call
-       label="Use as Favorites folder"
-       layout="topleft"
-       name="Set Favorites folder">
-        <menu_item_call.on_click
-         function="Inventory.SetFavoritesFolder"/>
-      </menu_item_call>
     <menu
      label="Change Type"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 2745b9d302..d77fbdec0a 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -117,32 +117,20 @@
      name="Recent Items"
      show_item_link_overlays="true"
      width="290" />
-    <inventory_panel
-     name="Worn Items"
-     label="WORN"
-     show_empty_message="false"
-     follows="all"
-     layout="topleft"
-     width="290"
-     bg_opaque_color="DkGray2"
-     bg_alpha_color="DkGray2"
-     background_visible="true"
-     border="false"
-     bevel_style="none"
-     scroll.reserve_scroll_corner="false"/>
-    <favorites_inventory_panel
-     name="Favorite Items"
-     label="FAVORITES"
-     show_empty_message="false"
-     follows="all"
-     layout="topleft"
-     width="290"
-     bg_opaque_color="DkGray2"
-     bg_alpha_color="DkGray2"
-     background_visible="true"
-     border="false"
-     bevel_style="none"
-     scroll.reserve_scroll_corner="false"/>
+       <inventory_panel
+      name="Worn Items"
+      label="WORN"
+      show_empty_message="false"
+      follows="all"
+      layout="topleft"
+      width="290"
+      bg_opaque_color="DkGray2"
+      bg_alpha_color="DkGray2"
+      background_visible="true"
+      border="false"
+      bevel_style="none"
+      scroll.reserve_scroll_corner="false">
+  </inventory_panel>
   </tab_container>
   <layout_stack
    animate="false"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 585cf3f001..f9f12e7f5c 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2297,7 +2297,6 @@ For AI Character: Get the closest navigable point to the point provided.
 	<!-- inventory -->
 	<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
 	<string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string>
-	<string name="InventoryFavoritItemsNotSelected">Click "Use as Favorites folder" on a folder of your choice. You can choose a different folder at any time. System folders cannot be used for Favorites.</string>
 	<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
 	<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
 	<string name="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</string>
-- 
cgit v1.2.3


From 4eefce9767784742cd394ddf948d345cfbced8c8 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 9 Sep 2020 18:05:11 +0300
Subject: SL-13921 Only one of extended key usages is needed

LN (EKU_TLS) is more likely to be present thus should be checked first
---
 indra/newview/llsechandler_basic.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 656a2cf8cf..737ef30ada 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -924,12 +924,13 @@ void _validateCert(int validation_policy,
 			LLTHROW(LLCertKeyUsageValidationException(current_cert_info));
 		}
 		// only validate EKU if the cert has it
-		if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() &&	   
-		   (  (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
+        if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE)
+           && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray()
+           && (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE],
+                                         LLSD((std::string)CERT_EKU_TLS_SERVER_AUTH)))
+           && (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
                                          LLSD((std::string)CERT_EKU_SERVER_AUTH)))
-           || (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], 
-                                        LLSD((std::string)CERT_EKU_TLS_SERVER_AUTH)))
-            ))
+           )
 		{
 			LLTHROW(LLCertKeyUsageValidationException(current_cert_info));
 		}
-- 
cgit v1.2.3


From 81553d1b8cacde537ceff10c8f24806a7f94ad36 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 9 Sep 2020 22:09:39 +0300
Subject: SL-13919 SSL verification should take mVerifyPeer flag into account

---
 indra/llcorehttp/_httpoprequest.cpp | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index 6978b8d08b..408adbde2b 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -1007,11 +1007,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
 {
     HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle<HttpOpRequest>(userdata));
 
-	if (op->mCallbackSSLVerify)
-	{
-		SSL_CTX * ctx = (SSL_CTX *)sslctx;
-		// verification for ssl certs
-		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
+    if (op->mCallbackSSLVerify)
+    {
+        SSL_CTX * ctx = (SSL_CTX *)sslctx;
+        if (op->mReqOptions && op->mReqOptions->getSSLVerifyPeer())
+        {
+            // verification for ssl certs
+            SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
+        }
+        else
+        {
+            // disable any default verification for server certs
+            // Ex: setting urls (assume non-SL) for parcel media in LLFloaterURLEntry
+            SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+        }
 		// set the verification callback.
 		SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata);
 		// the calls are void
-- 
cgit v1.2.3


From 8594be3b9a6518ae25b99f920358a61ed4bae1a1 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 11 Sep 2020 16:31:15 +0300
Subject: SL-13927 Turn SSL verification On for all SL services in viewer

---
 indra/llcorehttp/httpoptions.cpp      | 11 ++++++++++-
 indra/llcorehttp/httpoptions.h        | 11 ++++++++++-
 indra/llcrashlogger/llcrashlogger.cpp |  1 +
 indra/newview/llappcorehttp.cpp       | 24 ++++++++++++++++++++++++
 indra/newview/llappcorehttp.h         |  1 +
 indra/newview/llfloaterabout.cpp      |  1 +
 indra/newview/llfloatergridstatus.cpp |  1 +
 indra/newview/lltranslate.cpp         |  2 ++
 8 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index df5aa52fa9..c6365e5091 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -32,6 +32,7 @@
 namespace LLCore
 {
 
+    bool HttpOptions::sDefaultVerifyPeer = false;
 
 HttpOptions::HttpOptions() :
     mWantHeaders(false),
@@ -43,7 +44,7 @@ HttpOptions::HttpOptions() :
     mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
     mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
     mFollowRedirects(true),
-    mVerifyPeer(false),
+    mVerifyPeer(sDefaultVerifyPeer),
     mVerifyHost(false),
     mDNSCacheTimeout(-1L),
     mNoBody(false)
@@ -122,7 +123,15 @@ void HttpOptions::setHeadersOnly(bool nobody)
 {
     mNoBody = nobody;
     if (mNoBody)
+    {
         setWantHeaders(true);
+        setSSLVerifyPeer(false);
+    }
+}
+
+void HttpOptions::setDefaultSSLVerifyPeer(bool verify)
+{
+    sDefaultVerifyPeer = verify;
 }
 
 }   // end namespace LLCore
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 8a6de61b04..41f71896b0 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -143,7 +143,7 @@ public:
 
     /// Instructs the LLCore::HTTPRequest to verify that the exchanged security
     /// certificate is authentic. 
-    /// Default: false
+    /// Default: sDefaultVerifyPeer
     void				setSSLVerifyPeer(bool verify);
 	bool				getSSLVerifyPeer() const
 	{
@@ -177,6 +177,13 @@ public:
     {
         return mNoBody;
     }
+
+    /// Sets default behavior for verifying that the name in the 
+    /// security certificate matches the name of the host contacted.
+    /// Defaults false if not set, but should be set according to
+    /// viewer's initialization options and command argunments, see
+    /// NoVerifySSLCert
+    static void         setDefaultSSLVerifyPeer(bool verify);
 	
 protected:
 	bool				mWantHeaders;
@@ -192,6 +199,8 @@ protected:
 	bool        		mVerifyHost;
 	int					mDNSCacheTimeout;
     bool                mNoBody;
+
+    static bool         sDefaultVerifyPeer;
 }; // end class HttpOptions
 
 
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 62fcdaf545..e02f3a6306 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -411,6 +411,7 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg
     LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
 
     httpOpts->setTimeout(timeout);
+    httpOpts->setSSLVerifyPeer(false);
 
 	for(int i = 0; i < retries; ++i)
 	{
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index 134a34137b..3da87e657c 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -116,6 +116,7 @@ static const struct
 };
 
 static void setting_changed();
+static void ssl_verification_changed();
 
 
 LLAppCoreHttp::HttpClass::HttpClass()
@@ -195,6 +196,23 @@ void LLAppCoreHttp::init()
 		LL_WARNS("Init") << "Failed to set SSL Verification.  Reason:  " << status.toString() << LL_ENDL;
 	}
 
+    // Set up Default SSL Verification option.
+    const std::string no_verify_ssl("NoVerifySSLCert");
+    if (gSavedSettings.controlExists(no_verify_ssl))
+    {
+        LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(no_verify_ssl);
+        if (cntrl_ptr.isNull())
+        {
+            LL_WARNS("Init") << "Unable to set signal on global setting '" << no_verify_ssl
+                << "'" << LL_ENDL;
+        }
+        else
+        {
+            mSSLNoVerifySignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&ssl_verification_changed));
+            LLCore::HttpOptions::setDefaultSSLVerifyPeer(!cntrl_ptr->getValue().asBoolean());
+        }
+    }
+
 	// Tracing levels for library & libcurl (note that 2 & 3 are beyond spammy):
 	// 0 - None
 	// 1 - Basic start, stop simple transitions
@@ -296,6 +314,11 @@ void setting_changed()
 	LLAppViewer::instance()->getAppCoreHttp().refreshSettings(false);
 }
 
+void ssl_verification_changed()
+{
+    LLCore::HttpOptions::setDefaultSSLVerifyPeer(!gSavedSettings.getBOOL("NoVerifySSLCert"));
+}
+
 namespace
 {
     // The NoOpDeletor is used when wrapping LLAppCoreHttp in a smart pointer below for
@@ -355,6 +378,7 @@ void LLAppCoreHttp::cleanup()
 	{
 		mHttpClasses[i].mSettingsSignal.disconnect();
 	}
+    mSSLNoVerifySignal.disconnect();
 	mPipelinedSignal.disconnect();
 	
 	delete mRequest;
diff --git a/indra/newview/llappcorehttp.h b/indra/newview/llappcorehttp.h
index 95c138d598..751c498ab0 100644
--- a/indra/newview/llappcorehttp.h
+++ b/indra/newview/llappcorehttp.h
@@ -256,6 +256,7 @@ private:
 	HttpClass					mHttpClasses[AP_COUNT];
 	bool						mPipelined;				// Global setting
 	boost::signals2::connection	mPipelinedSignal;		// Signal for 'HttpPipelining' setting
+	boost::signals2::connection	mSSLNoVerifySignal;		// Signal for 'NoVerifySSLCert' setting
 
 	static LLCore::HttpStatus	sslVerify(const std::string &uri, const LLCore::HttpHandler::ptr_t &handler, void *appdata);
 };
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 171858e472..1fbd198019 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -236,6 +236,7 @@ void LLFloaterAbout::fetchServerReleaseNotesCoro(const std::string& cap_url)
 
     httpOpts->setWantHeaders(true);
     httpOpts->setFollowRedirects(false);
+    httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL verification fails
 
     LLSD result = httpAdapter->getAndSuspend(httpRequest, cap_url, httpOpts);
 
diff --git a/indra/newview/llfloatergridstatus.cpp b/indra/newview/llfloatergridstatus.cpp
index faa7e9f3db..9745e17bbb 100644
--- a/indra/newview/llfloatergridstatus.cpp
+++ b/indra/newview/llfloatergridstatus.cpp
@@ -95,6 +95,7 @@ void LLFloaterGridStatus::getGridStatusRSSCoro()
     LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
     LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders);
 
+    httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL fails
     httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
     std::string url = gSavedSettings.getString("GridStatusRSS");
 
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index fa3b44f702..553a3cd086 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -144,6 +144,7 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::
     httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
 
     httpOpts->setFollowRedirects(true);
+    httpOpts->setSSLVerifyPeer(false);
 
     std::string url = this->getKeyVerificationURL(key);
     if (url.empty())
@@ -185,6 +186,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
 
     httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
     httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+    httpOpts->setSSLVerifyPeer(false);
 
     std::string url = this->getTranslateURL(fromTo.first, fromTo.second, msg);
     if (url.empty())
-- 
cgit v1.2.3


From 3ab3d957de295fb755440c534aa5aa4d65852fc8 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 1 Sep 2020 21:24:06 +0300
Subject: SL-13830 Don't crash if quiting during startup

---
 indra/newview/llvoicevivox.cpp | 44 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 7b6d9613ac..746ed69417 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -919,10 +919,12 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
     //---------------------------------------------------------------------
     llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
 
+    bool quiting = LLAppViewer::isExiting();
+
     LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL;
 
     LLVoiceVivoxStats::getInstance()->reset();
-    while (!mConnected)
+    while (!mConnected && !quiting)
     {
         LLVoiceVivoxStats::getInstance()->connectionAttemptStart();
         LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL;
@@ -937,10 +939,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
         if (!mConnected)
         {
             llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS);
+            quiting = LLAppViewer::isExiting();
         }
     }
     
     //---------------------------------------------------------------------
+    if (quiting && !mConnected)
+    {
+        return false;
+    }
+
     llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
 
     while (!mPump)
@@ -977,11 +985,13 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
 {
     LL_INFOS("Voice") << "Provisioning voice account." << LL_ENDL;
 
-    while (!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived())
+    bool quiting = LLApp::isExiting();
+    while ((!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived()) && !quiting)
     {
         LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
         // *TODO* Pump a message for wake up.
         llcoro::suspend();
+        quiting = LLApp::isExiting();
     }
 
     std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
@@ -1001,6 +1011,7 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
     {
         LLVoiceVivoxStats::getInstance()->provisionAttemptStart();
         result = httpAdapter->postAndSuspend(httpRequest, url, LLSD(), httpOpts);
+        quiting = LLApp::isExiting();
 
         LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
         LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
@@ -1010,6 +1021,7 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
             F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast<float>(retryCount));
             LL_WARNS("Voice") << "Provision CAP 404.  Retrying in " << timeout << " seconds." << LL_ENDL;
             llcoro::suspendUntilTimeout(timeout);
+            quiting = LLApp::isExiting();
         }
         else if (!status)
         {
@@ -1021,10 +1033,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
         {
             provisioned = true;
         }        
-    } while (!provisioned && retryCount <= PROVISION_RETRY_MAX);
+    } while (!provisioned && retryCount <= PROVISION_RETRY_MAX && !quiting);
+
+    if (quiting && !provisioned)
+    {
+        return false;
+    }
 
     LLVoiceVivoxStats::getInstance()->provisionAttemptEnd(provisioned);
-    if (! provisioned )
+    if (!provisioned)
     {
         LL_WARNS("Voice") << "Could not access voice provision cap after " << retryCount << " attempts." << LL_ENDL;
         return false;
@@ -1069,6 +1086,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
     LLSD result;
     bool connected(false);
     bool giving_up(false);
+    bool quiting = LLApp::isExiting();
     int retries = 0;
     LL_INFOS("Voice") << "Requesting connection to voice service" << LL_ENDL;
 
@@ -1077,6 +1095,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
     do
     {
         result = llcoro::suspendUntilEventOn(mVivoxPump);
+        quiting = LLApp::isExiting();
         LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
 
         if (result.has("connector"))
@@ -1085,12 +1104,13 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
             connected = LLSD::Boolean(result["connector"]);
             if (!connected)
             {
-                if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX)
+                if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX && !quiting)
                 {
                     F32 timeout = LLSD::Real(result["retry"]);
                     timeout *= retries;
                     LL_INFOS("Voice") << "Retry connection to voice service in " << timeout << " seconds" << LL_ENDL;
                     llcoro::suspendUntilTimeout(timeout);
+                    quiting = LLApp::isExiting();
 
                     if (mVoiceEnabled) // user may have switched it off
                     {
@@ -1113,7 +1133,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
         LL_DEBUGS("Voice") << (connected ? "" : "not ") << "connected, "
                            << (giving_up ? "" : "not ") << "giving up"
                            << LL_ENDL;
-    } while (!connected && !giving_up);
+    } while (!connected && !giving_up && !quiting);
 
     if (giving_up)
     {
@@ -1183,6 +1203,7 @@ bool LLVivoxVoiceClient::loginToVivox()
     bool response_ok(false);
     bool account_login(false);
     bool send_login(true);
+    bool quiting = LLApp::isExiting();
 
     do 
     {
@@ -1194,13 +1215,14 @@ bool LLVivoxVoiceClient::loginToVivox()
         }
         
         LLSD result = llcoro::suspendUntilEventOnWithTimeout(mVivoxPump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
+        quiting = LLApp::isExiting();
         LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
 
         if (result.has("login"))
         {
             std::string loginresp = result["login"];
 
-            if ((loginresp == "retry") || (loginresp == "timeout"))
+            if (((loginresp == "retry") || (loginresp == "timeout")) && !quiting)
             {
                 LL_WARNS("Voice") << "login failed with status '" << loginresp << "' "
                                   << " count " << loginRetryCount << "/" << LOGIN_RETRY_MAX
@@ -1228,6 +1250,7 @@ bool LLVivoxVoiceClient::loginToVivox()
                 LL_WARNS("Voice") << "login " << loginresp << " will retry login in " << timeout << " seconds." << LL_ENDL;
                     
                 llcoro::suspendUntilTimeout(timeout);
+                quiting = LLApp::isExiting();
             }
             else if (loginresp == "failed")
             {
@@ -1242,9 +1265,14 @@ bool LLVivoxVoiceClient::loginToVivox()
             {
                 account_login = true;
             }
+            else if (quiting)
+            {
+                mIsLoggingIn = false;
+                return false;
+            }
         }
 
-    } while (!response_ok || !account_login);
+    } while ((!response_ok || !account_login) && !quiting);
 
     mRelogRequested = false;
     mIsLoggedIn = true;
-- 
cgit v1.2.3


From 6936736d1766a8a683b7058dbfdaee3c07e30cf7 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 11 Sep 2020 20:59:43 +0300
Subject: Revert SL-13927 commit 8c8eac256bdb51fdf9e6e297280b2017d26c3588.

Got into D503 by accident
---
 indra/llcorehttp/httpoptions.cpp      | 11 +----------
 indra/llcorehttp/httpoptions.h        | 11 +----------
 indra/llcrashlogger/llcrashlogger.cpp |  1 -
 indra/newview/llappcorehttp.cpp       | 24 ------------------------
 indra/newview/llappcorehttp.h         |  1 -
 indra/newview/llfloaterabout.cpp      |  1 -
 indra/newview/llfloatergridstatus.cpp |  1 -
 indra/newview/lltranslate.cpp         |  2 --
 8 files changed, 2 insertions(+), 50 deletions(-)

diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index c6365e5091..df5aa52fa9 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -32,7 +32,6 @@
 namespace LLCore
 {
 
-    bool HttpOptions::sDefaultVerifyPeer = false;
 
 HttpOptions::HttpOptions() :
     mWantHeaders(false),
@@ -44,7 +43,7 @@ HttpOptions::HttpOptions() :
     mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
     mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
     mFollowRedirects(true),
-    mVerifyPeer(sDefaultVerifyPeer),
+    mVerifyPeer(false),
     mVerifyHost(false),
     mDNSCacheTimeout(-1L),
     mNoBody(false)
@@ -123,15 +122,7 @@ void HttpOptions::setHeadersOnly(bool nobody)
 {
     mNoBody = nobody;
     if (mNoBody)
-    {
         setWantHeaders(true);
-        setSSLVerifyPeer(false);
-    }
-}
-
-void HttpOptions::setDefaultSSLVerifyPeer(bool verify)
-{
-    sDefaultVerifyPeer = verify;
 }
 
 }   // end namespace LLCore
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 41f71896b0..8a6de61b04 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -143,7 +143,7 @@ public:
 
     /// Instructs the LLCore::HTTPRequest to verify that the exchanged security
     /// certificate is authentic. 
-    /// Default: sDefaultVerifyPeer
+    /// Default: false
     void				setSSLVerifyPeer(bool verify);
 	bool				getSSLVerifyPeer() const
 	{
@@ -177,13 +177,6 @@ public:
     {
         return mNoBody;
     }
-
-    /// Sets default behavior for verifying that the name in the 
-    /// security certificate matches the name of the host contacted.
-    /// Defaults false if not set, but should be set according to
-    /// viewer's initialization options and command argunments, see
-    /// NoVerifySSLCert
-    static void         setDefaultSSLVerifyPeer(bool verify);
 	
 protected:
 	bool				mWantHeaders;
@@ -199,8 +192,6 @@ protected:
 	bool        		mVerifyHost;
 	int					mDNSCacheTimeout;
     bool                mNoBody;
-
-    static bool         sDefaultVerifyPeer;
 }; // end class HttpOptions
 
 
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index e02f3a6306..62fcdaf545 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -411,7 +411,6 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg
     LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
 
     httpOpts->setTimeout(timeout);
-    httpOpts->setSSLVerifyPeer(false);
 
 	for(int i = 0; i < retries; ++i)
 	{
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index 3da87e657c..134a34137b 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -116,7 +116,6 @@ static const struct
 };
 
 static void setting_changed();
-static void ssl_verification_changed();
 
 
 LLAppCoreHttp::HttpClass::HttpClass()
@@ -196,23 +195,6 @@ void LLAppCoreHttp::init()
 		LL_WARNS("Init") << "Failed to set SSL Verification.  Reason:  " << status.toString() << LL_ENDL;
 	}
 
-    // Set up Default SSL Verification option.
-    const std::string no_verify_ssl("NoVerifySSLCert");
-    if (gSavedSettings.controlExists(no_verify_ssl))
-    {
-        LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(no_verify_ssl);
-        if (cntrl_ptr.isNull())
-        {
-            LL_WARNS("Init") << "Unable to set signal on global setting '" << no_verify_ssl
-                << "'" << LL_ENDL;
-        }
-        else
-        {
-            mSSLNoVerifySignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&ssl_verification_changed));
-            LLCore::HttpOptions::setDefaultSSLVerifyPeer(!cntrl_ptr->getValue().asBoolean());
-        }
-    }
-
 	// Tracing levels for library & libcurl (note that 2 & 3 are beyond spammy):
 	// 0 - None
 	// 1 - Basic start, stop simple transitions
@@ -314,11 +296,6 @@ void setting_changed()
 	LLAppViewer::instance()->getAppCoreHttp().refreshSettings(false);
 }
 
-void ssl_verification_changed()
-{
-    LLCore::HttpOptions::setDefaultSSLVerifyPeer(!gSavedSettings.getBOOL("NoVerifySSLCert"));
-}
-
 namespace
 {
     // The NoOpDeletor is used when wrapping LLAppCoreHttp in a smart pointer below for
@@ -378,7 +355,6 @@ void LLAppCoreHttp::cleanup()
 	{
 		mHttpClasses[i].mSettingsSignal.disconnect();
 	}
-    mSSLNoVerifySignal.disconnect();
 	mPipelinedSignal.disconnect();
 	
 	delete mRequest;
diff --git a/indra/newview/llappcorehttp.h b/indra/newview/llappcorehttp.h
index 751c498ab0..95c138d598 100644
--- a/indra/newview/llappcorehttp.h
+++ b/indra/newview/llappcorehttp.h
@@ -256,7 +256,6 @@ private:
 	HttpClass					mHttpClasses[AP_COUNT];
 	bool						mPipelined;				// Global setting
 	boost::signals2::connection	mPipelinedSignal;		// Signal for 'HttpPipelining' setting
-	boost::signals2::connection	mSSLNoVerifySignal;		// Signal for 'NoVerifySSLCert' setting
 
 	static LLCore::HttpStatus	sslVerify(const std::string &uri, const LLCore::HttpHandler::ptr_t &handler, void *appdata);
 };
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 1fbd198019..171858e472 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -236,7 +236,6 @@ void LLFloaterAbout::fetchServerReleaseNotesCoro(const std::string& cap_url)
 
     httpOpts->setWantHeaders(true);
     httpOpts->setFollowRedirects(false);
-    httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL verification fails
 
     LLSD result = httpAdapter->getAndSuspend(httpRequest, cap_url, httpOpts);
 
diff --git a/indra/newview/llfloatergridstatus.cpp b/indra/newview/llfloatergridstatus.cpp
index 9745e17bbb..faa7e9f3db 100644
--- a/indra/newview/llfloatergridstatus.cpp
+++ b/indra/newview/llfloatergridstatus.cpp
@@ -95,7 +95,6 @@ void LLFloaterGridStatus::getGridStatusRSSCoro()
     LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
     LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders);
 
-    httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL fails
     httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
     std::string url = gSavedSettings.getString("GridStatusRSS");
 
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 553a3cd086..fa3b44f702 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -144,7 +144,6 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::
     httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
 
     httpOpts->setFollowRedirects(true);
-    httpOpts->setSSLVerifyPeer(false);
 
     std::string url = this->getKeyVerificationURL(key);
     if (url.empty())
@@ -186,7 +185,6 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
 
     httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
     httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
-    httpOpts->setSSLVerifyPeer(false);
 
     std::string url = this->getTranslateURL(fromTo.first, fromTo.second, msg);
     if (url.empty())
-- 
cgit v1.2.3


From 74f23cde48829577d330ec0624135b45564af0ac Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 11 Sep 2020 21:34:13 +0300
Subject: SL-13830 Remade vivox shutdown to terminate when it is told to
 shutdown instead of when viewer is quiting

---
 indra/newview/llvoicevivox.cpp | 69 ++++++++++++++++++++----------------------
 indra/newview/llvoicevivox.h   |  2 ++
 2 files changed, 35 insertions(+), 36 deletions(-)

diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 746ed69417..976ef61d8e 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -274,6 +274,8 @@ static void killGateway()
 
 ///////////////////////////////////////////////////////////////////////////////////////////////
 
+bool LLVivoxVoiceClient::sShuttingDown = false;
+
 LLVivoxVoiceClient::LLVivoxVoiceClient() :
 	mSessionTerminateRequested(false),
 	mRelogRequested(false),
@@ -381,6 +383,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient()
 	{
 		mAvatarNameCacheConnection.disconnect();
 	}
+    sShuttingDown = true;
 }
 
 //---------------------------------------------------
@@ -414,6 +417,8 @@ void LLVivoxVoiceClient::terminate()
 		mRelogRequested = false;
 		killGateway();
 	}
+
+    sShuttingDown = true;
 }
 
 //---------------------------------------------------
@@ -661,13 +666,13 @@ void LLVivoxVoiceClient::voiceControlCoro()
 
     U32 retry = 0;
 
-    while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !LLApp::isExiting())
+    while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !sShuttingDown)
     {
         LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
         llcoro::suspendUntilTimeout(1.0);
     }
 
-    if (LLApp::isExiting())
+    if (sShuttingDown)
     {
         mIsCoroutineActive = false;
         return;
@@ -698,7 +703,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
             << "disconnected"
             << " RelogRequested=" << mRelogRequested
             << LL_ENDL;            
-        if (mRelogRequested)
+        if (mRelogRequested && !sShuttingDown)
         {
             if (!success)
             {
@@ -713,14 +718,14 @@ void LLVivoxVoiceClient::voiceControlCoro()
                 LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL;
             }
 
-            while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
+            while (isGatewayRunning() || (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !sShuttingDown))
             {
                 LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL;
                 llcoro::suspendUntilTimeout(1.0);
             }
         }
     }
-    while (mVoiceEnabled && mRelogRequested);
+    while (mVoiceEnabled && mRelogRequested && !sShuttingDown);
     mIsCoroutineActive = false;
     LL_INFOS("Voice") << "exiting" << LL_ENDL;
 }
@@ -765,7 +770,7 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
 
 bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
 {
-    if (!LLAppViewer::isExiting() && mVoiceEnabled)
+    if (!sShuttingDown && mVoiceEnabled)
     {
         LL_WARNS("Voice") << "SLVoice terminated " << ll_stream_notation_sd(data) << LL_ENDL;
         terminateAudioSession(false);
@@ -919,12 +924,10 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
     //---------------------------------------------------------------------
     llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
 
-    bool quiting = LLAppViewer::isExiting();
-
     LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL;
 
     LLVoiceVivoxStats::getInstance()->reset();
-    while (!mConnected && !quiting)
+    while (!mConnected && !sShuttingDown)
     {
         LLVoiceVivoxStats::getInstance()->connectionAttemptStart();
         LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL;
@@ -939,12 +942,11 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
         if (!mConnected)
         {
             llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS);
-            quiting = LLAppViewer::isExiting();
         }
     }
     
     //---------------------------------------------------------------------
-    if (quiting && !mConnected)
+    if (sShuttingDown && !mConnected)
     {
         return false;
     }
@@ -985,13 +987,11 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
 {
     LL_INFOS("Voice") << "Provisioning voice account." << LL_ENDL;
 
-    bool quiting = LLApp::isExiting();
-    while ((!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived()) && !quiting)
+    while ((!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived()) && !sShuttingDown)
     {
         LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
         // *TODO* Pump a message for wake up.
         llcoro::suspend();
-        quiting = LLApp::isExiting();
     }
 
     std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
@@ -1011,7 +1011,6 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
     {
         LLVoiceVivoxStats::getInstance()->provisionAttemptStart();
         result = httpAdapter->postAndSuspend(httpRequest, url, LLSD(), httpOpts);
-        quiting = LLApp::isExiting();
 
         LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
         LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
@@ -1021,7 +1020,6 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
             F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast<float>(retryCount));
             LL_WARNS("Voice") << "Provision CAP 404.  Retrying in " << timeout << " seconds." << LL_ENDL;
             llcoro::suspendUntilTimeout(timeout);
-            quiting = LLApp::isExiting();
         }
         else if (!status)
         {
@@ -1033,9 +1031,9 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
         {
             provisioned = true;
         }        
-    } while (!provisioned && retryCount <= PROVISION_RETRY_MAX && !quiting);
+    } while (!provisioned && retryCount <= PROVISION_RETRY_MAX && !sShuttingDown);
 
-    if (quiting && !provisioned)
+    if (sShuttingDown && !provisioned)
     {
         return false;
     }
@@ -1082,11 +1080,15 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
         LL_WARNS("Voice") << "cannot establish connection; enabled "<<mVoiceEnabled<<" initialized "<<mIsInitialized<<LL_ENDL;
         return false;
     }
+
+    if (sShuttingDown)
+    {
+        return false;
+    }
     
     LLSD result;
     bool connected(false);
     bool giving_up(false);
-    bool quiting = LLApp::isExiting();
     int retries = 0;
     LL_INFOS("Voice") << "Requesting connection to voice service" << LL_ENDL;
 
@@ -1095,7 +1097,6 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
     do
     {
         result = llcoro::suspendUntilEventOn(mVivoxPump);
-        quiting = LLApp::isExiting();
         LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
 
         if (result.has("connector"))
@@ -1104,13 +1105,12 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
             connected = LLSD::Boolean(result["connector"]);
             if (!connected)
             {
-                if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX && !quiting)
+                if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX && !sShuttingDown)
                 {
                     F32 timeout = LLSD::Real(result["retry"]);
                     timeout *= retries;
                     LL_INFOS("Voice") << "Retry connection to voice service in " << timeout << " seconds" << LL_ENDL;
                     llcoro::suspendUntilTimeout(timeout);
-                    quiting = LLApp::isExiting();
 
                     if (mVoiceEnabled) // user may have switched it off
                     {
@@ -1133,7 +1133,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
         LL_DEBUGS("Voice") << (connected ? "" : "not ") << "connected, "
                            << (giving_up ? "" : "not ") << "giving up"
                            << LL_ENDL;
-    } while (!connected && !giving_up && !quiting);
+    } while (!connected && !giving_up && !sShuttingDown);
 
     if (giving_up)
     {
@@ -1203,7 +1203,6 @@ bool LLVivoxVoiceClient::loginToVivox()
     bool response_ok(false);
     bool account_login(false);
     bool send_login(true);
-    bool quiting = LLApp::isExiting();
 
     do 
     {
@@ -1215,14 +1214,13 @@ bool LLVivoxVoiceClient::loginToVivox()
         }
         
         LLSD result = llcoro::suspendUntilEventOnWithTimeout(mVivoxPump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
-        quiting = LLApp::isExiting();
         LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
 
         if (result.has("login"))
         {
             std::string loginresp = result["login"];
 
-            if (((loginresp == "retry") || (loginresp == "timeout")) && !quiting)
+            if (((loginresp == "retry") || (loginresp == "timeout")) && !sShuttingDown)
             {
                 LL_WARNS("Voice") << "login failed with status '" << loginresp << "' "
                                   << " count " << loginRetryCount << "/" << LOGIN_RETRY_MAX
@@ -1250,7 +1248,6 @@ bool LLVivoxVoiceClient::loginToVivox()
                 LL_WARNS("Voice") << "login " << loginresp << " will retry login in " << timeout << " seconds." << LL_ENDL;
                     
                 llcoro::suspendUntilTimeout(timeout);
-                quiting = LLApp::isExiting();
             }
             else if (loginresp == "failed")
             {
@@ -1265,14 +1262,14 @@ bool LLVivoxVoiceClient::loginToVivox()
             {
                 account_login = true;
             }
-            else if (quiting)
+            else if (sShuttingDown)
             {
                 mIsLoggingIn = false;
                 return false;
             }
         }
 
-    } while ((!response_ok || !account_login) && !quiting);
+    } while ((!response_ok || !account_login) && !sShuttingDown);
 
     mRelogRequested = false;
     mIsLoggedIn = true;
@@ -1725,12 +1722,12 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
     // the region chat.
     mSessionTerminateRequested = false;
 
-    bool status=((mVoiceEnabled || !mIsInitialized) && !mRelogRequested  && !LLApp::isExiting());
+    bool status=((mVoiceEnabled || !mIsInitialized) && !mRelogRequested  && !sShuttingDown);
     LL_DEBUGS("Voice") << "exiting"
                        << " VoiceEnabled " << mVoiceEnabled
                        << " IsInitialized " << mIsInitialized
                        << " RelogRequested " << mRelogRequested
-                       << " AppExiting " << LLApp::isExiting()
+                       << " ShuttingDown " << (sShuttingDown ? "TRUE" : "FALSE")
                        << " returning " << status
                        << LL_ENDL;
     return status;
@@ -1768,7 +1765,7 @@ bool LLVivoxVoiceClient::waitForChannel()
             mIsProcessingChannels = true;
             llcoro::suspend();
 
-            if (LLApp::isExiting())
+            if (sShuttingDown)
             {
                 mRelogRequested = false;
                 break;
@@ -1819,13 +1816,13 @@ bool LLVivoxVoiceClient::waitForChannel()
                 llcoro::suspendUntilTimeout(1.0);
             }
 
-            if (LLApp::isExiting())
+            if (sShuttingDown)
             {
                 mRelogRequested = false;
                 break;
             }
 
-        } while (mVoiceEnabled && !mRelogRequested);
+        } while (mVoiceEnabled && !mRelogRequested && !sShuttingDown);
 
         LL_DEBUGS("Voice")
             << "leaving inner waitForChannel loop"
@@ -1847,14 +1844,14 @@ bool LLVivoxVoiceClient::waitForChannel()
                 return false;
             }
         }
-    } while (mVoiceEnabled && mRelogRequested && isGatewayRunning());
+    } while (mVoiceEnabled && mRelogRequested && isGatewayRunning() && !sShuttingDown);
 
     LL_DEBUGS("Voice")
         << "exiting"
         << " RelogRequested=" << mRelogRequested
         << " VoiceEnabled=" << mVoiceEnabled
         << LL_ENDL;
-    return !LLApp::isExiting();
+    return !sShuttingDown;
 }
 
 bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 210c726452..699c85066b 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -912,6 +912,8 @@ private:
     bool    mIsProcessingChannels;
     bool    mIsCoroutineActive;
 
+    static bool sShuttingDown; // corutines can last longer than vivox so we need a static variable as a shutdown flag
+
     LLEventMailDrop mVivoxPump;
 };
 
-- 
cgit v1.2.3


From 05b98ec8619390d22f9c15e48ce03c69ede263ac Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Fri, 11 Sep 2020 23:57:31 +0300
Subject: Updated apr_suite to codeticket build 548882

---
 autobuild.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/autobuild.xml b/autobuild.xml
index 1416899483..eacf11fb0f 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -76,9 +76,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>d670d00aa732b97d105d287b62582762</string>
+              <string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -112,9 +112,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>83b4a047db5f7ee462753d91e6277cba</string>
+              <string>6bdf460c18ee004b41a46afc80041a92</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -124,16 +124,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b3bbf168b39e25c08cc1febddeb33332</string>
+              <string>83104bfa4dabb77cd70d185e38a95b49</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.4.5.539073</string>
+        <string>1.4.5.548882</string>
       </map>
       <key>boost</key>
       <map>
-- 
cgit v1.2.3


From d26f17efd565b189e4ed79ede674a493f4abd97a Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Fri, 11 Sep 2020 19:01:08 -0700
Subject: SL-13768 Remove glow from moon when sun is down due to it using the
 sun glow setting

---
 indra/newview/lldrawpoolwlsky.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index b0eb1a405b..de79a47562 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -184,6 +184,7 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca
 
         ((LLSettingsVOSky*)psky.get())->updateShader(sky_shader);
 
+        bool is_sun_up      = psky->getIsSunUp();
         F32 moisture_level  = (float)psky->getSkyMoistureLevel();
         F32 droplet_radius  = (float)psky->getSkyDropletRadius();
         F32 ice_level       = (float)psky->getSkyIceLevel();
@@ -199,9 +200,9 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca
         sky_shader->uniform1f(LLShaderMgr::DROPLET_RADIUS, droplet_radius);
         sky_shader->uniform1f(LLShaderMgr::ICE_LEVEL, ice_level);
 
-        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor());
+        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, is_sun_up ? psky->getSunMoonGlowFactor() : 0.0f ); // SL-13768
 
-        sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, psky->getIsSunUp() ? 1 : 0);
+        sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, is_sun_up ? 1 : 0);
 
         /// Render the skydome
         renderDome(origin, camHeightLocal, sky_shader);	
-- 
cgit v1.2.3


From f677b4187b1c8b4e6633bc8a39ef4cc9ca7577bf Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Fri, 11 Sep 2020 19:07:14 -0700
Subject: SL-13465 Remove hack offset of moon when AS is ON to match when AS is
 OFF.

---
 indra/newview/app_settings/shaders/class1/deferred/moonV.glsl  | 3 +--
 indra/newview/app_settings/shaders/class1/windlight/moonV.glsl | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
index e1bac4f248..1fed9d39e2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
@@ -37,8 +37,7 @@ void calcAtmospherics(vec3 eye_pos);
 void main()
 {
     //transform vertex
-    vec3 offset = vec3(0, 0, 50);
-    vec4 vert = vec4(position.xyz - offset, 1.0);
+    vec4 vert = vec4(position.xyz, 1.0);
     vec4 pos = (modelview_matrix * vert);
 
     gl_Position = modelview_projection_matrix*vert;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
index 8cd4b2ef47..c4cdd06e28 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
@@ -37,8 +37,7 @@ VARYING vec2 vary_texcoord0;
 void main()
 {
     //transform vertex
-    vec3 offset = vec3(0, 0, 50);
-    vec4 vert = vec4(position.xyz - offset, 1.0);
+    vec4 vert = vec4(position.xyz, 1.0);
     vec4 pos = (modelview_matrix * vert);
 
     gl_Position = modelview_projection_matrix*vert;
-- 
cgit v1.2.3


From 874d7e7e02e3bfbabbac1b31e94ad848ee854367 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Fri, 11 Sep 2020 20:46:55 -0700
Subject: SL-13465 Restore Pre-EEP haze effecting moon

---
 .../shaders/class1/deferred/moonF.glsl             | 43 ++++++++--------------
 .../shaders/class1/deferred/moonV.glsl             |  8 +---
 .../shaders/class1/windlight/moonF.glsl            | 35 +++++++-----------
 .../shaders/class1/windlight/moonV.glsl            |  6 +--
 indra/newview/lldrawpoolwlsky.cpp                  | 11 +++---
 5 files changed, 37 insertions(+), 66 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
index 4366945214..35068899ee 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
@@ -1,9 +1,9 @@
 /** 
- * @file moonF.glsl
+ * @file class1\deferred\moonF.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
+ * Copyright (C) 2005, 2020 Linden Research, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,46 +36,33 @@ out vec4 frag_data[3];
 uniform vec4 color;
 uniform vec4 sunlight_color;
 uniform vec4 moonlight_color;
-uniform vec3 lumWeights;
+uniform vec3 moon_dir;
 uniform float moon_brightness;
-uniform float minLuminance;
 uniform sampler2D diffuseMap;
-uniform sampler2D altDiffuseMap;
-uniform float blend_factor; // interp factor between moon A/B
+
 VARYING vec2 vary_texcoord0;
 
 vec3 srgb_to_linear(vec3 c);
 
-vec3 getAdditiveColor();
-
 /// Soft clips the light with a gamma correction
 vec3 scaleSoftClip(vec3 light);
 
 void main() 
 {
-    vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
-    vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy);
-    vec4 c     = mix(moonA, moonB, blend_factor);
-
-    c.rgb = srgb_to_linear(c.rgb);
-
-    // mix factor which blends when sunlight is brighter
-    // and shows true moon color at night
-    vec3 luma_weights = vec3(0.3, 0.5, 0.3);
-
-    vec4 light_color = max(sunlight_color, moonlight_color);
-    float blend = 1.0 - dot(normalize(light_color.rgb), luma_weights);
-
-    vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0  - 1.0;
-    c.rgb = pow(c.rgb, exp);
+    // Restore Pre-EEP alpha fade moon near horizon
+    float fade = 1.0;
+    if( moon_dir.z > 0 )
+        fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );
 
-    //c.rgb *= moonlight_color.rgb;
+    vec4 c      = texture2D(diffuseMap, vary_texcoord0.xy);
+//       c.rgb  = srgb_to_linear(c.rgb);
+         c.rgb *= moonlight_color.rgb;
+         c.rgb *= moon_brightness;
 
-    // Partial atmospherics calculation
-    vec3 ac = getAdditiveColor();
-    c.rgb += ac;
+         c.rgb *= fade;
+         c.a   *= fade;
 
-    c.rgb = scaleSoftClip(c.rgb);
+         c.rgb  = scaleSoftClip(c.rgb);
 
     frag_data[0] = vec4(c.rgb, c.a);
     frag_data[1] = vec4(0.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
index 1fed9d39e2..c4922afd7d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl
@@ -1,9 +1,9 @@
 /** 
- * @file moonV.glsl
+ * @file class1\deferred\moonV.glsl
  *
   * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
+ * Copyright (C) 2007, 2020 Linden Research, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -32,8 +32,6 @@ ATTRIBUTE vec2 texcoord0;
 
 VARYING vec2 vary_texcoord0;
 
-void calcAtmospherics(vec3 eye_pos);
-
 void main()
 {
     //transform vertex
@@ -42,7 +40,5 @@ void main()
 
     gl_Position = modelview_projection_matrix*vert;
 
-    calcAtmospherics(pos.xyz);
-    
     vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
 }
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
index 72d2c4cdfa..2425a2ad04 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
@@ -3,7 +3,7 @@
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
+ * Copyright (C) 2005, 2020 Linden Research, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,37 +36,30 @@ out vec4 frag_color;
 uniform vec4 color;
 uniform vec4 sunlight_color;
 uniform vec4 moonlight_color;
-uniform vec3 lumWeights;
+uniform vec3 moon_dir;
 uniform float moon_brightness;
-uniform float minLuminance;
 uniform sampler2D diffuseMap;
-uniform sampler2D altDiffuseMap;
-uniform float blend_factor; // interp factor between moon A/B
+
 VARYING vec2 vary_texcoord0;
 
-vec3 getAdditiveColor();
 vec3 scaleSoftClip(vec3 light);
 
 void main() 
 {
-    vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
-    vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy);
-    vec4 c     = mix(moonA, moonB, blend_factor);
-
-    // mix factor which blends when sunlight is brighter
-    // and shows true moon color at night
-    vec3 luma_weights = vec3(0.3, 0.5, 0.3);
-    float blend = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights);
+    // Restore Pre-EEP alpha fade moon near horizon
+    float fade = 1.0;
+    if( moon_dir.z > 0 )
+        fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );
 
-    vec3 exp = vec3(1.0 - blend * moon_brightness) * 2.0 - 1.0;
-    c.rgb = pow(c.rgb, exp);
-    //c.rgb *= moonlight_color.rgb;
+    vec4 c     = texture2D(diffuseMap, vary_texcoord0.xy);
+//       c.rgb = pow(c.rgb, vec3(0.7f)); // can't use "srgb_to_linear(color.rgb)" as that is a deferred only function
+         c.rgb *= moonlight_color.rgb;
+         c.rgb *= moon_brightness;
 
-    // Partial atmospherics calculation
-    vec3 ac = getAdditiveColor();
-    c.rgb += ac;
+         c.rgb *= fade;
+         c.a   *= fade;
 
-    c.rgb = scaleSoftClip(c.rgb);
+         c.rgb  = scaleSoftClip(c.rgb);
 
     frag_color = vec4(c.rgb, c.a);
 }
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
index c4cdd06e28..2fceb5f743 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl
@@ -3,7 +3,7 @@
  *
   * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
+ * Copyright (C) 2007, 2020 Linden Research, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -30,8 +30,6 @@ uniform mat4 modelview_projection_matrix;
 ATTRIBUTE vec3 position;
 ATTRIBUTE vec2 texcoord0;
 
-void calcAtmospherics(vec3 inPositionEye);
-
 VARYING vec2 vary_texcoord0;
 
 void main()
@@ -43,6 +41,4 @@ void main()
     gl_Position = modelview_projection_matrix*vert;
     
     vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-    
-    calcAtmospherics(pos.xyz);
 }
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index b0eb1a405b..d4e7f1600e 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -532,8 +532,6 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
         }
 	}
 
-    blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
-
 	face = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON];
 
 	if (gSky.mVOSkyp->getMoon().getDraw() && face && face->getTexture(LLRender::DIFFUSE_MAP) && face->getGeomCount() && moon_shader)
@@ -551,17 +549,17 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
             {
                 // Bind current and next sun textures
                 moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_a, LLTexUnit::TT_TEXTURE);
-                blend_factor = 0;
+                //blend_factor = 0;
             }
             else if (tex_b && !tex_a)
             {
                 moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
-                blend_factor = 0;
+                //blend_factor = 0;
             }
             else if (tex_b != tex_a)
             {
                 moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_a, LLTexUnit::TT_TEXTURE);
-                moon_shader->bindTexture(LLShaderMgr::ALTERNATE_DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
+                //moon_shader->bindTexture(LLShaderMgr::ALTERNATE_DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
             }
 
             LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
@@ -571,7 +569,8 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
             moon_shader->uniform1f(LLShaderMgr::MOON_BRIGHTNESS, moon_brightness);
             moon_shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, gSky.mVOSkyp->getMoon().getColor().mV);
             moon_shader->uniform4fv(LLShaderMgr::DIFFUSE_COLOR, 1, color.mV);
-            moon_shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
+            //moon_shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
+            moon_shader->uniform3fv(LLShaderMgr::DEFERRED_MOON_DIR, 1, psky->getMoonDirection().mV); // shader: moon_dir
 
             face->renderIndexed();
 
-- 
cgit v1.2.3


From 78da30936ce72649ab0bcc0276ce06b9c26c4317 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 15 Sep 2020 21:25:28 +0000
Subject: Revert "SL-13768 Remove glow from moon when sun is down due to it
 using the sun glow setting (pull request #297)"

---
 indra/newview/lldrawpoolwlsky.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 4d077379cb..d4e7f1600e 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -184,7 +184,6 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca
 
         ((LLSettingsVOSky*)psky.get())->updateShader(sky_shader);
 
-        bool is_sun_up      = psky->getIsSunUp();
         F32 moisture_level  = (float)psky->getSkyMoistureLevel();
         F32 droplet_radius  = (float)psky->getSkyDropletRadius();
         F32 ice_level       = (float)psky->getSkyIceLevel();
@@ -200,9 +199,9 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca
         sky_shader->uniform1f(LLShaderMgr::DROPLET_RADIUS, droplet_radius);
         sky_shader->uniform1f(LLShaderMgr::ICE_LEVEL, ice_level);
 
-        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, is_sun_up ? psky->getSunMoonGlowFactor() : 0.0f ); // SL-13768
+        sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor());
 
-        sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, is_sun_up ? 1 : 0);
+        sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, psky->getIsSunUp() ? 1 : 0);
 
         /// Render the skydome
         renderDome(origin, camHeightLocal, sky_shader);	
-- 
cgit v1.2.3


From be99bca2c31ffeaa7d559fe54fc9f7c4376af169 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Tue, 15 Sep 2020 16:52:13 -0600
Subject: SL-13768 remove moon glow from ALM deferred path as well

---
 indra/newview/app_settings/shaders/class2/deferred/skyF.glsl | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
index 1dce85a83b..0c9892acad 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
@@ -153,9 +153,8 @@ void main()
         // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     // Add "minimum anti-solar illumination"
-    temp2.x += .25;
-
-    temp2.x *= sun_moon_glow_factor;
+    // For sun, add to glow.  For moon, remove glow entirely. SL-13768
+    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (temp2.x + 0.25));
 
     // Haze color above cloud
     vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-- 
cgit v1.2.3


From 038929158c630564c65019f1dcf3a9e7cd92e682 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 16 Sep 2020 16:42:53 -0600
Subject: SL-13768 de-obfuscate the ALM version of skyF.glsl

---
 .../app_settings/shaders/class2/deferred/skyF.glsl | 102 ++++++++-------------
 1 file changed, 40 insertions(+), 62 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
index 0c9892acad..b9e561c112 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
@@ -92,110 +92,88 @@ void main()
 {
 
     // World / view / projection
-    // Get relative position
-    vec3 P = pos.xyz - camPosLocal.xyz + vec3(0,50,0);
-
-    // Set altitude
-    if (P.y > 0.)
-    {
-        P *= (max_y / P.y);
-    }
-    else
-    {
-        P *= (-32000. / P.y);
-    }
-
-    // Can normalize then
-    vec3 Pn = normalize(P);
-    float  Plen = length(P);
+    // Get relative position (offset why?)
+    vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0,50,0);
 
-    // Initialize temp variables
-    vec4 temp1 = vec4(0.);
-    vec4 temp2 = vec4(0.);
-    vec4 blue_weight;
-    vec4 haze_weight;
-    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
-    vec4 light_atten;
+    // Adj position vector to clamp altitude
+    if (rel_pos.y > 0.) { rel_pos *= (max_y / rel_pos.y); }
+    if (rel_pos.y < 0.) { rel_pos *= (-32000. / rel_pos.y); }
+
+    // Normalized
+    vec3 rel_pos_norm = normalize(rel_pos);
+    float  rel_pos_len = length(rel_pos);
 
-    float dens_mul = density_multiplier;
+    // Initialize temp variables
+    vec4  sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 
     // Sunlight attenuation effect (hue and brightness) due to atmosphere
     // this is used later for sunlight modulation at various altitudes
-    light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
+    vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
 
     // Calculate relative weights
-    temp1 = abs(blue_density) + vec4(abs(haze_density));
-    blue_weight = blue_density / temp1;
-    haze_weight = haze_density / temp1;
+    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
+    vec4 blue_weight = blue_density / combined_haze;
+    vec4 haze_weight = haze_density / combined_haze;
 
-    // Compute sunlight from P & lightnorm (for long rays like sky)
-    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
-    temp2.y = 1. / temp2.y;
-    sunlight *= exp( - light_atten * temp2.y);
+    // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
+    float off_axis = 1.0 / max(1e-6, max(0, rel_pos_norm.y) + lightnorm.y );
+    sunlight *= exp( - light_atten * off_axis);
 
     // Distance
-    temp2.z = Plen * dens_mul;
+    float density_dist = rel_pos_len * density_multiplier;
 
-    // Transparency (-> temp1)
-    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+    // Transparency (-> combined_haze)
+    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
     // compiler gets confused.
-    temp1 = exp(-temp1 * temp2.z);
+    combined_haze = exp(-combined_haze * density_dist);
 
     // Compute haze glow
-    temp2.x = dot(Pn, lightnorm.xyz);
-    temp2.x = 1. - temp2.x;
-        // temp2.x is 0 at the sun and increases away from sun
-    temp2.x = max(temp2.x, .001);   
+    float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
+    haze_glow = 1. - haze_glow;
+        // haze_glow is 0 at the sun and increases away from sun
+    haze_glow = max(haze_glow, .001);   
         // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
-    temp2.x *= glow.x;
+    haze_glow *= glow.x;
         // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-    temp2.x = pow(temp2.x, glow.z);
+    haze_glow = pow(haze_glow, glow.z);
         // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
-    temp2.x = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (temp2.x + 0.25));
+    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25));
 
     // Haze color above cloud
-    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color)
-                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
-             ); 
+    vec4 color = blue_horizon * blue_weight * (sunlight + ambient_color)
+               + haze_horizon * haze_weight * (sunlight * haze_glow + ambient_color); 
 
     // Final atmosphere additive
-    color *= (1. - temp1);
+    color *= (1. - combined_haze);
 
     // Increase ambient when there are more clouds
-    vec4 tmpAmbient = ambient_color;
-    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; 
+    // TODO 9/20: DJH what does this do?  max(0,(1-ambient)) will change the color
+    vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; 
 
     // Dim sunlight by cloud shadow percentage
     sunlight *= max(0.0, (1. - cloud_shadow));
 
     // Haze color below cloud
-    vec4 additiveColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient)
-                + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
-             ); 
-
-    
+    vec4 add_below_cloud = blue_horizon * blue_weight * (sunlight + ambient)
+                         + haze_horizon * haze_weight * (sunlight * haze_glow + ambient);
     
     // Attenuate cloud color by atmosphere
-    temp1 = sqrt(temp1);    //less atmos opacity (more transparency) below clouds
+    combined_haze = sqrt(combined_haze);    //less atmos opacity (more transparency) below clouds
 
     // At horizon, blend high altitude sky color towards the darker color below the clouds
-    color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
+    color += (add_below_cloud - color) * (1. - sqrt(combined_haze));
     
-    float optic_d = dot(Pn, lightnorm.xyz);
-
+    float optic_d = dot(rel_pos_norm, lightnorm.xyz);
     vec3 halo_22 = halo22(optic_d);
-
     color.rgb += rainbow(optic_d);
-
     color.rgb += halo_22;
-
     color.rgb *= 2.;
     color.rgb = scaleSoftClip(color.rgb);
 
-    /// Gamma correct for WL (soft clip effect).
+    // Gamma correct for WL (soft clip effect).
     frag_data[0] = vec4(color.rgb, 1.0);
     frag_data[1] = vec4(0.0,0.0,0.0,0.0);
     frag_data[2] = vec4(0.0,0.0,0.0,1.0); //1.0 in norm.w masks off fog
-- 
cgit v1.2.3


From a5e8b6cea5eaf83d23c56e37f1c4d5baddf363b6 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 16 Sep 2020 16:47:23 -0600
Subject: SL-13768 clang-format class2 deferred skyF.glsl (whitespace)

---
 .../app_settings/shaders/class2/deferred/skyF.glsl | 98 +++++++++++-----------
 1 file changed, 51 insertions(+), 47 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
index b9e561c112..1485c515a4 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl
@@ -1,24 +1,24 @@
-/** 
+/**
  * @file class2/deferred/skyF.glsl
  *
  * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2005, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
@@ -32,13 +32,13 @@ uniform mat4 modelview_projection_matrix;
 // Inputs
 uniform vec3 camPosLocal;
 
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 moonlight_color;
-uniform int sun_up_factor;
-uniform vec4 ambient_color;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
+uniform vec4  lightnorm;
+uniform vec4  sunlight_color;
+uniform vec4  moonlight_color;
+uniform int   sun_up_factor;
+uniform vec4  ambient_color;
+uniform vec4  blue_horizon;
+uniform vec4  blue_density;
 uniform float haze_horizon;
 uniform float haze_density;
 
@@ -47,7 +47,7 @@ uniform float density_multiplier;
 uniform float distance_multiplier;
 uniform float max_y;
 
-uniform vec4 glow;
+uniform vec4  glow;
 uniform float sun_moon_glow_factor;
 
 uniform vec4 cloud_color;
@@ -73,16 +73,16 @@ uniform float ice_level;
 
 vec3 rainbow(float d)
 {
-   d = clamp(d, -1.0, 0.0);
-   float rad = (droplet_radius - 5.0f) / 1024.0f;
-   return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
+    d         = clamp(d, -1.0, 0.0);
+    float rad = (droplet_radius - 5.0f) / 1024.0f;
+    return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
 }
 
 vec3 halo22(float d)
 {
-   d = clamp(d, 0.1, 1.0);
-   float v = sqrt(clamp(1 - (d * d), 0, 1));
-   return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
+    d       = clamp(d, 0.1, 1.0);
+    float v = sqrt(clamp(1 - (d * d), 0, 1));
+    return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
 }
 
 /// Soft clips the light with a gamma correction
@@ -90,21 +90,26 @@ vec3 scaleSoftClip(vec3 light);
 
 void main()
 {
-
     // World / view / projection
     // Get relative position (offset why?)
-    vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0,50,0);
+    vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
     // Adj position vector to clamp altitude
-    if (rel_pos.y > 0.) { rel_pos *= (max_y / rel_pos.y); }
-    if (rel_pos.y < 0.) { rel_pos *= (-32000. / rel_pos.y); }
+    if (rel_pos.y > 0.)
+    {
+        rel_pos *= (max_y / rel_pos.y);
+    }
+    if (rel_pos.y < 0.)
+    {
+        rel_pos *= (-32000. / rel_pos.y);
+    }
 
     // Normalized
-    vec3 rel_pos_norm = normalize(rel_pos);
-    float  rel_pos_len = length(rel_pos);
+    vec3  rel_pos_norm = normalize(rel_pos);
+    float rel_pos_len  = length(rel_pos);
 
     // Initialize temp variables
-    vec4  sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
+    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
 
     // Sunlight attenuation effect (hue and brightness) due to atmosphere
     // this is used later for sunlight modulation at various altitudes
@@ -112,12 +117,12 @@ void main()
 
     // Calculate relative weights
     vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
-    vec4 blue_weight = blue_density / combined_haze;
-    vec4 haze_weight = haze_density / combined_haze;
+    vec4 blue_weight   = blue_density / combined_haze;
+    vec4 haze_weight   = haze_density / combined_haze;
 
     // Compute sunlight from rel_pos & lightnorm (for long rays like sky)
-    float off_axis = 1.0 / max(1e-6, max(0, rel_pos_norm.y) + lightnorm.y );
-    sunlight *= exp( - light_atten * off_axis);
+    float off_axis = 1.0 / max(1e-6, max(0, rel_pos_norm.y) + lightnorm.y);
+    sunlight *= exp(-light_atten * off_axis);
 
     // Distance
     float density_dist = rel_pos_len * density_multiplier;
@@ -129,45 +134,45 @@ void main()
 
     // Compute haze glow
     float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
-    haze_glow = 1. - haze_glow;
-        // haze_glow is 0 at the sun and increases away from sun
-    haze_glow = max(haze_glow, .001);   
-        // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+    haze_glow       = 1. - haze_glow;
+    // haze_glow is 0 at the sun and increases away from sun
+    haze_glow = max(haze_glow, .001);
+    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
     haze_glow *= glow.x;
-        // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+    // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
     haze_glow = pow(haze_glow, glow.z);
-        // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+    // glow.z should be negative, so we're doing a sort of (1 / "angle") function
 
     // Add "minimum anti-solar illumination"
     // For sun, add to glow.  For moon, remove glow entirely. SL-13768
     haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25));
 
     // Haze color above cloud
-    vec4 color = blue_horizon * blue_weight * (sunlight + ambient_color)
-               + haze_horizon * haze_weight * (sunlight * haze_glow + ambient_color); 
+    vec4 color = blue_horizon * blue_weight * (sunlight + ambient_color) 
+               + haze_horizon * haze_weight * (sunlight * haze_glow + ambient_color);
 
     // Final atmosphere additive
     color *= (1. - combined_haze);
 
     // Increase ambient when there are more clouds
     // TODO 9/20: DJH what does this do?  max(0,(1-ambient)) will change the color
-    vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; 
+    vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
 
     // Dim sunlight by cloud shadow percentage
     sunlight *= max(0.0, (1. - cloud_shadow));
 
     // Haze color below cloud
-    vec4 add_below_cloud = blue_horizon * blue_weight * (sunlight + ambient)
+    vec4 add_below_cloud = blue_horizon * blue_weight * (sunlight + ambient) 
                          + haze_horizon * haze_weight * (sunlight * haze_glow + ambient);
-    
+
     // Attenuate cloud color by atmosphere
-    combined_haze = sqrt(combined_haze);    //less atmos opacity (more transparency) below clouds
+    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds
 
     // At horizon, blend high altitude sky color towards the darker color below the clouds
     color += (add_below_cloud - color) * (1. - sqrt(combined_haze));
-    
+
     float optic_d = dot(rel_pos_norm, lightnorm.xyz);
-    vec3 halo_22 = halo22(optic_d);
+    vec3  halo_22 = halo22(optic_d);
     color.rgb += rainbow(optic_d);
     color.rgb += halo_22;
     color.rgb *= 2.;
@@ -175,7 +180,6 @@ void main()
 
     // Gamma correct for WL (soft clip effect).
     frag_data[0] = vec4(color.rgb, 1.0);
-    frag_data[1] = vec4(0.0,0.0,0.0,0.0);
-    frag_data[2] = vec4(0.0,0.0,0.0,1.0); //1.0 in norm.w masks off fog
+    frag_data[1] = vec4(0.0, 0.0, 0.0, 0.0);
+    frag_data[2] = vec4(0.0, 0.0, 0.0, 1.0);  // 1.0 in norm.w masks off fog
 }
-
-- 
cgit v1.2.3


From e8f4017b910ae6276772f540eef80ac0c788cb57 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Wed, 16 Sep 2020 17:11:01 -0600
Subject: DRTVWR-4976 Misc shader cleanup.

Removed some potential div-by-0 NaNs and a mangled clamp.
---
 indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl     | 4 ++--
 indra/newview/app_settings/shaders/class1/deferred/skyV.glsl        | 6 +++---
 .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl    | 2 +-
 indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl    | 4 ++--
 indra/newview/app_settings/shaders/class2/windlight/skyV.glsl       | 4 ++--
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index b59862bb3b..b7036e02cf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -99,11 +99,11 @@ void main()
     altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
     // Set altitude
-    if (rel_pos.y > 0.)
+    if (rel_pos.y > 0)
     {
         rel_pos *= (max_y / rel_pos.y);
     }
-    else
+    if (rel_pos.y < 0)
     {
         altitude_blend_factor = 0;  // SL-11589 Fix clouds drooping below horizon
         rel_pos *= (-32000. / rel_pos.y);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
index b35a32dbbf..28a1faf24f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -71,12 +71,12 @@ void main()
     // Get relative position
     vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
-    // Set altitude
-    if (rel_pos.y > 0.)
+    // Adj position vector to clamp altitude
+    if (rel_pos.y > 0)
     {
         rel_pos *= (max_y / rel_pos.y);
     }
-    else
+    if (rel_pos.y < 0)
     {
         rel_pos *= (-32000. / rel_pos.y);
     }
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 05e6e6a9f9..ea2690ba09 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -49,7 +49,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
     vec3 rel_pos = inPositionEye;
 
     //(TERRAIN) limit altitude
-    rel_pos.y = clamp(rel_pos.y, -max_y, max_y);
+    if (abs(rel_pos.y) > max_y) rel_pos *= (max_y / rel_pos.y);
 
     vec3  rel_pos_norm = normalize(rel_pos);
     float rel_pos_len  = length(rel_pos);
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 75e074cbf8..1f881eb44b 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -99,12 +99,12 @@ void main()
     // fade clouds beyond a certain point so the bottom of the sky dome doesn't look silly at high altitude
     altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
 
-    // Set altitude
+    // Adj position vector to clamp altitude
     if (rel_pos.y > 0.)
     {
         rel_pos *= (max_y / rel_pos.y);
     }
-    else
+    if (rel_pos.y < 0.)
     {
         rel_pos *= (-32000. / rel_pos.y);
     }
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 6528066a4e..a0a33b8642 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -67,12 +67,12 @@ void main()
     // Get relative position
     vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
 
-    // Set altitude
+    // Adj position vector to clamp altitude
     if (rel_pos.y > 0.)
     {
         rel_pos *= (max_y / rel_pos.y);
     }
-    else
+    if (rel_pos.y < 0.)
     {
         rel_pos *= (-32000. / rel_pos.y);
     }
-- 
cgit v1.2.3


From 5054e6abee89d52b7dc49ec8727b6a9020e50ca5 Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Mon, 21 Sep 2020 15:21:25 -0600
Subject: SL-13522 remove injected character lights to improve alpha blend

Character lights injected during render pass while in character edit mode
(i.e. mSpecialRenderMode == 3) were causing discrepencies between deferred
(ALM) and forward alpha blend lighting.
---
 indra/newview/pipeline.cpp | 42 ++++--------------------------------------
 1 file changed, 4 insertions(+), 38 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 9516273396..f565573935 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6421,34 +6421,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
 		light->setAmbient(LLColor4::black);
 		light->setSpecular(LLColor4::black);
 	}
-	if (gAgentAvatarp &&
-		gAgentAvatarp->mSpecialRenderMode == 3)
-	{
-		LLColor4  light_color = LLColor4::white;
-		light_color.mV[3] = 0.0f;
-
-		LLVector3 light_pos(LLViewerCamera::getInstance()->getOrigin());
-		LLVector4 light_pos_gl(light_pos, 1.0f);
-
-		F32 light_radius = 16.f;
-
-			F32 x = 3.f;
-		float linatten = x / (light_radius); // % of brightness at radius
 
-		mHWLightColors[2] = light_color;
-		LLLightState* light = gGL.getLight(2);
-
-		light->setPosition(light_pos_gl);
-		light->setDiffuse(light_color);
-        light->setDiffuseB(light_color * 0.25f);
-		light->setAmbient(LLColor4::black);
-		light->setSpecular(LLColor4::black);
-		light->setQuadraticAttenuation(0.f);
-		light->setConstantAttenuation(0.f);
-		light->setLinearAttenuation(linatten);
-		light->setSpotExponent(0.f);
-		light->setSpotCutoff(180.f);
-	}
+    // Bookmark comment to allow searching for mSpecialRenderMode == 3 (avatar edit mode),
+    // prev site of forward (non-deferred) character light injection, removed by SL-13522 09/20
 
 	// Init GL state
 	if (!LLGLSLShader::sNoFixedFunction)
@@ -8813,17 +8788,8 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
                     }
                 }
 
-                // If we're in avatar editing mode (3), add an avatar appearance light at the camera position
-                if (gAgentAvatarp && gAgentAvatarp->mSpecialRenderMode == 3)
-                {
-                    // Cam coords (post-transform) are 0,0,0, with radius 15m
-                    fullscreen_lights.push_back(LLVector4(0.f, 0.f, 0.f, 15.0f));
-
-                    // Use a white light
-                    LLVector4 white_light(LLColor4::white.mV);
-                    white_light.mV[3] = 0.0f;
-                    light_colors.push_back(white_light);
-                }
+                // Bookmark comment to allow searching for mSpecialRenderMode == 3 (avatar edit mode),
+                // prev site of appended deferred character light, removed by SL-13522 09/20
 
                 unbindDeferredShader(gDeferredLightProgram);
             }
-- 
cgit v1.2.3


From 60ed688026269568a9eef67437dc780f88c92871 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 22 Sep 2020 15:32:35 -0400
Subject: Increment viewer version to 6.4.9 following promotion of DRTVWR-503

---
 indra/newview/VIEWER_VERSION.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 4b20d9700d..a228920441 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.8
+6.4.9
-- 
cgit v1.2.3


From bac6652cdcd2d8333df04c3ebd3a6a7b752328b3 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Mon, 28 Sep 2020 13:21:32 -0400
Subject: Increment viewer version to 6.4.10 following promotion of DRTVWR-497

---
 indra/newview/VIEWER_VERSION.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index a228920441..b03e20c456 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.9
+6.4.10
-- 
cgit v1.2.3