Pass WorldRenderer to IRenderModifiers and replace more palette lookups.

This commit is contained in:
Paul Chote
2013-02-24 12:15:28 +13:00
parent 48d713aafd
commit 000a5eaa56
17 changed files with 40 additions and 32 deletions

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA namespace OpenRA
@@ -98,7 +99,7 @@ namespace OpenRA
} }
ApplyIRender = x => x.Render(this); 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) ); Bounds = Cached.New( () => CalculateBounds(false) );
ExtendedBounds = Cached.New( () => CalculateBounds(true) ); ExtendedBounds = Cached.New( () => CalculateBounds(true) );
@@ -109,7 +110,7 @@ namespace OpenRA
Bounds.Invalidate(); Bounds.Invalidate();
ExtendedBounds.Invalidate(); ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity ); currentActivity = Traits.Util.RunActivity( this, currentActivity );
} }
public void UpdateSight() public void UpdateSight()
@@ -126,12 +127,12 @@ namespace OpenRA
// note: these delegates are cached to avoid massive allocation. // note: these delegates are cached to avoid massive allocation.
Func<IRender, IEnumerable<Renderable>> ApplyIRender; Func<IRender, IEnumerable<Renderable>> ApplyIRender;
Func<IEnumerable<Renderable>, IRenderModifier, IEnumerable<Renderable>> ApplyRenderModifier; Func<IEnumerable<Renderable>, IRenderModifier, WorldRenderer, IEnumerable<Renderable>> ApplyRenderModifier;
public IEnumerable<Renderable> Render() public IEnumerable<Renderable> Render(WorldRenderer wr)
{ {
var mods = TraitsImplementing<IRenderModifier>(); var mods = TraitsImplementing<IRenderModifier>();
var sprites = TraitsImplementing<IRender>().SelectMany(ApplyIRender); var sprites = TraitsImplementing<IRender>().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 // When useAltitude = true, the bounding box is extended

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Effects
yield break; yield break;
if (remainingTicks % 2 == 0) if (remainingTicks % 2 == 0)
foreach (var r in target.Render()) foreach (var r in target.Render(wr))
yield return r.WithPalette(wr.Palette("highlight")); yield return r.WithPalette(wr.Palette("highlight"));
} }
} }

View File

@@ -92,7 +92,7 @@ namespace OpenRA.Graphics
bounds.BottomRightAsCPos().ToPPos() bounds.BottomRightAsCPos().ToPPos()
); );
var renderables = actors.SelectMany(a => a.Render()) var renderables = actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer); .OrderBy(r => r, comparer);
var effects = world.Effects.SelectMany(e => e.Render(this)); var effects = world.Effects.SelectMany(e => e.Render(this));

View File

@@ -113,7 +113,7 @@ namespace OpenRA.Traits
} }
public interface INotifyAttack { void Attacking(Actor self, Target target); } public interface INotifyAttack { void Attacking(Actor self, Target target); }
public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r); } public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r); }
public interface IDamageModifier { float GetDamageModifier(Actor attacker, WarheadInfo warhead); } public interface IDamageModifier { float GetDamageModifier(Actor attacker, WarheadInfo warhead); }
public interface ISpeedModifier { decimal GetSpeedModifier(); } public interface ISpeedModifier { decimal GetSpeedModifier(); }
public interface IFirepowerModifier { float GetFirepowerModifier(); } public interface IFirepowerModifier { float GetFirepowerModifier(); }

View File

@@ -11,6 +11,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Mods.RA; using OpenRA.Mods.RA;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Cnc namespace OpenRA.Mods.Cnc
@@ -39,7 +40,7 @@ namespace OpenRA.Mods.Cnc
Info = info; Info = info;
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
foreach (var c in cargo.Passengers) foreach (var c in cargo.Passengers)
{ {
@@ -55,7 +56,7 @@ namespace OpenRA.Mods.Cnc
Info.PassengerTypes.Contains(p.Trait<Passenger>().info.CargoType)) Info.PassengerTypes.Contains(p.Trait<Passenger>().info.CargoType))
: cargo.Passengers; : 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)) .Select(a => a.WithPos(a.Pos - new float2(0, Info.RelativeAltitude))
.WithZOffset(a.ZOffset + Info.RelativeAltitude))); .WithZOffset(a.ZOffset + Info.RelativeAltitude)));
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
@@ -18,7 +19,7 @@ namespace OpenRA.Mods.RA
class BelowUnits : IRenderModifier class BelowUnits : IRenderModifier
{ {
public IEnumerable<Renderable> ModifyRender(Actor self, 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((int) -a.Sprite.size.Y));
} }

View File

@@ -68,13 +68,13 @@ namespace OpenRA.Mods.RA
static readonly Renderable[] Nothing = { }; static readonly Renderable[] Nothing = { };
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> rs) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
if (remainingTime > 0) if (remainingTime > 0)
return rs; return r;
if (Cloaked && IsVisible(self)) 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 else
return Nothing; return Nothing;
} }

View File

