Rename and tweak post-render interfaces.

This commit is contained in:
Paul Chote
2016-08-22 16:50:49 +01:00
parent f1990853df
commit 11805bb567
24 changed files with 129 additions and 143 deletions

View File

@@ -152,9 +152,9 @@ namespace OpenRA.Graphics
if (enableDepthBuffer) if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer(); Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IPostRender>()) foreach (var a in World.ActorsWithTrait<IRenderAboveWorld>())
if (a.Actor.IsInWorld && !a.Actor.Disposed) if (a.Actor.IsInWorld && !a.Actor.Disposed)
a.Trait.RenderAfterWorld(this, a.Actor); a.Trait.RenderAboveWorld(a.Actor, this);
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null; var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
@@ -162,7 +162,7 @@ namespace OpenRA.Graphics
Game.Renderer.ClearDepthBuffer(); Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IRenderShroud>()) foreach (var a in World.ActorsWithTrait<IRenderShroud>())
a.Trait.RenderShroud(this, renderShroud); a.Trait.RenderShroud(renderShroud, this);
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry) if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry)
for (var i = 0; i < renderables.Count; i++) for (var i = 0; i < renderables.Count; i++)
@@ -174,8 +174,8 @@ namespace OpenRA.Graphics
Game.Renderer.DisableScissor(); Game.Renderer.DisableScissor();
var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed) var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed)
.SelectMany(a => a.TraitsImplementing<IPostRenderSelection>()) .SelectMany(a => a.TraitsImplementing<IRenderAboveShroudWhenSelected>()
.SelectMany(t => t.RenderAfterWorld(this)); .SelectMany(t => t.RenderAboveShroud(a, this)));
Game.Renderer.WorldVoxelRenderer.BeginFrame(); Game.Renderer.WorldVoxelRenderer.BeginFrame();
var finalOverlayRenderables = overlayRenderables.Select(r => r.PrepareRender(this)); var finalOverlayRenderables = overlayRenderables.Select(r => r.PrepareRender(this));

View File

