From cfc92d9075bf12ec520d1f2a513e3f295b3fc07b Mon Sep 17 00:00:00 2001 From: MaxED Date: Fri, 16 Dec 2016 21:23:37 +0000 Subject: [PATCH] Added, Draw Lines mode: added "Remove First Vertex" action (Ctrl-Backspace). It removes the first drawn vertex from the drawing session. Renamed "Remove Previous Vertex" action to "Remove Last Vertex". Changed, Classic modes: added a limit on how far the view can be scrolled from the editable map area. Fixed, Drag geometry modes: in some cases incorrect vertices were removed when using "Replace with dragged geometry" drag mode. Fixed, Game configurations: sector special 195 ("Hidden Sector") was missing from Hexen/UDMF specials list. --- .../Configurations/Includes/ZDoom_sectors.cfg | 1 + Source/Core/Editing/ClassicMode.cs | 19 ++++++++++++++++--- Source/Core/Map/MapSet.cs | 17 +++-------------- .../ClassicModes/DrawGeometryMode.cs | 19 +++++++++++++------ .../ClassicModes/DrawRectangleMode.cs | 5 +++++ .../BuilderModes/Resources/Actions.cfg | 15 +++++++++++++-- 6 files changed, 51 insertions(+), 25 deletions(-) diff --git a/Build/Configurations/Includes/ZDoom_sectors.cfg b/Build/Configurations/Includes/ZDoom_sectors.cfg index 019e8ba2..08bc6205 100644 --- a/Build/Configurations/Includes/ZDoom_sectors.cfg +++ b/Build/Configurations/Includes/ZDoom_sectors.cfg @@ -57,6 +57,7 @@ zdoom 115 = "Instant death"; 116 = "Delayed damage strong (hazardcount +4/16 per second)"; 118 = "Carry player by tag"; + 195 = "Hidden Sector (automap)"; 196 = "Healing Sector"; 197 = "Lightning Outdoor"; 198 = "Lightning Indoor 2"; diff --git a/Source/Core/Editing/ClassicMode.cs b/Source/Core/Editing/ClassicMode.cs index b0d55a0a..bab61bd2 100644 --- a/Source/Core/Editing/ClassicMode.cs +++ b/Source/Core/Editing/ClassicMode.cs @@ -208,8 +208,11 @@ namespace CodeImp.DoomBuilder.Editing // This scrolls anywhere private void ScrollBy(float deltax, float deltay) { + //mxd. Don't stroll too far from map boundaries + Vector2D offset = ClampViewOffset(renderer2d.OffsetX + deltax, renderer2d.OffsetY + deltay); + // Scroll now - renderer2d.PositionView(renderer2d.OffsetX + deltax, renderer2d.OffsetY + deltay); + renderer2d.PositionView(offset.x, offset.y); this.OnViewChanged(); // Redraw @@ -265,9 +268,10 @@ namespace CodeImp.DoomBuilder.Editing // Calculate view position difference Vector2D diff = ((clientsize / newscale) - (clientsize / renderer2d.Scale)) * zoompos; + Vector2D offset = ClampViewOffset(renderer2d.OffsetX - diff.x, renderer2d.OffsetY + diff.y); //mxd // Zoom now - renderer2d.PositionView(renderer2d.OffsetX - diff.x, renderer2d.OffsetY + diff.y); + renderer2d.PositionView(offset.x, offset.y); renderer2d.ScaleView(newscale); this.OnViewChanged(); @@ -281,6 +285,15 @@ namespace CodeImp.DoomBuilder.Editing if(mouseinside) OnMouseMove(new MouseEventArgs(mousebuttons, 0, (int)mousepos.x, (int)mousepos.y, 0)); } + //mxd. Makes sure given offset stays within map boundaries + private static Vector2D ClampViewOffset(float x, float y) + { + Vector2D diff = new Vector2D(x, y); + Vector2D safediff = new Vector2D(General.Clamp(diff.x, General.Map.Config.LeftBoundary, General.Map.Config.RightBoundary), + General.Clamp(diff.y, General.Map.Config.BottomBoundary, General.Map.Config.TopBoundary)); + return diff - (diff - safediff); + } + //mxd. This changes current grid size based on current zoom level internal void MatchGridSizeToDisplayScale() { @@ -659,7 +672,7 @@ namespace CodeImp.DoomBuilder.Editing if(General.Settings.GZSynchCameras && !General.Interface.CtrlState && General.Editing.PreviousMode != null && General.Editing.PreviousMode.IsSubclassOf(typeof(VisualMode))) { - Vector2D campos = new Vector2D(General.Map.VisualCamera.Position.x, General.Map.VisualCamera.Position.y); + Vector2D campos = ClampViewOffset(General.Map.VisualCamera.Position.x, General.Map.VisualCamera.Position.y); renderer2d.PositionView(campos.x, campos.y); } diff --git a/Source/Core/Map/MapSet.cs b/Source/Core/Map/MapSet.cs index b7e69bc9..b18d4b56 100644 --- a/Source/Core/Map/MapSet.cs +++ b/Source/Core/Map/MapSet.cs @@ -2121,22 +2121,11 @@ namespace CodeImp.DoomBuilder.Map //mxd. Remove remaining new verts from dragged shape if possible if(mergemode == MergeGeometryMode.REPLACE) { - // Get lines, which belong to dragged sectors - HashSet draggedsectors = GetSectorsFromLinedefs(movinglines); - HashSet sectorlines = new HashSet(); - foreach(Sector s in draggedsectors) - { - foreach(Sidedef side in s.Sidedefs) - sectorlines.Add(side.Line); - } - + // Collect verts created by splitting. Can't use GetMarkedVertices here, because we are in the middle of AddRemove HashSet tocheck = new HashSet(); - - foreach(Linedef l in sectorlines) + foreach(Vertex v in vertices) { - if(l.IsDisposed) continue; - if(!movingverts.Contains(l.Start)) tocheck.Add(l.Start); - if(!movingverts.Contains(l.End)) tocheck.Add(l.End); + if(v != null && v.Marked && !movingverts.Contains(v)) tocheck.Add(v); } // Remove verts, which are not part of initially dragged verts diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 14f0d03b..89caa38e 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -941,15 +941,22 @@ namespace CodeImp.DoomBuilder.BuilderModes } } - // Remove a point + // Remove last point [BeginAction("removepoint")] - public virtual void RemovePoint() + public virtual void RemovePoint() { RemovePointAt(points.Count - 1); } + + //mxd. Remove first point + [BeginAction("removefirstpoint")] + public virtual void RemoveFirstPoint() { RemovePointAt(0); } + + //mxd + private void RemovePointAt(int index) { - if(points.Count > 0) points.RemoveAt(points.Count - 1); - if(labels.Count > 0) + if(points.Count > 0 && points.Count > index) points.RemoveAt(index); + if(labels.Count > 0 && labels.Count > index) { - labels[labels.Count - 1].Dispose(); - labels.RemoveAt(labels.Count - 1); + labels[index].Dispose(); + labels.RemoveAt(index); } Update(); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs index 03682aae..856c508a 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs @@ -381,6 +381,11 @@ namespace CodeImp.DoomBuilder.BuilderModes Update(); } + public override void RemoveFirstPoint() + { + RemovePoint(); + } + #endregion #region ================== Events diff --git a/Source/Plugins/BuilderModes/Resources/Actions.cfg b/Source/Plugins/BuilderModes/Resources/Actions.cfg index 936ceb4d..ac7e5315 100644 --- a/Source/Plugins/BuilderModes/Resources/Actions.cfg +++ b/Source/Plugins/BuilderModes/Resources/Actions.cfg @@ -248,14 +248,25 @@ drawpoint removepoint { - title = "Remove Previous Vertex"; + title = "Remove Last Vertex"; category = "drawing"; - description = "Removes the previously drawn vertex from the drawing session."; + description = "Removes the last drawn vertex from the drawing session."; allowkeys = true; allowmouse = true; allowscroll = true; } +removefirstpoint +{ + title = "Remove First Vertex"; + category = "drawing"; + description = "Removes the first drawn vertex from the drawing session."; + allowkeys = true; + allowmouse = true; + allowscroll = true; + default = 131080; // Ctrl-Backspace +} + finishdraw { title = "Finish Drawing";