From 6259b6d99f306b3f267198a53b17a4386b72ca15 Mon Sep 17 00:00:00 2001 From: biwa <6475593+biwa@users.noreply.github.com> Date: Sat, 5 Feb 2022 00:44:04 +0100 Subject: [PATCH] Linedefs Mode: improved performance when showing the vertex insertion preview --- .../ClassicModes/DrawGeometryMode.cs | 26 ++++++++++++-- .../BuilderModes/ClassicModes/LinedefsMode.cs | 34 +++++++++++++++---- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 950c71716..a3ab3a128 100755 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -331,9 +331,15 @@ namespace CodeImp.DoomBuilder.BuilderModes Vector2D scaledPerpendicular = delta.GetPerpendicular().GetNormal().GetScaled(18f / renderer.Scale); renderer.RenderLine(middlePoint, new Vector2D(middlePoint.x - scaledPerpendicular.x, middlePoint.y - scaledPerpendicular.y), LINE_THICKNESS, color, true); } - + // This returns the aligned and snapped draw position public static DrawnVertex GetCurrentPosition(Vector2D mousemappos, bool snaptonearest, bool snaptogrid, bool snaptocardinal, bool usefourcardinaldirections, IRenderer2D renderer, List<DrawnVertex> points) + { + return GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, snaptocardinal, usefourcardinaldirections, renderer, points, null); + } + + // This returns the aligned and snapped draw position + public static DrawnVertex GetCurrentPosition(Vector2D mousemappos, bool snaptonearest, bool snaptogrid, bool snaptocardinal, bool usefourcardinaldirections, IRenderer2D renderer, List<DrawnVertex> points, BlockMap<BlockEntry> blockmap) { DrawnVertex p = new DrawnVertex(); p.stitch = true; //mxd. Setting these to false seems to be a good way to create invalid geometry... @@ -380,8 +386,22 @@ namespace CodeImp.DoomBuilder.BuilderModes } } + List<Vertex> vertices = new List<Vertex>(); + Vertex nv = null; + + // If we got a blockmap get the veritces that are in range only + if (blockmap != null) + { + HashSet<BlockEntry> blocks = blockmap.GetSquareRange(vm.x - vrange, vm.y - vrange, vrange * 2, vrange * 2); + foreach (BlockEntry be in blocks) + vertices.AddRange(be.Vertices); + + nv = MapSet.NearestVertexSquareRange(vertices, vm, vrange); + } + else + nv = General.Map.Map.NearestVertexSquareRange(vm, vrange); + // Try the nearest vertex - Vertex nv = General.Map.Map.NearestVertexSquareRange(vm, vrange); if(nv != null) { //mxd. Line angle must stay the same @@ -402,7 +422,7 @@ namespace CodeImp.DoomBuilder.BuilderModes } // Try the nearest linedef. mxd. We'll need much bigger stitch distance when snapping to cardinal directions - Linedef nl = General.Map.Map.NearestLinedefRange(vm, BuilderPlug.Me.StitchRange / renderer.Scale); + Linedef nl = blockmap != null ? MapSet.NearestLinedefRange(blockmap, vm, BuilderPlug.Me.StitchRange / renderer.Scale) : General.Map.Map.NearestLinedefRange(vm, BuilderPlug.Me.StitchRange / renderer.Scale); if(nl != null) { //mxd. Line angle must stay the same diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs index cbd3261fc..a6ac58fff 100755 --- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs @@ -23,13 +23,11 @@ using System.Linq; using System.Windows.Forms; using CodeImp.DoomBuilder.Actions; using CodeImp.DoomBuilder.BuilderModes.Interface; -using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.Data; using CodeImp.DoomBuilder.Editing; using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Rendering; -using CodeImp.DoomBuilder.Types; using CodeImp.DoomBuilder.Windows; #endregion @@ -921,6 +919,7 @@ namespace CodeImp.DoomBuilder.BuilderModes public override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); + if(panning) return; //mxd. Skip all this jazz while panning //mxd @@ -978,18 +977,39 @@ namespace CodeImp.DoomBuilder.BuilderModes { bool snaptogrid = General.Interface.ShiftState ^ General.Interface.SnapToGrid; bool snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge; - Vector2D v = DrawGeometryMode.GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, false, false, renderer, new List<DrawnVertex>()).pos; - if(v != insertpreview) + Vector2D v = DrawGeometryMode.GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, false, false, renderer, new List<DrawnVertex>(), blockmap).pos; + + if (v != insertpreview) { insertpreview = v; - General.Interface.RedrawDisplay(); + + // Render preview. Do not redraw the whole display for performance reasons + if(renderer.StartOverlay(true)) + { + double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange); + byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128); + float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; + renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true); + renderer.Finish(); + renderer.Present(); + } } } else if(insertpreview.IsFinite()) { insertpreview.x = float.NaN; - General.Interface.RedrawDisplay(); + + // Render preview. Do not redraw the whole display for performance reasons + if (renderer.StartOverlay(true)) + { + double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange); + byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128); + float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; + renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true); + renderer.Finish(); + renderer.Present(); + } } // Highlight if not the same @@ -1023,7 +1043,7 @@ namespace CodeImp.DoomBuilder.BuilderModes protected override void BeginViewPan() { // We don't want vertex preview while panning - insertpreview.x = float.NaN; + insertpreview.x = double.NaN; base.BeginViewPan(); } -- GitLab