From 4e36099b2237ad8b63086057e09f7abdabd23872 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Mon, 1 Jun 2020 17:16:13 +0200
Subject: [PATCH] Arching works... kind of

---
 .../VisualModes/BaseVisualMode.cs             | 65 +++++++++++++++----
 1 file changed, 52 insertions(+), 13 deletions(-)

diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index c0208bb1e..10586ac5c 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -4268,25 +4268,64 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				return;
 			}
 
-			double theta = Angle2D.DegToRad(90.0);
+			General.Map.UndoRedo.CreateUndo("Arch between slope handles");
 
-			General.Map.UndoRedo.CreateUndo("Slope between slope handles");
+			Line2D handleline = new Line2D(handles[0].GetCenterPoint(), handles[1].GetCenterPoint());
+			double offsetangle = Angle2D.DegToRad(0.0);
+			double theta = Angle2D.DegToRad(180.0);
+			double length = handleline.GetLength();
 
-			Line3D line = new Line3D(handles[0].GetCenterPoint(), handles[1].GetCenterPoint());
-			double anglez = line.GetAngleZ();
-			
+			double right = Math.Cos(0.0);
+			double left = Math.Cos(theta + offsetangle);
+			double middle = Math.Cos(offsetangle);
+
+			double radius = length / (middle - left);
+			double leftdelimiter = Math.Cos(offsetangle + theta);
+			double rightdelimiter = Math.Cos(offsetangle);
+
+			double sectionstart = Math.Cos(offsetangle + theta) * radius;
+
+			foreach (BaseVisualGeometrySector bvgs in selectedsectors)
+			{
+				double u1 = double.MaxValue;
+				double u2 = double.MinValue;
+
+				
+				foreach (Sidedef sd in bvgs.Sector.Sides.Keys)
+				{
+					double intersection;
+					double bla;
 
-			double angle = line.GetAngle();
+					if (!Line2D.GetIntersection(handleline.v1, handleline.v2, sd.Line.Line.v1.x, sd.Line.Line.v1.y, sd.Line.Line.v2.x, sd.Line.Line.v2.y, out bla, out intersection, true))
+						continue;
 
-			Vector2D v1 = new Vector2D(line.Start).GetRotated(angle);
-			Vector2D v2 = new Vector2D(line.End).GetRotated(angle);
+					if (intersection < u1)
+						u1 = intersection;
 
-			Line2D line2d = new Line2D(v1, v2);
-			double length = line2d.GetLength();
-			double startx = Math.Cos(anglez - theta / 2) * length;
+					if (intersection > u2)
+						u2 = intersection;
+				}
+
+				if (u1 == u2)
+					continue;
+
+				double xpos1 = sectionstart + (u1 * length);
+				double xpos2 = sectionstart + (u2 * length);
+				double height1 = Math.Sqrt(radius * radius - xpos1 * xpos1);
+				double height2 = Math.Sqrt(radius * radius - xpos2 * xpos2);
+				double slopeangle = Vector2D.GetAngle(new Vector2D(xpos1, height1), new Vector2D(xpos2, height2));
+
+				Plane plane = new Plane(new Vector3D(handleline.GetCoordinatesAt(u1), height1), handleline.GetAngle() + Angle2D.PIHALF, slopeangle, true);
+
+				VisualSidedefSlope.ApplySlope(bvgs.Level, plane, this);
+				bvgs.Sector.UpdateSectorGeometry(true);
+
+				Debug.WriteLine(string.Format("sector: {0} | xpos1: {1}, height1: {2} | xpos2: {3}, height2: {4} | slope angle: {5}", bvgs.Sector.Sector.Index, xpos1, xpos2, height1, height2, slopeangle));
+			}
+
+			UpdateChangedObjects();
 
-			Vector2D z1 = v1.GetRotated(-angle);
-			Vector2D z2 = v2.GetRotated(-angle);
+			General.Interface.DisplayStatus(StatusType.Action, "Arched between slope handles.");
 		}
 
 		#endregion
-- 
GitLab