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> public class RenderableComparer : IComparer<Renderable>
{ {
WorldRenderer wr;
public RenderableComparer(WorldRenderer wr)
{
this.wr = wr;
}
public int Compare(Renderable x, Renderable y) public int Compare(Renderable x, Renderable y)
{ {
return x.SortOrder.CompareTo(y.SortOrder); return x.SortOrder(wr).CompareTo(y.SortOrder(wr));
} }
} }
public struct Renderable public struct Renderable
{ {
readonly Sprite Sprite; readonly Sprite Sprite;
readonly float2 Pos; readonly WPos Pos;
readonly int Z; readonly float Scale;
float Scale;
// TODO: Fix Parachute and WithShadow so these can be made private // TODO: Fix Parachute and WithShadow so these can be made private
public readonly PaletteReference Palette; public readonly PaletteReference Palette;
public readonly int ZOffset; 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; Sprite = sprite;
Pos = pos; Pos = pos;
Palette = palette; Palette = palette;
Z = z;
ZOffset = zOffset; ZOffset = zOffset;
Scale = scale; 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) public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z)
: this(sprite, pos, palette, z, 0, 1f) { } : this(sprite, pos, palette, z, 0, 1f) { }
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, float scale) public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, float scale)
: this(sprite, pos, palette, z, 0, scale) { } : this(sprite, pos, palette, z, 0, scale) { }
public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, Palette, Z, ZOffset, newScale); } public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, ZOffset, Palette, newScale); }
public Renderable WithPalette(PaletteReference newPalette) { return new Renderable(Sprite, Pos, newPalette, Z, ZOffset, Scale); } 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); } // Transitional hack
public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, Z, newOffset, Scale); } 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) 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 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;
}
} }
} }

View File

@@ -68,7 +68,7 @@ namespace OpenRA.Graphics
void DrawRenderables() void DrawRenderables()
{ {
var bounds = Game.viewport.WorldBounds(world); var bounds = Game.viewport.WorldBounds(world);
var comparer = new RenderableComparer(); var comparer = new RenderableComparer(this);
var actors = world.FindUnits( var actors = world.FindUnits(
bounds.TopLeftAsCPos().ToPPos(), 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); 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) public int2 ScreenPxOffset(WVec vec)
{ {