diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index 60702b08c0944408d5a25b8d3763ab10067b708f..f97c07291002bf55b580655521ec36195943399c 100755 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -1187,14 +1187,27 @@ namespace CodeImp.DoomBuilder.BuilderModes } allslopehandles.Clear(); - if (General.Map.UDMF /* && General.Settings.ShowVisualSlopeHandles */) + BuildSlopeHandles(General.Map.Map.Sectors.ToList()); + } + + private void BuildSlopeHandles(List<Sector> sectors) + { + if (General.Map.UDMF) { - foreach (Sector s in General.Map.Map.Sectors) + foreach (Sector s in sectors) { + if (s.IsDisposed) + { + continue; + } + SectorData sectordata = GetSectorData(s); sectordata.Update(); + if (allslopehandles.ContainsKey(s)) + allslopehandles.Remove(s); + foreach (Sidedef sidedef in s.Sidedefs) { VisualSlope handle = CreateVisualSlopeHandle(sectordata.Floor, sidedef, true); @@ -1489,6 +1502,29 @@ namespace CodeImp.DoomBuilder.BuilderModes { // Let the core do this (it will just dispose the sectors that were changed) base.ResourcesReloadedPartial(); + + // The base doesn't know anything about slobe handles, so we have to clear them up ourself + if (General.Map.UDMF) + { + List<Sector> removedsectors = new List<Sector>(); + + // Get the sectors that were disposed... + foreach(Sector s in allslopehandles.Keys) + { + if (s.IsDisposed) + removedsectors.Add(s); + } + + // ... so that we can remove their slope handles + foreach(Sector s in removedsectors) + { + allslopehandles[s].Clear(); + allslopehandles.Remove(s); + } + + // Rebuild slope handles for the changed sectors + BuildSlopeHandles(General.Map.Map.GetMarkedSectors(true)); + } } else { diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualSidedefSlope.cs b/Source/Plugins/BuilderModes/VisualModes/VisualSidedefSlope.cs index 237a586b0e61b50f8eff1a99d6ae7e7c5b5f590c..6346c914578374e8330985ae93faed67eab482f5 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualSidedefSlope.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualSidedefSlope.cs @@ -84,6 +84,9 @@ namespace CodeImp.DoomBuilder.VisualModes /// </summary> public override bool PickFastReject(Vector3D from, Vector3D to, Vector3D dir) { + if (sidedef.IsDisposed || sidedef.Sector.IsDisposed) + return false; + RectangleF bbox = sidedef.Sector.BBox; if ((up && plane.Distance(from) > 0.0f) || (!up && plane.Distance(from) < 0.0f))