Fix UI rendering of offset sprites.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets
|
||||
WorldRenderer worldRenderer;
|
||||
Dictionary<ProductionQueue, Animation> 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<TooltipInfo>().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);
|
||||
|
||||
@@ -25,6 +25,10 @@ namespace OpenRA.Mods.RA.Widgets
|
||||
WorldRenderer worldRenderer;
|
||||
Dictionary<string, Animation> 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);
|
||||
|
||||
@@ -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<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));
|
||||
|
||||
// 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"];
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user