From 69db7cd947a6b272004f7a02a0f45527dba0fdbd Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Thu, 27 Apr 2017 17:26:32 +0300
Subject: MAINT-3223 Texture repeats synch feature

---
 indra/newview/app_settings/settings.xml            |  11 +
 indra/newview/llpanelface.cpp                      | 326 ++++++++++++++++++---
 indra/newview/llpanelface.h                        |  13 +-
 .../skins/default/xui/en/panel_tools_texture.xml   |  14 +-
 4 files changed, 317 insertions(+), 47 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f0a91fd407..89f5d7a24f 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11878,6 +11878,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>SyncMaterialSettings</key>
+    <map>
+      <key>Comment</key>
+      <string>SyncMaterialSettings</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>SnapshotQuality</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index ad600358dd..a16259886d 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -131,13 +131,13 @@ BOOL	LLPanelFace::postBuild()
 	childSetCommitCallback("combobox shininess",&LLPanelFace::onCommitShiny,this);
 	childSetCommitCallback("combobox bumpiness",&LLPanelFace::onCommitBump,this);
 	childSetCommitCallback("combobox alphamode",&LLPanelFace::onCommitAlphaMode,this);
-	childSetCommitCallback("TexScaleU",&LLPanelFace::onCommitTextureInfo, this);
-	childSetCommitCallback("TexScaleV",&LLPanelFace::onCommitTextureInfo, this);
-	childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureInfo, this);
+	childSetCommitCallback("TexScaleU",&LLPanelFace::onCommitTextureScaleX, this);
+	childSetCommitCallback("TexScaleV",&LLPanelFace::onCommitTextureScaleY, this);
+	childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureRot, this);
 	childSetCommitCallback("rptctrl",&LLPanelFace::onCommitRepeatsPerMeter, this);
 	childSetCommitCallback("checkbox planar align",&LLPanelFace::onCommitPlanarAlign, this);
-	childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this);
-	childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this);
+	childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureOffsetX, this);
+	childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureOffsetY, this);
 
 	childSetCommitCallback("bumpyScaleU",&LLPanelFace::onCommitMaterialBumpyScaleX, this);
 	childSetCommitCallback("bumpyScaleV",&LLPanelFace::onCommitMaterialBumpyScaleY, this);
@@ -691,6 +691,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		}
 
 		getChildView("radio_material_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
@@ -1862,12 +1864,39 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)
 	sendBump(nmap_id.isNull() ? 0 : BUMPY_TEXTURE);
 }
 
+//static
+void LLPanelFace::syncOffsetX(LLPanelFace* self, F32 offsetU)
+{
+	LLSelectedTEMaterial::setNormalOffsetX(self,offsetU);
+	LLSelectedTEMaterial::setSpecularOffsetX(self,offsetU);
+	self->getChild<LLSpinCtrl>("TexOffsetU")->forceSetValue(offsetU);
+	self->sendTextureInfo();
+}
+
+//static
+void LLPanelFace::syncOffsetY(LLPanelFace* self, F32 offsetV)
+{
+	LLSelectedTEMaterial::setNormalOffsetY(self,offsetV);
+	LLSelectedTEMaterial::setSpecularOffsetY(self,offsetV);
+	self->getChild<LLSpinCtrl>("TexOffsetV")->forceSetValue(offsetV);
+	self->sendTextureInfo();
+}
+
 //static
 void LLPanelFace::onCommitMaterialBumpyOffsetX(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setNormalOffsetX(self,self->getCurrentBumpyOffsetU());
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetX(self,self->getCurrentBumpyOffsetU());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setNormalOffsetX(self,self->getCurrentBumpyOffsetU());
+	}
+
 }
 
 //static
@@ -1875,7 +1904,15 @@ void LLPanelFace::onCommitMaterialBumpyOffsetY(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setNormalOffsetY(self,self->getCurrentBumpyOffsetV());
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetY(self,self->getCurrentBumpyOffsetV());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setNormalOffsetY(self,self->getCurrentBumpyOffsetV());
+	}
 }
 
 //static
@@ -1883,7 +1920,15 @@ void LLPanelFace::onCommitMaterialShinyOffsetX(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setSpecularOffsetX(self,self->getCurrentShinyOffsetU());
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetX(self, self->getCurrentShinyOffsetU());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setSpecularOffsetX(self,self->getCurrentShinyOffsetU());
+	}
 }
 
 //static
@@ -1891,7 +1936,31 @@ void LLPanelFace::onCommitMaterialShinyOffsetY(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setSpecularOffsetY(self,self->getCurrentShinyOffsetV());
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetY(self,self->getCurrentShinyOffsetV());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setSpecularOffsetY(self,self->getCurrentShinyOffsetV());
+	}
+}
+
+//static
+void LLPanelFace::syncRepeatX(LLPanelFace* self, F32 scaleU)
+{
+	LLSelectedTEMaterial::setNormalRepeatX(self,scaleU);
+	LLSelectedTEMaterial::setSpecularRepeatX(self,scaleU);
+	self->sendTextureInfo();
+}
+
+//static
+void LLPanelFace::syncRepeatY(LLPanelFace* self, F32 scaleV)
+{
+	LLSelectedTEMaterial::setNormalRepeatY(self,scaleV);
+	LLSelectedTEMaterial::setSpecularRepeatY(self,scaleV);
+	self->sendTextureInfo();
 }
 
 //static
@@ -1904,7 +1973,16 @@ void LLPanelFace::onCommitMaterialBumpyScaleX(LLUICtrl* ctrl, void* userdata)
 	{
 		bumpy_scale_u *= 0.5f;
 	}
-	LLSelectedTEMaterial::setNormalRepeatX(self,bumpy_scale_u);
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexScaleU")->forceSetValue(self->getCurrentBumpyScaleU());
+		syncRepeatX(self, bumpy_scale_u);
+	}
+	else
+	{
+		LLSelectedTEMaterial::setNormalRepeatX(self,bumpy_scale_u);
+	}
 }
 
 //static
@@ -1917,7 +1995,17 @@ void LLPanelFace::onCommitMaterialBumpyScaleY(LLUICtrl* ctrl, void* userdata)
 	{
 		bumpy_scale_v *= 0.5f;
 	}
-	LLSelectedTEMaterial::setNormalRepeatY(self,bumpy_scale_v);
+
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexScaleV")->forceSetValue(self->getCurrentBumpyScaleV());
+		syncRepeatY(self, bumpy_scale_v);
+	}
+	else
+	{
+		LLSelectedTEMaterial::setNormalRepeatY(self,bumpy_scale_v);
+	}
 }
 
 //static
@@ -1930,7 +2018,16 @@ void LLPanelFace::onCommitMaterialShinyScaleX(LLUICtrl* ctrl, void* userdata)
 	{
 		shiny_scale_u *= 0.5f;
 	}
-	LLSelectedTEMaterial::setSpecularRepeatX(self,shiny_scale_u);
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexScaleU")->forceSetValue(self->getCurrentShinyScaleU());
+		syncRepeatX(self, shiny_scale_u);
+	}
+	else
+	{
+		LLSelectedTEMaterial::setSpecularRepeatX(self,shiny_scale_u);
+	}
 }
 
 //static
@@ -1943,7 +2040,24 @@ void LLPanelFace::onCommitMaterialShinyScaleY(LLUICtrl* ctrl, void* userdata)
 	{
 		shiny_scale_v *= 0.5f;
 	}
-	LLSelectedTEMaterial::setSpecularRepeatY(self,shiny_scale_v);
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexScaleV")->forceSetValue(self->getCurrentShinyScaleV());
+		syncRepeatY(self, shiny_scale_v);
+	}
+	else
+	{
+		LLSelectedTEMaterial::setSpecularRepeatY(self,shiny_scale_v);
+	}
+}
+
+//static
+void LLPanelFace::syncMaterialRot(LLPanelFace* self, F32 rot)
+{
+	LLSelectedTEMaterial::setNormalRotation(self,rot * DEG_TO_RAD);
+	LLSelectedTEMaterial::setSpecularRotation(self,rot * DEG_TO_RAD);
+	self->sendTextureInfo();
 }
 
 //static
@@ -1951,7 +2065,16 @@ void LLPanelFace::onCommitMaterialBumpyRot(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setNormalRotation(self,self->getCurrentBumpyRot() * DEG_TO_RAD);
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexRot")->forceSetValue(self->getCurrentBumpyRot());
+		syncMaterialRot(self, self->getCurrentBumpyRot());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setNormalRotation(self,self->getCurrentBumpyRot() * DEG_TO_RAD);
+	}
 }
 
 //static
@@ -1959,7 +2082,16 @@ void LLPanelFace::onCommitMaterialShinyRot(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	llassert_always(self);
-	LLSelectedTEMaterial::setSpecularRotation(self,self->getCurrentShinyRot() * DEG_TO_RAD);
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		self->getChild<LLSpinCtrl>("TexRot")->forceSetValue(self->getCurrentShinyRot());
+		syncMaterialRot(self, self->getCurrentShinyRot());
+	}
+	else
+	{
+		LLSelectedTEMaterial::setSpecularRotation(self,self->getCurrentShinyRot() * DEG_TO_RAD);
+	}
 }
 
 //static
@@ -1994,6 +2126,92 @@ void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )
 	self->updateUI(true);
 }
 
+// static
+void LLPanelFace::onCommitTextureScaleX( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		F32 bumpy_scale_u = self->getChild<LLUICtrl>("TexScaleU")->getValue().asReal();
+		if (self->isIdenticalPlanarTexgen())
+		{
+			bumpy_scale_u *= 0.5f;
+		}
+		syncRepeatX(self, bumpy_scale_u);
+	}
+	else
+	{
+		self->sendTextureInfo();
+	}
+	self->updateUI(true);
+}
+
+// static
+void LLPanelFace::onCommitTextureScaleY( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		F32 bumpy_scale_v = self->getChild<LLUICtrl>("TexScaleV")->getValue().asReal();
+		if (self->isIdenticalPlanarTexgen())
+		{
+			bumpy_scale_v *= 0.5f;
+		}
+		syncRepeatY(self, bumpy_scale_v);
+	}
+	else
+	{
+		self->sendTextureInfo();
+	}
+	self->updateUI(true);
+}
+
+// static
+void LLPanelFace::onCommitTextureRot( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncMaterialRot(self, self->getChild<LLUICtrl>("TexRot")->getValue().asReal());
+	}
+	else
+	{
+		self->sendTextureInfo();
+	}
+	self->updateUI(true);
+}
+
+// static
+void LLPanelFace::onCommitTextureOffsetX( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetX(self, self->getChild<LLUICtrl>("TexOffsetU")->getValue().asReal());
+	}
+	else
+	{
+		self->sendTextureInfo();
+	}
+	self->updateUI(true);
+}
+
+// static
+void LLPanelFace::onCommitTextureOffsetY( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
+	{
+		syncOffsetY(self, self->getChild<LLUICtrl>("TexOffsetV")->getValue().asReal());
+	}
+	else
+	{
+		self->sendTextureInfo();
+	}
+	self->updateUI(true);
+}
+
 // Commit the number of repeats per meter
 // static
 void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
@@ -2017,44 +2235,62 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
 
 	LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s);
 	LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t);
+
+	LLUICtrl* bumpy_scale_u = self->getChild<LLUICtrl>("bumpyScaleU");
+	LLUICtrl* bumpy_scale_v = self->getChild<LLUICtrl>("bumpyScaleV");
+	LLUICtrl* shiny_scale_u = self->getChild<LLUICtrl>("shinyScaleU");
+	LLUICtrl* shiny_scale_v = self->getChild<LLUICtrl>("shinyScaleV");
  
-	switch (material_type)
+	if (gSavedSettings.getBOOL("SyncMaterialSettings"))
 	{
-		case MATTYPE_DIFFUSE:
-		{
-	LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter );
-}
-		break;
+		LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter );
 
-		case MATTYPE_NORMAL:
-		{
-			LLUICtrl* bumpy_scale_u = self->getChild<LLUICtrl>("bumpyScaleU");
-			LLUICtrl* bumpy_scale_v = self->getChild<LLUICtrl>("bumpyScaleV");
-			
-			bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter);
-			bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter);
+		bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter);
+		bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter);
 
-			LLSelectedTEMaterial::setNormalRepeatX(self,obj_scale_s * repeats_per_meter);
-			LLSelectedTEMaterial::setNormalRepeatY(self,obj_scale_t * repeats_per_meter);
-		}
-		break;
+		LLSelectedTEMaterial::setNormalRepeatX(self,obj_scale_s * repeats_per_meter);
+		LLSelectedTEMaterial::setNormalRepeatY(self,obj_scale_t * repeats_per_meter);
 
