From 982d50470c7e08f39e14b4ca63e74c14610f9ef3 Mon Sep 17 00:00:00 2001
From: spherallic <spherallic@gmail.com>
Date: Fri, 24 May 2024 15:05:59 +0200
Subject: [PATCH] Make texture scaling actions more sensible, add
 multiply/divide by 2 actions

---
 .../Windows/LinedefEditFormSRB2.Designer.cs   | 10 ++++----
 .../Windows/SectorEditFormSRB2.Designer.cs    |  4 ++--
 .../BuilderModes/Resources/Actions.cfg        | 24 +++++++++++++++++++
 .../VisualModes/BaseVisualGeometrySidedef.cs  | 23 ++++++++++--------
 .../VisualModes/BaseVisualMode.cs             |  3 +++
 .../BuilderModes/VisualModes/VisualCeiling.cs | 23 ++++++++++--------
 .../BuilderModes/VisualModes/VisualFloor.cs   | 23 ++++++++++--------
 .../VisualModes/VisualMiddle3D.cs             | 14 ++---------
 8 files changed, 75 insertions(+), 49 deletions(-)

diff --git a/Source/Core/Windows/LinedefEditFormSRB2.Designer.cs b/Source/Core/Windows/LinedefEditFormSRB2.Designer.cs
index ae5617b96..e91b7f1a8 100644
--- a/Source/Core/Windows/LinedefEditFormSRB2.Designer.cs
+++ b/Source/Core/Windows/LinedefEditFormSRB2.Designer.cs
@@ -604,7 +604,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.pfcFrontScaleTop.ButtonStep = 1;
 			this.pfcFrontScaleTop.ButtonStepBig = 1F;
 			this.pfcFrontScaleTop.ButtonStepFloat = 0.1F;
-			this.pfcFrontScaleTop.ButtonStepSmall = 0.01F;
+			this.pfcFrontScaleTop.ButtonStepSmall = 0.05F;
 			this.pfcFrontScaleTop.ButtonStepsUseModifierKeys = true;
 			this.pfcFrontScaleTop.DefaultValue = 1F;
 			this.pfcFrontScaleTop.Field1 = "scalex_top";
@@ -624,7 +624,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.pfcFrontScaleBottom.ButtonStep = 1;
 			this.pfcFrontScaleBottom.ButtonStepBig = 1F;
 			this.pfcFrontScaleBottom.ButtonStepFloat = 0.1F;
-			this.pfcFrontScaleBottom.ButtonStepSmall = 0.01F;
+			this.pfcFrontScaleBottom.ButtonStepSmall = 0.05F;
 			this.pfcFrontScaleBottom.ButtonStepsUseModifierKeys = true;
 			this.pfcFrontScaleBottom.DefaultValue = 1F;
 			this.pfcFrontScaleBottom.Field1 = "scalex_bottom";
@@ -644,7 +644,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.pfcFrontScaleMid.ButtonStep = 1;
 			this.pfcFrontScaleMid.ButtonStepBig = 1F;
 			this.pfcFrontScaleMid.ButtonStepFloat = 0.1F;
-			this.pfcFrontScaleMid.ButtonStepSmall = 0.01F;
+			this.pfcFrontScaleMid.ButtonStepSmall = 0.05F;
 			this.pfcFrontScaleMid.ButtonStepsUseModifierKeys = true;
 			this.pfcFrontScaleMid.DefaultValue = 1F;
 			this.pfcFrontScaleMid.Field1 = "scalex_mid";
@@ -1239,7 +1239,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.pfcBackScaleBottom.ButtonStep = 1;
 			this.pfcBackScaleBottom.ButtonStepBig = 1F;
 			this.pfcBackScaleBottom.ButtonStepFloat = 0.1F;
-			this.pfcBackScaleBottom.ButtonStepSmall = 0.01F;
+			this.pfcBackScaleBottom.ButtonStepSmall = 0.05F;
 			this.pfcBackScaleBottom.ButtonStepsUseModifierKeys = true;
 			this.pfcBackScaleBottom.DefaultValue = 1F;
 			this.pfcBackScaleBottom.Field1 = "scalex_bottom";