@@ -374,11 +374,9 @@ namespace OpenRA.Traits
string SequencePrefix { get; } string SequencePrefix { get; }
} }
public interface IPostRender { void RenderAfterWorld(WorldRenderer wr, Actor self); } public interface IRenderAboveWorld { void RenderAboveWorld(Actor self, WorldRenderer wr); }
public interface IRenderShroud { void RenderShroud(Shroud shroud, WorldRenderer wr); }
public interface IRenderShroud { void RenderShroud(WorldRenderer wr, Shroud shroud); } public interface IRenderAboveShroudWhenSelected { IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr); }
public interface IPostRenderSelection { IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr); }
public interface ITargetableInfo : ITraitInfoInterface public interface ITargetableInfo : ITraitInfoInterface
{ {

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new BaseProvider(init.Self, this); } public object Create(ActorInitializer init) { return new BaseProvider(init.Self, this); }
} }
public class BaseProvider : ITick, IPostRenderSelection, ISelectionBar public class BaseProvider : ITick, IRenderAboveShroudWhenSelected, ISelectionBar
{ {
public readonly BaseProviderInfo Info; public readonly BaseProviderInfo Info;
readonly DeveloperMode devMode; readonly DeveloperMode devMode;
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
allyBuildEnabled = self.World.WorldActor.Trait<MapBuildRadius>().AllyBuildRadiusEnabled; allyBuildEnabled = self.World.WorldActor.Trait<MapBuildRadius>().AllyBuildRadiusEnabled;
} }
public void Tick(Actor self) void ITick.Tick(Actor self)
{ {
if (progress > 0) if (progress > 0)
progress--; progress--;
@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits
return self.Owner == self.World.RenderPlayer || (allyBuildEnabled && self.Owner.IsAlliedWith(self.World.RenderPlayer)); return self.Owner == self.World.RenderPlayer || (allyBuildEnabled && self.Owner.IsAlliedWith(self.World.RenderPlayer));
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) public IEnumerable<IRenderable> RangeCircleRenderables(WorldRenderer wr)
{ {
// Visible to player and allies // Visible to player and allies
if (!ValidRenderPlayer()) if (!ValidRenderPlayer())
@@ -81,6 +81,11 @@ namespace OpenRA.Mods.Common.Traits
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
} }
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
return RangeCircleRenderables(wr);
}
float ISelectionBar.GetValue() float ISelectionBar.GetValue()
{ {
// Visible to player and allies // Visible to player and allies

View File

@@ -129,11 +129,9 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{ {
if (!RequiresBaseProvider) if (!RequiresBaseProvider)
yield break; return SpriteRenderable.None;
foreach (var a in w.ActorsWithTrait<BaseProvider>()) return w.ActorsWithTrait<BaseProvider>().SelectMany(a => a.Trait.RangeCircleRenderables(wr));
foreach (var r in a.Trait.RenderAfterWorld(wr))
yield return r;
} }
} }

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new CombatDebugOverlay(init.Self); } public object Create(ActorInitializer init) { return new CombatDebugOverlay(init.Self); }
} }
public class CombatDebugOverlay : IPostRender, INotifyDamage, INotifyCreated public class CombatDebugOverlay : IRenderAboveWorld, INotifyDamage, INotifyCreated
{ {
readonly DeveloperMode devMode; readonly DeveloperMode devMode;
readonly HealthInfo healthInfo; readonly HealthInfo healthInfo;
@@ -42,12 +42,12 @@ namespace OpenRA.Mods.Common.Traits
devMode = localPlayer != null ? localPlayer.PlayerActor.Trait<DeveloperMode>() : null; devMode = localPlayer != null ? localPlayer.PlayerActor.Trait<DeveloperMode>() : null;
} }
public void Created(Actor self) void INotifyCreated.Created(Actor self)
{ {
allBlockers = self.TraitsImplementing<IBlocksProjectiles>().ToArray(); allBlockers = self.TraitsImplementing<IBlocksProjectiles>().ToArray();
} }
public void RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (devMode == null || !devMode.ShowCombatGeometry) if (devMode == null || !devMode.ShowCombatGeometry)
return; return;
@@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public void Damaged(Actor self, AttackInfo e) void INotifyDamage.Damaged(Actor self, AttackInfo e)
{ {
if (devMode == null || !devMode.ShowCombatGeometry || e.Damage.Value == 0) if (devMode == null || !devMode.ShowCombatGeometry || e.Damage.Value == 0)
return; return;

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
object ITraitInfo.Create(ActorInitializer init) { return new ExitsDebugOverlay(init.Self, this); } object ITraitInfo.Create(ActorInitializer init) { return new ExitsDebugOverlay(init.Self, this); }
} }
public class ExitsDebugOverlay : IPostRender public class ExitsDebugOverlay : IRenderAboveWorld
{ {
readonly ExitsDebugOverlayManager manager; readonly ExitsDebugOverlayManager manager;
readonly ExitsDebugOverlayInfo info; readonly ExitsDebugOverlayInfo info;
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits
exits = self.Info.TraitInfos<ExitInfo>().ToArray(); exits = self.Info.TraitInfos<ExitInfo>().ToArray();
} }
void IPostRender.RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (manager == null || !manager.Enabled) if (manager == null || !manager.Enabled)
return; return;

View File

