From abc2bab6e11e0a9528f9b510e7e3082f80206835 Mon Sep 17 00:00:00 2001 From: codeimp Date: Sat, 25 Oct 2008 10:34:32 +0000 Subject: [PATCH] error checking for overlapping lines that do not reference the same sector on all sides --- Source/BuilderModes/BuilderModes.csproj | 2 + .../ErrorChecks/CheckOverlappingLines.cs | 120 ++++++++++++++++++ .../ErrorChecks/ResultLineOverlapping.cs | 86 +++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 Source/BuilderModes/ErrorChecks/CheckOverlappingLines.cs create mode 100644 Source/BuilderModes/ErrorChecks/ResultLineOverlapping.cs diff --git a/Source/BuilderModes/BuilderModes.csproj b/Source/BuilderModes/BuilderModes.csproj index 2c9a35a8..68fc0187 100644 --- a/Source/BuilderModes/BuilderModes.csproj +++ b/Source/BuilderModes/BuilderModes.csproj @@ -46,6 +46,8 @@ + + diff --git a/Source/BuilderModes/ErrorChecks/CheckOverlappingLines.cs b/Source/BuilderModes/ErrorChecks/CheckOverlappingLines.cs new file mode 100644 index 00000000..cc271d28 --- /dev/null +++ b/Source/BuilderModes/ErrorChecks/CheckOverlappingLines.cs @@ -0,0 +1,120 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using CodeImp.DoomBuilder.Windows; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Map; +using CodeImp.DoomBuilder.Rendering; +using CodeImp.DoomBuilder.Geometry; +using CodeImp.DoomBuilder.Editing; +using CodeImp.DoomBuilder.Actions; +using CodeImp.DoomBuilder.Types; +using CodeImp.DoomBuilder.Config; +using System.Threading; + +#endregion + +namespace CodeImp.DoomBuilder.BuilderModes +{ + [ErrorChecker("Check overlapping lines", true, 500)] + public class CheckOverlappingLines : ErrorChecker + { + #region ================== Constants + + #endregion + + #region ================== Constructor / Destructor + + // Constructor + public CheckOverlappingLines() + { + // Total progress is done when all things are checked + SetTotalProgress(General.Map.Map.Linedefs.Count); + } + + #endregion + + #region ================== Methods + + // This runs the check + public override void Run() + { + Dictionary donelines = new Dictionary(); + + // Go for all the liendefs + foreach(Linedef l in General.Map.Map.Linedefs) + { + // Check if not already done + if(!donelines.ContainsKey(l)) + { + // And go for all the linedefs that could overlap + foreach(Linedef d in General.Map.Map.Linedefs) + { + // Not the same line? + if(!object.ReferenceEquals(l, d)) + { + float lu, du; + + // Check if the lines touch. Note that I don't include 0.0 and 1.0 here because + // the lines may be touching at the ends when sharing the same vertex. + if(l.Line.GetIntersection(d.Line, out du, out lu)) + { + if((lu > 0.0f) && (lu < 1.0f) && (du > 0.0f) && (du < 1.0f)) + { + // Check if not the same sector on all sides + Sector samesector = null; + if(l.Front != null) samesector = l.Front.Sector; + else if(l.Back != null) samesector = l.Back.Sector; + else if(d.Front != null) samesector = d.Front.Sector; + else if(d.Back != null) samesector = d.Back.Sector; + if((l.Front == null) || (l.Front.Sector != samesector)) samesector = null; + else if((l.Back == null) || (l.Back.Sector != samesector)) samesector = null; + else if((d.Front == null) || (d.Front.Sector != samesector)) samesector = null; + else if((d.Back == null) || (d.Back.Sector != samesector)) samesector = null; + + if(samesector == null) + { + SubmitResult(new ResultLineOverlapping(l, d)); + donelines[d] = d; + } + } + } + } + } + } + + // Handle thread interruption + try { Thread.Sleep(0); } + catch(ThreadInterruptedException) { return; } + + // We are making progress! + AddProgress(1); + } + } + + #endregion + } +} diff --git a/Source/BuilderModes/ErrorChecks/ResultLineOverlapping.cs b/Source/BuilderModes/ErrorChecks/ResultLineOverlapping.cs new file mode 100644 index 00000000..5b1e3b07 --- /dev/null +++ b/Source/BuilderModes/ErrorChecks/ResultLineOverlapping.cs @@ -0,0 +1,86 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using CodeImp.DoomBuilder.Windows; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Map; +using CodeImp.DoomBuilder.Rendering; +using CodeImp.DoomBuilder.Geometry; +using CodeImp.DoomBuilder.Editing; +using CodeImp.DoomBuilder.Actions; +using CodeImp.DoomBuilder.Types; +using CodeImp.DoomBuilder.Config; + +#endregion + +namespace CodeImp.DoomBuilder.BuilderModes +{ + public class ResultLineOverlapping : ErrorResult + { + #region ================== Variables + + private Linedef line1; + private Linedef line2; + + #endregion + + #region ================== Properties + + public override int Buttons { get { return 0; } } + + #endregion + + #region ================== Constructor / Destructor + + // Constructor + public ResultLineOverlapping(Linedef l1, Linedef l2) + { + // Initialize + this.line1 = l1; + this.line2 = l2; + this.description = "These linedefs are overlapping and they do not reference the same sector on all sides. Overlapping lines is only allowed when they reference the same sector on all sides."; + } + + #endregion + + #region ================== Methods + + // This must return the string that is displayed in the listbox + public override string ToString() + { + return "Linedefs are overlapping and references different sectors"; + } + + // Rendering + public override void PlotSelection(IRenderer2D renderer) + { + renderer.PlotLinedef(line1, General.Colors.Selection); + renderer.PlotLinedef(line2, General.Colors.Selection); + } + + #endregion + } +}