Add IEffectAnnotation interface.

This commit is contained in:
Paul Chote
2019-09-15 16:39:58 +01:00
committed by abcdefg30
parent 0ff078968d
commit 8c1b0f1afe
5 changed files with 33 additions and 20 deletions

View File

@@ -24,4 +24,5 @@ namespace OpenRA.Effects
public interface ISpatiallyPartitionable { } public interface ISpatiallyPartitionable { }
public interface IEffectAboveShroud { IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr); } public interface IEffectAboveShroud { IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr); }
public interface IEffectAnnotation { IEnumerable<IRenderable> RenderAnnotation(WorldRenderer wr); }
} }

View File

@@ -166,12 +166,17 @@ namespace OpenRA.Graphics
.Where(t => !t.SpatiallyPartitionable || onScreenActors.Contains(a)) .Where(t => !t.SpatiallyPartitionable || onScreenActors.Contains(a))
.SelectMany(t => t.RenderAnnotations(a, this))); .SelectMany(t => t.RenderAnnotations(a, this)));
var effects = World.Effects.Select(e => e as IEffectAnnotation)
.Where(e => e != null)
.SelectMany(e => e.RenderAnnotation(this));
var orderGenerator = SpriteRenderable.None; var orderGenerator = SpriteRenderable.None;
if (World.OrderGenerator != null) if (World.OrderGenerator != null)
orderGenerator = World.OrderGenerator.RenderAnnotations(this, World); orderGenerator = World.OrderGenerator.RenderAnnotations(this, World);
return actors return actors
.Concat(selected) .Concat(selected)
.Concat(effects)
.Concat(orderGenerator) .Concat(orderGenerator)
.Select(r => r.PrepareRender(this)); .Select(r => r.PrepareRender(this));
} }

View File

@@ -19,7 +19,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Cnc.Effects namespace OpenRA.Mods.Cnc.Effects
{ {
class GpsDotEffect : IEffect, IEffectAboveShroud class GpsDotEffect : IEffect, IEffectAnnotation
{ {
readonly Actor actor; readonly Actor actor;
readonly GpsDotInfo info; readonly GpsDotInfo info;
@@ -97,7 +97,7 @@ namespace OpenRA.Mods.Cnc.Effects
return SpriteRenderable.None; return SpriteRenderable.None;
} }
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr) IEnumerable<IRenderable> IEffectAnnotation.RenderAnnotation(WorldRenderer wr)
{ {
if (actor.World.RenderPlayer == null || !dotStates[actor.World.RenderPlayer].Visible) if (actor.World.RenderPlayer == null || !dotStates[actor.World.RenderPlayer].Visible)
return SpriteRenderable.None; return SpriteRenderable.None;

View File

@@ -18,7 +18,7 @@ using OpenRA.Primitives;
namespace OpenRA.Mods.Common.Effects namespace OpenRA.Mods.Common.Effects
{ {
public class FloatingText : IEffect, IEffectAboveShroud public class FloatingText : IEffect, IEffectAnnotation
{ {
static readonly WVec Velocity = new WVec(0, 0, 86); static readonly WVec Velocity = new WVec(0, 0, 86);
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.Common.Effects
remaining = duration; remaining = duration;
} }
public void Tick(World world) void IEffect.Tick(World world)
{ {
if (--remaining <= 0) if (--remaining <= 0)
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));
@@ -45,9 +45,9 @@ namespace OpenRA.Mods.Common.Effects
pos += Velocity; pos += Velocity;
} }
public IEnumerable<IRenderable> Render(WorldRenderer wr) { return SpriteRenderable.None; } IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr) IEnumerable<IRenderable> IEffectAnnotation.RenderAnnotation(WorldRenderer wr)
{ {
if (wr.World.FogObscures(pos) || wr.World.ShroudObscures(pos)) if (wr.World.FogObscures(pos) || wr.World.ShroudObscures(pos))
yield break; yield break;

View File

@@ -10,13 +10,14 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using OpenRA.Effects; using OpenRA.Effects;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
namespace OpenRA.Mods.Common.Effects namespace OpenRA.Mods.Common.Effects
{ {
class RallyPointIndicator : IEffect, IEffectAboveShroud class RallyPointIndicator : IEffect, IEffectAboveShroud, IEffectAnnotation
{ {
readonly Actor building; readonly Actor building;
readonly RallyPoint rp; readonly RallyPoint rp;
@@ -92,26 +93,32 @@ namespace OpenRA.Mods.Common.Effects
if (!building.World.Selection.Contains(building)) if (!building.World.Selection.Contains(building))
return SpriteRenderable.None; return SpriteRenderable.None;
return RenderInner(wr); var renderables = SpriteRenderable.None;
}
IEnumerable<IRenderable> RenderInner(WorldRenderer wr)
{
if (Game.Settings.Game.TargetLines != TargetLinesType.Disabled)
yield return new TargetLineRenderable(targetLine, building.Owner.Color, rp.Info.LineWidth);
if (circles != null || flag != null) if (circles != null || flag != null)
{ {
var palette = wr.Palette(rp.PaletteName); var palette = wr.Palette(rp.PaletteName);
if (circles != null) if (circles != null)
foreach (var r in circles.Render(targetLine[1], palette)) renderables = renderables.Concat(circles.Render(targetLine[1], palette));
yield return r;
if (flag != null) if (flag != null)
foreach (var r in flag.Render(targetLine[1], palette)) renderables = renderables.Concat(flag.Render(targetLine[1], palette));
yield return r;
} }
return renderables;
}
IEnumerable<IRenderable> IEffectAnnotation.RenderAnnotation(WorldRenderer wr)
{
if (Game.Settings.Game.TargetLines == TargetLinesType.Disabled)
return SpriteRenderable.None;
if (!building.IsInWorld || !building.Owner.IsAlliedWith(building.World.LocalPlayer))
return SpriteRenderable.None;
if (!building.World.Selection.Contains(building))
return SpriteRenderable.None;
return new IRenderable[] { new TargetLineRenderable(targetLine, building.Owner.Color, rp.Info.LineWidth) };
} }
} }
} }