@@ -23,15 +23,17 @@ namespace OpenRA.Mods.Common.Traits
public virtual object Create(ActorInitializer init) { return new DrawLineToTarget(init.Self, this); } public virtual object Create(ActorInitializer init) { return new DrawLineToTarget(init.Self, this); }
} }
public class DrawLineToTarget : IPostRenderSelection, INotifySelected, INotifyBecomingIdle public class DrawLineToTarget : IRenderAboveShroudWhenSelected, INotifySelected, INotifyBecomingIdle
{ {
Actor self; readonly DrawLineToTargetInfo info;
DrawLineToTargetInfo info;
List<Target> targets; List<Target> targets;
Color c; Color c;
int lifetime; int lifetime;
public DrawLineToTarget(Actor self, DrawLineToTargetInfo info) { this.self = self; this.info = info; } public DrawLineToTarget(Actor self, DrawLineToTargetInfo info)
{
this.info = info;
}
public void SetTarget(Actor self, Target target, Color c, bool display) public void SetTarget(Actor self, Target target, Color c, bool display)
{ {
@@ -51,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
lifetime = info.Delay; lifetime = info.Delay;
} }
public void Selected(Actor a) void INotifySelected.Selected(Actor a)
{ {
if (a.IsIdle) if (a.IsIdle)
return; return;
@@ -60,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
lifetime = info.Delay; lifetime = info.Delay;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt); var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt);
if ((lifetime <= 0 || --lifetime <= 0) && !force) if ((lifetime <= 0 || --lifetime <= 0) && !force)
@@ -81,7 +83,7 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public void OnBecomingIdle(Actor a) void INotifyBecomingIdle.OnBecomingIdle(Actor a)
{ {
if (a.IsIdle) if (a.IsIdle)
targets = null; targets = null;

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits.Render
public object Create(ActorInitializer init) { return new RenderDebugState(init.Self, this); } public object Create(ActorInitializer init) { return new RenderDebugState(init.Self, this); }
} }
class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IPostRenderSelection class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IRenderAboveShroudWhenSelected
{ {
readonly DeveloperMode devMode; readonly DeveloperMode devMode;
readonly SpriteFont font; readonly SpriteFont font;
@@ -53,12 +53,12 @@ namespace OpenRA.Mods.Common.Traits.Render
ai = self.Owner.PlayerActor.TraitsImplementing<HackyAI>().FirstOrDefault(x => x.IsEnabled); ai = self.Owner.PlayerActor.TraitsImplementing<HackyAI>().FirstOrDefault(x => x.IsEnabled);
} }
public void AddedToWorld(Actor self) void INotifyAddedToWorld.AddedToWorld(Actor self)
{ {
tagString = self.ToString(); tagString = self.ToString();
} }
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{ {
color = GetColor(); color = GetColor();
} }
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Traits.Render
return self.EffectiveOwner != null ? self.EffectiveOwner.Owner.Color.RGB : self.Owner.Color.RGB; return self.EffectiveOwner != null ? self.EffectiveOwner.Owner.Color.RGB : self.Owner.Color.RGB;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (devMode == null || !devMode.ShowActorTags) if (devMode == null || !devMode.ShowActorTags)
yield break; yield break;

View File

@@ -35,19 +35,17 @@ namespace OpenRA.Mods.Common.Traits.Render
public object Create(ActorInitializer init) { return new RenderDetectionCircle(init.Self, this); } public object Create(ActorInitializer init) { return new RenderDetectionCircle(init.Self, this); }
} }
class RenderDetectionCircle : ITick, IPostRenderSelection class RenderDetectionCircle : ITick, IRenderAboveShroudWhenSelected
{ {
readonly RenderDetectionCircleInfo info; readonly RenderDetectionCircleInfo info;
readonly Actor self;
WAngle lineAngle; WAngle lineAngle;
public RenderDetectionCircle(Actor self, RenderDetectionCircleInfo info) public RenderDetectionCircle(Actor self, RenderDetectionCircleInfo info)
{ {
this.info = info; this.info = info;
this.self = self;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
yield break; yield break;
@@ -71,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits.Render
info.ContrastColor); info.ContrastColor);
} }
public void Tick(Actor self) void ITick.Tick(Actor self)
{ {
lineAngle += info.UpdateLineTick; lineAngle += info.UpdateLineTick;
} }

View File

@@ -32,23 +32,24 @@ namespace OpenRA.Mods.Common.Traits.Render
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{ {
if (range == WDist.Zero) if (range == WDist.Zero)
yield break; return SpriteRenderable.None;
yield return new RangeCircleRenderable( var localRange = new RangeCircleRenderable(
centerPosition, centerPosition,
range, range,
0, 0,
Color.FromArgb(128, Color.Yellow), Color.FromArgb(128, Color.Yellow),
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>()) var otherRanges = w.ActorsWithTrait<RenderRangeCircle>()
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer)) .Where(a => a.Trait.Info.RangeCircleType == RangeCircleType)
if (a.Actor.Info.TraitInfo<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType) .SelectMany(a => a.Trait.RangeCircleRenderables(wr));
foreach (var r in a.Trait.RenderAfterWorld(wr))
yield return r; return otherRanges.Append(localRange);
} }
public object Create(ActorInitializer init) { return new RenderRangeCircle(init.Self); } public object Create(ActorInitializer init) { return new RenderRangeCircle(init.Self, this); }
public void RulesetLoaded(Ruleset rules, ActorInfo ai) public void RulesetLoaded(Ruleset rules, ActorInfo ai)
{ {
var armaments = ai.TraitInfos<ArmamentInfo>().Where(a => a.UpgradeMinEnabledLevel == 0); var armaments = ai.TraitInfos<ArmamentInfo>().Where(a => a.UpgradeMinEnabledLevel == 0);
@@ -60,18 +61,21 @@ namespace OpenRA.Mods.Common.Traits.Render
} }
} }
class RenderRangeCircle : IPostRenderSelection class RenderRangeCircle : IRenderAboveShroudWhenSelected
{ {
public readonly RenderRangeCircleInfo Info;
readonly Actor self; readonly Actor self;
readonly AttackBase attack; readonly AttackBase attack;
public RenderRangeCircle(Actor self) public RenderRangeCircle(Actor self, RenderRangeCircleInfo info)
{ {
Info = info;
this.self = self; this.self = self;
attack = self.Trait<AttackBase>(); attack = self.Trait<AttackBase>();
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) public IEnumerable<IRenderable> RangeCircleRenderables(WorldRenderer wr)
{ {
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
yield break; yield break;
@@ -87,5 +91,10 @@ namespace OpenRA.Mods.Common.Traits.Render
Color.FromArgb(128, Color.Yellow), Color.FromArgb(128, Color.Yellow),
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
} }
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
return RangeCircleRenderables(wr);
}
} }
} }

