From 8df1856f84cf2d76b207ab43b05f1f930db50c51 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 31 Aug 2022 22:42:52 +0300
Subject: SL-17653 In texture picker cleaned up permanently invisible 'show
 folders' checkbox

---
 indra/newview/lltexturectrl.cpp                    | 24 ----------------------
 indra/newview/lltexturectrl.h                      |  2 --
 .../skins/default/xui/en/floater_texture_ctrl.xml  | 11 +---------
 3 files changed, 1 insertion(+), 36 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index a26ac446c6..580fd7936e 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -410,10 +410,6 @@ BOOL LLFloaterTexturePicker::postBuild()
 	childSetAction("None", LLFloaterTexturePicker::onBtnNone,this);
 	childSetAction("Blank", LLFloaterTexturePicker::onBtnBlank,this);
 
-
-	childSetCommitCallback("show_folders_check", onShowFolders, this);
-	getChildView("show_folders_check")->setVisible( FALSE);
-
     mFilterEdit = getChild<LLFilterEditor>("inventory search editor");
     mFilterEdit->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onFilterEdit, this, _2));
 
@@ -505,7 +501,6 @@ void LLFloaterTexturePicker::draw()
 	updateImageStats();
 
 	// if we're inactive, gray out "apply immediate" checkbox
-	getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected);
 	getChildView("Select")->setEnabled(mActive && mCanApply);
 	getChildView("Pipette")->setEnabled(mActive);
 	getChild<LLUICtrl>("Pipette")->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
@@ -836,9 +831,6 @@ void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
 	self->getChild<LLFilterEditor>("inventory search editor")->setVisible(index == 0 ? TRUE : FALSE);
 	self->getChild<LLInventoryPanel>("inventory panel")->setVisible(index == 0 ? TRUE : FALSE);
 
-	/*self->getChild<LLCheckBox>("show_folders_check")->setVisible(mode);
-	  no idea under which conditions the above is even shown, needs testing. */
-
 	self->getChild<LLButton>("l_add_btn")->setVisible(index == 1 ? TRUE : FALSE);
 	self->getChild<LLButton>("l_rem_btn")->setVisible(index == 1 ? TRUE : FALSE);
 	self->getChild<LLButton>("l_upl_btn")->setVisible(index == 1 ? TRUE : FALSE);
@@ -1036,22 +1028,6 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
 	}
 }
 
-// static
-void LLFloaterTexturePicker::onShowFolders(LLUICtrl* ctrl, void *user_data)
-{
-	LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
-	LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data;
-
-	if (check_box->get())
-	{
-		picker->mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	}
-	else
-	{
-		picker->mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NO_FOLDERS);
-	}
-}
-
 // static
 void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_data)
 {
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 1bfbb0d1be..0325e09aa7 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -329,9 +329,7 @@ public:
 	//static void		onBtnRevert( void* userdata );
 	static void		onBtnBlank(void* userdata);
 	static void		onBtnNone(void* userdata);
-	static void		onBtnClear(void* userdata);
 	void			onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
-	static void		onShowFolders(LLUICtrl* ctrl, void* userdata);
 	static void		onApplyImmediateCheck(LLUICtrl* ctrl, void* userdata);
 	void			onTextureSelect(const LLTextureEntry& te);
 
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 18c226ed58..2a84fece03 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -175,22 +175,13 @@
      bg_alpha_color="DkGray2"
      border="false"
      follows="all"
-     height="195"
+     height="200"
      layout="topleft"
      left_delta="0"
      name="inventory panel"
      top_pad="4"
      width="231"
      filter_asset_types="texture|material"/>
-     <check_box
-     height="14"
-     initial_value="false"
-     label="Show folders"
-     layout="topleft"
-     name="show_folders_check"
-     top_pad="0"
-     left_delta="-3"
-     width="200" />
 
 <!--  middle: local mode -->
     <button
-- 
cgit v1.2.3


From 20dc30450cb50d08e6c7d23613a6a59aae1a6a16 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 31 Aug 2022 19:45:23 +0300
Subject: SL-17999 PBR material in tool's texture tab

---
 indra/newview/lldrawpoolsky.cpp                    |   5 +-
 indra/newview/llpanelface.cpp                      | 467 ++++++++++-----------
 indra/newview/llpanelface.h                        |  14 +-
 indra/newview/llselectmgr.cpp                      |  83 ++++
 indra/newview/llselectmgr.h                        |   1 +
 .../skins/default/xui/en/panel_tools_texture.xml   |  48 +++
 6 files changed, 356 insertions(+), 262 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 3a1efec91b..55ebf03adc 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -51,7 +51,10 @@ LLDrawPoolSky::LLDrawPoolSky()
 void LLDrawPoolSky::prerender()
 {
 	mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT); 
-	gSky.mVOSkyp->updateGeometry(gSky.mVOSkyp->mDrawable);
+    if (gSky.mVOSkyp->mDrawable)
+    {
+        gSky.mVOSkyp->updateGeometry(gSky.mVOSkyp->mDrawable);
+    }
 }
 
 void LLDrawPoolSky::render(S32 pass)
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 865529eb8f..795a93c3fe 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -93,13 +93,15 @@
 // Must match the commbobox definitions in panel_tools_texture.xml
 //
 const S32 MATMEDIA_MATERIAL = 0;	// Material
-const S32 MATMEDIA_MEDIA = 1;		// Media
+const S32 MATMEDIA_PBR = 1;			// PBR
+const S32 MATMEDIA_MEDIA = 2;		// Media
 const S32 MATTYPE_DIFFUSE = 0;		// Diffuse material texture
 const S32 MATTYPE_NORMAL = 1;		// Normal map
 const S32 MATTYPE_SPECULAR = 2;		// Specular map
 const S32 ALPHAMODE_MASK = 2;		// Alpha masking mode
 const S32 BUMPY_TEXTURE = 18;		// use supplied normal map
 const S32 SHINY_TEXTURE = 4;		// use supplied specular map
+const S32 PBRTYPE_ALBEDO = 0;		// PBR ALBEDO
 
 BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP);
 
@@ -142,7 +144,6 @@ F32		LLPanelFace::getCurrentShinyScaleU()		{ return getChild<LLUICtrl>("shinySca
 F32		LLPanelFace::getCurrentShinyScaleV()		{ return getChild<LLUICtrl>("shinyScaleV")->getValue().asReal();					}
 F32		LLPanelFace::getCurrentShinyOffsetU()		{ return getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal();					}
 F32		LLPanelFace::getCurrentShinyOffsetV()		{ return getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal();					}
-LLUUID	LLPanelFace::getCurrentMaterialID()			{ return getChild<LLUICtrl>("materialID")->getValue().asUUID(); 					}
 
 //
 // Methods
@@ -174,7 +175,6 @@ BOOL	LLPanelFace::postBuild()
 	childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterialGloss, this);
 	childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);
 	childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this);
-	childSetCommitCallback("materialID", &LLPanelFace::onCommitMaterialID, this);
 
 	childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
 	childSetAction("button align textures", &LLPanelFace::onAlignTexture, this);
@@ -197,6 +197,24 @@ BOOL	LLPanelFace::postBuild()
 
 	setMouseOpaque(FALSE);
 
