diff --git a/OpenRA.Game/Graphics/SheetBuilder.cs b/OpenRA.Game/Graphics/SheetBuilder.cs index 32e06f5883..a6ab4b0bce 100644 --- a/OpenRA.Game/Graphics/SheetBuilder.cs +++ b/OpenRA.Game/Graphics/SheetBuilder.cs @@ -77,7 +77,8 @@ namespace OpenRA.Graphics return (TextureChannel)nextChannel; } - public Sprite Allocate(Size imageSize) + public Sprite Allocate(Size imageSize) { return Allocate(imageSize, float2.Zero); } + public Sprite Allocate(Size imageSize, float2 spriteOffset) { if (imageSize.Width + p.X > current.Size.Width) { @@ -103,7 +104,7 @@ namespace OpenRA.Graphics p = new Point(0,0); } - var rect = new Sprite(current, new Rectangle(p, imageSize), channel); + var rect = new Sprite(current, new Rectangle(p, imageSize), spriteOffset, channel); p.X += imageSize.Width; return rect; diff --git a/OpenRA.Game/Graphics/Sprite.cs b/OpenRA.Game/Graphics/Sprite.cs index 1ebcb9eaad..fca0632536 100644 --- a/OpenRA.Game/Graphics/Sprite.cs +++ b/OpenRA.Game/Graphics/Sprite.cs @@ -18,12 +18,17 @@ namespace OpenRA.Graphics public readonly Sheet sheet; public readonly TextureChannel channel; public readonly float2 size; + public readonly float2 offset; readonly float2[] textureCoords; public Sprite(Sheet sheet, Rectangle bounds, TextureChannel channel) + : this(sheet, bounds, float2.Zero, channel) {} + + public Sprite(Sheet sheet, Rectangle bounds, float2 offset, TextureChannel channel) { - this.bounds = bounds; this.sheet = sheet; + this.bounds = bounds; + this.offset = offset; this.channel = channel; this.size = new float2(bounds.Size); diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index c73485213f..985f194800 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -66,7 +66,7 @@ namespace OpenRA.Graphics Flush(); currentSheet = s.sheet; - Util.FastCreateQuad(vertices, location.ToInt2(), s, paletteIndex, nv, size); + Util.FastCreateQuad(vertices, (location + s.offset).ToInt2(), s, paletteIndex, nv, size); nv += 4; }