View File

@@ -41,25 +41,23 @@ namespace OpenRA.Mods.Common.Traits.Render
public int[] SelectionBoxBounds { get { return VisualBounds; } } public int[] SelectionBoxBounds { get { return VisualBounds; } }
} }
public class SelectionDecorations : IPostRenderSelection, ITick public class SelectionDecorations : IRenderAboveShroudWhenSelected, ITick
{ {
// depends on the order of pips in TraitsInterfaces.cs! // depends on the order of pips in TraitsInterfaces.cs!
static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" }; static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" };
public readonly SelectionDecorationsInfo Info; public readonly SelectionDecorationsInfo Info;
readonly Actor self;
readonly Animation pipImages; readonly Animation pipImages;
public SelectionDecorations(Actor self, SelectionDecorationsInfo info) public SelectionDecorations(Actor self, SelectionDecorationsInfo info)
{ {
this.self = self;
Info = info; Info = info;
pipImages = new Animation(self.World, Info.Image); pipImages = new Animation(self.World, Info.Image);
} }
IEnumerable<WPos> ActivityTargetPath() IEnumerable<WPos> ActivityTargetPath(Actor self)
{ {
if (!self.IsInWorld || self.IsDead) if (!self.IsInWorld || self.IsDead)
yield break; yield break;
@@ -75,7 +73,7 @@ namespace OpenRA.Mods.Common.Traits.Render
} }
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (self.World.FogObscures(self)) if (self.World.FogObscures(self))
yield break; yield break;
@@ -90,18 +88,18 @@ namespace OpenRA.Mods.Common.Traits.Render
yield break; yield break;
if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug)
yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green); yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green);
var b = self.VisualBounds; var b = self.VisualBounds;
var pos = wr.ScreenPxPosition(self.CenterPosition); var pos = wr.ScreenPxPosition(self.CenterPosition);
var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
var pal = wr.Palette(Info.Palette); var pal = wr.Palette(Info.Palette);
foreach (var r in DrawPips(wr, self, bl, pal)) foreach (var r in DrawPips(self, wr, bl, pal))
yield return r; yield return r;
} }
IEnumerable<IRenderable> DrawPips(WorldRenderer wr, Actor self, int2 basePosition, PaletteReference palette) IEnumerable<IRenderable> DrawPips(Actor self, WorldRenderer wr, int2 basePosition, PaletteReference palette)
{ {
var pipSources = self.TraitsImplementing<IPips>(); var pipSources = self.TraitsImplementing<IPips>();
if (!pipSources.Any()) if (!pipSources.Any())

View File

@@ -55,17 +55,15 @@ namespace OpenRA.Mods.Common.Traits.Render
public override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); } public override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); }
} }
public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IPostRenderSelection public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IRenderAboveShroudWhenSelected
{ {
protected readonly Animation Anim; protected readonly Animation Anim;
readonly string image; readonly string image;
readonly Actor self;
public WithDecoration(Actor self, WithDecorationInfo info) public WithDecoration(Actor self, WithDecorationInfo info)
: base(info) : base(info)
{ {
this.self = self;
image = info.Image ?? self.Info.Name; image = info.Image ?? self.Info.Name;
Anim = new Animation(self.World, image, () => self.World.Paused); Anim = new Animation(self.World, image, () => self.World.Paused);
Anim.PlayRepeating(info.Sequence); Anim.PlayRepeating(info.Sequence);
@@ -73,14 +71,14 @@ namespace OpenRA.Mods.Common.Traits.Render
public virtual bool ShouldRender(Actor self) { return true; } public virtual bool ShouldRender(Actor self) { return true; }
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
{ {
return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>(); return !Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>(); return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr) IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
@@ -129,6 +127,6 @@ namespace OpenRA.Mods.Common.Traits.Render
return new IRenderable[] { new UISpriteRenderable(Anim.Image, self.CenterPosition, pxPos, Info.ZOffset, wr.Palette(Info.Palette), 1f) }; return new IRenderable[] { new UISpriteRenderable(Anim.Image, self.CenterPosition, pxPos, Info.ZOffset, wr.Palette(Info.Palette), 1f) };
} }
public void Tick(Actor self) { Anim.Tick(); } void ITick.Tick(Actor self) { Anim.Tick(); }
} }
} }

