Fix UI rendering of offset sprites.

This commit is contained in:
Paul Chote
2013-11-30 22:13:53 +13:00
parent 21f2e88d83
commit 6881dcc710
13 changed files with 72 additions and 38 deletions

View File

@@ -56,6 +56,7 @@ namespace OpenRA.Widgets
Sprite sprite = null; Sprite sprite = null;
string cachedImage = null; string cachedImage = null;
int cachedFrame = -1; int cachedFrame = -1;
float2 cachedOffset = float2.Zero;
public override void Draw() public override void Draw()
{ {
@@ -68,9 +69,10 @@ namespace OpenRA.Widgets
sprite = Game.modData.SpriteLoader.LoadAllSprites(image)[frame]; sprite = Game.modData.SpriteLoader.LoadAllSprites(image)[frame];
cachedImage = image; cachedImage = image;
cachedFrame = frame; 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 public int FrameCount

View File

@@ -29,14 +29,14 @@ namespace OpenRA.Widgets
Game.Renderer.RgbaSpriteRenderer.DrawSprite(s,pos); 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) public static void DrawPanel(string collection, Rectangle Bounds)

View File

@@ -197,11 +197,14 @@ namespace OpenRA.Mods.Cnc.Widgets
public override void Draw() public override void Draw()
{ {
var iconSize = new float2(64, 48);
var iconOffset = 0.5f * iconSize;
overlayFont = Game.Renderer.Fonts["TinyBold"]; 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); queuedOffset = new float2(4, 2);
holdOffset = new float2(32, 24) - overlayFont.Measure(HoldText) / 2; holdOffset = iconOffset - overlayFont.Measure(HoldText) / 2;
readyOffset = new float2(32, 24) - overlayFont.Measure(ReadyText) / 2; readyOffset = iconOffset - overlayFont.Measure(ReadyText) / 2;
if (CurrentQueue == null) if (CurrentQueue == null)
return; return;
@@ -215,7 +218,7 @@ namespace OpenRA.Mods.Cnc.Widgets
// Icons // Icons
foreach (var icon in icons.Values) foreach (var icon in icons.Values)
{ {
WidgetUtils.DrawSHP(icon.Sprite, icon.Pos, worldRenderer); WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, worldRenderer);
// Build progress // Build progress
if (icon.Queued.Count > 0) if (icon.Queued.Count > 0)
@@ -225,10 +228,10 @@ namespace OpenRA.Mods.Cnc.Widgets
() => (first.TotalTime - first.RemainingTime) () => (first.TotalTime - first.RemainingTime)
* (clock.CurrentSequence.Length - 1) / first.TotalTime); * (clock.CurrentSequence.Length - 1) / first.TotalTime);
clock.Tick(); 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)) 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 // Overlays

View File

@@ -89,10 +89,13 @@ namespace OpenRA.Mods.Cnc.Widgets
public override void Draw() public override void Draw()
{ {
var iconSize = new float2(64, 48);
var iconOffset = 0.5f * iconSize;
overlayFont = Game.Renderer.Fonts["TinyBold"]; overlayFont = Game.Renderer.Fonts["TinyBold"];
holdOffset = new float2(32, 24) - overlayFont.Measure(HoldText) / 2; holdOffset = iconOffset - overlayFont.Measure(HoldText) / 2;
readyOffset = new float2(32, 24) - overlayFont.Measure(ReadyText) / 2; readyOffset = iconOffset - overlayFont.Measure(ReadyText) / 2;
timeOffset = new float2(32, 24) - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2; timeOffset = iconOffset - overlayFont.Measure(WidgetUtils.FormatTime(0)) / 2;
// Background // Background
foreach (var rect in icons.Keys) foreach (var rect in icons.Keys)
@@ -101,14 +104,14 @@ namespace OpenRA.Mods.Cnc.Widgets
// Icons // Icons
foreach (var p in icons.Values) foreach (var p in icons.Values)
{ {
WidgetUtils.DrawSHP(p.Sprite, p.Pos, worldRenderer); WidgetUtils.DrawSHPCentered(p.Sprite, p.Pos + iconOffset, worldRenderer);
// Charge progress // Charge progress
clock.PlayFetchIndex("idle", clock.PlayFetchIndex("idle",
() => (p.Power.TotalTime - p.Power.RemainingTime) () => (p.Power.TotalTime - p.Power.RemainingTime)
* (clock.CurrentSequence.Length - 1) / p.Power.TotalTime); * (clock.CurrentSequence.Length - 1) / p.Power.TotalTime);
clock.Tick(); clock.Tick();
WidgetUtils.DrawSHP(clock.Image, p.Pos, worldRenderer); WidgetUtils.DrawSHPCentered(clock.Image, p.Pos + iconOffset, worldRenderer);
} }
// Overlay // Overlay

View File

@@ -203,6 +203,7 @@ namespace OpenRA.Mods.RA.Widgets
string paletteCollection = "palette-" + world.LocalPlayer.Country.Race; string paletteCollection = "palette-" + world.LocalPlayer.Country.Race;
float2 origin = new float2(paletteOrigin.X + 9, paletteOrigin.Y + 9); float2 origin = new float2(paletteOrigin.X + 9, paletteOrigin.Y + 9);
var iconOffset = 0.5f * new float2(IconWidth, IconHeight);
var x = 0; var x = 0;
var y = 0; var y = 0;
@@ -233,7 +234,7 @@ namespace OpenRA.Mods.RA.Widgets
var drawPos = new float2(rect.Location); var drawPos = new float2(rect.Location);
var icon = new Animation(RenderSimple.GetImage(item)); var icon = new Animation(RenderSimple.GetImage(item));
icon.Play(item.Traits.Get<TooltipInfo>().Icon); icon.Play(item.Traits.Get<TooltipInfo>().Icon);
WidgetUtils.DrawSHP(icon.Image, drawPos, worldRenderer); WidgetUtils.DrawSHPCentered(icon.Image, drawPos + iconOffset, worldRenderer);
var firstOfThis = queue.AllQueued().FirstOrDefault(a => a.Item == item.Name); var firstOfThis = queue.AllQueued().FirstOrDefault(a => a.Item == item.Name);
@@ -248,7 +249,7 @@ namespace OpenRA.Mods.RA.Widgets
() => (firstOfThis.TotalTime - firstOfThis.RemainingTime) () => (firstOfThis.TotalTime - firstOfThis.RemainingTime)
* (clock.CurrentSequence.Length - 1) / firstOfThis.TotalTime); * (clock.CurrentSequence.Length - 1) / firstOfThis.TotalTime);
clock.Tick(); clock.Tick();
WidgetUtils.DrawSHP(clock.Image, drawPos, worldRenderer); WidgetUtils.DrawSHPCentered(clock.Image, drawPos + iconOffset, worldRenderer);
if (queue.CurrentItem() == firstOfThis) if (queue.CurrentItem() == firstOfThis)
textBits.Add(Pair.New(overlayPos, GetOverlayForItem(firstOfThis))); textBits.Add(Pair.New(overlayPos, GetOverlayForItem(firstOfThis)));
@@ -269,7 +270,7 @@ namespace OpenRA.Mods.RA.Widgets
if (x != 0) y++; if (x != 0) y++;
foreach (var ob in overlayBits) 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"]; var font = Game.Renderer.Fonts["TinyBold"];
foreach (var tb in textBits) foreach (var tb in textBits)

View File

