diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 8f138ea82d..b16c2c03ff 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -126,7 +126,12 @@ namespace OpenRA.Graphics bounds.Offset((int)Game.viewport.Location.X, (int)Game.viewport.Location.Y); - var renderables = world.Actors.SelectMany(a => a.Render()) + var foos = world.Actors; + var bars = world.FindUnits( + new float2(bounds.Left, bounds.Top), + new float2(bounds.Right, bounds.Bottom)); + + var renderables = foos.SelectMany(a => a.Render()) .OrderBy(r => r, comparer); DrawSpriteList(bounds, renderables); @@ -149,14 +154,45 @@ namespace OpenRA.Graphics renderer.Device.DisableScissor(); + foreach (var bar in bars) { - var a = new float2( bounds.Left, bounds.Top ); - var b = new float2( bounds.Right - a.X, 0); + var baz = bar.GetBounds(true); + + var a = new float2(baz.Left, baz.Top); + var b = new float2(baz.Right - a.X, 0); + var c = new float2(0, baz.Bottom - a.Y); + lineRenderer.DrawLine(a, a + b, Color.Green, Color.Green); + lineRenderer.DrawLine(a + b, a + b + c, Color.Green, Color.Green); + lineRenderer.DrawLine(a + b + c, a + c, Color.Green, Color.Green); + lineRenderer.DrawLine(a, a + c, Color.Green, Color.Green); + } + + { + var a = new float2(bounds.Left, bounds.Top); + var b = new float2(bounds.Right - a.X, 0); var c = new float2(0, bounds.Bottom - a.Y); lineRenderer.DrawLine(a, a + b, Color.Red, Color.Red); lineRenderer.DrawLine(a + b, a + b + c, Color.Red, Color.Red); lineRenderer.DrawLine(a + b + c, a + c, Color.Red, Color.Red); lineRenderer.DrawLine(a, a + c, Color.Red, Color.Red); + + bounds = GetBoundsRect(); + a = new float2(bounds.Left, bounds.Top); + b = new float2(bounds.Right - a.X, 0); + c = new float2(0, bounds.Bottom - a.Y); + lineRenderer.DrawLine(a, a + b, Color.Blue, Color.Blue); + lineRenderer.DrawLine(a + b, a + b + c, Color.Blue, Color.Blue); + lineRenderer.DrawLine(a + b + c, a + c, Color.Blue, Color.Blue); + lineRenderer.DrawLine(a, a + c, Color.Blue, Color.Blue); + } + + { + for (var j = 0; j < Game.world.Map.MapSize; + j += Game.world.WorldActor.Info.Traits.Get().BinSize) + { + lineRenderer.DrawLine(new float2(0, j * 24), new float2(Game.world.Map.MapSize * 24, j * 24), Color.Black, Color.Black); + lineRenderer.DrawLine(new float2(j * 24, 0), new float2(j * 24, Game.world.Map.MapSize * 24), Color.Black, Color.Black); + } } lineRenderer.Flush(); diff --git a/OpenRA.Game/Traits/World/SpatialBins.cs b/OpenRA.Game/Traits/World/SpatialBins.cs index 1a02379331..d8c71ef649 100644 --- a/OpenRA.Game/Traits/World/SpatialBins.cs +++ b/OpenRA.Game/Traits/World/SpatialBins.cs @@ -52,6 +52,8 @@ namespace OpenRA.Traits IEnumerable ActorsInBins(int i1, int i2, int j1, int j2) { + if (bins[0, 0] == null) yield break; // hack + j1 = Math.Max(0, j1); j2 = Math.Min(j2, bins.GetUpperBound(1) - 1); i1 = Math.Max(0, i1); i2 = Math.Min(i2, bins.GetUpperBound(0) - 1); for (var j = j1; j <= j2; j++)