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) public Renderable Image(Actor self, WorldRenderer wr, PaletteReference pal)
{ {
var p = self.CenterLocation; return Image(self, wr, pal, 1f);
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 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) public static implicit operator AnimationWithOffset(Animation a)

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
@@ -16,18 +17,20 @@ namespace OpenRA.Graphics
{ {
public int Compare(Renderable x, Renderable y) 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 struct Renderable
{ {
public readonly Sprite Sprite; readonly Sprite Sprite;
public readonly float2 Pos; 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 PaletteReference Palette;
public readonly int Z;
public readonly int ZOffset; public readonly int ZOffset;
public float Scale;
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, int zOffset, 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 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 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 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 PaletteReference Palette(string name) { return palettes[name]; }
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); } 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 bounds = Game.viewport.WorldBounds(world);
var comparer = new RenderableComparer(); var comparer = new RenderableComparer();
var actors = world.FindUnits( var actors = world.FindUnits(
bounds.TopLeftAsCPos().ToPPos(), bounds.TopLeftAsCPos().ToPPos(),
bounds.BottomRightAsCPos().ToPPos() bounds.BottomRightAsCPos().ToPPos());
);
var renderables = actors.SelectMany(a => a.Render(this)) actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer); .OrderBy(r => r, comparer)
.Do(rr => rr.Render(this));
var effects = world.Effects.SelectMany(e => e.Render(this)); // Effects are drawn on top of all actors
// TODO: Allow effects to be interleaved with actors
return renderables.Concat(effects); world.Effects.SelectMany(e => e.Render(this))
.Do(rr => rr.Render(this));
} }
public void Draw() public void Draw()
@@ -96,7 +97,7 @@ namespace OpenRA.Graphics
terrainRenderer.Draw(this, Game.viewport); terrainRenderer.Draw(this, Game.viewport);
foreach (var a in world.traitDict.ActorsWithTraitMultiple<IRenderAsTerrain>(world)) foreach (var a in world.traitDict.ActorsWithTraitMultiple<IRenderAsTerrain>(world))
foreach (var r in a.Trait.RenderAsTerrain(this, a.Actor)) 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) foreach (var a in world.Selection.Actors)
if (!a.Destroyed) if (!a.Destroyed)
@@ -108,8 +109,7 @@ namespace OpenRA.Graphics
if (world.OrderGenerator != null) if (world.OrderGenerator != null)
world.OrderGenerator.RenderBeforeWorld(this, world); world.OrderGenerator.RenderBeforeWorld(this, world);
foreach (var image in SpritesToRender()) DrawRenderables();
image.Sprite.DrawAt(image.Pos, image.Palette.Index, image.Scale);
// added for contrails // added for contrails
foreach (var a in world.ActorsWithTrait<IPostRender>()) foreach (var a in world.ActorsWithTrait<IPostRender>())

View File

@@ -107,12 +107,7 @@ namespace OpenRA.Traits
foreach (var a in anims.Values) foreach (var a in anims.Values)
if (a.DisableFunc == null || !a.DisableFunc()) if (a.DisableFunc == null || !a.DisableFunc())
{ yield return a.Image(self, wr, palette, Info.Scale);
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;
}
} }
public int2 SelectionSize(Actor self) public int2 SelectionSize(Actor self)

View File

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

View File

@@ -99,9 +99,7 @@ namespace OpenRA.Mods.RA.Orders
} }
foreach (var r in preview) foreach (var r in preview)
r.Sprite.DrawAt(topLeft.ToPPos().ToFloat2() + r.Pos, r.WithPxOffset(topLeft.ToPPos().ToFloat2()).Render(wr);
r.Palette.Index,
r.Scale*r.Sprite.size);
var res = world.WorldActor.Trait<ResourceLayer>(); var res = world.WorldActor.Trait<ResourceLayer>();
var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft); 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) public override IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
{ {
return base.RenderPreview(building, 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) public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.RA.Render
var disabled = self.IsDisabled(); var disabled = self.IsDisabled();
foreach (var a in r) foreach (var a in r)
{ {
var ret = a.WithPos(a.Pos - Info.Origin); var ret = a.WithPxOffset(-Info.Origin);
yield return ret; yield return ret;
if (disabled) if (disabled)
yield return ret.WithPalette(wr.Palette("disabled")).WithZOffset(1); 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 shadowSprites = r.Select(a => a.WithPalette(wr.Palette("shadow")));
var flyingSprites = (move.Altitude <= 0) ? r 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); return shadowSprites.Concat(flyingSprites);
} }

View File

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