From d103a187f64b22ca2f7fbd51a967b36cc69675fa Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 12 May 2013 03:01:11 +1200 Subject: [PATCH] Make the guts of Renderable private. --- OpenRA.Game/Graphics/AnimationWithOffset.cs | 14 +++++--- OpenRA.Game/Graphics/Renderable.cs | 32 +++++++++++++++---- OpenRA.Game/Graphics/WorldRenderer.cs | 22 ++++++------- OpenRA.Game/Traits/Render/RenderSimple.cs | 7 +--- OpenRA.Mods.Cnc/RenderCargo.cs | 2 +- OpenRA.Mods.RA/BelowUnits.cs | 2 +- OpenRA.Mods.RA/Effects/Parachute.cs | 8 ++--- .../Orders/PlaceBuildingOrderGenerator.cs | 4 +-- OpenRA.Mods.RA/Render/RenderBuilding.cs | 4 +-- OpenRA.Mods.RA/Render/WithShadow.cs | 2 +- .../SupportPowers/ChronoshiftPower.cs | 8 ++--- 11 files changed, 59 insertions(+), 46 deletions(-) diff --git a/OpenRA.Game/Graphics/AnimationWithOffset.cs b/OpenRA.Game/Graphics/AnimationWithOffset.cs index 8691c91c6e..becc5ae3d6 100644 --- a/OpenRA.Game/Graphics/AnimationWithOffset.cs +++ b/OpenRA.Game/Graphics/AnimationWithOffset.cs @@ -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) diff --git a/OpenRA.Game/Graphics/Renderable.cs b/OpenRA.Game/Graphics/Renderable.cs index 97adc81611..b75d501435 100644 --- a/OpenRA.Game/Graphics/Renderable.cs +++ b/OpenRA.Game/Graphics/Renderable.cs @@ -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; } } } } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 6dd39fb3c3..e4a91d7cbb 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -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 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(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()) diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index eec13f8683..f52a4fd4e9 100755 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -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) diff --git a/OpenRA.Mods.Cnc/RenderCargo.cs b/OpenRA.Mods.Cnc/RenderCargo.cs index 86b96d7e0b..14c7bf7c3c 100644 --- a/OpenRA.Mods.Cnc/RenderCargo.cs +++ b/OpenRA.Mods.Cnc/RenderCargo.cs @@ -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))); } } diff --git a/OpenRA.Mods.RA/BelowUnits.cs b/OpenRA.Mods.RA/BelowUnits.cs index 4795bd7f0c..9bc68c4e17 100644 --- a/OpenRA.Mods.RA/BelowUnits.cs +++ b/OpenRA.Mods.RA/BelowUnits.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA { public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { - return r.Select(a => a.WithZOffset((int) -a.Sprite.size.Y)); + return r.Select(a => a.WithZOffset(-a.Size.Height)); } } } diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index 57528be0ee..27cb28a268 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -65,17 +65,17 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable 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); diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 9289d45d02..88cd1e784f 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -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(); var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft); diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index f1e969fe16..e45ea9b3b5 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Render public override IEnumerable RenderPreview(ActorInfo building, PaletteReference pr) { return base.RenderPreview(building, pr) - .Select(a => a.WithPos(a.Pos + building.Traits.Get().Origin)); + .Select(a => a.WithPxOffset(building.Traits.Get().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); diff --git a/OpenRA.Mods.RA/Render/WithShadow.cs b/OpenRA.Mods.RA/Render/WithShadow.cs index 76ddf84515..5d709f64b0 100644 --- a/OpenRA.Mods.RA/Render/WithShadow.cs +++ b/OpenRA.Mods.RA/Render/WithShadow.cs @@ -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); } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 22aa83c5df..8ccb97ba90 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -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