From 000a5eaa56a19b0f99be4d3240a8cd56c10931be Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 24 Feb 2013 12:15:28 +1300 Subject: [PATCH] Pass WorldRenderer to IRenderModifiers and replace more palette lookups. --- OpenRA.Game/Actor.cs | 11 ++++++----- OpenRA.Game/Effects/FlashTarget.cs | 2 +- OpenRA.Game/Graphics/WorldRenderer.cs | 2 +- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- OpenRA.Mods.Cnc/RenderCargo.cs | 5 +++-- OpenRA.Mods.RA/BelowUnits.cs | 3 ++- OpenRA.Mods.RA/Cloak.cs | 6 +++--- OpenRA.Mods.RA/Effects/InvulnEffect.cs | 2 +- OpenRA.Mods.RA/GainsExperience.cs | 14 +++++++------- OpenRA.Mods.RA/InvisibleToEnemy.cs | 3 ++- OpenRA.Mods.RA/Missions/Allies04Script.cs | 3 ++- OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs | 3 ++- OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs | 3 ++- OpenRA.Mods.RA/Render/RenderBuilding.cs | 4 ++-- OpenRA.Mods.RA/Render/RenderSpy.cs | 3 ++- OpenRA.Mods.RA/Render/WithShadow.cs | 4 ++-- OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs | 2 +- 17 files changed, 40 insertions(+), 32 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 3eea3d1ed0..f431ad149a 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA @@ -98,7 +99,7 @@ namespace OpenRA } ApplyIRender = x => x.Render(this); - ApplyRenderModifier = (m, p) => p.ModifyRender(this, m); + ApplyRenderModifier = (m, p, wr) => p.ModifyRender(this, wr, m); Bounds = Cached.New( () => CalculateBounds(false) ); ExtendedBounds = Cached.New( () => CalculateBounds(true) ); @@ -109,7 +110,7 @@ namespace OpenRA Bounds.Invalidate(); ExtendedBounds.Invalidate(); - currentActivity = Util.RunActivity( this, currentActivity ); + currentActivity = Traits.Util.RunActivity( this, currentActivity ); } public void UpdateSight() @@ -126,12 +127,12 @@ namespace OpenRA // note: these delegates are cached to avoid massive allocation. Func> ApplyIRender; - Func, IRenderModifier, IEnumerable> ApplyRenderModifier; - public IEnumerable Render() + Func, IRenderModifier, WorldRenderer, IEnumerable> ApplyRenderModifier; + public IEnumerable Render(WorldRenderer wr) { var mods = TraitsImplementing(); var sprites = TraitsImplementing().SelectMany(ApplyIRender); - return mods.Aggregate(sprites, ApplyRenderModifier); + return mods.Aggregate(sprites, (m,p) => ApplyRenderModifier(m,p,wr)); } // When useAltitude = true, the bounding box is extended diff --git a/OpenRA.Game/Effects/FlashTarget.cs b/OpenRA.Game/Effects/FlashTarget.cs index 6e30ff9b39..c8c422d791 100755 --- a/OpenRA.Game/Effects/FlashTarget.cs +++ b/OpenRA.Game/Effects/FlashTarget.cs @@ -39,7 +39,7 @@ namespace OpenRA.Effects yield break; if (remainingTicks % 2 == 0) - foreach (var r in target.Render()) + foreach (var r in target.Render(wr)) yield return r.WithPalette(wr.Palette("highlight")); } } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 9e9dbbbb56..594ac3562b 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -92,7 +92,7 @@ namespace OpenRA.Graphics bounds.BottomRightAsCPos().ToPPos() ); - var renderables = actors.SelectMany(a => a.Render()) + var renderables = actors.SelectMany(a => a.Render(this)) .OrderBy(r => r, comparer); var effects = world.Effects.SelectMany(e => e.Render(this)); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 41fb0835d1..2b100763a3 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -113,7 +113,7 @@ namespace OpenRA.Traits } public interface INotifyAttack { void Attacking(Actor self, Target target); } - public interface IRenderModifier { IEnumerable ModifyRender(Actor self, IEnumerable r); } + public interface IRenderModifier { IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r); } public interface IDamageModifier { float GetDamageModifier(Actor attacker, WarheadInfo warhead); } public interface ISpeedModifier { decimal GetSpeedModifier(); } public interface IFirepowerModifier { float GetFirepowerModifier(); } diff --git a/OpenRA.Mods.Cnc/RenderCargo.cs b/OpenRA.Mods.Cnc/RenderCargo.cs index 9e5101f41b..86b96d7e0b 100644 --- a/OpenRA.Mods.Cnc/RenderCargo.cs +++ b/OpenRA.Mods.Cnc/RenderCargo.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.RA; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.Cnc @@ -39,7 +40,7 @@ namespace OpenRA.Mods.Cnc Info = info; } - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { foreach (var c in cargo.Passengers) { @@ -55,7 +56,7 @@ namespace OpenRA.Mods.Cnc Info.PassengerTypes.Contains(p.Trait().info.CargoType)) : cargo.Passengers; - return r.Concat(visiblePassengers.SelectMany(a => a.Render()) + return r.Concat(visiblePassengers.SelectMany(a => a.Render(wr)) .Select(a => a.WithPos(a.Pos - 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 c6336de911..4795bd7f0c 100644 --- a/OpenRA.Mods.RA/BelowUnits.cs +++ b/OpenRA.Mods.RA/BelowUnits.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -18,7 +19,7 @@ namespace OpenRA.Mods.RA class BelowUnits : IRenderModifier { - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return r.Select(a => a.WithZOffset((int) -a.Sprite.size.Y)); } diff --git a/OpenRA.Mods.RA/Cloak.cs b/OpenRA.Mods.RA/Cloak.cs index 84ebf54a6c..5a9e320db1 100644 --- a/OpenRA.Mods.RA/Cloak.cs +++ b/OpenRA.Mods.RA/Cloak.cs @@ -68,13 +68,13 @@ namespace OpenRA.Mods.RA static readonly Renderable[] Nothing = { }; - public IEnumerable ModifyRender(Actor self, IEnumerable rs) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { if (remainingTime > 0) - return rs; + return r; if (Cloaked && IsVisible(self)) - return rs.Select(a => a.WithPalette(PaletteReference.FromName(info.Palette))); + return r.Select(a => a.WithPalette(wr.Palette(info.Palette))); else return Nothing; } diff --git a/OpenRA.Mods.RA/Effects/InvulnEffect.cs b/OpenRA.Mods.RA/Effects/InvulnEffect.cs index 953c0826b6..d16dd233a9 100644 --- a/OpenRA.Mods.RA/Effects/InvulnEffect.cs +++ b/OpenRA.Mods.RA/Effects/InvulnEffect.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Effects if (a.Destroyed) // Tick will clean up yield break; - foreach (var r in a.Render()) + foreach (var r in a.Render(wr)) yield return r.WithPalette(wr.Palette("invuln")); } } diff --git a/OpenRA.Mods.RA/GainsExperience.cs b/OpenRA.Mods.RA/GainsExperience.cs index 7d5532d693..022c78c208 100644 --- a/OpenRA.Mods.RA/GainsExperience.cs +++ b/OpenRA.Mods.RA/GainsExperience.cs @@ -97,23 +97,23 @@ namespace OpenRA.Mods.RA return Level > 0 ? Info.SpeedModifier[Level - 1] : 1m; } - public IEnumerable ModifyRender(Actor self, IEnumerable rs) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { if (self.Owner == self.World.LocalPlayer && Level > 0) - return InnerModifyRender(self, rs); + return InnerModifyRender(self, wr, r); else - return rs; + return r; } - IEnumerable InnerModifyRender(Actor self, IEnumerable rs) + IEnumerable InnerModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { - foreach (var r in rs) - yield return r; + foreach (var rs in r) + yield return rs; RankAnim.Tick(); // HACK var bounds = self.Bounds.Value; yield return new Renderable(RankAnim.Image, new float2(bounds.Right - 6, bounds.Bottom - 8), - PaletteReference.FromName("effect"), self.CenterLocation.Y); + wr.Palette("effect"), self.CenterLocation.Y); } } diff --git a/OpenRA.Mods.RA/InvisibleToEnemy.cs b/OpenRA.Mods.RA/InvisibleToEnemy.cs index e3ff497308..248f7d7cd9 100644 --- a/OpenRA.Mods.RA/InvisibleToEnemy.cs +++ b/OpenRA.Mods.RA/InvisibleToEnemy.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Drawing; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -32,7 +33,7 @@ namespace OpenRA.Mods.RA static readonly Renderable[] Nothing = { }; - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return IsVisible(self.Owner.Shroud, self) ? r : Nothing; } diff --git a/OpenRA.Mods.RA/Missions/Allies04Script.cs b/OpenRA.Mods.RA/Missions/Allies04Script.cs index 4eaa1d8dea..739ae8b7c2 100644 --- a/OpenRA.Mods.RA/Missions/Allies04Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies04Script.cs @@ -16,6 +16,7 @@ using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Move; using OpenRA.Mods.RA.Render; +using OpenRA.Graphics; using OpenRA.Traits; using OpenRA.Widgets; @@ -505,7 +506,7 @@ namespace OpenRA.Mods.RA.Missions hijackable = self.Trait(); } - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return r.Select(a => a.WithPalette(Palette(hijackable.OldOwner))); } diff --git a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs index 9354c46672..c4f823be48 100644 --- a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA } Renderable[] cache = { }; - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { if (IsVisible(self.World.RenderedShroud, self)) cache = r.ToArray(); diff --git a/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs index 865cf7effb..cba548f4e4 100644 --- a/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA } static Renderable[] Nothing = { }; - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return IsVisible(self.World.RenderedShroud, self) ? r : Nothing; } diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index 9b7d5c8e41..ce7711bd7c 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -54,7 +54,7 @@ namespace OpenRA.Mods.RA.Render self.QueueActivity(new CallFunc(() => Complete(self))); } - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { var disabled = self.IsDisabled(); foreach (var a in r) @@ -62,7 +62,7 @@ namespace OpenRA.Mods.RA.Render var ret = a.WithPos(a.Pos - Info.Origin); yield return ret; if (disabled) - yield return ret.WithPalette(PaletteReference.FromName("disabled")).WithZOffset(1); + yield return ret.WithPalette(wr.Palette("disabled")).WithZOffset(1); } } diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index 80a571ae08..b281ac304e 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; using OpenRA.Mods.RA.Orders; @@ -31,7 +32,7 @@ namespace OpenRA.Mods.RA.Render disguisedAsSprite = spy.disguisedAsSprite; } - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer))) : r; } diff --git a/OpenRA.Mods.RA/Render/WithShadow.cs b/OpenRA.Mods.RA/Render/WithShadow.cs index c55472fb41..76ddf84515 100644 --- a/OpenRA.Mods.RA/Render/WithShadow.cs +++ b/OpenRA.Mods.RA/Render/WithShadow.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Render class WithShadow : IRenderModifier { - public IEnumerable ModifyRender(Actor self, IEnumerable r) + public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { var move = self.Trait(); @@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Render var visualOffset = ((move is Helicopter || move is Mobile) && move.Altitude > 0) ? Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0; - var shadowSprites = r.Select(a => a.WithPalette(PaletteReference.FromName("shadow"))); + 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)); diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 57fe38832f..5875c93a51 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -243,7 +243,7 @@ namespace OpenRA.Mods.RA { if (manager.self.Owner.Shroud.IsTargetable(unit)) { var targetCell = unit.Location + (xy - sourceLocation); - foreach (var r in unit.Render()) + 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.RowIndex(wr), r.Scale*r.Sprite.size);