+    LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control");
+    if (pbr_ctrl)
+    {
+        pbr_ctrl->setDefaultImageAssetID(LLUUID(gSavedSettings.getString("DefaultObjectTexture")));
+        pbr_ctrl->setCommitCallback(boost::bind(&LLPanelFace::onCommitPbr, this, _2));
+        pbr_ctrl->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelPbr, this, _2));
+        pbr_ctrl->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectPbr, this, _2));
+        pbr_ctrl->setDragCallback(boost::bind(&LLPanelFace::onDragPbr, this, _2));
+        pbr_ctrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onPbrSelectionChanged, this, _1));
+        pbr_ctrl->setOnCloseCallback(boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2));
+
+        pbr_ctrl->setFollowsTop();
+        pbr_ctrl->setFollowsLeft();
+        pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
+        pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
+        pbr_ctrl->setBakeTextureEnabled(false);
+    }
+
 	mTextureCtrl = getChild<LLTextureCtrl>("texture control");
 	if(mTextureCtrl)
 	{
@@ -314,6 +332,13 @@ BOOL	LLPanelFace::postBuild()
         radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);
     }
 
+    LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type");
+    if (radio_mat_type)
+    {
+        radio_pbr_type->setCommitCallback(LLPanelFace::onCommitPbrType, this);
+        radio_pbr_type->selectNthItem(PBRTYPE_ALBEDO);
+    }
+
 	mCtrlGlow = getChild<LLSpinCtrl>("glow");
 	if(mCtrlGlow)
 	{
@@ -852,7 +877,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		{
 			LL_WARNS() << "failed getChild for 'combobox matmedia'" << LL_ENDL;
 		}
-		getChildView("combobox matmedia")->setEnabled(editable);
+        combobox_matmedia->setEnabled(editable);
 
 		LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
 		if(radio_mat_type)
@@ -869,14 +894,31 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		}
 
 		getChildView("radio_material_type")->setEnabled(editable);
+        getChildView("radio_pbr_type")->setEnabled(editable);
 		getChildView("checkbox_sync_settings")->setEnabled(editable);
 		childSetValue("checkbox_sync_settings", gSavedSettings.getBOOL("SyncMaterialSettings"));
 		updateVisibility();
 
 		bool identical				= true;	// true because it is anded below
-      bool identical_diffuse	= false;
-      bool identical_norm		= false;
-      bool identical_spec		= false;
+        bool identical_diffuse	= false;
+        bool identical_norm		= false;
+        bool identical_spec		= false;
+
+        // pbr material
+        bool is_pbr_material = false;
+        LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control");
+        if (pbr_ctrl)
+        {
+            LLUUID pbr_id;
+            bool identical_pbr;
+            LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr);
+            identical &= identical_pbr;
+
+            pbr_ctrl->setTentative(identical_pbr ? FALSE : TRUE);
+            pbr_ctrl->setEnabled(editable);
+            pbr_ctrl->setImageAssetID(pbr_id);
+            is_pbr_material = pbr_id.notNull();
+        }
 
 		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("texture control");
 		LLTextureCtrl*	shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
@@ -888,7 +930,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		
 		// Color swatch
 		{
-			getChildView("color label")->setEnabled(editable);
+			getChildView("color label")->setEnabled(editable && !is_pbr_material);
 		}
 		LLColorSwatchCtrl*	mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
 
@@ -903,17 +945,17 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			mColorSwatch->setOriginal(color);
 			mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable);
 
-			mColorSwatch->setValid(editable);
-			mColorSwatch->setEnabled( editable );
+			mColorSwatch->setValid(editable && !is_pbr_material);
+			mColorSwatch->setEnabled(editable && !is_pbr_material);
 			mColorSwatch->setCanApplyImmediately( editable );
 		}
 
 		// Color transparency
-		getChildView("color trans")->setEnabled(editable);
+		getChildView("color trans")->setEnabled(editable && !is_pbr_material);
 
 		F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;
 		getChild<LLUICtrl>("ColorTrans")->setValue(editable ? transparency : 0);
-		getChildView("ColorTrans")->setEnabled(editable);
+		getChildView("ColorTrans")->setEnabled(editable && !is_pbr_material);
 
 		// Specular map
 		LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec);
@@ -958,7 +1000,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 
 		U8 bumpy = 0;
 		// Bumpy
-						{
+		{
 			bool identical_bumpy = false;
 			LLSelectedTE::getBumpmap(bumpy,identical_bumpy);
 
@@ -979,7 +1021,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			getChildView("combobox bumpiness")->setEnabled(editable);
 			getChild<LLUICtrl>("combobox bumpiness")->setTentative(!identical_bumpy);
 			getChildView("label bumpiness")->setEnabled(editable);
-						}
+        }
 
 		// Texture
 		{
@@ -1333,8 +1375,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			LLSelectedTE::getGlow(glow,identical_glow);
 			getChild<LLUICtrl>("glow")->setValue(glow);
 			getChild<LLUICtrl>("glow")->setTentative(!identical_glow);
-			getChildView("glow")->setEnabled(editable);
-			getChildView("glow label")->setEnabled(editable);
+			getChildView("glow")->setEnabled(editable && !is_pbr_material);
+			getChildView("glow label")->setEnabled(editable && !is_pbr_material);
 		}
 
 		{
@@ -1441,10 +1483,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			LLMaterialPtr material;
 			LLSelectedTEMaterial::getCurrent(material, identical);
 
-            // enable this UI box if a single face is selected.
-            BOOL is_single_face = !LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected();
-            childSetEnabled("materialID", static_cast<bool>(is_single_face));   // doesn't work - why?
-
             if (material && editable)
 			{
 				LL_DEBUGS("Materials") << material->asLLSD() << LL_ENDL;
@@ -1557,8 +1595,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());
 		calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());
 		calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal());
-
-		getChildView("materialID")->setEnabled(editable);
 	}
 	else
 	{
@@ -1566,6 +1602,12 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		clearCtrls();
 
 		// Disable non-UICtrls
+        LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control");
+        if (pbr_ctrl)
+        {
+            pbr_ctrl->setImageAssetID(LLUUID::null);
+            pbr_ctrl->setEnabled(FALSE);
+        }
 		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("texture control"); 
 		if(texture_ctrl)
 		{
@@ -1701,10 +1743,12 @@ void LLPanelFace::updateVisibility()
 	U32 materials_media = combo_matmedia->getCurrentIndex();
 	U32 material_type = radio_mat_type->getSelectedIndex();
 	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();
-	bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled()));
-	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled();
-	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
-	getChildView("radio_material_type")->setVisible(!show_media);
+    bool show_material = materials_media == MATMEDIA_MATERIAL;
+    bool show_pbr = materials_media == MATMEDIA_PBR;
+	bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled()));
+	bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled();
+	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
+	getChildView("radio_material_type")->setVisible(show_texture);
 
 	// Media controls
 	getChildView("media_info")->setVisible(show_media);
@@ -1713,20 +1757,20 @@ void LLPanelFace::updateVisibility()
 	getChildView("button align")->setVisible(show_media);
 
 	// Diffuse texture controls
-	getChildView("texture control")->setVisible(show_texture && !show_media);
-	getChildView("label alphamode")->setVisible(show_texture && !show_media);
-	getChildView("combobox alphamode")->setVisible(show_texture && !show_media);
+	getChildView("texture control")->setVisible(show_texture && show_material);
+	getChildView("label alphamode")->setVisible(show_texture && (show_material || show_pbr));
+	getChildView("combobox alphamode")->setVisible(show_texture && (show_material || show_pbr));
 	getChildView("label maskcutoff")->setVisible(false);
 	getChildView("maskcutoff")->setVisible(false);
-	if (show_texture && !show_media)
+	if (show_texture && show_material)
 	{
 		updateAlphaControls();
 	}