View File

@@ -52,14 +52,14 @@ namespace OpenRA.Mods.Common.Traits.Render
foreach (var a in w.ActorsWithTrait<WithRangeCircle>()) foreach (var a in w.ActorsWithTrait<WithRangeCircle>())
if (a.Trait.Info.Type == Type) if (a.Trait.Info.Type == Type)
foreach (var r in a.Trait.RenderRangeCircle(wr)) foreach (var r in a.Trait.RenderRangeCircle(a.Actor, wr))
yield return r; yield return r;
} }
public object Create(ActorInitializer init) { return new WithRangeCircle(init.Self, this); } public object Create(ActorInitializer init) { return new WithRangeCircle(init.Self, this); }
} }
class WithRangeCircle : IPostRenderSelection, IPostRender class WithRangeCircle : IRenderAboveShroudWhenSelected, IRenderAboveWorld
{ {
public readonly WithRangeCircleInfo Info; public readonly WithRangeCircleInfo Info;
readonly Actor self; readonly Actor self;
@@ -79,7 +79,7 @@ namespace OpenRA.Mods.Common.Traits.Render
} }
} }
public IEnumerable<IRenderable> RenderRangeCircle(WorldRenderer wr) public IEnumerable<IRenderable> RenderRangeCircle(Actor self, WorldRenderer wr)
{ {
if (Info.Visible == RangeCircleVisibility.WhenSelected && Visible) if (Info.Visible == RangeCircleVisibility.WhenSelected && Visible)
yield return new RangeCircleRenderable( yield return new RangeCircleRenderable(
@@ -92,12 +92,12 @@ namespace OpenRA.Mods.Common.Traits.Render
yield break; yield break;
} }
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
return RenderRangeCircle(wr); return RenderRangeCircle(self, wr);
} }
void IPostRender.RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (Info.Visible == RangeCircleVisibility.Always && Visible) if (Info.Visible == RangeCircleVisibility.Always && Visible)
RangeCircleRenderable.DrawRangeCircle( RangeCircleRenderable.DrawRangeCircle(

View File

@@ -35,22 +35,19 @@ namespace OpenRA.Mods.Common.Traits.Render
public object Create(ActorInitializer init) { return new WithSpriteControlGroupDecoration(init.Self, this); } public object Create(ActorInitializer init) { return new WithSpriteControlGroupDecoration(init.Self, this); }
} }
public class WithSpriteControlGroupDecoration : IPostRenderSelection public class WithSpriteControlGroupDecoration : IRenderAboveShroudWhenSelected
{ {
public readonly WithSpriteControlGroupDecorationInfo Info; public readonly WithSpriteControlGroupDecorationInfo Info;
readonly Actor self;
readonly Animation pipImages; readonly Animation pipImages;
public WithSpriteControlGroupDecoration(Actor self, WithSpriteControlGroupDecorationInfo info) public WithSpriteControlGroupDecoration(Actor self, WithSpriteControlGroupDecorationInfo info)
{ {
this.self = self;
Info = info; Info = info;
pipImages = new Animation(self.World, Info.Image); pipImages = new Animation(self.World, Info.Image);
} }
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (self.World.FogObscures(self)) if (self.World.FogObscures(self))
yield break; yield break;
@@ -59,11 +56,11 @@ namespace OpenRA.Mods.Common.Traits.Render
yield break; yield break;
var pal = wr.Palette(Info.Palette); var pal = wr.Palette(Info.Palette);
foreach (var r in DrawControlGroup(wr, self, pal)) foreach (var r in DrawControlGroup(self, wr, pal))
yield return r; yield return r;
} }
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self, PaletteReference palette) IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr, PaletteReference palette)
{ {
var group = self.World.Selection.GetControlGroupForActor(self); var group = self.World.Selection.GetControlGroupForActor(self);
if (group == null) if (group == null)

View File

@@ -47,17 +47,15 @@ namespace OpenRA.Mods.Common.Traits.Render
public object Create(ActorInitializer init) { return new WithTextControlGroupDecoration(init.Self, this); } public object Create(ActorInitializer init) { return new WithTextControlGroupDecoration(init.Self, this); }
} }
public class WithTextControlGroupDecoration : IPostRenderSelection, INotifyCapture public class WithTextControlGroupDecoration : IRenderAboveShroudWhenSelected, INotifyCapture
{ {
readonly WithTextControlGroupDecorationInfo info; readonly WithTextControlGroupDecorationInfo info;
readonly SpriteFont font; readonly SpriteFont font;
readonly Actor self;
Color color; Color color;
public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info) public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info)
{ {
this.self = self;
this.info = info; this.info = info;
if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font)) if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font))
@@ -66,7 +64,7 @@ namespace OpenRA.Mods.Common.Traits.Render
color = info.UsePlayerColor ? self.Owner.Color.RGB : info.Color; color = info.UsePlayerColor ? self.Owner.Color.RGB : info.Color;
} }
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (self.World.FogObscures(self)) if (self.World.FogObscures(self))
yield break; yield break;
@@ -74,11 +72,11 @@ namespace OpenRA.Mods.Common.Traits.Render
if (self.Owner != wr.World.LocalPlayer) if (self.Owner != wr.World.LocalPlayer)
yield break; yield break;
foreach (var r in DrawControlGroup(wr, self)) foreach (var r in DrawControlGroup(self, wr))
yield return r; yield return r;
} }
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self) IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
{ {
var group = self.World.Selection.GetControlGroupForActor(self); var group = self.World.Selection.GetControlGroupForActor(self);
if (group == null) if (group == null)

View File

@@ -54,34 +54,28 @@ namespace OpenRA.Mods.Common.Traits.Render
} }
} }
public class WithTextDecoration : UpgradableTrait<WithTextDecorationInfo>, IRender, IPostRenderSelection, INotifyCapture public class WithTextDecoration : UpgradableTrait<WithTextDecorationInfo>, IRender, IRenderAboveShroudWhenSelected, INotifyCapture
{ {
readonly Actor self;
readonly SpriteFont font; readonly SpriteFont font;
Color color; Color color;
public WithTextDecoration(Actor self, WithTextDecorationInfo info) public WithTextDecoration(Actor self, WithTextDecorationInfo info)
: base(info) : base(info)
{ {
this.self = self; font = Game.Renderer.Fonts[info.Font];
if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font))
throw new YamlException("Font '{0}' is not listed in the mod.yaml's Fonts section".F(info.Font));
color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color; color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color;
} }
public virtual bool ShouldRender(Actor self) { return true; } public virtual bool ShouldRender(Actor self) { return true; }
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
{ {
return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>(); return !Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>(); return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr) IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits
public virtual object Create(ActorInitializer init) { return new EditorSelectionLayer(init.Self, this); } public virtual object Create(ActorInitializer init) { return new EditorSelectionLayer(init.Self, this); }
} }
public class EditorSelectionLayer : IWorldLoaded, IPostRender public class EditorSelectionLayer : IWorldLoaded, IRenderAboveWorld
{ {
readonly EditorSelectionLayerInfo info; readonly EditorSelectionLayerInfo info;
readonly Map map; readonly Map map;
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
pasteSprite = map.Rules.Sequences.GetSequence(info.Image, info.PasteSequence).GetSprite(0); pasteSprite = map.Rules.Sequences.GetSequence(info.Image, info.PasteSequence).GetSprite(0);
} }
public void WorldLoaded(World w, WorldRenderer wr) void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
{ {
if (w.Type != WorldType.Editor) if (w.Type != WorldType.Editor)
return; return;
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits
CopyRegion = PasteRegion = null; CopyRegion = PasteRegion = null;
} }
public void RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (wr.World.Type != WorldType.Editor) if (wr.World.Type != WorldType.Editor)
return; return;