-		case MATTYPE_SPECULAR:
+		shiny_scale_u->setValue(obj_scale_s * repeats_per_meter);
+		shiny_scale_v->setValue(obj_scale_t * repeats_per_meter);
+
+		LLSelectedTEMaterial::setSpecularRepeatX(self,obj_scale_s * repeats_per_meter);
+		LLSelectedTEMaterial::setSpecularRepeatY(self,obj_scale_t * repeats_per_meter);
+	}
+	else
+	{
+		switch (material_type)
 		{
-			LLUICtrl* shiny_scale_u = self->getChild<LLUICtrl>("shinyScaleU");
-			LLUICtrl* shiny_scale_v = self->getChild<LLUICtrl>("shinyScaleV");
-			
-			shiny_scale_u->setValue(obj_scale_s * repeats_per_meter);
-			shiny_scale_v->setValue(obj_scale_t * repeats_per_meter);
+			case MATTYPE_DIFFUSE:
+			{
+				LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter );
+			}
+			break;
 
-			LLSelectedTEMaterial::setSpecularRepeatX(self,obj_scale_s * repeats_per_meter);
-			LLSelectedTEMaterial::setSpecularRepeatY(self,obj_scale_t * repeats_per_meter);
-		}
-		break;
+			case MATTYPE_NORMAL:
+			{
+				bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter);
+				bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter);
 
-		default:
-			llassert(false);
-		break;
+				LLSelectedTEMaterial::setNormalRepeatX(self,obj_scale_s * repeats_per_meter);
+				LLSelectedTEMaterial::setNormalRepeatY(self,obj_scale_t * repeats_per_meter);
+			}
+			break;
+
+			case MATTYPE_SPECULAR:
+			{
+				shiny_scale_u->setValue(obj_scale_s * repeats_per_meter);
+				shiny_scale_v->setValue(obj_scale_t * repeats_per_meter);
+
+				LLSelectedTEMaterial::setSpecularRepeatX(self,obj_scale_s * repeats_per_meter);
+				LLSelectedTEMaterial::setSpecularRepeatY(self,obj_scale_t * repeats_per_meter);
+			}
+			break;
+
+			default:
+				llassert(false);
+				break;
+		}
 	}
 	// vertical scale and repeats per meter depends on each other, so force set on changes
 	self->updateUI(true);
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 078995e787..7c084cb0ab 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -162,7 +162,12 @@ protected:
 
 	// Callback funcs for individual controls
 	//
-	static void		onCommitTextureInfo( 	LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureInfo(LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureScaleX(LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureScaleY(LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureRot(LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureOffsetX(LLUICtrl* ctrl, void* userdata);
+	static void		onCommitTextureOffsetY(LLUICtrl* ctrl, void* userdata);
 
 	static void		onCommitMaterialBumpyScaleX(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialBumpyScaleY(	LLUICtrl* ctrl, void* userdata);
@@ -170,6 +175,12 @@ protected:
 	static void		onCommitMaterialBumpyOffsetX(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialBumpyOffsetY(	LLUICtrl* ctrl, void* userdata);
 
+	static void		syncRepeatX(LLPanelFace* self, F32 scaleU);
+	static void		syncRepeatY(LLPanelFace* self, F32 scaleV);
+	static void		syncOffsetX(LLPanelFace* self, F32 offsetU);
+	static void		syncOffsetY(LLPanelFace* self, F32 offsetV);
+	static void 	syncMaterialRot(LLPanelFace* self, F32 rot);
+
 	static void		onCommitMaterialShinyScaleX(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialShinyScaleY(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialShinyRot(		LLUICtrl* ctrl, void* userdata);
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 b7b67147eb..ffdbc5d227 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -148,6 +148,18 @@
                 top_pad="1"
                 value="2"/>
             </radio_group> 
+            <check_box
+             control_name="SyncMaterialSettings"
+             follows="top|left"
+             height="20"
+             initial_value="false"
+             label="Lock repeat"
+             layout="topleft"
+             left="8"
+             name="checkbox_sync_settings"
+             tool_tip="Adjust all maps repeats simultaneously"
+             top_pad="-16"
+             width="160" />
             <texture_picker
              can_apply_immediately="true"
              default_image_name="Default"
@@ -159,7 +171,7 @@
              left="10"
              name="texture control"
              tool_tip="Click to choose a picture"
-             top_pad="7"
+             top_pad="5"
              width="64" />
             <text
              type="string"
-- 
cgit v1.2.3