@@ -1259,7 +1259,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.pfcBackScaleMid.ButtonStep = 1;
 			this.pfcBackScaleMid.ButtonStepBig = 1F;
 			this.pfcBackScaleMid.ButtonStepFloat = 0.1F;
-			this.pfcBackScaleMid.ButtonStepSmall = 0.01F;
+			this.pfcBackScaleMid.ButtonStepSmall = 0.05F;
 			this.pfcBackScaleMid.ButtonStepsUseModifierKeys = true;
 			this.pfcBackScaleMid.DefaultValue = 1F;
 			this.pfcBackScaleMid.Field1 = "scalex_mid";
diff --git a/Source/Core/Windows/SectorEditFormSRB2.Designer.cs b/Source/Core/Windows/SectorEditFormSRB2.Designer.cs
index d828f0b84..35a5e592b 100644
--- a/Source/Core/Windows/SectorEditFormSRB2.Designer.cs
+++ b/Source/Core/Windows/SectorEditFormSRB2.Designer.cs
@@ -975,7 +975,7 @@
 			this.floorScale.ButtonStep = 1;
 			this.floorScale.ButtonStepBig = 1F;
 			this.floorScale.ButtonStepFloat = 0.1F;
-			this.floorScale.ButtonStepSmall = 0.01F;
+			this.floorScale.ButtonStepSmall = 0.05F;
 			this.floorScale.ButtonStepsUseModifierKeys = true;
 			this.floorScale.DefaultValue = 1F;
 			this.floorScale.Field1 = "xscalefloor";
@@ -1177,7 +1177,7 @@
 			this.ceilScale.ButtonStep = 1;
 			this.ceilScale.ButtonStepBig = 1F;
 			this.ceilScale.ButtonStepFloat = 0.1F;
-			this.ceilScale.ButtonStepSmall = 0.01F;
+			this.ceilScale.ButtonStepSmall = 0.05F;
 			this.ceilScale.ButtonStepsUseModifierKeys = true;
 			this.ceilScale.DefaultValue = 1F;
 			this.ceilScale.Field1 = "xscaleceiling";
diff --git a/Source/Plugins/BuilderModes/Resources/Actions.cfg b/Source/Plugins/BuilderModes/Resources/Actions.cfg
index d7ae909b5..7c266476e 100755
--- a/Source/Plugins/BuilderModes/Resources/Actions.cfg
+++ b/Source/Plugins/BuilderModes/Resources/Actions.cfg
@@ -960,6 +960,30 @@ scaledowny
 	default = 101;
 }
 
