From 76f6483829340978299340c0615ba43a6fbc06ad Mon Sep 17 00:00:00 2001
From: spherallic <spherallic@gmail.com>
Date: Tue, 19 Sep 2023 17:53:27 +0200
Subject: [PATCH] Visual Mode: changing brightness now affects sector
 brightness, holding Alt will change local brightness

---
 .../BuilderModes/Resources/Actions.cfg        |  2 +
 .../VisualModes/BaseVisualGeometrySector.cs   |  2 +-
 .../VisualModes/BaseVisualGeometrySidedef.cs  |  4 +-
 .../VisualModes/BaseVisualMode.cs             |  6 +-
 .../VisualModes/BaseVisualSlope.cs            |  2 +-
 .../VisualModes/BaseVisualThing.cs            |  2 +-
 .../VisualModes/BaseVisualVertex.cs           |  2 +-
 .../VisualModes/IVisualEventReceiver.cs       |  2 +-
 .../VisualModes/NullVisualEventReceiver.cs    |  2 +-
 .../BuilderModes/VisualModes/VisualCeiling.cs | 12 ++--
 .../BuilderModes/VisualModes/VisualFloor.cs   | 61 +++++++++++++------
 11 files changed, 62 insertions(+), 35 deletions(-)

diff --git a/Source/Plugins/BuilderModes/Resources/Actions.cfg b/Source/Plugins/BuilderModes/Resources/Actions.cfg
index 86a01b7d4..d7ae909b5 100755
--- a/Source/Plugins/BuilderModes/Resources/Actions.cfg
+++ b/Source/Plugins/BuilderModes/Resources/Actions.cfg
@@ -723,6 +723,7 @@ raisebrightness8
 	allowmouse = true;
 	allowscroll = true;
 	repeat = true;
+	disregardalt = true;
 }
 
 lowerbrightness8
@@ -734,6 +735,7 @@ lowerbrightness8
 	allowmouse = true;
 	allowscroll = true;
 	repeat = true;
