Pass WorldRenderer to IRenderModifiers and replace more palette lookups.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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(); }
|
||||||
|
|||||||
@@ -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)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user