+//sphere
+scalemultiply
+{
+	title = "Multiply Scale by 2";
+	category = "visual";
+	description = "Multiplies scale of targeted or selected textures or things by 2 (UDMF only).";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = true;
+	repeat = true;
+}
+
+//sphere
+scaledivide
+{
+	title = "Divide Scale by 2";
+	category = "visual";
+	description = "Divides scale of targeted or selected textures or things by 2 (UDMF only).";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = true;
+	repeat = true;
+}
+
 textureselect
 {
 	title = "Select Texture";
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
index dc8127407..9ef885ddb 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
@@ -1741,21 +1741,21 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 			Sidedef.Fields.BeforeFieldsChange();
 
-			if(incrementX != 0)
+			if (Math.Abs(incrementX) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Width * scaleX) - incrementX;
-				double newscaleX = Math.Round(pix / Texture.Width, 3);
-				scaleX = (newscaleX == 0 ? scaleX * -1 : newscaleX);
-				UniFields.SetFloat(Sidedef.Fields, keyX, scaleX, 1.0);
+				incrementX *= scaleX < 1.0 || (scaleX < 1.1 && incrementX < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(Sidedef.Fields, keyX, ((scaleX * 100) + incrementX) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementX) == 2)
+				UniFields.SetFloat(Sidedef.Fields, keyX, incrementX < 0 ? scaleX / 2 : scaleX * 2, 1.0);
 
-			if(incrementY != 0) 
+			if (Math.Abs(incrementY) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Height * scaleY) - incrementY;
-				double newscaleY = Math.Round(pix / Texture.Height, 3);
-				scaleY = (newscaleY == 0 ? scaleY * -1 : newscaleY);
-				UniFields.SetFloat(Sidedef.Fields, keyY, scaleY, 1.0);
+				incrementY *= scaleY < 1.0 || (scaleY < 1.1 && incrementY < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(Sidedef.Fields, keyY, ((scaleY * 100) + incrementY) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementY) == 2)
+				UniFields.SetFloat(Sidedef.Fields, keyY, incrementY < 0 ? scaleY / 2 : scaleY * 2, 1.0);
 
 			// Update geometry
 			Setup();
@@ -1764,6 +1764,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			SectorData sd = mode.GetSectorDataEx(Sector.Sector);
 			if(sd != null) sd.Reset(true);
 
+			scaleX = Sidedef.Fields.GetValue(keyX, 1.0);
+			scaleY = Sidedef.Fields.GetValue(keyY, 1.0);
+
 			mode.SetActionResult("Wall scale changed to " + scaleX.ToString("F03", CultureInfo.InvariantCulture) + ", " + scaleY.ToString("F03", CultureInfo.InvariantCulture) + " (" + (int)Math.Round(Texture.Width / scaleX) + " x " + (int)Math.Round(Texture.Height / scaleY) + ").");
 		}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index f8baf3e60..01a2c19ac 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -3554,6 +3554,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		[BeginAction("scaledownx")] public void ScaleTextureDownX() { ScaleTexture(-1, 0); }
 		[BeginAction("scaleupy")]   public void ScaleTextureUpY() { ScaleTexture(0, 1); } 
 		[BeginAction("scaledowny")] public void ScaleTextureDownY() { ScaleTexture(0, -1); }
+		//sphere
+		[BeginAction("scalemultiply")] public void ScaleTextureMultiply() { ScaleTexture(2, 2); }
+		[BeginAction("scaledivide")] public void ScaleTextureDivide() { ScaleTexture(-2, -2); }
 
 		//mxd
 		private void ScaleTexture(int incrementx, int incrementy)
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
index 0b880c7bc..d4af9ed97 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
@@ -324,21 +324,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 			s.Fields.BeforeFieldsChange();
 
-			if(incrementX != 0) 
+			if (Math.Abs(incrementX) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Width * scaleX) - incrementX;
-				double newscaleX = Math.Round(pix / Texture.Width, 3);
-				scaleX = (newscaleX == 0 ? scaleX * -1 : newscaleX);
-				UniFields.SetFloat(s.Fields, "xscaleceiling", scaleX, 1.0);
+				incrementX *= scaleX < 1.0 || (scaleX < 1.1 && incrementX < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(s.Fields, "xscaleceiling", ((scaleX * 100) + incrementX) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementX) == 2)
+				UniFields.SetFloat(s.Fields, "xscaleceiling", incrementX < 0 ? scaleX / 2 : scaleX * 2, 1.0);
 
-			if(incrementY != 0) 
+			if (Math.Abs(incrementY) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Height * scaleY) - incrementY;
-				double newscaleY = Math.Round(pix / Texture.Height, 3);
-				scaleY = (newscaleY == 0 ? scaleY * -1 : newscaleY);
-				UniFields.SetFloat(s.Fields, "yscaleceiling", scaleY, 1.0);
+				incrementY *= scaleY < 1.0 || (scaleY < 1.1 && incrementY < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(s.Fields, "yscaleceiling", ((scaleY * 100) + incrementY) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementY) == 2)
+				UniFields.SetFloat(s.Fields, "yscaleceiling", incrementY < 0 ? scaleY / 2 : scaleY * 2, 1.0);
+
+			scaleX = s.Fields.GetValue("xscaleceiling", 1.0);
+			scaleY = s.Fields.GetValue("yscaleceiling", 1.0);
 
 			mode.SetActionResult("Ceiling scale changed to " + scaleX.ToString("F03", CultureInfo.InvariantCulture) + ", " + scaleY.ToString("F03", CultureInfo.InvariantCulture) + " (" + (int)Math.Round(Texture.Width / scaleX) + " x " + (int)Math.Round(Texture.Height / scaleY) + ").");
 		}
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
index 4141ea3e2..ddae08d31 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
@@ -278,21 +278,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 			s.Fields.BeforeFieldsChange();
 