@@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Effects
if (a.Destroyed) // Tick will clean up if (a.Destroyed) // Tick will clean up
yield break; yield break;
foreach (var r in a.Render()) foreach (var r in a.Render(wr))
yield return r.WithPalette(wr.Palette("invuln")); yield return r.WithPalette(wr.Palette("invuln"));
} }
} }

View File

@@ -97,23 +97,23 @@ namespace OpenRA.Mods.RA
return Level > 0 ? Info.SpeedModifier[Level - 1] : 1m; return Level > 0 ? Info.SpeedModifier[Level - 1] : 1m;
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> rs) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
if (self.Owner == self.World.LocalPlayer && Level > 0) if (self.Owner == self.World.LocalPlayer && Level > 0)
return InnerModifyRender(self, rs); return InnerModifyRender(self, wr, r);
else else
return rs; return r;
} }
IEnumerable<Renderable> InnerModifyRender(Actor self, IEnumerable<Renderable> rs) IEnumerable<Renderable> InnerModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
foreach (var r in rs) foreach (var rs in r)
yield return r; yield return rs;
RankAnim.Tick(); // HACK RankAnim.Tick(); // HACK
var bounds = self.Bounds.Value; var bounds = self.Bounds.Value;
yield return new Renderable(RankAnim.Image, new float2(bounds.Right - 6, bounds.Bottom - 8), 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);
} }
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
@@ -32,7 +33,7 @@ namespace OpenRA.Mods.RA
static readonly Renderable[] Nothing = { }; static readonly Renderable[] Nothing = { };
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
return IsVisible(self.Owner.Shroud, self) ? r : Nothing; return IsVisible(self.Owner.Shroud, self) ? r : Nothing;
} }

View File

@@ -16,6 +16,7 @@ using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Buildings;
using OpenRA.Mods.RA.Move; using OpenRA.Mods.RA.Move;
using OpenRA.Mods.RA.Render; using OpenRA.Mods.RA.Render;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Widgets; using OpenRA.Widgets;
@@ -505,7 +506,7 @@ namespace OpenRA.Mods.RA.Missions
hijackable = self.Trait<Allies04Hijackable>(); hijackable = self.Trait<Allies04Hijackable>();
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
return r.Select(a => a.WithPalette(Palette(hijackable.OldOwner))); return r.Select(a => a.WithPalette(Palette(hijackable.OldOwner)));
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
@@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA
} }
Renderable[] cache = { }; Renderable[] cache = { };
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
if (IsVisible(self.World.RenderedShroud, self)) if (IsVisible(self.World.RenderedShroud, self))
cache = r.ToArray(); cache = r.ToArray();

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
@@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA
} }
static Renderable[] Nothing = { }; static Renderable[] Nothing = { };
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
return IsVisible(self.World.RenderedShroud, self) ? r : Nothing; return IsVisible(self.World.RenderedShroud, self) ? r : Nothing;
} }

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.RA.Render
self.QueueActivity(new CallFunc(() => Complete(self))); self.QueueActivity(new CallFunc(() => Complete(self)));
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
var disabled = self.IsDisabled(); var disabled = self.IsDisabled();
foreach (var a in r) foreach (var a in r)
@@ -62,7 +62,7 @@ namespace OpenRA.Mods.RA.Render
var ret = a.WithPos(a.Pos - Info.Origin); var ret = a.WithPos(a.Pos - Info.Origin);
yield return ret; yield return ret;
if (disabled) if (disabled)
yield return ret.WithPalette(PaletteReference.FromName("disabled")).WithZOffset(1); yield return ret.WithPalette(wr.Palette("disabled")).WithZOffset(1);
} }
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Mods.RA.Orders; using OpenRA.Mods.RA.Orders;
@@ -31,7 +32,7 @@ namespace OpenRA.Mods.RA.Render
disguisedAsSprite = spy.disguisedAsSprite; disguisedAsSprite = spy.disguisedAsSprite;
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer))) : r; return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer))) : r;
} }

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Render
class WithShadow : IRenderModifier class WithShadow : IRenderModifier
{ {
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
{ {
var move = self.Trait<IMove>(); var move = self.Trait<IMove>();
@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Render
var visualOffset = ((move is Helicopter || move is Mobile) && move.Altitude > 0) var visualOffset = ((move is Helicopter || move is Mobile) && move.Altitude > 0)
? Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 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 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.WithPos(a.Pos - new float2(0, move.Altitude + visualOffset)).WithZOffset(move.Altitude + a.ZOffset));

View File

@@ -243,7 +243,7 @@ namespace OpenRA.Mods.RA
{ {
if (manager.self.Owner.Shroud.IsTargetable(unit)) { if (manager.self.Owner.Shroud.IsTargetable(unit)) {
var targetCell = unit.Location + (xy - sourceLocation); 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.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location).ToFloat2() + Traits.Util.CenterOfCell(targetCell).ToFloat2(),
r.Palette.RowIndex(wr), r.Palette.RowIndex(wr),
r.Scale*r.Sprite.size); r.Scale*r.Sprite.size);