using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Map; using System.Threading; namespace CodeImp.DoomBuilder.BuilderModes.ErrorChecks { [ErrorChecker("Check map size", true, 50)] public class CheckMapSize : ErrorChecker { private const int PROGRESS_STEP = 1000; public override bool SkipCheck { get { return General.Map.Config.SafeBoundary <= 0; } } // Constructor public CheckMapSize() { // Total progress is done when all vertices are checked SetTotalProgress(General.Map.Map.Vertices.Count / PROGRESS_STEP); } // This runs the check public override void Run() { int progress = 0; int stepprogress = 0; double minx = int.MaxValue; double maxx = int.MinValue; double miny = int.MaxValue; double maxy = int.MinValue; // Go for all vertices foreach(Vertex v in General.Map.Map.Vertices) { if(v.Position.x < minx) minx = v.Position.x; if(v.Position.x > maxx) maxx = v.Position.x; if(v.Position.y < miny) miny = v.Position.y; if(v.Position.y > maxy) maxy = v.Position.y; // Handle thread interruption try { Thread.Sleep(0); } catch(ThreadInterruptedException) { return; } // We are making progress! if((++progress / PROGRESS_STEP) > stepprogress) { stepprogress = (progress / PROGRESS_STEP); AddProgress(1); } } // Map elements should not be more than 32767 mu apart if(maxx - minx > General.Map.Config.SafeBoundary || maxy - miny > General.Map.Config.SafeBoundary) { SubmitResult(new ResultMapTooBig(new Vector2D(minx, miny), new Vector2D(maxx, maxy))); } } } }