Make the guts of Renderable private.

This commit is contained in:
Paul Chote
2013-05-12 03:01:11 +12:00
parent 7719ad1f2d
commit d103a187f6
11 changed files with 59 additions and 46 deletions

View File

@@ -34,12 +34,16 @@ namespace OpenRA.Graphics
public Renderable Image(Actor self, WorldRenderer wr, PaletteReference pal)
{
var p = self.CenterLocation;
var loc = p.ToFloat2() - 0.5f * Animation.Image.size
+ (OffsetFunc != null ? OffsetFunc(wr) : float2.Zero);
var r = new Renderable(Animation.Image, loc, pal, p.Y);
return Image(self, wr, pal, 1f);
}
return ZOffset != 0 ? r.WithZOffset(ZOffset) : r;
public Renderable Image(Actor self, WorldRenderer wr, PaletteReference pal, float scale)
{
var p = self.CenterLocation;
var loc = p.ToFloat2() - 0.5f * scale * Animation.Image.size
+ (OffsetFunc != null ? OffsetFunc(wr) : float2.Zero);
return new Renderable(Animation.Image, loc, pal, p.Y, ZOffset, scale);
}
public static implicit operator AnimationWithOffset(Animation a)

View File

@@ -9,6 +9,7 @@
#endregion
using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Graphics
{
@@ -16,18 +17,20 @@ namespace OpenRA.Graphics
{
public int Compare(Renderable x, Renderable y)
{
return (x.Z + x.ZOffset).CompareTo(y.Z + y.ZOffset);
return x.SortOrder.CompareTo(y.SortOrder);
}
}
public struct Renderable
{
public readonly Sprite Sprite;
public readonly float2 Pos;
readonly Sprite Sprite;
readonly float2 Pos;
readonly int Z;
float Scale;
// TODO: Fix Parachute and WithShadow so these can be made private
public readonly PaletteReference Palette;
public readonly int Z;
public readonly int ZOffset;
public float Scale;
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, int zOffset, float scale)
{
@@ -47,7 +50,24 @@ namespace OpenRA.Graphics
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 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); }
public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, Z, ZOffset, Scale); }
public void Render(WorldRenderer wr)
{
Sprite.DrawAt(Pos, Palette.Index, Scale);
}
public Size Size
{
get
{
var size = (Scale*Sprite.size).ToInt2();
return new Size(size.X, size.Y);
}
}
public int SortOrder { get { return Z + ZOffset; } }
}
}

View File

@@ -65,22 +65,23 @@ namespace OpenRA.Graphics
public PaletteReference Palette(string name) { return palettes[name]; }
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); }
IEnumerable<Renderable> SpritesToRender()
void DrawRenderables()
{
var bounds = Game.viewport.WorldBounds(world);
var comparer = new RenderableComparer();
var actors = world.FindUnits(
bounds.TopLeftAsCPos().ToPPos(),
bounds.BottomRightAsCPos().ToPPos()
);
bounds.BottomRightAsCPos().ToPPos());
var renderables = actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer);
actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer)
.Do(rr => rr.Render(this));
var effects = world.Effects.SelectMany(e => e.Render(this));
return renderables.Concat(effects);
// Effects are drawn on top of all actors
// TODO: Allow effects to be interleaved with actors
world.Effects.SelectMany(e => e.Render(this))
.Do(rr => rr.Render(this));
}
public void Draw()
@@ -96,7 +97,7 @@ namespace OpenRA.Graphics
terrainRenderer.Draw(this, Game.viewport);
foreach (var a in world.traitDict.ActorsWithTraitMultiple<IRenderAsTerrain>(world))
foreach (var r in a.Trait.RenderAsTerrain(this, a.Actor))
r.Sprite.DrawAt(r.Pos, r.Palette.Index, r.Scale);
r.Render(this);
foreach (var a in world.Selection.Actors)
if (!a.Destroyed)
@@ -108,8 +109,7 @@ namespace OpenRA.Graphics
if (world.OrderGenerator != null)
world.OrderGenerator.RenderBeforeWorld(this, world);
foreach (var image in SpritesToRender())
image.Sprite.DrawAt(image.Pos, image.Palette.Index, image.Scale);
DrawRenderables();
// added for contrails
foreach (var a in world.ActorsWithTrait<IPostRender>())

View File

@@ -107,12 +107,7 @@ namespace OpenRA.Traits
foreach (var a in anims.Values)
if (a.DisableFunc == null || !a.DisableFunc())
{
Renderable ret = a.Image(self, wr, palette);
if (Info.Scale != 1f)
ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f * ret.Sprite.size * (1 - Info.Scale));
yield return ret;
}
yield return a.Image(self, wr, palette, Info.Scale);
}
public int2 SelectionSize(Actor self)

View File

@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Cnc
: cargo.Passengers;
return r.Concat(visiblePassengers.SelectMany(a => a.Render(wr))
.Select(a => a.WithPos(a.Pos - new float2(0, Info.RelativeAltitude))
.Select(a => a.WithPxOffset(new float2(0, -Info.RelativeAltitude))
.WithZOffset(a.ZOffset + Info.RelativeAltitude)));
}
}

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA
{
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{
return r.Select(a => a.WithZOffset((int) -a.Sprite.size.Y));
return r.Select(a => a.WithZOffset(-a.Size.Height));
}
}
}

View File

@@ -65,17 +65,17 @@ namespace OpenRA.Mods.RA.Effects
public IEnumerable<Renderable> Render(WorldRenderer wr)
{
var rc = cargo.Render(wr).Select(a => a.WithPos(a.Pos - new float2(0, altitude))
.WithZOffset(a.ZOffset + (int)altitude));
var rc = cargo.Render(wr);
// Don't render anything if the cargo is invisible (e.g. under fog)
if (!rc.Any())
yield break;
var shadow = wr.Palette("shadow");
foreach (var c in rc)
{
yield return c.WithPos(location.ToFloat2() - .5f * c.Sprite.size).WithPalette(wr.Palette("shadow")).WithZOffset(0);
yield return c.WithZOffset(2);
yield return c.WithPalette(shadow);
yield return c.WithPxOffset(new float2(0, -altitude)).WithZOffset(c.ZOffset + (int)altitude + 2);
}
var pos = location.ToFloat2() - new float2(0, altitude);

View File

@@ -99,9 +99,7 @@ namespace OpenRA.Mods.RA.Orders
}
foreach (var r in preview)
r.Sprite.DrawAt(topLeft.ToPPos().ToFloat2() + r.Pos,
r.Palette.Index,
r.Scale*r.Sprite.size);
r.WithPxOffset(topLeft.ToPPos().ToFloat2()).Render(wr);
var res = world.WorldActor.Trait<ResourceLayer>();
var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft);

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Render
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
{
return base.RenderPreview(building, pr)
.Select(a => a.WithPos(a.Pos + building.Traits.Get<RenderBuildingInfo>().Origin));
.Select(a => a.WithPxOffset(building.Traits.Get<RenderBuildingInfo>().Origin));
}
public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.RA.Render
var disabled = self.IsDisabled();
foreach (var a in r)
{
var ret = a.WithPos(a.Pos - Info.Origin);
var ret = a.WithPxOffset(-Info.Origin);
yield return ret;
if (disabled)
yield return ret.WithPalette(wr.Palette("disabled")).WithZOffset(1);

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Render
var shadowSprites = r.Select(a => a.WithPalette(wr.Palette("shadow")));
var flyingSprites = (move.Altitude <= 0) ? r
: r.Select(a => a.WithPos(a.Pos - new float2(0, move.Altitude + visualOffset)).WithZOffset(move.Altitude + a.ZOffset));
: r.Select(a => a.WithPxOffset(new float2(0, -(move.Altitude + visualOffset))).WithZOffset(move.Altitude + a.ZOffset));
return shadowSprites.Concat(flyingSprites);
}

View File

@@ -242,13 +242,9 @@ namespace OpenRA.Mods.RA
// Unit previews
foreach (var unit in power.UnitsInRange(sourceLocation))
{
if (manager.self.Owner.Shroud.IsTargetable(unit)) {
var targetCell = unit.Location + (xy - sourceLocation);
if (manager.self.Owner.Shroud.IsTargetable(unit))
foreach (var r in unit.Render(wr))
r.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location).ToFloat2() + Traits.Util.CenterOfCell(targetCell).ToFloat2(),
r.Palette.Index,
r.Scale*r.Sprite.size);
}
r.WithPxOffset((xy.ToPPos() - sourceLocation.ToPPos()).ToFloat2()).Render(wr);
}
// Unit tiles