+	disregardalt = true;
 }
 
 movetextureleft
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
index 32e52bf16..5ec651566 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
@@ -830,7 +830,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		// Sector brightness change
-		public virtual void OnChangeTargetBrightness(bool up)
+		public virtual void OnChangeTargetBrightness(bool up, bool local)
 		{
 			mode.CreateUndo("Change sector brightness", UndoGroup.SectorBrightnessChange, Sector.Sector.FixedIndex);
 			
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
index 45f4f7ec6..24dffc1e4 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
@@ -1585,10 +1585,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 		
 		// Sector brightness change
-		public virtual void OnChangeTargetBrightness(bool up)
+		public virtual void OnChangeTargetBrightness(bool up, bool local)
 		{
 			//mxd. Change UDMF wall light?
-			if(General.Map.UDMF && (General.Map.Config.DistinctWallBrightness || General.Map.Config.DistinctSidedefPartBrightness))
+			if(General.Map.UDMF && (General.Map.Config.DistinctWallBrightness || General.Map.Config.DistinctSidedefPartBrightness) && local)
 			{
 				string fieldname = "light";
 				string fieldabsolutename = "lightabsolute";
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index c45d03091..aed974525 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -3508,18 +3508,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		[BeginAction("raisebrightness8")]
 		public void RaiseBrightness8()
 		{
+			bool local = General.Interface.AltState;
 			PreAction(UndoGroup.SectorBrightnessChange);
 			List<IVisualEventReceiver> objs = GetSelectedObjects(true, true, false, false, false);
-			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(true);
+			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(true, local);
 			PostAction();
 		}
 
 		[BeginAction("lowerbrightness8")]
 		public void LowerBrightness8()
 		{
+			bool local = General.Interface.AltState;
 			PreAction(UndoGroup.SectorBrightnessChange);
 			List<IVisualEventReceiver> objs = GetSelectedObjects(true, true, false, false, false);
-			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(false);
+			foreach(IVisualEventReceiver i in objs) i.OnChangeTargetBrightness(false, local);
 			PostAction();
 		}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
index 329adb62e..f76b70be9 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
@@ -110,7 +110,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 		// Unused
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnSelectTexture() { }
 		public void OnCopyTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
index 29ddb26fc..389a39d68 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
@@ -699,7 +699,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		// Unused
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnSelectTexture() { }
 		public void OnCopyTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
index 3de36f62f..e7483c76a 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
@@ -240,7 +240,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnSelectBegin() { }
 		public void OnEditBegin() { }
 		public void OnMouseMove(MouseEventArgs e) { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnChangeScale(int incrementX, int incrementY) { }
 		public void OnSelectTexture() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
index cde7f2ca6..8c5d73dd3 100755
--- a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
@@ -34,7 +34,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		void OnEditEnd();
 		void OnMouseMove(MouseEventArgs e);
 		void OnChangeTargetHeight(int amount);
-		void OnChangeTargetBrightness(bool up);
+		void OnChangeTargetBrightness(bool up, bool local);
 		void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection);
 		void OnChangeScale(int incrementX, int incrementY); //mxd
 		void OnResetTextureOffset();
diff --git a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
index e6abe0e41..dfe8b05b8 100755
--- a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
@@ -33,7 +33,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnEditEnd()	{ }
 		public void OnMouseMove(MouseEventArgs e) {	}
 		public void OnChangeTargetHeight(int amount) { }
-		public void OnChangeTargetBrightness(bool up) { }
+		public void OnChangeTargetBrightness(bool up, bool local) { }
 		public void OnChangeTextureOffset(int horizontal, int vertical, bool doSurfaceAngleCorrection) { }
 		public void OnChangeScale(int incrementX, int incrementY) { } //mxd
 		public void OnResetTextureOffset() { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
index a1d85c029..1ee4422a2 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
@@ -436,7 +436,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		//mxd. Sector brightness change
-		public override void OnChangeTargetBrightness(bool up) 
+		public override void OnChangeTargetBrightness(bool up, bool local) 
 		{
 			if(level != null && level.sector != Sector.Sector) 
 			{
@@ -451,17 +451,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				}
 
 				if(index > -1 && index < Sector.ExtraCeilings.Count)
-					((BaseVisualSector)mode.GetVisualSector(Sector.ExtraCeilings[index].level.sector)).Floor.OnChangeTargetBrightness(up);
+					((BaseVisualSector)mode.GetVisualSector(Sector.ExtraCeilings[index].level.sector)).Floor.OnChangeTargetBrightness(up, false);
 				else
-					base.OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
 			} 
 			else 
 			{
 				// Change the sector brightness if the map is not in UDMF format, or this ceiling is part of 3D-floor,
-				// or the game configuration doesn't support distinct surfave brightnesses
-				if(!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness) 
+				// or the game configuration doesn't support distinct surface brightnesses
+				if(!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness || !local) 
 				{
-					base.OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
 					return;
 				}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
index 8be4c2161..64a6732e1 100755
--- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
@@ -390,30 +390,53 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		//mxd. Sector brightness change
-		public override void OnChangeTargetBrightness(bool up) 
+		public override void OnChangeTargetBrightness(bool up, bool local) 
 		{
-			if(level != null) 
+			// This floor is part of 3D-floor
+			if (level != null && level.sector != Sector.Sector)
 			{
-				// This floor is part of 3D-floor
-				if(level.sector != Sector.Sector)
-				{
-					BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(level.sector);
-					vs.Floor.OnChangeTargetBrightness(up);
-					vs.UpdateSectorGeometry(true);
-				}
-				// This is actual floor of a sector with extrafloors
-				else if(Sector.ExtraFloors.Count > 0 && !Sector.ExtraFloors[0].ExtraFloor.Floor.restrictlighting && !Sector.ExtraFloors[0].ExtraFloor.Floor.disablelighting)
+				BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(level.sector);
+				vs.Floor.OnChangeTargetBrightness(up, local);
+				vs.UpdateSectorGeometry(true);
+			}
+			// This is actual floor of a sector with extrafloors
+			else if (level != null && Sector.ExtraFloors.Count > 0 && !Sector.ExtraFloors[0].ExtraFloor.Floor.restrictlighting && !Sector.ExtraFloors[0].ExtraFloor.Floor.disablelighting)
+			{
+				Sector.ExtraFloors[0].OnChangeTargetBrightness(up, local);
+			}
+			else
+			{
+				// Change the sector brightness if the map is not in UDMF format, or this floor is part of 3D-floor,
+				// or the game configuration doesn't support distinct surface brightnesses
+				if (!General.Map.UDMF || (level != null && Sector.Sector != level.sector) || !General.Map.Config.DistinctFloorAndCeilingBrightness || !local)
 				{
-					Sector.ExtraFloors[0].OnChangeTargetBrightness(up);
+					base.OnChangeTargetBrightness(up, false);
+					return;
 				}
+
+				int light = Sector.Sector.Fields.GetValue("lightfloor", 0);
+				bool absolute = Sector.Sector.Fields.GetValue("lightfloorabsolute", false);
+				int newLight;
+
+				if (up)
+					newLight = General.Map.Config.BrightnessLevels.GetNextHigher(light, absolute);
 				else
-				{
-					base.OnChangeTargetBrightness(up);
-				}
-			} 
-			else 
-			{
-				base.OnChangeTargetBrightness(up);
+					newLight = General.Map.Config.BrightnessLevels.GetNextLower(light, absolute);
+
+				if (newLight == light) return;
+
+				//create undo
+				mode.CreateUndo("Change floor brightness", UndoGroup.SurfaceBrightnessChange, Sector.Sector.FixedIndex);
+				Sector.Sector.Fields.BeforeFieldsChange();
+
+				//apply changes
+				UniFields.SetInteger(Sector.Sector.Fields, "lightfloor", newLight, (absolute ? int.MinValue : 0));
+				mode.SetActionResult("Changed floor brightness to " + newLight + ".");
+				Sector.Sector.UpdateNeeded = true;
+				Sector.Sector.UpdateCache();
+
+				//rebuild sector
+				Sector.UpdateSectorGeometry(false);
 			}
 		}
 
-- 
GitLab