diff --git a/OpenRA.Game/Widgets/ShpImageWidget.cs b/OpenRA.Game/Widgets/ShpImageWidget.cs index 4c8cb912a7..5c1dabaa0b 100644 --- a/OpenRA.Game/Widgets/ShpImageWidget.cs +++ b/OpenRA.Game/Widgets/ShpImageWidget.cs @@ -56,6 +56,7 @@ namespace OpenRA.Widgets Sprite sprite = null; string cachedImage = null; int cachedFrame = -1; + float2 cachedOffset = float2.Zero; public override void Draw() { @@ -68,9 +69,10 @@ namespace OpenRA.Widgets sprite = Game.modData.SpriteLoader.LoadAllSprites(image)[frame]; cachedImage = image; cachedFrame = frame; + cachedOffset = 0.5f * (new float2(RenderBounds.Size) - sprite.size); } - Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer.Palette(palette)); + Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin + cachedOffset, worldRenderer.Palette(palette)); } public int FrameCount diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 0ab460b639..1cfbefb13f 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -29,14 +29,14 @@ namespace OpenRA.Widgets Game.Renderer.RgbaSpriteRenderer.DrawSprite(s,pos); } - public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr) + public static void DrawSHPCentered(Sprite s, float2 pos, WorldRenderer wr) { - Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome")); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * s.size, wr.Palette("chrome")); } - public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size) + public static void DrawSHPCentered(Sprite s, float2 pos, WorldRenderer wr, float scale) { - Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"), size); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * scale * s.size, wr.Palette("chrome"), scale * s.size); } public static void DrawPanel(string collection, Rectangle Bounds) diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs index 8dea9c77eb..3e299090c8 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs @@ -197,11 +197,14 @@ namespace OpenRA.Mods.Cnc.Widgets public override void Draw() { + var iconSize = new float2(64, 48); + var iconOffset = 0.5f * iconSize; + overlayFont = Game.Renderer.Fonts["TinyBold"]; - timeOffset = new float2(32, 24) - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2; + timeOffset = iconOffset - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2; queuedOffset = new float2(4, 2); - holdOffset = new float2(32, 24) - overlayFont.Measure(HoldText) / 2; - readyOffset = new float2(32, 24) - overlayFont.Measure(ReadyText) / 2; + holdOffset = iconOffset - overlayFont.Measure(HoldText) / 2; + readyOffset = iconOffset - overlayFont.Measure(ReadyText) / 2; if (CurrentQueue == null) return; @@ -215,7 +218,7 @@ namespace OpenRA.Mods.Cnc.Widgets // Icons foreach (var icon in icons.Values) { - WidgetUtils.DrawSHP(icon.Sprite, icon.Pos, worldRenderer); + WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, worldRenderer); // Build progress if (icon.Queued.Count > 0) @@ -225,10 +228,10 @@ namespace OpenRA.Mods.Cnc.Widgets () => (first.TotalTime - first.RemainingTime) * (clock.CurrentSequence.Length - 1) / first.TotalTime); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, icon.Pos, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, icon.Pos + iconOffset, worldRenderer); } else if (!buildableItems.Any(a => a.Name == icon.Name)) - WidgetUtils.DrawSHP(cantBuild.Image, icon.Pos, worldRenderer); + WidgetUtils.DrawSHPCentered(cantBuild.Image, icon.Pos + iconOffset, worldRenderer); } // Overlays diff --git a/OpenRA.Mods.Cnc/Widgets/SupportPowersWidget.cs b/OpenRA.Mods.Cnc/Widgets/SupportPowersWidget.cs index dec4cd1389..3a970da1b9 100755 --- a/OpenRA.Mods.Cnc/Widgets/SupportPowersWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/SupportPowersWidget.cs @@ -89,10 +89,13 @@ namespace OpenRA.Mods.Cnc.Widgets public override void Draw() { + var iconSize = new float2(64, 48); + var iconOffset = 0.5f * iconSize; + overlayFont = Game.Renderer.Fonts["TinyBold"]; - holdOffset = new float2(32, 24) - overlayFont.Measure(HoldText) / 2; - readyOffset = new float2(32, 24) - overlayFont.Measure(ReadyText) / 2; - timeOffset = new float2(32, 24) - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2; + holdOffset = iconOffset - overlayFont.Measure(HoldText) / 2; + readyOffset = iconOffset - overlayFont.Measure(ReadyText) / 2; + timeOffset = iconOffset - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2; // Background foreach (var rect in icons.Keys) @@ -101,14 +104,14 @@ namespace OpenRA.Mods.Cnc.Widgets // Icons foreach (var p in icons.Values) { - WidgetUtils.DrawSHP(p.Sprite, p.Pos, worldRenderer); + WidgetUtils.DrawSHPCentered(p.Sprite, p.Pos + iconOffset, worldRenderer); // Charge progress clock.PlayFetchIndex("idle", () => (p.Power.TotalTime - p.Power.RemainingTime) * (clock.CurrentSequence.Length - 1) / p.Power.TotalTime); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, p.Pos, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, p.Pos + iconOffset, worldRenderer); } // Overlay diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index db0fe250f4..e6fd815b5c 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -203,6 +203,7 @@ namespace OpenRA.Mods.RA.Widgets string paletteCollection = "palette-" + world.LocalPlayer.Country.Race; float2 origin = new float2(paletteOrigin.X + 9, paletteOrigin.Y + 9); + var iconOffset = 0.5f * new float2(IconWidth, IconHeight); var x = 0; var y = 0; @@ -233,7 +234,7 @@ namespace OpenRA.Mods.RA.Widgets var drawPos = new float2(rect.Location); var icon = new Animation(RenderSimple.GetImage(item)); icon.Play(item.Traits.Get().Icon); - WidgetUtils.DrawSHP(icon.Image, drawPos, worldRenderer); + WidgetUtils.DrawSHPCentered(icon.Image, drawPos + iconOffset, worldRenderer); var firstOfThis = queue.AllQueued().FirstOrDefault(a => a.Item == item.Name); @@ -248,7 +249,7 @@ namespace OpenRA.Mods.RA.Widgets () => (firstOfThis.TotalTime - firstOfThis.RemainingTime) * (clock.CurrentSequence.Length - 1) / firstOfThis.TotalTime); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, drawPos, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, drawPos + iconOffset, worldRenderer); if (queue.CurrentItem() == firstOfThis) textBits.Add(Pair.New(overlayPos, GetOverlayForItem(firstOfThis))); @@ -269,7 +270,7 @@ namespace OpenRA.Mods.RA.Widgets if (x != 0) y++; foreach (var ob in overlayBits) - WidgetUtils.DrawSHP(ob.First, ob.Second, worldRenderer); + WidgetUtils.DrawSHPCentered(ob.First, ob.Second + iconOffset, worldRenderer); var font = Game.Renderer.Fonts["TinyBold"]; foreach (var tb in textBits) diff --git a/OpenRA.Mods.RA/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.RA/Widgets/ObserverProductionIconsWidget.cs index af7ff43802..8bc0abc7d3 100644 --- a/OpenRA.Mods.RA/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.RA/Widgets/ObserverProductionIconsWidget.cs @@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets WorldRenderer worldRenderer; Dictionary clocks; + public int IconWidth = 32; + public int IconHeight = 24; + public int IconSpacing = 8; + [ObjectCreator.UseCtor] public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer) { @@ -59,6 +63,8 @@ namespace OpenRA.Mods.RA.Widgets clocks.Add(queue.Trait, new Animation("clock")); } } + + var iconSize = new float2(IconWidth, IconHeight); foreach (var queue in queues) { var current = queue.Trait.CurrentItem(); @@ -71,16 +77,15 @@ namespace OpenRA.Mods.RA.Widgets var icon = new Animation(RenderSimple.GetImage(actor)); icon.Play(actor.Traits.Get().Icon); - var size = icon.Image.size / new float2(2, 2); - var location = new float2(RenderBounds.Location) + new float2(queue.i * (int)size.Length, 0); - WidgetUtils.DrawSHP(icon.Image, location, worldRenderer, size); + var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); + WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); var clock = clocks[queue.Trait]; clock.PlayFetchIndex("idle", () => current.TotalTime == 0 ? 0 : ((current.TotalTime - current.RemainingTime) * (clock.CurrentSequence.Length - 1) / current.TotalTime)); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, location, worldRenderer, size); + WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); var tiny = Game.Renderer.Fonts["Tiny"]; var text = GetOverlayForItem(current); diff --git a/OpenRA.Mods.RA/Widgets/ObserverSupportPowerIconsWidget.cs b/OpenRA.Mods.RA/Widgets/ObserverSupportPowerIconsWidget.cs index e192e162c1..408510763f 100644 --- a/OpenRA.Mods.RA/Widgets/ObserverSupportPowerIconsWidget.cs +++ b/OpenRA.Mods.RA/Widgets/ObserverSupportPowerIconsWidget.cs @@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets WorldRenderer worldRenderer; Dictionary clocks; + public int IconWidth = 32; + public int IconHeight = 24; + public int IconSpacing = 8; + [ObjectCreator.UseCtor] public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer) { @@ -61,22 +65,24 @@ namespace OpenRA.Mods.RA.Widgets clocks.Add(power.a.Key, new Animation("clock")); } } + + var iconSize = new float2(IconWidth, IconHeight); foreach (var power in powers) { var item = power.a.Value; if (item == null || item.Info == null || item.Info.Icon == null) continue; + icon.Play(item.Info.Icon); - var size = icon.Image.size / new float2(2, 2); - var location = new float2(RenderBounds.Location) + new float2(power.i * (int)size.Length, 0); - WidgetUtils.DrawSHP(icon.Image, location, worldRenderer, size); + var location = new float2(RenderBounds.Location) + new float2(power.i * (IconWidth + IconSpacing), 0); + WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); var clock = clocks[power.a.Key]; clock.PlayFetchIndex("idle", () => item.TotalTime == 0 ? 0 : ((item.TotalTime - item.RemainingTime) * (clock.CurrentSequence.Length - 1) / item.TotalTime)); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, location, worldRenderer, size); + WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); var tiny = Game.Renderer.Fonts["Tiny"]; var text = GetOverlayForItem(item); diff --git a/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs b/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs index 27a4f32dbb..13436ab4f6 100755 --- a/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs +++ b/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs @@ -23,6 +23,9 @@ namespace OpenRA.Mods.RA.Widgets [Translate] public string ReadyText = ""; [Translate] public string HoldText = ""; + public int IconWidth = 64; + public int IconHeight = 48; + Animation icon; Animation clock; readonly List>> buttons = new List>>(); @@ -84,10 +87,11 @@ namespace OpenRA.Mods.RA.Widgets WidgetUtils.DrawRGBA(WidgetUtils.GetChromeImage(world, "specialbin-bottom"), new float2(rectBounds.X, rectBounds.Y + numPowers * 51)); // HACK: Hack Hack Hack - rectBounds.Width = 69; - rectBounds.Height = 10 + numPowers * 51 + 21; + rectBounds.Width = IconWidth + 5; + rectBounds.Height = 31 + numPowers * (IconHeight + 3); var y = rectBounds.Y + 10; + var iconSize = new float2(IconWidth, IconHeight); foreach (var kv in powers) { var sp = kv.Value; @@ -137,14 +141,14 @@ namespace OpenRA.Mods.RA.Widgets } } - WidgetUtils.DrawSHP(icon.Image, drawPos, worldRenderer); + WidgetUtils.DrawSHPCentered(icon.Image, drawPos + 0.5f * iconSize, worldRenderer); clock.PlayFetchIndex("idle", () => sp.TotalTime == 0 ? clock.CurrentSequence.Length - 1 : (sp.TotalTime - sp.RemainingTime) * (clock.CurrentSequence.Length - 1) / sp.TotalTime); clock.Tick(); - WidgetUtils.DrawSHP(clock.Image, drawPos, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, drawPos + 0.5f * iconSize, worldRenderer); var overlay = sp.Ready ? ReadyText : sp.Active ? null : HoldText; var font = Game.Renderer.Fonts["TinyBold"]; diff --git a/mods/cnc/chrome/dialogs.yaml b/mods/cnc/chrome/dialogs.yaml index 0dd2997576..ea64b03ece 100644 --- a/mods/cnc/chrome/dialogs.yaml +++ b/mods/cnc/chrome/dialogs.yaml @@ -30,8 +30,10 @@ Background@COLOR_CHOOSER: Width:144 Height:72 ShpImage@FACT: - X:160 - Y:13 + X:153 + Y:1 + Width:80 + Height:73 Image:fact Palette:colorpicker Button@RANDOM_BUTTON: diff --git a/mods/d2k/chrome/color-picker.yaml b/mods/d2k/chrome/color-picker.yaml index 5a099fff48..0d4991736e 100644 --- a/mods/d2k/chrome/color-picker.yaml +++ b/mods/d2k/chrome/color-picker.yaml @@ -30,8 +30,10 @@ Background@COLOR_CHOOSER: Width:144 Height:72 ShpImage@FACT: - X:160 - Y:8 + X:153 + Y:1 + Width:80 + Height:73 Image:DATA.R8 Frame:1936 Palette:colorpicker diff --git a/mods/d2k/chrome/ingame.yaml b/mods/d2k/chrome/ingame.yaml index 92876a52a9..d7a96bad48 100644 --- a/mods/d2k/chrome/ingame.yaml +++ b/mods/d2k/chrome/ingame.yaml @@ -150,6 +150,8 @@ Container@PLAYER_WIDGETS: SupportPowerBin@INGAME_POWERS_BIN: X:0 Y:25 + IconWidth: 60 + IconHeight: 48 ReadyText: READY HoldText: ON HOLD BuildPalette@INGAME_BUILD_PALETTE: diff --git a/mods/ra/chrome/color-picker.yaml b/mods/ra/chrome/color-picker.yaml index 543e01b5c3..0daef841a9 100644 --- a/mods/ra/chrome/color-picker.yaml +++ b/mods/ra/chrome/color-picker.yaml @@ -30,8 +30,10 @@ Background@COLOR_CHOOSER: Width:144 Height:72 ShpImage@FACT: - X:156 + X:153 Y:1 + Width:80 + Height:73 Image:fact Palette:colorpicker Button@RANDOM_BUTTON: diff --git a/mods/ts/chrome/color-picker.yaml b/mods/ts/chrome/color-picker.yaml index e7553cd415..6e33ea9771 100644 --- a/mods/ts/chrome/color-picker.yaml +++ b/mods/ts/chrome/color-picker.yaml @@ -30,8 +30,10 @@ Background@COLOR_CHOOSER: Width:144 Height:72 ShpImage@GTCNST: - X:121 - Y:0-68 + X:153 + Y:1-40 + Width:80 + Height:73 Image:gtcnstmk Palette:colorpicker Button@RANDOM_BUTTON: