From fa65fef4d1cc7996987188907eb9ef2b01356b64 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 9 Dec 2017 19:04:34 +0000 Subject: [PATCH] Add IRenderModifier.ModifyScreenBounds to support WithShadow. --- OpenRA.Game/Traits/TraitsInterfaces.cs | 10 +++++++++- OpenRA.Mods.Common/Traits/Cloak.cs | 5 +++++ .../Traits/Modifiers/FrozenUnderFog.cs | 6 ++++++ .../Traits/Modifiers/HiddenUnderShroud.cs | 8 +++++++- .../Traits/Modifiers/WithColoredOverlay.cs | 6 ++++++ OpenRA.Mods.Common/Traits/Render/Hovers.cs | 6 ++++++ OpenRA.Mods.Common/Traits/Render/WithShadow.cs | 17 ++++++++++++++++- 7 files changed, 55 insertions(+), 3 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 307587481d..f66fa09d80 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -254,7 +254,15 @@ namespace OpenRA.Traits IEnumerable ActorsInBox(WPos a, WPos b); } - public interface IRenderModifier { IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r); } + public interface IRenderModifier + { + IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r); + + // HACK: This is here to support the WithShadow trait. + // That trait should be rewritten using standard techniques, and then this interface method removed + IEnumerable ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable r); + } + public interface ILoadsPalettes { void LoadPalettes(WorldRenderer wr); } public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); } public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary b); } diff --git a/OpenRA.Mods.Common/Traits/Cloak.cs b/OpenRA.Mods.Common/Traits/Cloak.cs index 8f30684951..d86209fcdc 100644 --- a/OpenRA.Mods.Common/Traits/Cloak.cs +++ b/OpenRA.Mods.Common/Traits/Cloak.cs @@ -137,6 +137,11 @@ namespace OpenRA.Mods.Common.Traits return SpriteRenderable.None; } + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } + void ITick.Tick(Actor self) { if (!IsTraitDisabled) diff --git a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs index d61354607d..8343bebac6 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using System.Drawing; using System.Linq; using OpenRA.Graphics; using OpenRA.Primitives; @@ -148,6 +149,11 @@ namespace OpenRA.Mods.Common.Traits { return IsVisible(self, self.World.RenderPlayer) || isRendering ? r : SpriteRenderable.None; } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } } public class HiddenUnderFogInit : IActorInit { } diff --git a/OpenRA.Mods.Common/Traits/Modifiers/HiddenUnderShroud.cs b/OpenRA.Mods.Common/Traits/Modifiers/HiddenUnderShroud.cs index 9a5c253e18..368dbb0e54 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/HiddenUnderShroud.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/HiddenUnderShroud.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using System.Drawing; using OpenRA.Graphics; using OpenRA.Traits; @@ -58,9 +59,14 @@ namespace OpenRA.Mods.Common.Traits return Info.AlwaysVisibleStances.HasStance(stance) || IsVisibleInner(self, byPlayer); } - public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + IEnumerable IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { return IsVisible(self, self.World.RenderPlayer) ? r : SpriteRenderable.None; } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } } } diff --git a/OpenRA.Mods.Common/Traits/Modifiers/WithColoredOverlay.cs b/OpenRA.Mods.Common/Traits/Modifiers/WithColoredOverlay.cs index 3d0dd09b09..9ea30e8749 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/WithColoredOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/WithColoredOverlay.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using System.Drawing; using OpenRA.Graphics; using OpenRA.Traits; @@ -49,5 +50,10 @@ namespace OpenRA.Mods.Common.Traits .AsDecoration(); } } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } } } \ No newline at end of file diff --git a/OpenRA.Mods.Common/Traits/Render/Hovers.cs b/OpenRA.Mods.Common/Traits/Render/Hovers.cs index 47b456cc03..246b5e9368 100644 --- a/OpenRA.Mods.Common/Traits/Render/Hovers.cs +++ b/OpenRA.Mods.Common/Traits/Render/Hovers.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using OpenRA.Graphics; using OpenRA.Traits; @@ -50,5 +51,10 @@ namespace OpenRA.Mods.Common.Traits.Render return r.Select(a => a.OffsetBy(worldVisualOffset)); } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithShadow.cs b/OpenRA.Mods.Common/Traits/Render/WithShadow.cs index bed1dc2cfc..9dfe0928c2 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithShadow.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithShadow.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using System.Drawing; using System.Linq; using OpenRA.Graphics; using OpenRA.Traits; @@ -40,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits.Render this.info = info; } - public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + IEnumerable IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) { if (IsTraitDisabled) return r; @@ -55,5 +56,19 @@ namespace OpenRA.Mods.Common.Traits.Render return shadowSprites.Concat(r); } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + foreach (var r in bounds) + yield return r; + + if (IsTraitDisabled) + yield break; + + var height = self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length; + var offset = wr.ScreenPxOffset(info.Offset - new WVec(0, 0, height)); + foreach (var r in bounds) + yield return new Rectangle(r.X + offset.X, r.Y + offset.Y, r.Width, r.Height); + } } }