View File

@@ -151,7 +151,7 @@ namespace OpenRA.Mods.Common.Traits
notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners; notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
} }
public void WorldLoaded(World w, WorldRenderer wr) void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
{ {
// Initialize tile cache // Initialize tile cache
// This includes the region outside the visible area to cover any sprites peeking outside the map // This includes the region outside the visible area to cover any sprites peeking outside the map
@@ -230,7 +230,7 @@ namespace OpenRA.Mods.Common.Traits
cellsDirty.UnionWith(cells); cellsDirty.UnionWith(cells);
} }
public void RenderShroud(WorldRenderer wr, Shroud shroud) void IRenderShroud.RenderShroud(Shroud shroud, WorldRenderer wr)
{ {
if (currentShroud != shroud) if (currentShroud != shroud)
{ {

View File

@@ -20,14 +20,14 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Renders a debug overlay showing the terrain cells. Attach this to the world actor.")] [Desc("Renders a debug overlay showing the terrain cells. Attach this to the world actor.")]
public class TerrainGeometryOverlayInfo : TraitInfo<TerrainGeometryOverlay> { } public class TerrainGeometryOverlayInfo : TraitInfo<TerrainGeometryOverlay> { }
public class TerrainGeometryOverlay : IPostRender, IWorldLoaded, IChatCommand public class TerrainGeometryOverlay : IRenderAboveWorld, IWorldLoaded, IChatCommand
{ {
const string CommandName = "terrainoverlay"; const string CommandName = "terrainoverlay";
const string CommandDesc = "Toggles the terrain geometry overlay"; const string CommandDesc = "Toggles the terrain geometry overlay";
public bool Enabled; public bool Enabled;
public void WorldLoaded(World w, WorldRenderer wr) void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
{ {
var console = w.WorldActor.TraitOrDefault<ChatCommands>(); var console = w.WorldActor.TraitOrDefault<ChatCommands>();
var help = w.WorldActor.TraitOrDefault<HelpCommand>(); var help = w.WorldActor.TraitOrDefault<HelpCommand>();
@@ -39,13 +39,13 @@ namespace OpenRA.Mods.Common.Traits
help.RegisterHelp(CommandName, CommandDesc); help.RegisterHelp(CommandName, CommandDesc);
} }
public void InvokeCommand(string name, string arg) void IChatCommand.InvokeCommand(string name, string arg)
{ {
if (name == CommandName) if (name == CommandName)
Enabled ^= true; Enabled ^= true;
} }
public void RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (!Enabled) if (!Enabled)
return; return;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new WarheadDebugOverlay(this); } public object Create(ActorInitializer init) { return new WarheadDebugOverlay(this); }
} }
public class WarheadDebugOverlay : IPostRender public class WarheadDebugOverlay : IRenderAboveWorld
{ {
class WHImpact class WHImpact
{ {
@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color)); impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color));
} }
public void RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
foreach (var i in impacts) foreach (var i in impacts)
{ {

View File

@@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new WeatherOverlay(init.World, this); } public object Create(ActorInitializer init) { return new WeatherOverlay(init.World, this); }
} }
public class WeatherOverlay : ITick, IPostRender public class WeatherOverlay : ITick, IRenderAboveWorld
{ {
readonly WeatherOverlayInfo info; readonly WeatherOverlayInfo info;
readonly World world; readonly World world;
@@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits
tempParticle.SwingOffset += tempParticle.SwingDirection * tempParticle.SwingSpeed; tempParticle.SwingOffset += tempParticle.SwingDirection * tempParticle.SwingSpeed;
} }
public void Tick(Actor self) void ITick.Tick(Actor self)
{ {
windTickCountdown--; windTickCountdown--;
} }
@@ -298,7 +298,7 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public void RenderAfterWorld(WorldRenderer wr, Actor self) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (!world.Paused) if (!world.Paused)
UpdateWeatherOverlay(wr); UpdateWeatherOverlay(wr);

