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

@@ -23,15 +23,17 @@ namespace OpenRA.Mods.Common.Traits
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;
DrawLineToTargetInfo info;
readonly DrawLineToTargetInfo info;
List<Target> targets;
Color c;
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)
{
@@ -51,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
lifetime = info.Delay;
}
public void Selected(Actor a)
void INotifySelected.Selected(Actor a)
{
if (a.IsIdle)
return;
@@ -60,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
lifetime = info.Delay;
}
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt);
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)
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); }
}
class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IPostRenderSelection
class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IRenderAboveShroudWhenSelected
{
readonly DeveloperMode devMode;
readonly SpriteFont font;
@@ -53,12 +53,12 @@ namespace OpenRA.Mods.Common.Traits.Render
ai = self.Owner.PlayerActor.TraitsImplementing<HackyAI>().FirstOrDefault(x => x.IsEnabled);
}
public void AddedToWorld(Actor self)
void INotifyAddedToWorld.AddedToWorld(Actor self)
{
tagString = self.ToString();
}
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
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;
}
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
if (devMode == null || !devMode.ShowActorTags)
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); }
}
class RenderDetectionCircle : ITick, IPostRenderSelection
class RenderDetectionCircle : ITick, IRenderAboveShroudWhenSelected
{
readonly RenderDetectionCircleInfo info;
readonly Actor self;
WAngle lineAngle;
public RenderDetectionCircle(Actor self, RenderDetectionCircleInfo 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))
yield break;
@@ -71,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits.Render
info.ContrastColor);
}
public void Tick(Actor self)
void ITick.Tick(Actor self)
{
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)
{
if (range == WDist.Zero)
yield break;
return SpriteRenderable.None;
yield return new RangeCircleRenderable(
var localRange = new RangeCircleRenderable(
centerPosition,
range,
0,
Color.FromArgb(128, Color.Yellow),
Color.FromArgb(96, Color.Black));
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
if (a.Actor.Info.TraitInfo<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType)
foreach (var r in a.Trait.RenderAfterWorld(wr))
yield return r;
var otherRanges = w.ActorsWithTrait<RenderRangeCircle>()
.Where(a => a.Trait.Info.RangeCircleType == RangeCircleType)
.SelectMany(a => a.Trait.RangeCircleRenderables(wr));
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)
{
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 AttackBase attack;
public RenderRangeCircle(Actor self)
public RenderRangeCircle(Actor self, RenderRangeCircleInfo info)
{
Info = info;
this.self = self;
attack = self.Trait<AttackBase>();
}
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
public IEnumerable<IRenderable> RangeCircleRenderables(WorldRenderer wr)
{
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
yield break;
@@ -87,5 +91,10 @@ namespace OpenRA.Mods.Common.Traits.Render
Color.FromArgb(128, Color.Yellow),
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 class SelectionDecorations : IPostRenderSelection, ITick
public class SelectionDecorations : IRenderAboveShroudWhenSelected, ITick
{
// 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" };
public readonly SelectionDecorationsInfo Info;
readonly Actor self;
readonly Animation pipImages;
public SelectionDecorations(Actor self, SelectionDecorationsInfo info)
{
this.self = self;
Info = info;
pipImages = new Animation(self.World, Info.Image);
}
IEnumerable<WPos> ActivityTargetPath()
IEnumerable<WPos> ActivityTargetPath(Actor self)
{
if (!self.IsInWorld || self.IsDead)
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))
yield break;
@@ -90,18 +88,18 @@ namespace OpenRA.Mods.Common.Traits.Render
yield break;
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 pos = wr.ScreenPxPosition(self.CenterPosition);
var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
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;
}
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>();
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 class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IPostRenderSelection
public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IRenderAboveShroudWhenSelected
{
protected readonly Animation Anim;
readonly string image;
readonly Actor self;
public WithDecoration(Actor self, WithDecorationInfo info)
: base(info)
{
this.self = self;
image = info.Image ?? self.Info.Name;
Anim = new Animation(self.World, image, () => self.World.Paused);
Anim.PlayRepeating(info.Sequence);
@@ -73,14 +71,14 @@ namespace OpenRA.Mods.Common.Traits.Render
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)
@@ -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) };
}
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>())
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;
}
public object Create(ActorInitializer init) { return new WithRangeCircle(init.Self, this); }
}
class WithRangeCircle : IPostRenderSelection, IPostRender
class WithRangeCircle : IRenderAboveShroudWhenSelected, IRenderAboveWorld
{
public readonly WithRangeCircleInfo Info;
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)
yield return new RangeCircleRenderable(
@@ -92,12 +92,12 @@ namespace OpenRA.Mods.Common.Traits.Render
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)
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 class WithSpriteControlGroupDecoration : IPostRenderSelection
public class WithSpriteControlGroupDecoration : IRenderAboveShroudWhenSelected
{
public readonly WithSpriteControlGroupDecorationInfo Info;
readonly Actor self;
readonly Animation pipImages;
public WithSpriteControlGroupDecoration(Actor self, WithSpriteControlGroupDecorationInfo info)
{
this.self = self;
Info = info;
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))
yield break;
@@ -59,11 +56,11 @@ namespace OpenRA.Mods.Common.Traits.Render
yield break;
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;
}
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);
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 class WithTextControlGroupDecoration : IPostRenderSelection, INotifyCapture
public class WithTextControlGroupDecoration : IRenderAboveShroudWhenSelected, INotifyCapture
{
readonly WithTextControlGroupDecorationInfo info;
readonly SpriteFont font;
readonly Actor self;
Color color;
public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info)
{
this.self = self;
this.info = info;
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;
}
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr)
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
if (self.World.FogObscures(self))
yield break;
@@ -74,11 +72,11 @@ namespace OpenRA.Mods.Common.Traits.Render
if (self.Owner != wr.World.LocalPlayer)
yield break;
foreach (var r in DrawControlGroup(wr, self))
foreach (var r in DrawControlGroup(self, wr))
yield return r;
}
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self)
IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
{
var group = self.World.Selection.GetControlGroupForActor(self);
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;
Color color;
public WithTextDecoration(Actor self, WithTextDecorationInfo info)
: base(info)
{
this.self = self;
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));
font = Game.Renderer.Fonts[info.Font];
color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color;
}
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)