diff --git a/OpenRA.FileFormats/Map/MapStub.cs b/OpenRA.FileFormats/Map/MapStub.cs index 9662b05a8b..960691c20b 100644 --- a/OpenRA.FileFormats/Map/MapStub.cs +++ b/OpenRA.FileFormats/Map/MapStub.cs @@ -66,27 +66,5 @@ namespace OpenRA.FileFormats Uid = Package.GetContent("map.uid").ReadAllText(); } - - public int2 ConvertToPreview(int2 point, Rectangle container) - { - float scale = Math.Min(container.Width * 1.0f / Width, container.Height * 1.0f / Height); - - var size = Math.Max(Width, Height); - var dw = (int)(scale * (size - Width)) / 2; - var dh = (int)(scale * (size - Height)) / 2; - - return new int2(container.X + dw + (int)(scale*(point.X - TopLeft.X)) , container.Y + dh + (int)(scale*(point.Y - TopLeft.Y))); - } - - public Rectangle PreviewBounds(Rectangle container) - { - float scale = Math.Min(container.Width * 1.0f / Width, container.Height * 1.0f / Height); - - var size = Math.Max(Width, Height); - var dw = (int)(scale * (size - Width)) / 2; - var dh = (int)(scale * (size - Height)) / 2; - - return new Rectangle(container.X + dw, container.Y + dh, (int)(Width * scale), (int)(Height * scale)); - } } } diff --git a/OpenRA.Game/Widgets/CheckboxWidget.cs b/OpenRA.Game/Widgets/CheckboxWidget.cs index 690b355124..e70147378a 100644 --- a/OpenRA.Game/Widgets/CheckboxWidget.cs +++ b/OpenRA.Game/Widgets/CheckboxWidget.cs @@ -35,24 +35,18 @@ namespace OpenRA.Widgets var font = (Bold) ? Game.chrome.renderer.BoldFont : Game.chrome.renderer.RegularFont; var pos = RenderOrigin; var rect = RenderBounds; - WidgetUtils.DrawPanel("dialog3", new Rectangle(rect.Location, - new Size(Bounds.Height, Bounds.Height))); + var check = new Rectangle(rect.Location, + new Size(Bounds.Height, Bounds.Height)); + WidgetUtils.DrawPanel("dialog3", check); var textSize = font.Measure(Text); font.DrawText(Text, new float2(rect.Left + rect.Height * 1.5f, pos.Y - baseLine + (Bounds.Height - textSize.Y)/2), Color.White); if (Checked()) - { + { Game.chrome.renderer.RgbaSpriteRenderer.Flush(); - - Game.chrome.lineRenderer.FillRect( - new RectangleF( - Game.viewport.Location.X + rect.Left + 4, - Game.viewport.Location.Y + rect.Top + 5, - rect.Height - 9, - rect.Height - 9), - Color.White); + WidgetUtils.FillRectWithColor(check.InflateBy(-4,-5,-4,-5),Color.White); Game.chrome.lineRenderer.Flush(); } } diff --git a/OpenRA.Game/Widgets/ColorBlockWidget.cs b/OpenRA.Game/Widgets/ColorBlockWidget.cs index 7c88da7411..84f23e5c5c 100644 --- a/OpenRA.Game/Widgets/ColorBlockWidget.cs +++ b/OpenRA.Game/Widgets/ColorBlockWidget.cs @@ -45,11 +45,8 @@ namespace OpenRA.Widgets } public override void DrawInner(World world) - { - var pos = RenderOrigin; - var paletteRect = new RectangleF(pos.X + Game.viewport.Location.X, - pos.Y + Game.viewport.Location.Y, Bounds.Width, Bounds.Height); - Game.chrome.lineRenderer.FillRect(paletteRect, GetColor()); + { + WidgetUtils.FillRectWithColor(RenderBounds, GetColor()); } } } diff --git a/OpenRA.Game/Widgets/MapPreviewWidget.cs b/OpenRA.Game/Widgets/MapPreviewWidget.cs index d190122951..4a9697a57c 100755 --- a/OpenRA.Game/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Game/Widgets/MapPreviewWidget.cs @@ -9,19 +9,14 @@ namespace OpenRA.Widgets { class MapPreviewWidget : Widget { - Sheet mapChooserSheet; - Sprite mapChooserSprite; - bool mapPreviewDirty = true; - MapStub lastMap; - + public int SpawnClickRadius = 50; + public Func Map = () => null; public Action OnSpawnClick = spawn => {}; public Func> SpawnColors = () => new Dictionary(); - - public MapPreviewWidget() : base() { } - static Cache PreviewCache = new Cache(stub => Minimap.RenderMapPreview(stub)); - + + public MapPreviewWidget() : base() { } protected MapPreviewWidget(MapPreviewWidget other) : base(other) { @@ -30,11 +25,14 @@ namespace OpenRA.Widgets OnSpawnClick = other.OnSpawnClick; SpawnColors = other.SpawnColors; } - - static Sprite UnownedSpawn = null; - static Sprite OwnedSpawn = null; - const int closeEnough = 50; + public override Widget Clone() { return new MapPreviewWidget(this); } + + public int2 ConvertToPreview(MapStub map, int2 point) + { + return new int2(MapRect.X + (int)(PreviewScale*(point.X - map.TopLeft.X)) , MapRect.Y + (int)(PreviewScale*(point.Y - map.TopLeft.Y))); + } + public override bool HandleInput(MouseInput mi) { var map = Map(); @@ -44,8 +42,8 @@ namespace OpenRA.Widgets if (mi.Event == MouseInputEvent.Down && mi.Button == MouseButton.Left) { var p = map.Waypoints - .Select((sp, i) => Pair.New(map.ConvertToPreview(sp.Value, RenderBounds), i)) - .Where(a => (a.First - mi.Location).LengthSquared < closeEnough) + .Select((sp, i) => Pair.New(ConvertToPreview(map, sp.Value), i)) + .Where(a => (a.First - mi.Location).LengthSquared < SpawnClickRadius) .Select(a => a.Second + 1) .FirstOrDefault(); OnSpawnClick(p); @@ -55,8 +53,13 @@ namespace OpenRA.Widgets return false; } - public override Widget Clone() { return new MapPreviewWidget(this); } - + Sheet mapChooserSheet; + Sprite mapChooserSprite; + MapStub lastMap; + Rectangle MapRect; + float PreviewScale = 0; + static Sprite UnownedSpawn = null; + static Sprite OwnedSpawn = null; public override void DrawInner( World world ) { if (UnownedSpawn == null) @@ -66,39 +69,37 @@ namespace OpenRA.Widgets var map = Map(); if( map == null ) return; + if (lastMap != map) { - mapPreviewDirty = true; lastMap = map; - } - - var mapRect = map.PreviewBounds( RenderBounds ); - if( mapPreviewDirty ) - { + // Update image data var preview = PreviewCache[map]; if( mapChooserSheet == null || mapChooserSheet.Size.Width != preview.Width || mapChooserSheet.Size.Height != preview.Height ) mapChooserSheet = new Sheet( Game.renderer, new Size( preview.Width, preview.Height ) ); mapChooserSheet.Texture.SetData( preview ); mapChooserSprite = new Sprite( mapChooserSheet, new Rectangle( 0, 0, map.Width, map.Height ), TextureChannel.Alpha ); - mapPreviewDirty = false; + + // Update map rect + PreviewScale = Math.Min(RenderBounds.Width * 1.0f / map.Width, RenderBounds.Height * 1.0f / map.Height); + var size = Math.Max(map.Width, map.Height); + var dw = (int)(PreviewScale * (size - map.Width)) / 2; + var dh = (int)(PreviewScale * (size - map.Height)) / 2; + MapRect = new Rectangle(RenderBounds.X + dw, RenderBounds.Y + dh, (int)(map.Width * PreviewScale), (int)(map.Height * PreviewScale)); } Game.chrome.renderer.RgbaSpriteRenderer.DrawSprite( mapChooserSprite, - new float2( mapRect.Location ), + new float2(MapRect.Location), "chrome", - new float2( mapRect.Size ) ); + new float2( MapRect.Size ) ); - DrawSpawnPoints( map, world ); - } - - void DrawSpawnPoints(MapStub map, World world) - { + // Overlay spawnpoints var colors = SpawnColors(); foreach (var p in map.SpawnPoints) { - var pos = map.ConvertToPreview(p, RenderBounds); + var pos = ConvertToPreview(map, p); var sprite = UnownedSpawn; var offset = new int2(-UnownedSpawn.bounds.Width/2, -UnownedSpawn.bounds.Height/2); @@ -106,13 +107,8 @@ namespace OpenRA.Widgets { sprite = OwnedSpawn; offset = new int2(-OwnedSpawn.bounds.Width/2, -OwnedSpawn.bounds.Height/2); - - Game.chrome.lineRenderer.FillRect(new RectangleF( - Game.viewport.Location.X + pos.X + offset.X + 2, - Game.viewport.Location.Y + pos.Y + offset.Y + 2, - 12, 12), colors[p]); + WidgetUtils.FillRectWithColor(new Rectangle(pos.X + offset.X + 2, pos.Y + offset.Y + 2, 12, 12), colors[p]); } - Game.chrome.renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos + offset, "chrome"); } diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index e21ad2c889..4abe1592e7 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -63,7 +63,15 @@ namespace OpenRA.Widgets DrawRGBA(ss, new float2(x, y)); } } - + + public static void FillRectWithColor(Rectangle r, Color c) + { + Game.chrome.lineRenderer.FillRect(new RectangleF( + Game.viewport.Location.X + r.X, + Game.viewport.Location.Y + r.Y, + r.Width, r.Height), c); + } + public static int[] GetBorderSizes(string collection) { var images = new[] { "border-t", "border-b", "border-l", "border-r" };