diff --git a/OpenRA.Game/Graphics/Renderable.cs b/OpenRA.Game/Graphics/Renderable.cs index 23def6dae1..c2846cae0e 100644 --- a/OpenRA.Game/Graphics/Renderable.cs +++ b/OpenRA.Game/Graphics/Renderable.cs @@ -15,48 +15,63 @@ namespace OpenRA.Graphics { public class RenderableComparer : IComparer { + WorldRenderer wr; + public RenderableComparer(WorldRenderer wr) + { + this.wr = wr; + } + public int Compare(Renderable x, Renderable y) { - return x.SortOrder.CompareTo(y.SortOrder); + return x.SortOrder(wr).CompareTo(y.SortOrder(wr)); } } public struct Renderable { readonly Sprite Sprite; - readonly float2 Pos; - readonly int Z; - float Scale; + readonly WPos Pos; + readonly float Scale; // TODO: Fix Parachute and WithShadow so these can be made private public readonly PaletteReference Palette; public readonly int ZOffset; - public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, int zOffset, float scale) + public Renderable(Sprite sprite, WPos pos, int zOffset, PaletteReference palette, float scale) { Sprite = sprite; Pos = pos; Palette = palette; - Z = z; ZOffset = zOffset; Scale = scale; } + public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, int zOffset, float scale) + : this(sprite, new PPos((int)pos.X, (int)pos.Y).ToWPos(0), z + zOffset, palette, scale) { } + public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z) : this(sprite, pos, palette, z, 0, 1f) { } public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, float scale) : this(sprite, pos, palette, z, 0, scale) { } - public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, Palette, Z, ZOffset, newScale); } - public Renderable WithPalette(PaletteReference newPalette) { return new Renderable(Sprite, Pos, newPalette, Z, ZOffset, Scale); } + public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, ZOffset, Palette, newScale); } + public Renderable WithPalette(PaletteReference newPalette) { return new Renderable(Sprite, Pos, ZOffset, newPalette, Scale); } + public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, newOffset, Palette, Scale); } + public Renderable WithPos(WPos pos) { return new Renderable(Sprite, pos, ZOffset, Palette, Scale); } - public Renderable WithPxOffset(float2 offset) { return new Renderable(Sprite, Pos + offset, Palette, Z, ZOffset, Scale); } - public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, Z, newOffset, Scale); } + // Transitional hack + public Renderable WithPxOffset(float2 offset) + { + var x = (int)(Pos.X * Game.CellSize / 1024 + offset.X); + var y = (int)(Pos.Y * Game.CellSize / 1024 + offset.Y); + var z = (int)(Pos.Z * Game.CellSize / 1024); + return new Renderable(Sprite, new PPos(x,y).ToWPos(z), ZOffset, Palette, Scale); + } public void Render(WorldRenderer wr) { - Sprite.DrawAt(Pos - 0.5f*Scale*Sprite.size, Palette.Index, Scale); + Sprite.DrawAt(wr.ScreenPxPosition(Pos) - 0.5f*Scale*Sprite.size, Palette.Index, Scale); } public Size Size @@ -68,6 +83,9 @@ namespace OpenRA.Graphics } } - public int SortOrder { get { return Z + ZOffset; } } + public int SortOrder(WorldRenderer wr) + { + return (int)wr.ScreenZPosition(Pos) + ZOffset; + } } } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index e4a91d7cbb..b43d54ccc1 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -68,7 +68,7 @@ namespace OpenRA.Graphics void DrawRenderables() { var bounds = Game.viewport.WorldBounds(world); - var comparer = new RenderableComparer(); + var comparer = new RenderableComparer(this); var actors = world.FindUnits( bounds.TopLeftAsCPos().ToPPos(), @@ -216,7 +216,7 @@ namespace OpenRA.Graphics { return new int2(Game.CellSize*pos.X/1024, Game.CellSize*(pos.Y - pos.Z)/1024); } - public float ScreenZOffset(WPos pos) { return pos.Z*Game.CellSize/1024f; } + public float ScreenZPosition(WPos pos) { return (pos.Y + pos.Z)*Game.CellSize/1024f; } public int2 ScreenPxOffset(WVec vec) {