diff --git a/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs b/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs index 89cfbff02e20d22971a1f9bc593f39a5ce7a78bd..65eb650bb25ee6215fcce2ab93810cfadd38ec6a 100644 --- a/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs +++ b/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs @@ -70,6 +70,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing private const float GRIP_SIZE = 9.0f; private readonly Cursor[] RESIZE_CURSORS = { Cursors.SizeNS, Cursors.SizeNWSE, Cursors.SizeWE, Cursors.SizeNESW }; + private const byte RECTANGLE_ALPHA = 60; #endregion @@ -93,6 +94,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing // Rectangle components private Vector2D[] corners = new Vector2D[4]; // lefttop, righttop, rightbottom, leftbottom + private FlatVertex[] cornerverts = new FlatVertex[6]; private Vector2D[] extends = new Vector2D[2]; // right, bottom private RectangleF[] resizegrips = new RectangleF[2]; // right, bottom private RectangleF[] rotategrips = new RectangleF[2]; // righttop, leftbottom @@ -107,6 +109,10 @@ namespace CodeImp.DoomBuilder.GZDoomEditing private Line2D resizeaxis; private float rotationoffset; private Vector2D rotationcenter; + + // Options + private bool snaptogrid; // SHIFT to toggle + private bool snaptonearest; // CTRL to enable #endregion @@ -210,12 +216,12 @@ namespace CodeImp.DoomBuilder.GZDoomEditing { case Grip.Main: int closestcorner = -1; - float cornerdist = float.MinValue; + float cornerdist = float.MaxValue; for(int i = 0; i < 4; i++) { Vector2D delta = corners[i] - mousemappos; float d = delta.GetLengthSq(); - if(d > cornerdist) + if(d < cornerdist) { closestcorner = i; cornerdist = d; @@ -225,9 +231,9 @@ namespace CodeImp.DoomBuilder.GZDoomEditing { // TODO: case 0: alignoffset = new Vector2D(0f, 0f); break; - case 1: alignoffset = new Vector2D(0f, 0f); break; - case 2: alignoffset = new Vector2D(0f, 0f); break; - case 3: alignoffset = new Vector2D(0f, 0f); break; + case 1: alignoffset = new Vector2D(texture.ScaledWidth, 0f); break; + case 2: alignoffset = new Vector2D(texture.ScaledWidth, -texture.ScaledHeight); break; + case 3: alignoffset = new Vector2D(0f, -texture.ScaledHeight); break; } showalignoffset = true; General.Interface.SetCursor(Cursors.Hand); @@ -235,13 +241,17 @@ namespace CodeImp.DoomBuilder.GZDoomEditing case Grip.RotateLB: case Grip.RotateRT: + alignoffset = new Vector2D(0f, 0f); + showalignoffset = true; General.Interface.SetCursor(Cursors.Cross); break; case Grip.SizeH: case Grip.SizeV: + alignoffset = new Vector2D(0f, 0f); + showalignoffset = true; // Pick the best matching cursor depending on rotation and side - float resizeangle = rotation; + float resizeangle = -(rotation + sectorinfo[0].rotation); if(mousegrip == Grip.SizeH) resizeangle += Angle2D.PIHALF; resizeangle = Angle2D.Normalized(resizeangle); if(resizeangle > Angle2D.PI) resizeangle -= Angle2D.PI; @@ -260,6 +270,13 @@ namespace CodeImp.DoomBuilder.GZDoomEditing } else { + Vector2D snappedmappos = mousemappos; + bool dosnaptogrid = snaptogrid; + + // Options + snaptogrid = General.Interface.ShiftState ^ General.Interface.SnapToGrid; + snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge; + // Change to crosshair cursor so we can clearly see around the mouse cursor General.Interface.SetCursor(Cursors.Cross); @@ -290,6 +307,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing private void UpdateRectangleComponents() { float gripsize = GRIP_SIZE / renderer.Scale; + PixelColor rectcolor = General.Colors.Highlight.WithAlpha(RECTANGLE_ALPHA); // Corners in world space corners[0] = TexToWorld(selectionoffset + new Vector2D(0f, 0f)); @@ -297,6 +315,27 @@ namespace CodeImp.DoomBuilder.GZDoomEditing corners[2] = TexToWorld(selectionoffset + new Vector2D(texture.ScaledWidth, -texture.ScaledHeight)); corners[3] = TexToWorld(selectionoffset + new Vector2D(0f, -texture.ScaledHeight)); + // Vertices + cornerverts = new FlatVertex[6]; + for(int i = 0; i < 6; i++) + { + cornerverts[i] = new FlatVertex(); + cornerverts[i].z = 1.0f; + cornerverts[i].c = rectcolor.ToInt(); + } + cornerverts[0].x = corners[0].x; + cornerverts[0].y = corners[0].y; + cornerverts[1].x = corners[1].x; + cornerverts[1].y = corners[1].y; + cornerverts[2].x = corners[2].x; + cornerverts[2].y = corners[2].y; + cornerverts[3].x = corners[0].x; + cornerverts[3].y = corners[0].y; + cornerverts[4].x = corners[2].x; + cornerverts[4].y = corners[2].y; + cornerverts[5].x = corners[3].x; + cornerverts[5].y = corners[3].y; + // Extended points for rotation corners extends[0] = TexToWorld(selectionoffset + new Vector2D(texture.ScaledWidth + (20f * Math.Sign(scale.x * sectorinfo[0].scale.x)) / renderer.Scale * (scale.x * sectorinfo[0].scale.x), 0f)); extends[1] = TexToWorld(selectionoffset + new Vector2D(0f, -texture.ScaledHeight + (-20f * Math.Sign(scale.y * sectorinfo[0].scale.y)) / renderer.Scale * (scale.y * sectorinfo[0].scale.y))); @@ -324,9 +363,9 @@ namespace CodeImp.DoomBuilder.GZDoomEditing if(showalignoffset) { Vector2D worldalignoffset = TexToWorld(selectionoffset + alignoffset); - alignrect = new RectangleF(worldalignoffset.x - gripsize * 0.25f, - worldalignoffset.y - gripsize * 0.25f, - gripsize * 0.5f, gripsize * 0.5f); + alignrect = new RectangleF(worldalignoffset.x - gripsize * 0.5f, + worldalignoffset.y - gripsize * 0.5f, + gripsize, gripsize); } } @@ -618,10 +657,21 @@ namespace CodeImp.DoomBuilder.GZDoomEditing // Render overlay if(renderer.StartOverlay(true)) { + // Rectangle + PixelColor rectcolor = General.Colors.Highlight.WithAlpha(RECTANGLE_ALPHA); + renderer.RenderGeometry(cornerverts, null, true); + renderer.RenderLine(corners[0], corners[1], 4, rectcolor, true); + renderer.RenderLine(corners[1], corners[2], 4, rectcolor, true); + renderer.RenderLine(corners[2], corners[3], 4, rectcolor, true); + renderer.RenderLine(corners[3], corners[0], 4, rectcolor, true); + + // Lines renderer.RenderLine(corners[0], extends[0], 1f, General.Colors.Highlight, true); renderer.RenderLine(corners[0], extends[1], 1f, General.Colors.Highlight, true); renderer.RenderLine(corners[1], corners[2], 0.5f, General.Colors.Highlight, true); renderer.RenderLine(corners[2], corners[3], 0.5f, General.Colors.Highlight, true); + + // Handles renderer.RenderRectangleFilled(rotategrips[0], General.Colors.Background, true); renderer.RenderRectangleFilled(rotategrips[1], General.Colors.Background, true); renderer.RenderRectangle(rotategrips[0], 2f, General.Colors.Indication, true); @@ -630,8 +680,11 @@ namespace CodeImp.DoomBuilder.GZDoomEditing renderer.RenderRectangleFilled(resizegrips[1], General.Colors.Background, true); renderer.RenderRectangle(resizegrips[0], 2f, General.Colors.Highlight, true); renderer.RenderRectangle(resizegrips[1], 2f, General.Colors.Highlight, true); + + // Rotate/align point if(showalignoffset) renderer.RenderRectangleFilled(alignrect, General.Colors.Selection, true); + renderer.Finish(); }