mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2025-02-17 01:22:18 +00:00
Linedefs Mode: improved performance when showing the vertex insertion preview
This commit is contained in:
parent
484b0817bd
commit
6259b6d99f
2 changed files with 50 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue