diff --git a/Source/Core/Geometry/Line2D.cs b/Source/Core/Geometry/Line2D.cs index d5d0d194dd534d55867cd35dabef08985fa21d4f..865050fcb5cd63f617558f7a2d0ad02a77ce185c 100755 --- a/Source/Core/Geometry/Line2D.cs +++ b/Source/Core/Geometry/Line2D.cs @@ -231,11 +231,10 @@ namespace CodeImp.DoomBuilder.Geometry { int flags1 = MapSet.GetCSFieldBits(line.v1, rect); int flags2 = MapSet.GetCSFieldBits(line.v2, rect); - Line2D result = line; intersects = false; - // Each pass will modify one coordinate of one endpoint - for (int pass = 0; pass < 4; pass++) + Line2D result = line; + while (true) { if (flags1 == 0 && flags2 == 0) { @@ -247,6 +246,7 @@ namespace CodeImp.DoomBuilder.Geometry if ((flags1 & flags2) != 0) { // Both points are in the same outer area + intersects = false; return new Line2D(); } @@ -254,43 +254,41 @@ namespace CodeImp.DoomBuilder.Geometry int outFlags = flags1 != 0 ? flags1 : flags2; if ((outFlags & 0x1) > 0) // Top { - x = line.v1.x + (line.v2.x - line.v1.x) * (rect.Top - line.v1.y) / (line.v2.y - line.v1.y); + x = result.v1.x + (result.v2.x - result.v1.x) * (rect.Top - result.v1.y) / (result.v2.y - result.v1.y); y = rect.Top; } else if ((outFlags & 0x2) > 0) // Bottom { - x = line.v1.x + (line.v2.x - line.v1.x) * (rect.Bottom - line.v1.y) / (line.v2.y - line.v1.y); + x = result.v1.x + (result.v2.x - result.v1.x) * (rect.Bottom - result.v1.y) / (result.v2.y - result.v1.y); y = rect.Bottom; } else if ((outFlags & 0x4) > 0) // Left { - y = line.v1.y + (line.v2.y - line.v1.y) * (rect.Left - line.v1.x) / (line.v2.x - line.v1.x); + y = result.v1.y + (result.v2.y - result.v1.y) * (rect.Left - result.v1.x) / (result.v2.x - result.v1.x); x = rect.Left; } else if ((outFlags & 0x8) > 0) // Right { - y = line.v1.y + (line.v2.y - line.v1.y) * (rect.Right - line.v1.x) / (line.v2.x - line.v1.x); + y = result.v1.y + (result.v2.y - result.v1.y) * (rect.Right - result.v1.x) / (result.v2.x - result.v1.x); x = rect.Right; } else { - intersects = false; - return new Line2D(); + intersects = true; + return result; } if (outFlags == flags1) { - line.v1 = new Vector2D(x, y); - flags1 = MapSet.GetCSFieldBits(line.v1, rect); + result.v1 = new Vector2D(x, y); + flags1 = MapSet.GetCSFieldBits(result.v1, rect); } else { - line.v2 = new Vector2D(x, y); - flags2 = MapSet.GetCSFieldBits(line.v2, rect); + result.v2 = new Vector2D(x, y); + flags2 = MapSet.GetCSFieldBits(result.v2, rect); } } - - return line; } #endregion diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index 06742a1f617223c9653eb00117c870d91df62b20..8adedb60df4050aa27c84fe9cea14725dc993666 100755 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -839,7 +839,7 @@ namespace CodeImp.DoomBuilder.Rendering if(General.Settings.RenderGrid) //mxd { - bool transformed = General.Map.Grid.GridOriginX != 0 || General.Map.Grid.GridOriginY != 0 || Math.Abs(General.Map.Grid.GridRotate) > 1e-4; + bool transformed = Math.Abs(General.Map.Grid.GridOriginX) > 1e-4 || Math.Abs(General.Map.Grid.GridOriginY) > 1e-4 || Math.Abs(General.Map.Grid.GridRotate) > 1e-4)); if (transformed) { @@ -909,15 +909,10 @@ namespace CodeImp.DoomBuilder.Rendering do { size *= 2; } while(size * scale <= 6f); float sizeinv = 1f / size; - if (size < 1 || size > 1024) - { - return; - } - // Determine map coordinates for view window - Vector2D ltpos = DisplayToMap(new Vector2D(0, 0)); - Vector2D rbpos = DisplayToMap(new Vector2D(windowsize.Width, windowsize.Height)); - Vector2D mapsize = rbpos - ltpos; + Vector2D ltview = DisplayToMap(new Vector2D(0, 0)); + Vector2D rbview = DisplayToMap(new Vector2D(windowsize.Width, windowsize.Height)); + Vector2D mapsize = rbview - ltview; Vector2D ltbound = new Vector2D(General.Map.Config.LeftBoundary, General.Map.Config.TopBoundary); Vector2D rbbound = new Vector2D(General.Map.Config.RightBoundary, General.Map.Config.BottomBoundary); @@ -926,8 +921,7 @@ namespace CodeImp.DoomBuilder.Rendering Vector2D tlb = ltbound.GetTransformed(translatex, translatey, scale, -scale); Vector2D rbb = rbbound.GetTransformed(translatex, translatey, scale, -scale); - Vector2D xcenter = GridSetup.SnappedToGrid(0.5f * (ltpos + rbpos), size, sizeinv, angle, originx, originy); - Vector2D ycenter = xcenter; + Vector2D center = GridSetup.SnappedToGrid(0.5f * (ltview + rbview), size, sizeinv, angle, originx, originy); // Get the angle vectors for the gridlines Vector2D dx = new Vector2D((float)Math.Cos(angle), (float)Math.Sin(angle)); @@ -935,15 +929,16 @@ namespace CodeImp.DoomBuilder.Rendering float maxextent = Math.Max(mapsize.x, mapsize.y); RectangleF bounds = new RectangleF(tlb.x, tlb.y, rbb.x - tlb.x, rbb.y - tlb.y); + bounds.Intersect(new RectangleF(0, 0, windowsize.Width, windowsize.Height)); bool xminintersect = true, xmaxintersect = true, yminintersect = true, ymaxintersect = true; int num = 0; while (xminintersect || xmaxintersect || yminintersect || ymaxintersect) { - Vector2D xminstart = xcenter - num * size * dy; - Vector2D xmaxstart = xcenter + num * size * dy; - Vector2D yminstart = ycenter - num * size * dx; - Vector2D ymaxstart = ycenter + num * size * dx; + Vector2D xminstart = center - num * size * dy; + Vector2D xmaxstart = center + num * size * dy; + Vector2D yminstart = center - num * size * dx; + Vector2D ymaxstart = center + num * size * dx; Line2D xminscanline = new Line2D(xminstart - dx * maxextent, xminstart + dx * maxextent); Line2D xmaxscanline = new Line2D(xmaxstart - dx * maxextent, xmaxstart + dx * maxextent); diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 0141d2c9bd18b56d5ec589c3269f65046bee9fd9..290c2366a94f78a955ad78c0ddb8781f18aa92fe 100755 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -2917,7 +2917,8 @@ namespace CodeImp.DoomBuilder.Windows { if (General.Map.Map.SelectedLinedefsCount != 1) { - General.ShowErrorMessage("Exactly one linedef must be selected.", MessageBoxButtons.OK); + General.Interface.DisplayStatus(StatusType.Warning, "Exactly one linedef must be selected"); + General.Interface.MessageBeep(MessageBeepType.Warning); return; } Linedef line = General.Map.Map.SelectedLinedefs.First.Value; @@ -2933,7 +2934,8 @@ namespace CodeImp.DoomBuilder.Windows { if (General.Map.Map.SelectedVerticessCount != 1) { - General.ShowErrorMessage("Exactly one vertex must be selected.", MessageBoxButtons.OK); + General.Interface.DisplayStatus(StatusType.Warning, "Exactly one vertex must be selected"); + General.Interface.MessageBeep(MessageBeepType.Warning); return; } Vertex vertex = General.Map.Map.SelectedVertices.First.Value;