@@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets
WorldRenderer worldRenderer; WorldRenderer worldRenderer;
Dictionary<ProductionQueue, Animation> clocks; Dictionary<ProductionQueue, Animation> clocks;
public int IconWidth = 32;
public int IconHeight = 24;
public int IconSpacing = 8;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer) public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer)
{ {
@@ -59,6 +63,8 @@ namespace OpenRA.Mods.RA.Widgets
clocks.Add(queue.Trait, new Animation("clock")); clocks.Add(queue.Trait, new Animation("clock"));
} }
} }
var iconSize = new float2(IconWidth, IconHeight);
foreach (var queue in queues) foreach (var queue in queues)
{ {
var current = queue.Trait.CurrentItem(); var current = queue.Trait.CurrentItem();
@@ -71,16 +77,15 @@ namespace OpenRA.Mods.RA.Widgets
var icon = new Animation(RenderSimple.GetImage(actor)); var icon = new Animation(RenderSimple.GetImage(actor));
icon.Play(actor.Traits.Get<TooltipInfo>().Icon); icon.Play(actor.Traits.Get<TooltipInfo>().Icon);
var size = icon.Image.size / new float2(2, 2); var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0);
var location = new float2(RenderBounds.Location) + new float2(queue.i * (int)size.Length, 0); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f);
WidgetUtils.DrawSHP(icon.Image, location, worldRenderer, size);
var clock = clocks[queue.Trait]; var clock = clocks[queue.Trait];
clock.PlayFetchIndex("idle", clock.PlayFetchIndex("idle",
() => current.TotalTime == 0 ? 0 : ((current.TotalTime - current.RemainingTime) () => current.TotalTime == 0 ? 0 : ((current.TotalTime - current.RemainingTime)
* (clock.CurrentSequence.Length - 1) / current.TotalTime)); * (clock.CurrentSequence.Length - 1) / current.TotalTime));
clock.Tick(); 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 tiny = Game.Renderer.Fonts["Tiny"];
var text = GetOverlayForItem(current); var text = GetOverlayForItem(current);

View File