-	getChildView("TexScaleU")->setVisible(show_texture);
-	getChildView("TexScaleV")->setVisible(show_texture);
-	getChildView("TexRot")->setVisible(show_texture);
-	getChildView("TexOffsetU")->setVisible(show_texture);
-	getChildView("TexOffsetV")->setVisible(show_texture);
+	getChildView("TexScaleU")->setVisible(show_texture || show_pbr);
+	getChildView("TexScaleV")->setVisible(show_texture || show_pbr);
+	getChildView("TexRot")->setVisible(show_texture || show_pbr);
+	getChildView("TexOffsetU")->setVisible(show_texture || show_pbr);
+	getChildView("TexOffsetV")->setVisible(show_texture || show_pbr);
 
 	// Specular map controls
 	getChildView("shinytexture control")->setVisible(show_shininess);
@@ -1762,7 +1806,9 @@ void LLPanelFace::updateVisibility()
 	getChildView("bumpyOffsetU")->setVisible(show_bumpiness);
 	getChildView("bumpyOffsetV")->setVisible(show_bumpiness);
 
-
+    // PBR controls
+    getChildView("pbr_control")->setVisible(show_pbr);
+    getChildView("radio_pbr_type")->setVisible(show_pbr);
 }
 
 // static
@@ -1777,6 +1823,16 @@ void LLPanelFace::onCommitMaterialType(LLUICtrl* ctrl, void* userdata)
     self->updateUI();
 }
 
+// static
+void LLPanelFace::onCommitPbrType(LLUICtrl* ctrl, void* userdata)
+{
+    LLPanelFace* self = (LLPanelFace*)userdata;
+    // Force to default states to side-step problems with menu contents
+    // and generally reflecting old state when switching tabs or objects
+    //
+    self->updateUI();
+}
+
 // static
 void LLPanelFace::onCommitBump(LLUICtrl* ctrl, void* userdata)
 {
@@ -1843,8 +1899,8 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh
 	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
 	U32 materials_media = combo_matmedia->getCurrentIndex();
 	U32 material_type = radio_mat_type->getSelectedIndex();
-	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();
-	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
+	bool show_material = (materials_media == MATMEDIA_MATERIAL);
+	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
 	U32 shiny_value = comboShiny->getCurrentIndex();
 	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture
 	getChildView("label glossiness")->setVisible(show_shinyctrls);
@@ -1961,22 +2017,82 @@ void LLPanelFace::onCommitGlow(LLUICtrl* ctrl, void* userdata)
 	self->sendGlow();
 }
 
+// static
+BOOL LLPanelFace::onDragPbr(LLUICtrl*, LLInventoryItem* item)
+{
+    BOOL accept = TRUE;
+    for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
+        iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++)
+    {
+        LLSelectNode* node = *iter;
+        LLViewerObject* obj = node->getObject();
+        if (!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item))
+        {
+            accept = FALSE;
+            break;
+        }
+    }
+    return accept;
+}
+
+void LLPanelFace::onCommitPbr(const LLSD& data)
+{
+    LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
+    if (!pbr_ctrl) return;
+    if (!pbr_ctrl->getTentative())
+    {
+        // we grab the item id first, because we want to do a
+        // permissions check in the selection manager. ARGH!
+        LLUUID id = pbr_ctrl->getImageItemID();
+        if (id.isNull())
+        {
+            id = pbr_ctrl->getImageAssetID();
+        }
+        LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id);
+    }
+}
+
+void LLPanelFace::onCancelPbr(const LLSD& data)
+{
+    LLSelectMgr::getInstance()->selectionRevertGLTFMaterials();
+}
+
+void LLPanelFace::onSelectPbr(const LLSD& data)
+{
+    LLSelectMgr::getInstance()->saveSelectedObjectTextures();
+
+    LLTextureCtrl* pbr_ctrl = getChild<LLTextureCtrl>("pbr_control");
+    if (!pbr_ctrl) return;
+    if (!pbr_ctrl->getTentative())
+    {
+        // we grab the item id first, because we want to do a
+        // permissions check in the selection manager. ARGH!
+        LLUUID id = pbr_ctrl->getImageItemID();
+        if (id.isNull())
+        {
+            id = pbr_ctrl->getImageAssetID();
+        }
+        LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id);
+        LLSelectedTEMaterial::setMaterialID(this, id);
+    }
+}
+
 // static
 BOOL LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item)
 {
-	BOOL accept = TRUE;
-	for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
-		 iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++)
-	{
-		LLSelectNode* node = *iter;
-		LLViewerObject* obj = node->getObject();
-		if(!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item))
-		{
-			accept = FALSE;
-			break;
-		}
-	}
-	return accept;
+    BOOL accept = TRUE;
+    for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
+        iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++)
+    {
+        LLSelectNode* node = *iter;
+        LLViewerObject* obj = node->getObject();
+        if (!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item))
+        {
+            accept = FALSE;
+            break;
+        }
+    }
+    return accept;
 }
 
 void LLPanelFace::onCommitTexture( const LLSD& data )
@@ -2354,17 +2470,6 @@ void LLPanelFace::onCommitMaterialMaskCutoff(LLUICtrl* ctrl, void* userdata)
 	LLSelectedTEMaterial::setAlphaMaskCutoff(self,self->getCurrentAlphaMaskCutoff());
 }
 
-//static
-void LLPanelFace::onCommitMaterialID(LLUICtrl* ctrl, void* userdata)
-{
-	LLPanelFace* self = static_cast<LLPanelFace*>(userdata);
-    LLUUID matID = self->getCurrentMaterialID();
-	LLSelectedTEMaterial::setMaterialID(self, matID);
-
-    // Temporary demo hack - replace the TE entries with those from the Material's LLSD
-    applyMaterialUUID(matID, userdata);
-}
-
 // static
 void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )
 {
@@ -3474,6 +3579,39 @@ void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
 	}
 }
 
+void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
+{
+    LLTextureCtrl* pbr_ctrl = getChild<LLTextureCtrl>("pbr_control");
+    if (pbr_ctrl)
+    {
+        LLUUID obj_owner_id;
+        std::string obj_owner_name;
+        LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name);
+
+        LLSaleInfo sale_info;
+        LLSelectMgr::instance().selectGetSaleInfo(sale_info);
+
+        bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture?
+        bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture?
+        bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent?
+        bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale?
+
+        if (can_copy && can_transfer)
+        {
+            pbr_ctrl->setCanApply(true, true);
+            return;
+        }
+
+        // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale
+        pbr_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
+
+        if (gSavedSettings.getBOOL("TextureLivePreview"))
+        {
+            LLNotificationsUtil::add("LivePreviewUnavailable");
+        }
+    }
+}
+
 bool LLPanelFace::isIdenticalPlanarTexgen()
 {
 	LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT;
@@ -3553,6 +3691,18 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
 	identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
 }
 
+void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical)
+{
+    struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID>
+    {
+        LLUUID get(LLViewerObject* object, S32 te_index)
+        {
+            return object->getRenderMaterialID(te_index);
+        }
+    } func;
+    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, id);
+}
+
 void LLPanelFace::LLSelectedTEMaterial::getCurrent(LLMaterialPtr& material_ptr, bool& identical_material)
 {
 	struct MaterialFunctor : public LLSelectedTEGetFunctor<LLMaterialPtr>
@@ -3692,196 +3842,3 @@ void LLPanelFace::LLSelectedTE::getMaxDiffuseRepeats(F32& repeats, bool& identic
 	identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &max_diff_repeats_func, repeats );
 }
 
-
-void LLPanelFace::onSaveMaterial(void* userdata)
-{
-    // DRTVWR-559, Q&D material picker - save to inventory goes here
-    LL_DEBUGS("Material") << "saving render material to inventory" << LL_ENDL;
-
-    std::string name = "New Material";
-
-	LLSD material_data = llsd::map(
-		"version", "1",
-		"material", LLSD::emptyMap()
-	);
-
-    // gen a new uuid for this asset
-    LLTransactionID tid;
-    tid.generate();     // timestamp-based randomization + uniquification
-    LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
-
-    material_data["material"] = renderMaterialToLLSD(new_asset_id, userdata);
-    std::stringstream output;
-    LLSDSerialize::toNotation(material_data, output);
-
-    //S32 expected_upload_cost = 0;// LLAgentBenefitsMgr::current().getTextureUploadCost();
-    
-    std::string res_name = name;
-    std::string res_desc = "Saved Material";
-    //LLFolderType::EType folder_type = LLFolderType::FT_MATERIAL;
-    //LLInventoryType::EType inv_type = LLInventoryType::IT_MATERIAL;
-    U32 next_owner_perm = LLPermissions::DEFAULT.getMaskNextOwner();
-
-    LLUUID parent = gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL);
-    const U8 subtype = NO_INV_SUBTYPE;  // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ?
-
-    create_inventory_item(gAgent.getID(), gAgent.getSessionID(), parent, tid, res_name, res_desc,
-        LLAssetType::AT_MATERIAL, LLInventoryType::IT_MATERIAL, subtype, next_owner_perm,
-        new LLBoostFuncInventoryCallback([output=output.str()](LLUUID const & inv_item_id){
-            // from reference in LLSettingsVOBase::createInventoryItem()/updateInventoryItem()
-            LLResourceUploadInfo::ptr_t uploadInfo =
-                std::make_shared<LLBufferedAssetUploadInfo>(
-                    inv_item_id,
-                    LLAssetType::AT_SETTINGS, // TODO switch to AT_MATERIAL
-                    output,
-                    [](LLUUID item_id, LLUUID new_asset_id, LLUUID new_item_id, LLSD response) {
-                        LL_INFOS("Material") << "inventory item uploaded.  item: " << item_id << " asset: " << new_asset_id << " new_item_id: " << new_item_id << " response: " << response << LL_ENDL;
-                        LLSD params = llsd::map("ASSET_ID", new_asset_id);
-                        LLNotificationsUtil::add("MaterialCreated", params);
-                    });
-
-            const LLViewerRegion* region = gAgent.getRegion();
-            if (region)
-            {
-                 std::string agent_url(region->getCapability("UpdateSettingsAgentInventory"));
-                 if (agent_url.empty())
-                 {
-                     LL_ERRS() << "missing required agent inventory cap url" << LL_ENDL;
-                 }
-                 LLViewerAssetUpload::EnqueueInventoryUpload(agent_url, uploadInfo);
-            }
-        })
-    );
-
-}
-
-// Fill an LLSD with data describing the current face's texture settings
-// TODO 2022-05 FUBAR there are both colliding and different data in LLPanelFace vs the TE.  Also, neither one has the diffuse tex settings.
-//              
-LLSD LLPanelFace::renderMaterialToLLSD(LLUUID uuid, void* userdata)
-{
-    llassert(userdata != nullptr);
-
-    LLSD sd;
-
-    sd.insert("RenderMaterialUUID",    LLSD(uuid));
-
-    // now pull same data from the selected TE (same but different. W T F?) 
-    LLMaterialPtr mat = nullptr;
-    bool ident; // ?
-    LLSelectedTEMaterial::getCurrent(mat, ident);
-
-    if (mat)
-    {
-        sd.insert("teMaterialID", LLSD(mat->getMaterialID()));
-
-        sd.insert("teNormalMap", LLSD(mat->getNormalID()));
-        sd.insert("teNormalOffsetX", LLSD(mat->getNormalOffsetX()));
-        sd.insert("teNormalOffsetY", LLSD(mat->getNormalOffsetY()));
-        sd.insert("teNormalRepeatX", LLSD(mat->getNormalRepeatX()));
-        sd.insert("teNormalRepeatY", LLSD(mat->getNormalRepeatY()));
-        sd.insert("teNormalRotation", LLSD(mat->getNormalRotation()));
-
-        sd.insert("teSpecularMap", LLSD(mat->getSpecularID()));
-        LLColor4U color = mat->getSpecularLightColor();
-
-        sd.insert("teSpecularColorR", LLSD(static_cast<S32>(color.mV[0])));
-        sd.insert("teSpecularColorG", LLSD(static_cast<S32>(color.mV[1])));
-        sd.insert("teSpecularColorB", LLSD(static_cast<S32>(color.mV[2])));
-        sd.insert("teSpecularColorA", LLSD(static_cast<S32>(color.mV[3])));
-        sd.insert("teSpecularExponent", LLSD(static_cast<S32>(mat->getSpecularLightExponent())));
-        sd.insert("teSpecularOffsetX", LLSD(mat->getSpecularOffsetX()));
-        sd.insert("teSpecularOffsetY", LLSD(mat->getSpecularOffsetY()));
-        sd.insert("teSpecularRepeatX", LLSD(mat->getSpecularRepeatX()));
-        sd.insert("teSpecularRepeatY", LLSD(mat->getSpecularRepeatY()));
-        sd.insert("teSpecularRotation", LLSD(mat->getSpecularRotation()));
-
-        sd.insert("teAlphaMode", LLSD(static_cast<S32>(mat->getDiffuseAlphaMode())));
-        sd.insert("teAlphaCutoff", LLSD(static_cast<S32>(mat->getAlphaMaskCutoff())));
-        sd.insert("teEnvIntensity", LLSD(static_cast<S32>(mat->getEnvironmentIntensity())));
-        sd.insert("teShaderMask", LLSD(static_cast<S32>(mat->getShaderMask())));
-    }
-    else
-    {
-        // pull data from the LLPanelFace
-        LLPanelFace* instance = static_cast<LLPanelFace*>(userdata);
-        sd.insert("pfNormalMap",         LLSD(instance->getCurrentNormalMap()));
-        sd.insert("pfSpecularMap",       LLSD(instance->getCurrentSpecularMap()));
-        sd.insert("pfShininess",         LLSD(static_cast<S32>(instance->getCurrentShininess())));
-        sd.insert("pfBumpiness",         LLSD(static_cast<S32>(instance->getCurrentBumpiness())));
-        sd.insert("pfAlphaMode",         LLSD(static_cast<S32>(instance->getCurrentDiffuseAlphaMode())));
-        sd.insert("pfAlphaCutoff",       LLSD(static_cast<S32>(instance->getCurrentAlphaMaskCutoff())));
-        sd.insert("pfEnvIntensity",      LLSD(static_cast<S32>(instance->getCurrentEnvIntensity())));
-        sd.insert("pfGlossiness",        LLSD(static_cast<S32>(instance->getCurrentGlossiness())));
-        sd.insert("pfNormalRotation",    LLSD(instance->getCurrentBumpyRot()));
-        sd.insert("pfNormalScaleU",      LLSD(instance->getCurrentBumpyScaleU()));
-        sd.insert("pfNormalScaleV",      LLSD(instance->getCurrentBumpyScaleV()));
-        sd.insert("pfNormalOffsetU",     LLSD(instance->getCurrentBumpyOffsetU()));
-        sd.insert("pfNormalOffsetV",     LLSD(instance->getCurrentBumpyOffsetV()));
-        sd.insert("pfSpecularRotation",  LLSD(instance->getCurrentShinyRot()));
-        sd.insert("pfSpecularScaleU",    LLSD(instance->getCurrentShinyScaleU()));
-        sd.insert("pfSpecularScaleV",    LLSD(instance->getCurrentShinyScaleV()));
-        sd.insert("pfSpecularOffsetU",   LLSD(instance->getCurrentShinyOffsetU()));
-        sd.insert("pfSpecularOffsetV",   LLSD(instance->getCurrentShinyOffsetV()));
-        sd.insert("pfMaterialID",        LLSD(instance->getCurrentMaterialID()));
-    }
-
-    return sd;
-}
-
-// Take the individual texture settings from the material and apply to current face & TE
-void LLPanelFace::applyMaterialUUID(LLUUID uuid, void* userdata)
-{
-    llassert(userdata != nullptr);
-    //LLPanelFace* instance = static_cast<LLPanelFace*>(userdata);
-    
-    LLFileSystem material_file(uuid, LLAssetType::AT_MATERIAL, LLFileSystem::READ);
-    S32 bufsize = material_file.getSize();
-    llassert(bufsize > 0);
-    std::vector<U8> buffer(bufsize);
-    material_file.read(&buffer[0], bufsize);
-    std::istringstream input(std::string(buffer.begin(), buffer.end()));  // TODO - extend LLFileSystem to expose iostream interface
-    LLSD matSD;
-
-    LLSDSerialize::fromNotation(matSD, input, bufsize);
-
-    LL_INFOS() << "dump matSD: " << matSD << LL_ENDL;
-
-    // strip off the versioning wrapper for now
-    matSD = matSD["material"];
-
-    // wrong, oops. llassert(uuid == matSD.get("RenderMaterialUUID").asUUID());      // if not, whoo boy
-
-    LLMaterialPtr mat = nullptr;
-    bool ident; // ?
-    LLSelectedTEMaterial::getCurrent(mat, ident);
-
-    mat->setMaterialID(matSD.get("teMaterialID").asUUID());
-
-    mat->setNormalID(matSD.get("teNormalMap").asUUID());
-    mat->setNormalOffsetX(matSD.get("teNormalOffsetX").asReal());
-    mat->setNormalOffsetY(matSD.get("teNormalOffsetY").asReal());
-    mat->setNormalRepeatX(matSD.get("teNormalRepeatX").asReal());
-    mat->setNormalRepeatY(matSD.get("teNormalRepeatY").asReal());
-    mat->setNormalRotation(matSD.get("teNormalRotation").asReal());
-
-    mat->setSpecularID(matSD.get("teSpecularMap").asUUID());
-    LLColor4U color;
-    color.mV[0] = static_cast<U8>(matSD.get("teSecularColorR").asInteger());
-    color.mV[1] = static_cast<U8>(matSD.get("teSecularColorG").asInteger());
-    color.mV[2] = static_cast<U8>(matSD.get("teSecularColorB").asInteger());
-    color.mV[3] = static_cast<U8>(matSD.get("teSecularColorA").asInteger());
-    mat->setSpecularLightColor(color);
-    mat->setSpecularLightExponent(static_cast<U8>(matSD.get("teSpecularExponent").asInteger()));
-    mat->setSpecularOffsetX(matSD.get("teSpecularOffsetX").asReal());
-    mat->setSpecularOffsetY(matSD.get("teSpecularOffsetY").asReal());
-    mat->setSpecularRepeatX(matSD.get("teSpecularRepeatX").asReal());
-    mat->setSpecularRepeatY(matSD.get("teSpecularRepeatY").asReal());
-    mat->setSpecularRotation(matSD.get("teSpecularRotation").asReal());
-
-    mat->setDiffuseAlphaMode(static_cast<U8>(matSD.get("teAlphaMode").asInteger()));
-    mat->setAlphaMaskCutoff(static_cast<U8>(matSD.get("teAlphaCutoff").asInteger()));
-    mat->setEnvironmentIntensity(static_cast<U8>(matSD.get("teEnvIntensity").asInteger()));
-    //mat->setShaderMask(static_cast<U32>(matSD.get(teShaderMask").asInteger());
-}
-
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 08dc619402..6746d67ce3 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -128,11 +128,15 @@ protected:
 	void			sendShiny(U32 shininess);			// applies and sends shininess
 	void			sendFullbright();		// applies and sends full bright
 	void        sendGlow();
