From 1367c37b8d86971460c572556d50f4178e52ba72 Mon Sep 17 00:00:00 2001
From: MaxED <j.maxed@gmail.com>
Date: Mon, 3 Feb 2014 11:19:12 +0000
Subject: [PATCH] Visual mode: when changing height of a triangular sector all
 vertices of which have height offset, vertex heights will be changed instead
 of sector's floor/ceiling height (this allows to edit terrain without the use
 of vertex handles). Visual mode: "Copy Texture", "Copy Texture Offsets" and
 "Copy Properties" actions now always copy properties from currently
 highlighted surface (previously they copied properties from the first
 selected surface when something was selected). Draw Rectangle mode: nothing
 was drawn in some cases. Drag Things mode: grid was not updated when grid
 size was changed in this mode.

---
 Source/Core/VisualModes/VisualVertex.cs       | 28 +++++++++----------
 .../ClassicModes/DragThingsMode.cs            | 11 ++++++++
 .../ClassicModes/DrawRectangleMode.cs         |  4 +--
 .../VisualModes/BaseVisualMode.cs             | 23 +++++++++------
 .../VisualModes/BaseVisualVertex.cs           |  2 +-
 .../BuilderModes/VisualModes/VisualCeiling.cs | 23 +++++++++++++++
 .../BuilderModes/VisualModes/VisualFloor.cs   | 23 +++++++++++++++
 7 files changed, 89 insertions(+), 25 deletions(-)

diff --git a/Source/Core/VisualModes/VisualVertex.cs b/Source/Core/VisualModes/VisualVertex.cs
index 364de8f56..995e33d5e 100644
--- a/Source/Core/VisualModes/VisualVertex.cs
+++ b/Source/Core/VisualModes/VisualVertex.cs
@@ -7,30 +7,30 @@ namespace CodeImp.DoomBuilder.VisualModes
 {
 	public class VisualVertexPair
 	{
-		private VisualVertex v1;
-		private VisualVertex v2;
+		private VisualVertex floorvert;
+		private VisualVertex ceilvert;
 
-		public VisualVertex[] Vertices { get { return new VisualVertex[] { v1, v2 }; } }
-		public VisualVertex Vertex1 { get { return v1; } }
-		public VisualVertex Vertex2 { get { return v2; } }
-		public bool Changed { set { v1.Changed = true; v2.Changed = true; } }
+		public VisualVertex[] Vertices { get { return new[] { floorvert, ceilvert }; } }
+		public VisualVertex FloorVertex { get { return floorvert; } }
+		public VisualVertex CeilingVertex { get { return ceilvert; } }
+		public bool Changed { set { floorvert.Changed = true; ceilvert.Changed = true; } }
 
-		public VisualVertexPair(VisualVertex v1, VisualVertex v2) {
-			if(v1.CeilingVertex == v2.CeilingVertex)
+		public VisualVertexPair(VisualVertex floorvert, VisualVertex ceilvert) {
+			if(floorvert.CeilingVertex == ceilvert.CeilingVertex)
 				throw new Exception("VisualVertexPair: both verts have the same alignment! We cannot tolerate this!");
 
-			this.v1 = v1;
-			this.v2 = v2;
+			this.floorvert = floorvert;
+			this.ceilvert = ceilvert;
 		}
 
 		public void Update() {
-			if(v1.Changed) v1.Update();
-			if(v2.Changed) v2.Update();
+			if(floorvert.Changed) floorvert.Update();
+			if(ceilvert.Changed) ceilvert.Update();
 		}
 
 		public void Deselect() {
-			v1.Selected = false;
-			v2.Selected = false;
+			floorvert.Selected = false;
+			ceilvert.Selected = false;
 		}
 	}
 
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
index 09a99c371..4b74674ac 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
@@ -272,6 +272,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		// This redraws only changed things
 		private void UpdateRedraw()
 		{
+			//mxd. Added, so grid can be rendered properly if the user changes grid size while dragging (very useful and important, I know)
+			if (renderer.StartPlotter(true)) 
+			{
+				// Render lines and vertices
+				renderer.PlotLinedefSet(General.Map.Map.Linedefs);
+				renderer.PlotVerticesSet(General.Map.Map.Vertices);
+				
+				// Done
+				renderer.Finish();
+			}
+
 			// Render things
 			if(renderer.StartThings(true))
 			{
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs
index f2f0026b4..07ee38e73 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs
@@ -168,10 +168,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			//no corners
 			if (bevelWidth == 0) {
 				currentBevelWidth = 0;
-				return new[] { pStart, new Vector2D((int)pEnd.x, (int)pStart.y), pEnd, new Vector2D((int)pStart.x, (int)pEnd.y), pStart };
+				return new[] { pStart, new Vector2D((int)pStart.x, (int)pEnd.y), pEnd, new Vector2D((int)pEnd.x, (int)pStart.y), pStart };
 			}
 
-			//got corners
+			//got corners. TODO: check point order
 			bool reverse = false;
 			currentBevelWidth = Math.Min(Math.Abs(bevelWidth), Math.Min(width, height) / 2);
 			
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index fffdabf3f..7d16eefa7 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -356,10 +356,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			//mxd
 			if(General.Map.UDMF && General.Settings.GZShowVisualVertices) {
 				foreach(KeyValuePair<Vertex, VisualVertexPair> pair in vertices) {
-					if(pair.Value.Vertex1.Selected)
-						selectedobjects.Add((BaseVisualVertex)pair.Value.Vertex1);
-					if(pair.Value.Vertex2.Selected)
-						selectedobjects.Add((BaseVisualVertex)pair.Value.Vertex2);
+					if(pair.Value.CeilingVertex.Selected)
+						selectedobjects.Add((BaseVisualVertex)pair.Value.CeilingVertex);
+					if(pair.Value.FloorVertex.Selected)
+						selectedobjects.Add((BaseVisualVertex)pair.Value.FloorVertex);
 				}
 			}
 		}
@@ -686,10 +686,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			return vertexdata[v];
 		}
 
+		internal BaseVisualVertex GetVisualVertex(Vertex v, bool floor) {
+			if(!vertices.ContainsKey(v))
+				vertices.Add(v, new VisualVertexPair(new BaseVisualVertex(this, v, false), new BaseVisualVertex(this, v, true)));
+
+			return (floor ? vertices[v].FloorVertex as BaseVisualVertex : vertices[v].CeilingVertex as BaseVisualVertex);
+		}
+
 		//mxd
 		internal void UpdateVertexHandle(Vertex v) {
 			if(!vertices.ContainsKey(v))
-				vertices.Add(v, new VisualVertexPair(new BaseVisualVertex(this, v, true), new BaseVisualVertex(this, v, false)));
+				vertices.Add(v, new VisualVertexPair(new BaseVisualVertex(this, v, false), new BaseVisualVertex(this, v, true)));
 			else
 				vertices[v].Changed = true;
 		}
@@ -2413,7 +2420,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void TextureCopy()
 		{
 			PreActionNoChange();
-			GetTargetEventReceiver(false).OnCopyTexture();
+			GetTargetEventReceiver(true).OnCopyTexture(); //mxd
 			PostAction();
 		}
 
@@ -2640,7 +2647,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void TextureCopyOffsets()
 		{
 			PreActionNoChange();
-			GetTargetEventReceiver(false).OnCopyTextureOffsets();
+			GetTargetEventReceiver(true).OnCopyTextureOffsets(); //mxd
 			PostAction();
 		}
 
@@ -2657,7 +2664,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void CopyProperties()
 		{
 			PreActionNoChange();
-			GetTargetEventReceiver(false).OnCopyProperties();
+			GetTargetEventReceiver(true).OnCopyProperties(); //mxd
 			PostAction();
 		}
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
index 92d609ec0..bc5ef06b6 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
@@ -291,7 +291,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					}
 				}
 