View File

@@ -31,23 +31,20 @@ namespace OpenRA.Mods.RA.Traits
public object Create(ActorInitializer init) { return new Minelayer(init.Self); } public object Create(ActorInitializer init) { return new Minelayer(init.Self); }
} }
public class Minelayer : IIssueOrder, IResolveOrder, IPostRenderSelection, ISync public class Minelayer : IIssueOrder, IResolveOrder, IRenderAboveShroudWhenSelected, ISync
{ {
/* TODO: [Sync] when sync can cope with arrays! */ /* TODO: [Sync] when sync can cope with arrays! */
public CPos[] Minefield = null; public CPos[] Minefield = null;
readonly Actor self;
readonly Sprite tile; readonly Sprite tile;
[Sync] CPos minefieldStart; [Sync] CPos minefieldStart;
public Minelayer(Actor self) public Minelayer(Actor self)
{ {
this.self = self;
var tileset = self.World.Map.Tileset.ToLowerInvariant(); var tileset = self.World.Map.Tileset.ToLowerInvariant();
tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0); tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
} }
public IEnumerable<IOrderTargeter> Orders IEnumerable<IOrderTargeter> IIssueOrder.Orders
{ {
get get
{ {
@@ -56,7 +53,7 @@ namespace OpenRA.Mods.RA.Traits
} }
} }
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
switch (order.OrderID) switch (order.OrderID)
{ {
@@ -75,7 +72,7 @@ namespace OpenRA.Mods.RA.Traits
} }
} }
public void ResolveOrder(Actor self, Order order) void IResolveOrder.ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "BeginMinefield") if (order.OrderString == "BeginMinefield")
minefieldStart = order.TargetLocation; minefieldStart = order.TargetLocation;
@@ -121,7 +118,7 @@ namespace OpenRA.Mods.RA.Traits
yield return new CPos(i, j); yield return new CPos(i, j);
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{ {
if (self.Owner != self.World.LocalPlayer || Minefield == null) if (self.Owner != self.World.LocalPlayer || Minefield == null)
yield break; yield break;

View File

@@ -20,7 +20,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits namespace OpenRA.Mods.RA.Traits
{ {
// TODO: remove all the Render*Circle duplication // TODO: remove all the Render*Circle duplication
class RenderJammerCircleInfo : ITraitInfo, IPlaceBuildingDecorationInfo class RenderJammerCircleInfo : TraitInfo<RenderJammerCircle>, IPlaceBuildingDecorationInfo
{ {
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{ {
@@ -48,20 +48,14 @@ namespace OpenRA.Mods.RA.Traits
foreach (var a in w.ActorsWithTrait<RenderJammerCircle>()) foreach (var a in w.ActorsWithTrait<RenderJammerCircle>())
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer)) if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
foreach (var r in a.Trait.RenderAfterWorld(wr)) foreach (var r in a.Trait.RenderAboveShroud(a.Actor, wr))
yield return r; yield return r;
} }
public object Create(ActorInitializer init) { return new RenderJammerCircle(init.Self); }
} }
class RenderJammerCircle : IPostRenderSelection class RenderJammerCircle : IRenderAboveShroudWhenSelected
{ {
Actor self; public IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr)
public RenderJammerCircle(Actor self) { this.self = self; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
{ {
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
yield break; yield break;

View File

@@ -11,6 +11,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Graphics;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
@@ -18,33 +19,27 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits namespace OpenRA.Mods.RA.Traits
{ {
class RenderShroudCircleInfo : ITraitInfo, IPlaceBuildingDecorationInfo class RenderShroudCircleInfo : TraitInfo<RenderShroudCircle>, IPlaceBuildingDecorationInfo
{ {
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{ {
yield return new RangeCircleRenderable( var localRange = new RangeCircleRenderable(
centerPosition, centerPosition,
ai.TraitInfo<CreatesShroudInfo>().Range, ai.TraitInfo<CreatesShroudInfo>().Range,
0, 0,
Color.FromArgb(128, Color.Cyan), Color.FromArgb(128, Color.Cyan),
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
foreach (var a in w.ActorsWithTrait<RenderShroudCircle>()) var otherRanges = w.ActorsWithTrait<RenderShroudCircle>()
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer)) .SelectMany(a => a.Trait.RangeCircleRenderables(a.Actor, wr));
foreach (var r in a.Trait.RenderAfterWorld(wr))
yield return r;
}
public object Create(ActorInitializer init) { return new RenderShroudCircle(init.Self); } return otherRanges.Append(localRange);
}
} }
class RenderShroudCircle : IPostRenderSelection class RenderShroudCircle : IRenderAboveShroudWhenSelected
{ {
Actor self; public IEnumerable<IRenderable> RangeCircleRenderables(Actor self, WorldRenderer wr)
public RenderShroudCircle(Actor self) { this.self = self; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
{ {
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
yield break; yield break;
@@ -56,5 +51,10 @@ namespace OpenRA.Mods.RA.Traits
Color.FromArgb(128, Color.Cyan), Color.FromArgb(128, Color.Cyan),
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
} }
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
return RangeCircleRenderables(self, wr);
}
} }
} }