-	void			sendMedia();
     void            alignTestureLayer();
 
     void            updateCopyTexButton();
 
+    void 	onCommitPbr(const LLSD& data);
+    void 	onCancelPbr(const LLSD& data);
+    void 	onSelectPbr(const LLSD& data);
+    static BOOL onDragPbr(LLUICtrl* ctrl, LLInventoryItem* item);
+
 	// this function is to return TRUE if the drag should succeed.
 	static BOOL onDragTexture(LLUICtrl* ctrl, LLInventoryItem* item);
 
@@ -200,6 +204,7 @@ protected:
 
 	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata);
+    static void		onCommitPbrType(LLUICtrl* ctrl, void* userdata);
 	static void		onCommitBump(				LLUICtrl* ctrl, void* userdata);
 	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);
 	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata);
@@ -211,10 +216,6 @@ protected:
 	static void		onClickAutoFix(void*);
     static void		onAlignTexture(void*);
 
-    static void		onSaveMaterial(void*);
-    static LLSD     renderMaterialToLLSD(LLUUID uuid, void* userdata);
-    static void     applyMaterialUUID(LLUUID uuid, void*);
-
 public: // needs to be accessible to selection manager
     void            onCopyColor(); // records all selected faces
     void            onPasteColor(); // to specific face
@@ -255,7 +256,6 @@ private:
 	F32		getCurrentShinyScaleV();
 	F32		getCurrentShinyOffsetU();
 	F32		getCurrentShinyOffsetV();
-	LLUUID	getCurrentMaterialID();
 
 	// Update visibility of controls to match current UI mode
 	// (e.g. materials vs media editing)
@@ -424,6 +424,7 @@ private:
 	 * all controls of the floater texture picker which allow to apply the texture will be disabled.
 	 */
     void onTextureSelectionChanged(LLInventoryItem* itemp);
+    void onPbrSelectionChanged(LLInventoryItem* itemp);
 
     LLMenuButton*   mMenuClipboardColor;
     LLMenuButton*   mMenuClipboardTexture;
@@ -535,6 +536,7 @@ public:
 		static void getFace(class LLFace*& face_to_return, bool& identical_face);
 		static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face);
 		static void getTexId(LLUUID& id, bool& identical);
+        static void getPbrMaterialId(LLUUID& id, bool& identical);
 		static void getObjectScaleS(F32& scale_s, bool& identical);
 		static void getObjectScaleT(F32& scale_t, bool& identical);
 		static void getMaxDiffuseRepeats(F32& repeats, bool& identical);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index fc5b1c60e2..c4ad48033e 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1759,6 +1759,89 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 	getSelection()->applyToObjects(&sendfunc);
 }
 
+//-----------------------------------------------------------------------------
+// selectionSetGLTFMaterial()
+//-----------------------------------------------------------------------------
+void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
+{
+    // First for (no copy) textures and multiple object selection
+    LLViewerInventoryItem* item = gInventory.getItem(mat_id);
+    if (item
+        && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
+        && (mSelectedObjects->getNumNodes() > 1))
+    {
+        LL_WARNS() << "Attempted to apply no-copy material to multiple objects"
+            << LL_ENDL;
+        return;
+    }
+
+    struct f : public LLSelectedTEFunctor
+    {
+        LLViewerInventoryItem* mItem;
+        LLUUID mMatId;
+        f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mMatId(id) {}
+        bool apply(LLViewerObject* objectp, S32 te)
+        {
+            if (objectp && !objectp->permModify())
+            {
+                return false;
+            }
+            LLUUID asset_id = mMatId;
+            if (mItem)
+            {
+                asset_id = mItem->getAssetUUID();
+            }
+
+            if (te != -1)
+            {
+                objectp->setRenderMaterialID(te, asset_id);
+            }
+            else
+            {
+                S32 num_faces = objectp->getNumTEs();
+                for (S32 face = 0; face < num_faces; face++)
+                {
+                    objectp->setRenderMaterialID(face, asset_id);
+                }
+            }
+
+            return true;
+        }
+    };
+
+    if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+    {
+        getSelection()->applyNoCopyTextureToTEs(item);
+    }
+    else
+    {
+        f setfunc(item, mat_id);
+        getSelection()->applyToTEs(&setfunc);
+    }
+
+
+    struct g : public LLSelectedObjectFunctor
+    {
+        LLViewerInventoryItem* mItem;
+        g(LLViewerInventoryItem* item) : mItem(item) {}
+        virtual bool apply(LLViewerObject* object)
+        {
+            if (!mItem)
+            {
+                object->sendTEUpdate();
+                // 1 particle effect per object				
+                LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+                effectp->setSourceObject(gAgentAvatarp);
+                effectp->setTargetObject(object);
+                effectp->setDuration(LL_HUD_DUR_SHORT);
+                effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+            }
+            return true;
+        }
+    } sendfunc(item);
+    getSelection()->applyToObjects(&sendfunc);
+}
+
 //-----------------------------------------------------------------------------
 // selectionSetColor()
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index aec2baa6a7..3b76f87c44 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -605,6 +605,7 @@ public:
 	void selectionSetRestitution(F32 restitution);
 	void selectionSetMaterial(U8 material);
 	void selectionSetImage(const LLUUID& imageid); // could be item or asset id
