Convert Renderable to World Coordinates internally.

This commit is contained in:
Paul Chote
2013-05-14 19:14:03 +12:00
parent d878c96343
commit fb17654ea0
2 changed files with 32 additions and 14 deletions

View File

@@ -15,48 +15,63 @@ namespace OpenRA.Graphics
{
public class RenderableComparer : IComparer<Renderable>
{
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;
}
}
}