From 7d180e5cae5d0de6015e5739053bb0274cc16aea Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Thu, 3 Feb 2022 19:35:10 +0100
Subject: [PATCH] Snap selection to grid: fixed a problem that could cause a
crash if geometry got removed by snapping it to the grid
---
Source/Core/Editing/EditMode.cs | 4 ++++
Source/Core/General/MapManager.cs | 6 ++++++
.../BuilderModes/ClassicModes/LinedefsMode.cs | 10 ++++++++++
.../Plugins/BuilderModes/ClassicModes/SectorsMode.cs | 11 +++++++++++
.../BuilderModes/ClassicModes/VerticesMode.cs | 12 +++++++++++-
5 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/Source/Core/Editing/EditMode.cs b/Source/Core/Editing/EditMode.cs
index a6e7775..bfc63a9 100644
--- a/Source/Core/Editing/EditMode.cs
+++ b/Source/Core/Editing/EditMode.cs
@@ -256,6 +256,10 @@ namespace CodeImp.DoomBuilder.Editing
//mxd. map testing events
public virtual bool OnMapTestBegin(bool testFromCurrentPosition) { return true; } //called before test map is launched. Returns false if map launch is impossible
public virtual void OnMapTestEnd(bool testFromCurrentPosition) { } //called after game engine is closed
+
+ // This should be called by global actions (i.e. that are not part of an editing mode) when they changed map elements,
+ // so that the mode can react to it (for example by rebuilding a blockmap)
+ public virtual void OnMapElementsChanged() { }
#endregion
}
diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index 4a1e5b0..2c46492 100644
--- a/Source/Core/General/MapManager.cs
+++ b/Source/Core/General/MapManager.cs
@@ -2592,6 +2592,9 @@ namespace CodeImp.DoomBuilder
undoredo.WithdrawUndo();
}
+ // Let the current editing mode know that we changed something
+ General.Editing.Mode.OnMapElementsChanged();
+
// Done
General.Interface.RedrawDisplay();
Cursor.Current = Cursors.Default;
@@ -2651,6 +2654,9 @@ namespace CodeImp.DoomBuilder
// Map is changed
General.Map.IsChanged = true;
+ // Let the current editing mode know that we changed something
+ General.Editing.Mode.OnMapElementsChanged();
+
// Done
General.Interface.RedrawDisplay();
Cursor.Current = Cursors.Default;
diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
index 668ba23..752ebeb 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
@@ -1287,6 +1287,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
return base.OnCopyBegin();
}
+ ///
+ /// If map elements have changed the blockmap needs to be recreated.
+ ///
+ public override void OnMapElementsChanged()
+ {
+ base.OnMapElementsChanged();
+
+ CreateBlockmap();
+ }
+
//mxd
private void RenderComment(Linedef l)
{
diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
index 0fac0f2..92f55f4 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
@@ -1545,6 +1545,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
base.OnRedoEnd(); //mxd
}
+
+ ///
+ /// If map elements have changed the blockmap needs to be recreated.
+ ///
+ public override void OnMapElementsChanged()
+ {
+ base.OnMapElementsChanged();
+
+ CreateBlockmap();
+ }
+
//mxd
public override void OnViewSelectionNumbersChanged(bool enabled)
{
diff --git a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs
index 7a4ed12..b36ee51 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs
@@ -752,7 +752,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
return base.OnCopyBegin();
}
-
+
+ ///
+ /// If map elements have changed the blockmap needs to be recreated.
+ ///
+ public override void OnMapElementsChanged()
+ {
+ base.OnMapElementsChanged();
+
+ CreateBlockmap();
+ }
+
#endregion
#region ================== Actions