private void ExtendFrom(VMWalkableRect source, int dir) { var free = source.Free[dir].List; foreach (VMFreeListRegion line in free) { VMExtendRectResult extension = new VMExtendRectResult(); VMWalkableRect newRect = null; switch (dir) { case 0: extension = ExtendRect(dir, line.a, line.b, source.y1); newRect = (extension.BestN == source.y1) ? null : new VMWalkableRect(line.a, extension.BestN, line.b, source.y1); break; case 1: extension = ExtendRect(dir, line.a, line.b, source.x2); newRect = (extension.BestN == source.x2) ? null : new VMWalkableRect(source.x2, line.a, extension.BestN, line.b); break; case 2: extension = ExtendRect(dir, line.a, line.b, source.y2); newRect = (extension.BestN == source.y2) ? null : new VMWalkableRect(line.a, source.y2, line.b, extension.BestN); break; case 3: extension = ExtendRect(dir, line.a, line.b, source.x1); newRect = (extension.BestN == source.x1) ? null : new VMWalkableRect(extension.BestN, line.a, source.x1, line.b); break; } if (newRect == null || extension.BestN == int.MaxValue || extension.BestN == int.MinValue) continue; source.Adj.Add(newRect); newRect.Adj.Add(source); var bounds = ((dir % 2) == 0) ? new VMFreeListRegion(newRect.x1, newRect.x2) : new VMFreeListRegion(newRect.y1, newRect.y2); var free2 = new VMFreeList(bounds); foreach (var r in extension.Best) { free2.Subtract(new VMFreeListRegion(r.a, r.b)); if (r.rect is VMWalkableRect) { var w = (VMWalkableRect)r.rect; w.Free[(dir + 2) % 4].Subtract(bounds); w.Adj.Add(newRect); newRect.Adj.Add(w); } } newRect.Free[dir] = free2; newRect.Free[(dir + 2) % 4] = new VMFreeList(0, 0); ConstructFree(newRect, ((dir % 2) == 1), ((dir % 2) == 0), ((dir % 2) == 1), ((dir % 2) == 0)); if (!source.Start) Map.Add(newRect); } }
private void ExtendFrom(VMWalkableRect source, int dir) { var free = source.Free[dir].List; foreach (VMFreeListRegion line in free) { VMExtendRectResult extension = new VMExtendRectResult(); VMWalkableRect newRect = null; switch (dir) { case 0: extension = ExtendRect(dir, line.a, line.b, source.y1); newRect = (extension.BestN == source.y1) ? null : new VMWalkableRect(line.a, extension.BestN, line.b, source.y1); break; case 1: extension = ExtendRect(dir, line.a, line.b, source.x2); newRect = (extension.BestN == source.x2) ? null : new VMWalkableRect(source.x2, line.a, extension.BestN, line.b); break; case 2: extension = ExtendRect(dir, line.a, line.b, source.y2); newRect = (extension.BestN == source.y2) ? null : new VMWalkableRect(line.a, source.y2, line.b, extension.BestN); break; case 3: extension = ExtendRect(dir, line.a, line.b, source.x1); newRect = (extension.BestN == source.x1) ? null : new VMWalkableRect(extension.BestN, line.a, source.x1, line.b); break; } if (newRect == null || extension.BestN == int.MaxValue || extension.BestN == int.MinValue) { continue; } source.Adj.Add(newRect); newRect.Adj.Add(source); var bounds = ((dir % 2) == 0) ? new VMFreeListRegion(newRect.x1, newRect.x2) : new VMFreeListRegion(newRect.y1, newRect.y2); var free2 = new VMFreeList(bounds); foreach (var r in extension.Best) { free2.Subtract(new VMFreeListRegion(r.a, r.b)); if (r.rect is VMWalkableRect) { var w = (VMWalkableRect)r.rect; w.Free[(dir + 2) % 4].Subtract(bounds); w.Adj.Add(newRect); newRect.Adj.Add(w); } } newRect.Free[dir] = free2; newRect.Free[(dir + 2) % 4] = new VMFreeList(0, 0); ConstructFree(newRect, ((dir % 2) == 1), ((dir % 2) == 0), ((dir % 2) == 1), ((dir % 2) == 0)); if (!source.Start) { Map.Add(newRect); } } }