Rework multi-resolution sprite handling:
- Sprite.Bounds now refers to rectangles in the source image. Use this when copying pixels, etc. - Sprite.Size now refers to sizes in effective pixel coordinates. Use this when rendering. - Sheet.DPIScale has been removed. - "Density" term is introduced to refer to the number of artwork pixels per effective pixel.
This commit is contained in:
@@ -24,6 +24,7 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
Sprite stripe, logo;
|
||||
|
||||
Sheet lastSheet;
|
||||
int lastDensity;
|
||||
Size lastResolution;
|
||||
|
||||
string[] messages = { "Loading..." };
|
||||
@@ -36,13 +37,14 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
messages = info["Text"].Split(',');
|
||||
}
|
||||
|
||||
public override void DisplayInner(Renderer r, Sheet s)
|
||||
public override void DisplayInner(Renderer r, Sheet s, int density)
|
||||
{
|
||||
if (s != lastSheet)
|
||||
if (s != lastSheet || density != lastDensity)
|
||||
{
|
||||
lastSheet = s;
|
||||
logo = new Sprite(s, new Rectangle(0, 0, 256, 256), TextureChannel.RGBA);
|
||||
stripe = new Sprite(s, new Rectangle(258, 0, 253, 256), TextureChannel.RGBA);
|
||||
lastDensity = density;
|
||||
logo = CreateSprite(s, density, new Rectangle(0, 0, 256, 256));
|
||||
stripe = CreateSprite(s, density, new Rectangle(258, 0, 253, 256));
|
||||
}
|
||||
|
||||
if (r.Resolution != lastResolution)
|
||||
|
||||
@@ -25,14 +25,16 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
Rectangle bounds;
|
||||
|
||||
Sheet lastSheet;
|
||||
int lastDensity;
|
||||
Size lastResolution;
|
||||
|
||||
public override void DisplayInner(Renderer r, Sheet s)
|
||||
public override void DisplayInner(Renderer r, Sheet s, int density)
|
||||
{
|
||||
if (s != lastSheet)
|
||||
if (s != lastSheet || density != lastDensity)
|
||||
{
|
||||
lastSheet = s;
|
||||
sprite = new Sprite(s, new Rectangle(0, 0, 1024, 480), TextureChannel.RGBA);
|
||||
lastDensity = density;
|
||||
sprite = CreateSprite(s, density, new Rectangle(0, 0, 1024, 480));
|
||||
}
|
||||
|
||||
if (r.Resolution != lastResolution)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Primitives;
|
||||
|
||||
namespace OpenRA.Mods.Common.LoadScreens
|
||||
{
|
||||
@@ -21,7 +22,9 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
|
||||
protected Dictionary<string, string> Info { get; private set; }
|
||||
float dpiScale = 1;
|
||||
|
||||
Sheet sheet;
|
||||
int density;
|
||||
|
||||
public override void Init(ModData modData, Dictionary<string, string> info)
|
||||
{
|
||||
@@ -29,7 +32,7 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
Info = info;
|
||||
}
|
||||
|
||||
public abstract void DisplayInner(Renderer r, Sheet s);
|
||||
public abstract void DisplayInner(Renderer r, Sheet s, int density);
|
||||
|
||||
public override void Display()
|
||||
{
|
||||
@@ -58,33 +61,37 @@ namespace OpenRA.Mods.Common.LoadScreens
|
||||
if (sheet == null && Info.ContainsKey("Image"))
|
||||
{
|
||||
var key = "Image";
|
||||
float sheetScale = 1;
|
||||
density = 1;
|
||||
if (dpiScale > 2 && Info.ContainsKey("Image3x"))
|
||||
{
|
||||
key = "Image3x";
|
||||
sheetScale = 3;
|
||||
density = 3;
|
||||
}
|
||||
else if (dpiScale > 1 && Info.ContainsKey("Image2x"))
|
||||
{
|
||||
key = "Image2x";
|
||||
sheetScale = 2;
|
||||
density = 2;
|
||||
}
|
||||
|
||||
using (var stream = ModData.DefaultFileSystem.Open(Info[key]))
|
||||
{
|
||||
sheet = new Sheet(SheetType.BGRA, stream);
|
||||
sheet.GetTexture().ScaleFilter = TextureScaleFilter.Linear;
|
||||
sheet.DPIScale = sheetScale;
|
||||
}
|
||||
}
|
||||
|
||||
Game.Renderer.BeginUI();
|
||||
DisplayInner(Game.Renderer, sheet);
|
||||
DisplayInner(Game.Renderer, sheet, density);
|
||||
Game.Renderer.EndFrame(new NullInputHandler());
|
||||
|
||||
lastUpdate.Restart();
|
||||
}
|
||||
|
||||
protected static Sprite CreateSprite(Sheet s, int density, Rectangle rect)
|
||||
{
|
||||
return new Sprite(s, density * rect, TextureChannel.RGBA, 1f / density);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && sheet != null)
|
||||
|
||||
@@ -164,8 +164,8 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
Game.Renderer.RgbaSpriteRenderer.DrawSprite(mixerSprite, RenderOrigin, new float2(RenderBounds.Size));
|
||||
|
||||
var sprite = ChromeProvider.GetImage("lobby-bits", "colorpicker");
|
||||
var pos = RenderOrigin + PxFromValue() - new int2(sprite.Bounds.Width, sprite.Bounds.Height) / 2;
|
||||
WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X + 1, pos.Y + 1, sprite.Bounds.Width - 2, sprite.Bounds.Height - 2), Color);
|
||||
var pos = RenderOrigin + PxFromValue() - new int2((int)sprite.Size.X, (int)sprite.Size.Y) / 2;
|
||||
WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X + 1, pos.Y + 1, (int)sprite.Size.X - 2, (int)sprite.Size.Y - 2), Color);
|
||||
Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,10 +48,10 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
var image = ChromeProvider.GetImage("scrollbar", IsDisabled() ? "down_pressed" : "down_arrow");
|
||||
var rb = RenderBounds;
|
||||
|
||||
WidgetUtils.DrawRGBA(image, stateOffset + new float2((rb.Right - (rb.Height + image.Bounds.Width) / 2), rb.Top + (rb.Height - image.Bounds.Height) / 2));
|
||||
WidgetUtils.DrawRGBA(image, stateOffset + new float2(rb.Right - (rb.Height + image.Size.X) / 2, rb.Top + (rb.Height - image.Size.Y) / 2));
|
||||
|
||||
var separator = ChromeProvider.GetImage(SeparatorCollection, SeparatorImage);
|
||||
WidgetUtils.DrawRGBA(separator, new float2(-3, 0) + new float2(rb.Right - rb.Height + 4, rb.Top + (rb.Height - separator.Bounds.Height) / 2));
|
||||
WidgetUtils.DrawRGBA(separator, stateOffset + new float2(-3, 0) + new float2(rb.Right - rb.Height + 4, rb.Top + (rb.Height - separator.Size.Y) / 2));
|
||||
}
|
||||
|
||||
public override Widget Clone() { return new DropDownButtonWidget(this); }
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
Game.Renderer.RgbaSpriteRenderer.DrawSprite(hueSprite, ro, new float2(rb.Size));
|
||||
|
||||
var sprite = ChromeProvider.GetImage("lobby-bits", "huepicker");
|
||||
var pos = RenderOrigin + new int2(PxFromValue(Value).Clamp(0, rb.Width - 1) - sprite.Bounds.Width / 2, (rb.Height - sprite.Bounds.Height) / 2);
|
||||
var pos = RenderOrigin + new int2(PxFromValue(Value).Clamp(0, rb.Width - 1) - (int)sprite.Size.X / 2, (rb.Height - (int)sprite.Size.Y) / 2);
|
||||
Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +252,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready)
|
||||
return;
|
||||
|
||||
var spawnSize = new float2(ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").Bounds.Size);
|
||||
var spawnSize = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").Size.XY;
|
||||
var selectedSpawn = preview.SpawnPoints
|
||||
.Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp, preview.GridType), i))
|
||||
.Where(a => ((a.First - mi.Location).ToFloat2() / spawnSize * 2).LengthSquared <= 1)
|
||||
|
||||
@@ -191,10 +191,10 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
var owned = colors.ContainsKey(p);
|
||||
var pos = ConvertToPreview(p, gridType);
|
||||
var sprite = owned ? spawnClaimed : spawnUnclaimed;
|
||||
var offset = new int2(sprite.Bounds.Width, sprite.Bounds.Height) / 2;
|
||||
var offset = sprite.Size.XY.ToInt2() / 2;
|
||||
|
||||
if (owned)
|
||||
WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X - offset.X + 1, pos.Y - offset.Y + 1, sprite.Bounds.Width - 2, sprite.Bounds.Height - 2), colors[p]);
|
||||
WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X - offset.X + 1, pos.Y - offset.Y + 1, (int)sprite.Size.X - 2, (int)sprite.Size.Y - 2), colors[p]);
|
||||
|
||||
Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos - offset);
|
||||
var number = Convert.ToChar('A' + spawnPoints.IndexOf(p)).ToString();
|
||||
|
||||
@@ -47,22 +47,27 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
public static void FillRectWithSprite(Rectangle r, Sprite s)
|
||||
{
|
||||
for (var x = r.Left; x < r.Right; x += (int)s.Size.X)
|
||||
for (var y = r.Top; y < r.Bottom; y += (int)s.Size.Y)
|
||||
var scale = s.Size.X / s.Bounds.Width;
|
||||
for (var x = (float)r.Left; x < r.Right; x += s.Size.X)
|
||||
{
|
||||
for (var y = (float)r.Top; y < r.Bottom; y += s.Size.Y)
|
||||
{
|
||||
var ss = s;
|
||||
var left = new int2(r.Right - x, r.Bottom - y);
|
||||
if (left.X < (int)s.Size.X || left.Y < (int)s.Size.Y)
|
||||
var dx = r.Right - x;
|
||||
var dy = r.Bottom - y;
|
||||
if (dx < s.Size.X || dy < s.Size.Y)
|
||||
{
|
||||
var rr = new Rectangle(s.Bounds.Left,
|
||||
var rr = new Rectangle(
|
||||
s.Bounds.Left,
|
||||
s.Bounds.Top,
|
||||
Math.Min(left.X, (int)s.Size.X),
|
||||
Math.Min(left.Y, (int)s.Size.Y));
|
||||
ss = new Sprite(s.Sheet, rr, s.Channel);
|
||||
Math.Min(s.Bounds.Width, (int)(dx / scale)),
|
||||
Math.Min(s.Bounds.Height, (int)(dy / scale)));
|
||||
ss = new Sprite(s.Sheet, rr, s.Channel, scale);
|
||||
}
|
||||
|
||||
DrawRGBA(ss, new float2(x, y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void FillRectWithColor(Rectangle r, Color c)
|
||||
|
||||
Reference in New Issue
Block a user