+    void selectionSetGLTFMaterial(const LLUUID& mat_id); // could be item or asset id
 	void selectionSetColor(const LLColor4 &color);
 	void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels
 	void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index 2af7ccaa7a..922c58fa94 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -143,6 +143,10 @@
                  label="Materials"
                  name="Materials"
                  value="Materials" />
+                <combo_box.item
+                 label="PBR"
+                 name="PBR"
+                 value="PBR" />
                 <combo_box.item
                  label="Media"
                  name="Media"
@@ -179,6 +183,37 @@
                 top_pad="1"
                 value="2"/>
             </radio_group>
+            <radio_group
+            control_name="ComboMaterialType"
+            height="50"
+            layout="topleft"
+            left_delta="0"
+            top_delta="0"
+            width="150"
+            visible = "false"
+            name="radio_pbr_type">
+                <radio_item
+                label="Albedo/emissive"
+                name="Albedo/emissive"
+                top="0" 
+                layout="topleft"
+                height="16" 
+                value="0"/>
+                <radio_item
+                label="Normal"
+                layout="topleft"
+                top_pad="1" 
+                height="16" 
+                name="Normal"
+                value="1"/>
+                <radio_item
+                label="Metallic/roughness"
+                name="Metallic/roughness"
+                height="16"
+                layout="topleft"
+                top_pad="1"
+                value="2"/>
+            </radio_group>
             <menu_button
                 menu_filename="menu_copy_paste_texture.xml"
                 follows="top|left"
@@ -217,6 +252,19 @@
              tool_tip="Click to choose a picture"
              top_pad="5"
              width="64" />
+            <texture_picker
+             can_apply_immediately="true"
+             default_image_name="Default"
+             fallback_image="materials_ui_x_24.png"
+             follows="left|top"
+             height="80"
+             label="PBR       "
+             layout="topleft"
+             left="10"
+             name="pbr_control"
+             tool_tip="Click to choose a pbr material"
+             top_delta="0"
+             width="64" />
             <text
              type="string"
              length="1"
-- 
cgit v1.2.3


From 116bd660b65cfad64c6f9635db165cff5b3eda36 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 31 Aug 2022 23:39:36 +0300
Subject: SL-17653 Finalized texure picker's local filtering

---
 indra/newview/llpanelface.cpp                      |   1 +
 indra/newview/lltexturectrl.cpp                    | 126 +++++++++++++++++----
 indra/newview/lltexturectrl.h                      |  19 +++-
 .../skins/default/xui/en/floater_texture_ctrl.xml  | 118 +++++++++++--------
 4 files changed, 194 insertions(+), 70 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 795a93c3fe..9300b161f4 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -213,6 +213,7 @@ BOOL	LLPanelFace::postBuild()
         pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
         pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
         pbr_ctrl->setBakeTextureEnabled(false);
+        pbr_ctrl->setInventoryPickType(LLTextureCtrl::PICK_MATERIAL);
     }
 
 	mTextureCtrl = getChild<LLTextureCtrl>("texture control");
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 580fd7936e..87c05c162a 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -177,7 +177,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
 	mOnFloaterCloseCallback(NULL),
 	mSetImageAssetIDCallback(NULL),
 	mOnUpdateImageStatsCallback(NULL),
-	mBakeTextureEnabled(FALSE)
+	mBakeTextureEnabled(FALSE),
+    mInventoryPickType(LLTextureCtrl::PICK_TEXTURE)
 {
 	mCanApplyImmediately = can_apply_immediately;
 	buildFromFile("floater_texture_ctrl.xml");
@@ -466,8 +467,20 @@ BOOL LLFloaterTexturePicker::postBuild()
 	mLocalScrollCtrl = getChild<LLScrollListCtrl>("l_name_list");
 	mLocalScrollCtrl->setCommitCallback(onLocalScrollCommit, this);
     mLocalScrollCtrl->clearRows();
-	LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
-    LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+
+    if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+    {
+        LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
+    else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+    {
+        LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
+    else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+    {
+        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
 
 	mNoCopyTextureSelected = FALSE;
 
@@ -901,11 +914,18 @@ void LLFloaterTexturePicker::onBtnAdd(void* userdata)
 {
     LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata;
 
-    // todo: there will be changes to texture picker to forbid
-    // selection of materials in some cases, like landmarks, once
-    // it gets implemented, update code to select FLOAD_* filter
-    // based on picker's material/texture mode.
-    LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL_TEXTURE, true);
+    if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+    {
+        LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL_TEXTURE, true);
+    }
+    else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+    {
+        LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_IMAGE, true);
+    }
+    else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+    {
+        LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL, true);
+    }
 }
 
 // static
@@ -941,8 +961,20 @@ void LLFloaterTexturePicker::onBtnRemove(void* userdata)
 		self->getChild<LLButton>("l_rem_btn")->setEnabled(false);
 		self->getChild<LLButton>("l_upl_btn")->setEnabled(false);
         self->mLocalScrollCtrl->clearRows();
-		LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
-        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+
+        if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+        {
+            LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+            LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
+        else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+        {
+            LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
+        else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+        {
+            LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
 	}
 }
 
@@ -1183,18 +1215,23 @@ void LLFloaterTexturePicker::onSelectTextureMaterials(LLUICtrl* ctrl, void *user
 
     U32 filter_types = 0x0;
 
-    if (index == textures_and_materials)
+    if (self->mInventoryPickType != LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+    {
+        index = self->mInventoryPickType;
+    }
+
+    if (index == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
     {
         filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
         filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
         filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
     }
-    else if (index == textures_only)
+    else if (index == LLTextureCtrl::PICK_TEXTURE)
     {
         filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
         filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
     }
-    else if (index == materials_only)
+    else if (index == LLTextureCtrl::PICK_MATERIAL)
     {
         filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
     }
@@ -1229,6 +1266,28 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
 	onModeSelect(0, this);
 }
 
+void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryType type)
+{
+    mInventoryPickType = type;
+
+    mLocalScrollCtrl->clearRows();
+    if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+    {
+        LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
+    else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+    {
+        LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
+    else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+    {
+        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
+    }
+
+    onSelectTextureMaterials(0, this);
+}
+
 void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle)
 {
     std::vector<std::string>::const_iterator iter = filenames.begin();
@@ -1254,8 +1313,20 @@ void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& fi
     {
         LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)handle.get();
         self->mLocalScrollCtrl->clearRows();
-        LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
-        LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+
+        if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+        {
+            LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+            LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
+        else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+        {
+            LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
+        else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+        {
+            LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
+        }
     }
 }
 
@@ -1306,6 +1377,8 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
 	mValid( TRUE ),
 	mShowLoadingPlaceholder( TRUE ),
 	mOpenTexPreview(false),
+    mBakeTextureEnabled(true),
+    mInventoryPickType(PICK_TEXTURE),
 	mImageAssetID(p.image_id),
 	mDefaultImageAssetID(p.default_image_id),
 	mDefaultImageName(p.default_image_name),
@@ -1495,14 +1568,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
 		if (texture_floaterp)
 		{
 			texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLTextureCtrl::onFloaterCommit, this, _1, _2));
-		}
-		if (texture_floaterp)
-		{
 			texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1));
-		}
-		if (texture_floaterp)
-		{
-			texture_floaterp->setBakeTextureEnabled(TRUE);
+
+			texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled);
+            texture_floaterp->setInventoryPickType(mInventoryPickType);
 		}
 
 		LLFloater* root_floater = gFloaterView->getParentFloater(this);
@@ -1749,8 +1818,9 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
 	}
 }
 
-void LLTextureCtrl::setBakeTextureEnabled(BOOL enabled)
+void LLTextureCtrl::setBakeTextureEnabled(bool enabled)
 {
+    mBakeTextureEnabled = enabled;
 	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
 	if (floaterp)
 	{
@@ -1758,6 +1828,16 @@ void LLTextureCtrl::setBakeTextureEnabled(BOOL enabled)
 	}
 }
 
+void LLTextureCtrl::setInventoryPickType(EPickInventoryType type)
+{
+    mInventoryPickType = type;
+    LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+    if (floaterp)
+    {
+        floaterp->setInventoryPickType(type);
+    }
+}
+
 BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
 					  BOOL drop, EDragAndDropType cargo_type, void *cargo_data,
 					  EAcceptance *accept,
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 0325e09aa7..fb409af42b 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -78,6 +78,13 @@ public:
 		TEXTURE_CANCEL
 	} ETexturePickOp;
 
+    typedef enum e_pick_inventory_type
+    {
+        PICK_TEXTURE_MATERIAL = 0,
+        PICK_TEXTURE = 1,
+        PICK_MATERIAL = 2,
+    } EPickInventoryType;
+
 public:
 	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
 	{
@@ -212,7 +219,11 @@ public:
 
 	LLViewerFetchedTexture* getTexture() { return mTexturep; }
 
-	void setBakeTextureEnabled(BOOL enabled);
+    void setBakeTextureEnabled(bool enabled);
+    bool getBakeTextureEnabled() const { return mBakeTextureEnabled; }
+
+    void setInventoryPickType(EPickInventoryType type);
+    EPickInventoryType getInventoryPickType() { return mInventoryPickType; };
 
 private:
 	BOOL allowDrop(LLInventoryItem* item);
@@ -251,7 +262,8 @@ private:
 	std::string				 	mLoadingPlaceholderString;
 	S32						 	mLabelWidth;
 	bool						mOpenTexPreview;
-	BOOL						mBakeTextureEnabled;
+	bool						mBakeTextureEnabled;
+    LLTextureCtrl::EPickInventoryType mInventoryPickType;
 };
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -347,6 +359,8 @@ public:
 	void 			setLocalTextureEnabled(BOOL enabled);
 	void 			setBakeTextureEnabled(BOOL enabled);
 
+    void setInventoryPickType(LLTextureCtrl::EPickInventoryType type);
+
     static void		onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle);
 
 protected:
@@ -389,6 +403,7 @@ private:
 	bool mCanApply;
 	bool mCanPreview;
 	bool mPreviewSettingChanged;
+    LLTextureCtrl::EPickInventoryType mInventoryPickType;
 
 
 	texture_selected_callback mTextureSelectedCallback;
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 2a84fece03..b6a2aaf31b 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -137,51 +137,79 @@
      value="Preview Disabled"
      word_wrap="true"
      visible="false"
-     width="87" />  
-    <combo_box
-      follows="left|top|right"
-      height="23"
-      label="Choose Textures, Materials or LIFE!"
-      layout="topleft"
-      left="175"
-      name="textures_material_combo"
-      top="20"
-      width="231">
-      <combo_box.item
-       label="Materials &amp; Textures"
-       name="Materials_Textures"
-       value="0" />
-      <combo_box.item
-       label="Textures"
-       name="Textures"
-       value="1" />
-      <combo_box.item
-       label="Materials"
-       name="Materials"
-       value="2" />
-    </combo_box>
-    <filter_editor
-     follows="left|top|right"
-     height="23"
-     label="Filter Textures"
-     layout="topleft"
-     left="175"
-     name="inventory search editor"
-     top="48"
-     width="231" />
-  <asset_filtered_inv_panel
-   allow_multi_select="false"
-     bg_visible="true"
-     bg_alpha_color="DkGray2"
-     border="false"
-     follows="all"
-     height="200"
-     layout="topleft"
-     left_delta="0"
-     name="inventory panel"
-     top_pad="4"
-     width="231"
-     filter_asset_types="texture|material"/>
+     width="87" />
+
+  <layout_stack name="inventory_stack"
+                width="231"
+                height="276"
+                top="20"
+                left="175"
+                follows="all"
+                animate="false"
+                orientation="vertical">
+    <layout_panel name="combo_layout"
+                  border="false"
+                  bevel_style="in"
+                  auto_resize="false"
+                  user_resize="false"
+                  visible="false"
+                  width="231"
+                  height="24">
+        <combo_box
+          follows="left|top|right"
+          height="23"
+          label="Choose Textures, Materials or LIFE!"
+          layout="topleft"
+          left="0"
+          name="textures_material_combo"
+          top="0"
+          width="231">
+          <combo_box.item
+           label="Materials &amp; Textures"
+           name="Materials_Textures"
+           value="0" />
+          <combo_box.item
+           label="Textures"
+           name="Textures"
+           value="1" />
+          <combo_box.item
+           label="Materials"
+           name="Materials"
+           value="2" />
+        </combo_box>
+    </layout_panel>
+    <layout_panel name="inventory_layout"
+                  border="false"
+                  bevel_style="in"
+                  auto_resize="true"
+                  user_resize="false"
+                  visible="true"
+                  width="231"
+                  height="252">
+      <filter_editor
+       follows="left|top|right"
+       height="23"
+       label="Filter Textures"
+       layout="topleft"
+       left="0"
+       name="inventory search editor"
+       top="4"
+       width="231" />
+      <asset_filtered_inv_panel
+       allow_multi_select="false"
+       bg_visible="true"
+       bg_alpha_color="DkGray2"
+       border="false"
+       follows="all"
+       height="221"
+       layout="topleft"
+       left_delta="0"
+       name="inventory panel"
+       top_pad="4"
+       width="231"
+       filter_asset_types="texture|material"/>
+    </layout_panel>
+  </layout_stack>
 
 <!--  middle: local mode -->
     <button
-- 
cgit v1.2.3


From d2d257cfa99b685160e16ed93c163018e9fe3c50 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Thu, 1 Sep 2022 16:05:01 +0300
Subject: SL-17653 Fix combo not being visible when needed

---
 indra/newview/lltexturectrl.cpp | 14 ++++++++------
 indra/newview/lltexturectrl.h   |  2 ++
 2 files changed, 10 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 87c05c162a..2dad9cd2dc 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -416,6 +416,9 @@ BOOL LLFloaterTexturePicker::postBuild()
 
 	mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
 
+    // if can select both materials and textures, set textures_material_combo's layout as visible
+    childSetVisible("combo_layout", mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL);
+
     mTextureMaterialsCombo = getChild<LLComboBox>("textures_material_combo");
     mTextureMaterialsCombo->setCommitCallback(onSelectTextureMaterials, this);
 
@@ -1207,16 +1210,11 @@ void LLFloaterTexturePicker::onSelectTextureMaterials(LLUICtrl* ctrl, void *user
     LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata;
     int index = self->mTextureMaterialsCombo->getValue().asInteger();
 
-    // IMPORTANT: make sure these match the entries in floater_texture_ctrl.xml 
-    // for the textures_material_combo combo box
-    const int textures_and_materials = 0;
-    const int textures_only = 1;
-    const int materials_only = 2;
-
     U32 filter_types = 0x0;
 
     if (self->mInventoryPickType != LLTextureCtrl::PICK_TEXTURE_MATERIAL)
     {
+        // mInventoryPickType overrides combo
         index = self->mInventoryPickType;
     }
 
@@ -1270,6 +1268,9 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT
 {
     mInventoryPickType = type;
 
+    // if can select both materials and textures, set textures_material_combo's layout as visible
+    childSetVisible("combo_layout", mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL);
+
     mLocalScrollCtrl->clearRows();
     if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
     {
@@ -1285,6 +1286,7 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT
         LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
     }
 
+    // refresh filters
     onSelectTextureMaterials(0, this);
 }
 
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index fb409af42b..9cb86a2e74 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -78,6 +78,8 @@ public:
 		TEXTURE_CANCEL
 	} ETexturePickOp;
 
+    // Should match the entries in floater_texture_ctrl.xml 
+    // for the textures_material_combo combo box
     typedef enum e_pick_inventory_type
     {
         PICK_TEXTURE_MATERIAL = 0,
-- 
cgit v1.2.3


From ef98be881c3f13e7668f75cb0d302261053d9804 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Thu, 1 Sep 2022 17:30:48 -0400
Subject: Use an SRGB buffer for initial reflection map capture for proper
 linear sampling Fix irradiance gen up vector to be properly normalized

---
 .../newview/app_settings/shaders/class1/interface/irradianceGenF.glsl | 2 +-
 indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl  | 4 +++-
 indra/newview/llreflectionmapmanager.cpp                              | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
index 4d91395a1b..4681fa1abd 100644
--- a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
@@ -79,7 +79,7 @@ void main()
 	vec3 N = normalize(vary_dir);
 	vec3 up = vec3(0.0, 1.0, 0.0);
 	vec3 right = normalize(cross(up, N));
-	up = cross(N, right);
+	up = normalize(cross(N, right));
 
 	const float TWO_PI = PI * 2.0;
 	const float HALF_PI = PI * 0.5;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 85bb9fbbd1..e6017534ca 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -335,7 +335,6 @@ void main()
 #if PBR_USE_IRRADIANCE_HACK
         irradiance       = max(amblit,irradiance) * ambocc;
 #endif
-        specLight        = srgb_to_linear(specLight);
 #if DEBUG_PBR_SPECLIGHT051
         specLight        = vec3(0,0.5,1.0);
         irradiance       = specLight;
@@ -670,6 +669,9 @@ else
     diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14035
 
     sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
+    ambenv.rgb = linear_to_srgb(ambenv.rgb); 
+    glossenv.rgb = linear_to_srgb(glossenv.rgb);
+    legacyenv.rgb = linear_to_srgb(legacyenv.rgb);
 
     amblit = max(ambenv, amblit);
     color.rgb = amblit*ambocc;
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index d349b7e024..677e920031 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -80,7 +80,7 @@ void LLReflectionMapManager::update()
 
     if (!mRenderTarget.isComplete())
     {
-        U32 color_fmt = GL_RGBA;
+        U32 color_fmt = GL_SRGB8_ALPHA8;
         const bool use_depth_buffer = true;
         const bool use_stencil_buffer = true;
         U32 targetRes = LL_REFLECTION_PROBE_RESOLUTION * 2; // super sample
-- 
cgit v1.2.3


From e0c226b04d6f2ac566a9ea5841509f7cdfa98c11 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Thu, 1 Sep 2022 18:06:15 -0500
Subject: SL-18078, SL-18065 -- Experimentally allow uploading of lossless
 normal maps, fix for crash on shutdown.

---
 indra/newview/llappviewer.cpp         |  1 +
 indra/newview/llmaterialeditor.cpp    | 15 +++++++++++++++
 indra/newview/llviewertexturelist.cpp | 11 +++++++----
 indra/newview/llviewertexturelist.h   |  2 +-
 4 files changed, 24 insertions(+), 5 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 6ca35684d9..54f189625e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2071,6 +2071,7 @@ bool LLAppViewer::cleanup()
     if (sTextureFetch)
     {
         sTextureFetch->shutdown();
+        sTextureFetch->waitOnPending();
         delete sTextureFetch;
         sTextureFetch = NULL;
     }
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index f05f0344bd..5acf0600b6 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -1059,24 +1059,39 @@ static void pack_textures(
     LLPointer<LLImageJ2C>& mr_j2c,
     LLPointer<LLImageJ2C>& emissive_j2c)
 {
+    // NOTE : remove log spam and lossless vs lossy comparisons when the logs are no longer useful
+
     if (albedo_img)
     {
         albedo_j2c = LLViewerTextureList::convertToUploadFile(albedo_img);
+        LL_INFOS() << "Albedo: " << albedo_j2c->getDataSize() << LL_ENDL;
     }
 
     if (normal_img)
     {
         normal_j2c = LLViewerTextureList::convertToUploadFile(normal_img);
+
+        LLPointer<LLImageJ2C> test;
+        test = LLViewerTextureList::convertToUploadFile(normal_img, 1024, true);
+
+        S32 lossy_bytes = normal_j2c->getDataSize();
+        S32 lossless_bytes = test->getDataSize();
+
+        LL_INFOS() << llformat("Lossless vs Lossy: (%d/%d) = %.2f", lossless_bytes, lossy_bytes, (F32)lossless_bytes / lossy_bytes) << LL_ENDL;
+
+        normal_j2c = test;
     }
 
     if (mr_img)
     {
         mr_j2c = LLViewerTextureList::convertToUploadFile(mr_img);
+        LL_INFOS() << "Metallic/Roughness: " << mr_j2c->getDataSize() << LL_ENDL;
     }
 
     if (emissive_img)
     {
         emissive_j2c = LLViewerTextureList::convertToUploadFile(emissive_img);
+        LL_INFOS() << "Emissive: " << emissive_j2c->getDataSize() << LL_ENDL;
     }
 }
 
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 9cbbf1c276..511df4bd79 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1224,15 +1224,18 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
 }
 
 // note: modifies the argument raw_image!!!!
-LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions)
+LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions, bool force_lossless)
 {
 	LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
 	raw_image->biasedScaleToPowerOfTwo(max_image_dimentions);
 	LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C();
 	
-	if (gSavedSettings.getBOOL("LosslessJ2CUpload") &&
-		(raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF))
-		compressedImage->setReversible(TRUE);
+    if (force_lossless ||
+        (gSavedSettings.getBOOL("LosslessJ2CUpload") &&
+            (raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)))
+    {
+        compressedImage->setReversible(TRUE);
+    }
 	
 
 	if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression"))
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 7de3d68e42..4116be6528 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -96,7 +96,7 @@ public:
                                  const std::string& out_filename,
                                  const U8 codec,
                                  const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
-	static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+	static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT, bool force_lossless = false);
 	static void processImageNotInDatabase( LLMessageSystem *msg, void **user_data );
 	static void receiveImageHeader(LLMessageSystem *msg, void **user_data);
 	static void receiveImagePacket(LLMessageSystem *msg, void **user_data);
-- 
cgit v1.2.3