Convert Renderable to World Coordinates internally.
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user