@@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets
WorldRenderer worldRenderer; WorldRenderer worldRenderer;
Dictionary<string, Animation> clocks; Dictionary<string, Animation> clocks;
public int IconWidth = 32;
public int IconHeight = 24;
public int IconSpacing = 8;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer) public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer)
{ {
@@ -61,22 +65,24 @@ namespace OpenRA.Mods.RA.Widgets
clocks.Add(power.a.Key, new Animation("clock")); clocks.Add(power.a.Key, new Animation("clock"));
} }
} }
var iconSize = new float2(IconWidth, IconHeight);
foreach (var power in powers) foreach (var power in powers)
{ {
var item = power.a.Value; var item = power.a.Value;
if (item == null || item.Info == null || item.Info.Icon == null) if (item == null || item.Info == null || item.Info.Icon == null)
continue; continue;
icon.Play(item.Info.Icon); icon.Play(item.Info.Icon);
var size = icon.Image.size / new float2(2, 2); var location = new float2(RenderBounds.Location) + new float2(power.i * (IconWidth + IconSpacing), 0);
var location = new float2(RenderBounds.Location) + new float2(power.i * (int)size.Length, 0); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f);
WidgetUtils.DrawSHP(icon.Image, location, worldRenderer, size);
var clock = clocks[power.a.Key]; var clock = clocks[power.a.Key];
clock.PlayFetchIndex("idle", clock.PlayFetchIndex("idle",
() => item.TotalTime == 0 ? 0 : ((item.TotalTime - item.RemainingTime) () => item.TotalTime == 0 ? 0 : ((item.TotalTime - item.RemainingTime)
* (clock.CurrentSequence.Length - 1) / item.TotalTime)); * (clock.CurrentSequence.Length - 1) / item.TotalTime));
clock.Tick(); 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 tiny = Game.Renderer.Fonts["Tiny"];
var text = GetOverlayForItem(item); var text = GetOverlayForItem(item);

View File

@@ -23,6 +23,9 @@ namespace OpenRA.Mods.RA.Widgets
[Translate] public string ReadyText = ""; [Translate] public string ReadyText = "";
[Translate] public string HoldText = ""; [Translate] public string HoldText = "";
public int IconWidth = 64;
public int IconHeight = 48;
Animation icon; Animation icon;
Animation clock; Animation clock;
readonly List<Pair<Rectangle, Action<MouseInput>>> buttons = new List<Pair<Rectangle,Action<MouseInput>>>(); readonly List<Pair<Rectangle, Action<MouseInput>>> buttons = new List<Pair<Rectangle,Action<MouseInput>>>();
@@ -84,10 +87,11 @@ namespace OpenRA.Mods.RA.Widgets
WidgetUtils.DrawRGBA(WidgetUtils.GetChromeImage(world, "specialbin-bottom"), new float2(rectBounds.X, rectBounds.Y + numPowers * 51)); WidgetUtils.DrawRGBA(WidgetUtils.GetChromeImage(world, "specialbin-bottom"), new float2(rectBounds.X, rectBounds.Y + numPowers * 51));
// HACK: Hack Hack Hack // HACK: Hack Hack Hack
rectBounds.Width = 69; rectBounds.Width = IconWidth + 5;
rectBounds.Height = 10 + numPowers * 51 + 21; rectBounds.Height = 31 + numPowers * (IconHeight + 3);
var y = rectBounds.Y + 10; var y = rectBounds.Y + 10;
var iconSize = new float2(IconWidth, IconHeight);
foreach (var kv in powers) foreach (var kv in powers)
{ {
var sp = kv.Value; 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", clock.PlayFetchIndex("idle",
() => sp.TotalTime == 0 ? clock.CurrentSequence.Length - 1 : (sp.TotalTime - sp.RemainingTime) () => sp.TotalTime == 0 ? clock.CurrentSequence.Length - 1 : (sp.TotalTime - sp.RemainingTime)
* (clock.CurrentSequence.Length - 1) / sp.TotalTime); * (clock.CurrentSequence.Length - 1) / sp.TotalTime);
clock.Tick(); 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 overlay = sp.Ready ? ReadyText : sp.Active ? null : HoldText;
var font = Game.Renderer.Fonts["TinyBold"]; var font = Game.Renderer.Fonts["TinyBold"];

View File

@@ -30,8 +30,10 @@ Background@COLOR_CHOOSER:
Width:144 Width:144
Height:72 Height:72
ShpImage@FACT: ShpImage@FACT:
X:160 X:153
Y:13 Y:1
Width:80
Height:73
Image:fact Image:fact
Palette:colorpicker Palette:colorpicker
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON:

View File

@@ -30,8 +30,10 @@ Background@COLOR_CHOOSER:
Width:144 Width:144
Height:72 Height:72
ShpImage@FACT: ShpImage@FACT:
X:160 X:153
Y:8 Y:1
Width:80
Height:73
Image:DATA.R8 Image:DATA.R8
Frame:1936 Frame:1936
Palette:colorpicker Palette:colorpicker

View File

@@ -150,6 +150,8 @@ Container@PLAYER_WIDGETS:
SupportPowerBin@INGAME_POWERS_BIN: SupportPowerBin@INGAME_POWERS_BIN:
X:0 X:0
Y:25 Y:25
IconWidth: 60
IconHeight: 48
ReadyText: READY ReadyText: READY
HoldText: ON HOLD HoldText: ON HOLD
BuildPalette@INGAME_BUILD_PALETTE: BuildPalette@INGAME_BUILD_PALETTE:

View File

@@ -30,8 +30,10 @@ Background@COLOR_CHOOSER:
Width:144 Width:144
Height:72 Height:72
ShpImage@FACT: ShpImage@FACT:
X:156 X:153
Y:1 Y:1
Width:80
Height:73
Image:fact Image:fact
Palette:colorpicker Palette:colorpicker
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON:

View File

@@ -30,8 +30,10 @@ Background@COLOR_CHOOSER:
Width:144 Width:144
Height:72 Height:72
ShpImage@GTCNST: ShpImage@GTCNST:
X:121 X:153
Y:0-68 Y:1-40
Width:80
Height:73
Image:gtcnstmk Image:gtcnstmk
Palette:colorpicker Palette:colorpicker
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON: