Make the guts of Renderable private.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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; } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user