-				General.Interface.OnEditFormValuesChanged += new System.EventHandler(Interface_OnEditFormValuesChanged);
+				General.Interface.OnEditFormValuesChanged += Interface_OnEditFormValuesChanged;
 				mode.StartRealtimeInterfaceUpdate(SelectionType.Vertices);
 				General.Interface.ShowEditVertices(verts, false);
 				mode.StopRealtimeInterfaceUpdate(SelectionType.Vertices);
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
index 59fbc41f1..e1a3a0470 100644
--- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs
@@ -282,10 +282,33 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		protected override void ChangeHeight(int amount)
 		{
 			mode.CreateUndo("Change ceiling height", UndoGroup.CeilingHeightChange, level.sector.FixedIndex);
+			//mxd. Modify vertex offsets?
+			if(General.Map.UDMF && level.sector.Sidedefs.Count == 3 && changeVertexHeight(amount)) {
+				mode.SetActionResult("Changed ceiling vertex height by " + amount + ".");
+				return;
+			}
+
 			level.sector.CeilHeight += amount;
 			mode.SetActionResult("Changed ceiling height to " + level.sector.CeilHeight + ".");
 		}
 
+		//mxd
+		private bool changeVertexHeight(int amount) {
+			List<Vertex> verts = new List<Vertex>(3);
+
+			//do this only if all 3 verts have offsets
+			foreach(Sidedef side in level.sector.Sidedefs) {
+				if(float.IsNaN(side.Line.Start.ZCeiling) || float.IsNaN(side.Line.End.ZCeiling)) return false;
+				if(!verts.Contains(side.Line.Start)) verts.Add(side.Line.Start);
+				if(!verts.Contains(side.Line.End)) verts.Add(side.Line.End);
+			}
+
+			foreach(Vertex v in verts) 
+				mode.GetVisualVertex(v, false).OnChangeTargetHeight(amount);
+
+			return true;
+		}
+
 		//mxd. Sector brightness change
 		public override void OnChangeTargetBrightness(bool up) {
 			if (level != null && level.sector != Sector.Sector) {
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
index 7cd59ed96..091384690 100644
--- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs
@@ -285,10 +285,33 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		protected override void ChangeHeight(int amount)
 		{
 			mode.CreateUndo("Change floor height", UndoGroup.FloorHeightChange, level.sector.FixedIndex);
+			//mxd. Modify vertex offsets?
+			if(General.Map.UDMF && level.sector.Sidedefs.Count == 3 && changeVertexHeight(amount)) {
+				mode.SetActionResult("Changed floor vertex height by " + amount + ".");
+				return;
+			}
+
 			level.sector.FloorHeight += amount;
 			mode.SetActionResult("Changed floor height to " + level.sector.FloorHeight + ".");
 		}
 
+		//mxd
+		private bool changeVertexHeight(int amount) {
+			List<Vertex> verts = new List<Vertex>(3);
+
+			//do this only if all 3 verts have offsets
+			foreach(Sidedef side in level.sector.Sidedefs) {
+				if(float.IsNaN(side.Line.Start.ZFloor) || float.IsNaN(side.Line.End.ZFloor)) return false;
+				if(!verts.Contains(side.Line.Start)) verts.Add(side.Line.Start);
+				if(!verts.Contains(side.Line.End)) verts.Add(side.Line.End);
+			}
+
+			foreach (Vertex v in verts) 
+				mode.GetVisualVertex(v, true).OnChangeTargetHeight(amount);
+
+			return true;
+		}
+
 		//mxd. Sector brightness change
 		public override void OnChangeTargetBrightness(bool up) {
 			if (level != null) {
-- 
GitLab