diff --git a/OpenRA.FileFormats/Map/Map.cs b/OpenRA.FileFormats/Map/Map.cs
index 7628b57e17..66ac029974 100644
--- a/OpenRA.FileFormats/Map/Map.cs
+++ b/OpenRA.FileFormats/Map/Map.cs
@@ -16,13 +16,14 @@
* You should have received a copy of the GNU General Public License
* along with OpenRA. If not, see .
*/
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
using System.Security.Cryptography;
namespace OpenRA.FileFormats
@@ -57,6 +58,8 @@ namespace OpenRA.FileFormats
public int2 TopLeft;
public int2 BottomRight;
+ public Rectangle Bounds { get { return Rectangle.FromLTRB(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y); } }
+
public TileReference[,] MapTiles;
public TileReference[,] MapResources;
diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs
index bbb9c2de0d..ed3a1df604 100644
--- a/OpenRA.Game/Graphics/TerrainRenderer.cs
+++ b/OpenRA.Game/Graphics/TerrainRenderer.cs
@@ -90,9 +90,9 @@ namespace OpenRA.Graphics
if (firstRow < 0) firstRow = 0;
if (lastRow > map.Height) lastRow = map.Height;
- if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.bounds.HasValue)
+ if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.Bounds.HasValue)
{
- var r = world.LocalPlayer.Shroud.bounds.Value;
+ var r = world.LocalPlayer.Shroud.Bounds.Value;
if (firstRow < r.Top - map.YOffset)
firstRow = r.Top - map.YOffset;
diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs
index 06c94149af..c154084e2a 100644
--- a/OpenRA.Game/Graphics/Viewport.cs
+++ b/OpenRA.Game/Graphics/Viewport.cs
@@ -24,6 +24,7 @@ using OpenRA.Network;
using OpenRA.Traits;
using OpenRA.Widgets;
using OpenRA.Support;
+using System.Drawing;
namespace OpenRA.Graphics
{
@@ -196,5 +197,12 @@ namespace OpenRA.Graphics
{
Center( player.World.Queries.OwnedBy[ player ].WithTrait().Select( a => a.Actor ) );
}
+
+ public Rectangle? ShroudBounds()
+ {
+ var localPlayer = Game.world.LocalPlayer;
+ if (localPlayer == null) return null;
+ return localPlayer.Shroud.Bounds;
+ }
}
}
diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs
index 944c36acc8..56b761712f 100644
--- a/OpenRA.Game/Graphics/WorldRenderer.cs
+++ b/OpenRA.Game/Graphics/WorldRenderer.cs
@@ -83,9 +83,9 @@ namespace OpenRA.Graphics
Rectangle GetBoundsRect()
{
- if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.bounds.HasValue)
+ if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.Bounds.HasValue)
{
- var r = world.LocalPlayer.Shroud.bounds.Value;
+ var r = world.LocalPlayer.Shroud.Bounds.Value;
var left = (int)(Game.CellSize * r.Left - Game.viewport.Location.X);
var top = (int)(Game.CellSize * r.Top - Game.viewport.Location.Y);
@@ -169,7 +169,7 @@ namespace OpenRA.Graphics
{
DrawBox(bounds, Color.Red);
if (world.LocalPlayer != null)
- DrawBox(world.LocalPlayer.Shroud.bounds.Value, Color.Blue);
+ DrawBox(world.LocalPlayer.Shroud.Bounds.Value, Color.Blue);
for (var j = 0; j < world.Map.MapSize.Y;
j += world.WorldActor.Info.Traits.Get().BinSize)
diff --git a/OpenRA.Game/ShroudRenderer.cs b/OpenRA.Game/ShroudRenderer.cs
index 05a1772763..43369f7b5b 100644
--- a/OpenRA.Game/ShroudRenderer.cs
+++ b/OpenRA.Game/ShroudRenderer.cs
@@ -35,7 +35,7 @@ namespace OpenRA
bool disabled = false;
Map map;
- public Rectangle? bounds { get { return shroud.exploredBounds; } }
+ public Rectangle? Bounds { get { return shroud.exploredBounds; } }
public ShroudRenderer(Player owner, Map map)
{
@@ -149,11 +149,12 @@ namespace OpenRA
fogSprites[i, j] = ChooseFog(i, j);
}
- var miny = bounds.HasValue ? Math.Max(map.YOffset, bounds.Value.Top) : map.YOffset;
- var maxy = bounds.HasValue ? Math.Min(map.YOffset + map.Height, bounds.Value.Bottom) : map.YOffset + map.Height;
+ var clipRect = Bounds.HasValue ? Rectangle.Intersect(Bounds.Value, map.Bounds) : map.Bounds;
- var minx = bounds.HasValue ? Math.Max(map.XOffset, bounds.Value.Left) : map.XOffset;
- var maxx = bounds.HasValue ? Math.Min(map.XOffset + map.Width, bounds.Value.Right) : map.XOffset + map.Width;
+ var miny = clipRect.Top;
+ var maxy = clipRect.Bottom;
+ var minx = clipRect.Left;
+ var maxx = clipRect.Right;
var shroudPalette = "fog";
diff --git a/OpenRA.Game/Traits/World/SmudgeLayer.cs b/OpenRA.Game/Traits/World/SmudgeLayer.cs
index e2ac2a9372..d349a61497 100644
--- a/OpenRA.Game/Traits/World/SmudgeLayer.cs
+++ b/OpenRA.Game/Traits/World/SmudgeLayer.cs
@@ -82,12 +82,18 @@ namespace OpenRA.Traits
}
public void Render()
- {
- var tl = world.Map.TopLeft;
- var br = world.Map.BottomRight;
-
- for (int x = tl.X; x < br.X; x++)
- for (int y = tl.Y; y < br.Y; y++)
+ {
+ var cliprect = Game.viewport.ShroudBounds().HasValue
+ ? Rectangle.Intersect(Game.viewport.ShroudBounds().Value, world.Map.Bounds) : world.Map.Bounds;
+
+ var minx = cliprect.Left;
+ var maxx = cliprect.Right;
+
+ var miny = cliprect.Top;
+ var maxy = cliprect.Bottom;
+
+ for (int x = minx; x < maxx; x++)
+ for (int y = miny; y < maxy; y++)
{
var t = new int2(x, y);
if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.IsExplored(t) || tiles[x,y].type == 0) continue;