-			if(incrementX != 0) 
+			if (Math.Abs(incrementX) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Width * scaleX) - incrementX;
-				double newscaleX = Math.Round(pix / Texture.Width, 3);
-				scaleX = (newscaleX == 0 ? scaleX * -1 : newscaleX);
-				UniFields.SetFloat(s.Fields, "xscalefloor", scaleX, 1.0);
+				incrementX *= scaleX < 1.0 || (scaleX < 1.1 && incrementX < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(s.Fields, "xscalefloor", ((scaleX * 100) + incrementX) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementX) == 2)
+				UniFields.SetFloat(s.Fields, "xscalefloor", incrementX < 0 ? scaleX / 2 : scaleX * 2, 1.0);
 
-			if(incrementY != 0)
+			if (Math.Abs(incrementY) == 1)
 			{
-				double pix = (int)Math.Round(Texture.Height * scaleY) - incrementY;
-				double newscaleY = Math.Round(pix / Texture.Height, 3);
-				scaleY = (newscaleY == 0 ? scaleY * -1 : newscaleY);
-				UniFields.SetFloat(s.Fields, "yscalefloor", scaleY, 1.0);
+				incrementY *= scaleY < 1.0 || (scaleY < 1.1 && incrementY < 0) ? 5 : 10; // Finer control at smaller (<1.0) scales
+				UniFields.SetFloat(s.Fields, "yscalefloor", ((scaleY * 100) + incrementY) / 100, 1.0);
 			}
+			else if (Math.Abs(incrementY) == 2)
+				UniFields.SetFloat(s.Fields, "yscalefloor", incrementY < 0 ? scaleY / 2 : scaleY * 2, 1.0);
+
+			scaleX = s.Fields.GetValue("xscalefloor", 1.0);
+			scaleY = s.Fields.GetValue("yscalefloor", 1.0);
 
 			mode.SetActionResult("Floor scale changed to " + scaleX.ToString("F03", CultureInfo.InvariantCulture) + ", " + scaleY.ToString("F03", CultureInfo.InvariantCulture) + " (" + (int)Math.Round(Texture.Width / scaleX) + " x " + (int)Math.Round(Texture.Height / scaleY) + ").");
 		}
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
index 2ff765416..07802e64c 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
@@ -516,20 +516,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			target.Fields.BeforeFieldsChange();
 
 			if(incrementX != 0)
-			{
-				double pix = (int)Math.Round(Texture.Width * scaleX) - incrementX;
-				double newscaleX = Math.Round(pix / Texture.Width, 3);
-				scaleX = (newscaleX == 0 ? scaleX * -1 : newscaleX);
-				UniFields.SetFloat(target.Fields, "scalex_mid", scaleX, 1.0);
-			}
+				UniFields.SetFloat(target.Fields, "scalex_mid", scaleX + (incrementX / 10), 1.0);
 
 			if(incrementY != 0)
-			{
-				double pix = (int)Math.Round(Texture.Height * scaleY) - incrementY;
-				double newscaleY = Math.Round(pix / Texture.Height, 3);
-				scaleY = (newscaleY == 0 ? scaleY * -1 : newscaleY);
-				UniFields.SetFloat(target.Fields, "scaley_mid", scaleY, 1.0);
-			}
+				UniFields.SetFloat(target.Fields, "scaley_mid", scaleY + (incrementY / 10), 1.0);
 			
 			// Update the model sector to update all 3d floors
 			mode.GetVisualSector(extrafloor.Linedef.Front.Sector).UpdateSectorGeometry(false);
-- 
GitLab