From 2618a7dadcbb649aa6f7ffba312dfbefd63e61a4 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 5 Dec 2010 11:31:24 +1300 Subject: [PATCH] fix perf of floodfill in editor --- OpenRA.Editor/Surface.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index ae802a3ef5..e9cc43e3c8 100755 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -143,6 +143,16 @@ namespace OpenRA.Editor { var queue = new Queue(); var replace = Map.MapTiles[pos.X, pos.Y]; + var touched = new bool[Map.MapSize.X, Map.MapSize.Y]; + + Action MaybeEnqueue = (x, y) => + { + if (Map.IsInMap(x, y) && !touched[x, y]) + { + queue.Enqueue(new int2(x, y)); + touched[x, y] = true; + } + }; queue.Enqueue(pos); while (queue.Count > 0) @@ -157,10 +167,10 @@ namespace OpenRA.Editor for (var x = a.X; x <= b.X; x++) { Map.MapTiles[x, p.Y] = new TileReference { type = Brush.N, image = (byte)0, index = (byte)0 }; - if (Map.MapTiles[x, p.Y - 1].Equals(replace) && Map.IsInMap(x, p.Y - 1)) - queue.Enqueue(new int2(x, p.Y - 1)); - if (Map.MapTiles[x, p.Y + 1].Equals(replace) && Map.IsInMap(x, p.Y + 1)) - queue.Enqueue(new int2(x, p.Y + 1)); + if (Map.MapTiles[x, p.Y - 1].Equals(replace)) + MaybeEnqueue(x, p.Y - 1); + if (Map.MapTiles[x, p.Y + 1].Equals(replace)) + MaybeEnqueue(x, p.Y + 1); } }