diff --git a/OpenRA.Mods.RA/Effects/FrozenActorProxy.cs b/OpenRA.Mods.RA/Effects/FrozenActorProxy.cs new file mode 100644 index 0000000000..96fe2d82e0 --- /dev/null +++ b/OpenRA.Mods.RA/Effects/FrozenActorProxy.cs @@ -0,0 +1,53 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Effects; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Effects +{ + public class FrozenActorProxy : IEffect + { + readonly Actor self; + readonly IEnumerable footprint; + IRenderable[] renderables; + + public FrozenActorProxy(Actor self, IEnumerable footprint) + { + this.self = self; + this.footprint = footprint; + } + + public void Tick(World world) { } + public void SetRenderables(IEnumerable r) + { + renderables = r.Select(rr => rr).ToArray(); + } + + public IEnumerable Render(WorldRenderer wr) + { + if (renderables == null) + return SpriteRenderable.None; + + if (footprint.Any(c => !wr.world.FogObscures(c))) + { + if (self.Destroyed) + self.World.AddFrameEndTask(w => w.Remove(this)); + + return SpriteRenderable.None; + } + + return renderables; + } + } +} diff --git a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs index 3ec4839eaa..14b1620797 100644 --- a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -11,25 +11,48 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Effects; using OpenRA.Traits; namespace OpenRA.Mods.RA { - class FrozenUnderFogInfo : TraitInfo {} - - class FrozenUnderFog : IRenderModifier, IVisibilityModifier + public class FrozenUnderFogInfo : ITraitInfo, Requires, Requires { + public object Create(ActorInitializer init) { return new FrozenUnderFog(init.self); } + } + + public class FrozenUnderFog : IRenderModifier, IVisibilityModifier, ITickRender + { + FrozenActorProxy proxy; + IEnumerable footprint; + bool visible; + + public FrozenUnderFog(Actor self) + { + footprint = FootprintUtils.Tiles(self); + proxy = new FrozenActorProxy(self, footprint); + self.World.AddFrameEndTask(w => w.Add(proxy)); + } + public bool IsVisible(Actor self, Player byPlayer) { - return byPlayer == null || Shroud.GetVisOrigins(self).Any(o => byPlayer.Shroud.IsVisible(o)); + return byPlayer == null || footprint.Any(c => byPlayer.Shroud.IsVisible(c)); + } + + public void TickRender(WorldRenderer wr, Actor self) + { + if (self.Destroyed) + return; + + visible = IsVisible(self, self.World.RenderPlayer); + if (visible) + proxy.SetRenderables(self.Render(wr)); } - IRenderable[] cache = { }; public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { - if (IsVisible(self, self.World.RenderPlayer)) - cache = r.ToArray(); - return cache; + return visible ? r : SpriteRenderable.None; } } -} +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index b45286a48b..c488da4824 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -461,6 +461,7 @@ +