Add IRenderModifier.ModifyScreenBounds to support WithShadow.

This commit is contained in:
Paul Chote
2017-12-09 19:04:34 +00:00
committed by reaperrr
parent 86bfe28ade
commit fa65fef4d1
7 changed files with 55 additions and 3 deletions

View File

@@ -254,7 +254,15 @@ namespace OpenRA.Traits
IEnumerable<Actor> ActorsInBox(WPos a, WPos b); IEnumerable<Actor> ActorsInBox(WPos a, WPos b);
} }
public interface IRenderModifier { IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r); } public interface IRenderModifier
{
IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> 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<Rectangle> ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> r);
}
public interface ILoadsPalettes { void LoadPalettes(WorldRenderer wr); } public interface ILoadsPalettes { void LoadPalettes(WorldRenderer wr); }
public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); } public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); }
public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary<string, MutablePalette> b); } public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary<string, MutablePalette> b); }

View File

@@ -137,6 +137,11 @@ namespace OpenRA.Mods.Common.Traits
return SpriteRenderable.None; return SpriteRenderable.None;
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
{
return bounds;
}
void ITick.Tick(Actor self) void ITick.Tick(Actor self)
{ {
if (!IsTraitDisabled) if (!IsTraitDisabled)

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Primitives; using OpenRA.Primitives;
@@ -148,6 +149,11 @@ namespace OpenRA.Mods.Common.Traits
{ {
return IsVisible(self, self.World.RenderPlayer) || isRendering ? r : SpriteRenderable.None; return IsVisible(self, self.World.RenderPlayer) || isRendering ? r : SpriteRenderable.None;
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
{
return bounds;
}
} }
public class HiddenUnderFogInit : IActorInit { } public class HiddenUnderFogInit : IActorInit { }

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
@@ -58,9 +59,14 @@ namespace OpenRA.Mods.Common.Traits
return Info.AlwaysVisibleStances.HasStance(stance) || IsVisibleInner(self, byPlayer); return Info.AlwaysVisibleStances.HasStance(stance) || IsVisibleInner(self, byPlayer);
} }
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r) IEnumerable<IRenderable> IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
{ {
return IsVisible(self, self.World.RenderPlayer) ? r : SpriteRenderable.None; return IsVisible(self, self.World.RenderPlayer) ? r : SpriteRenderable.None;
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
{
return bounds;
}
} }
} }

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
@@ -49,5 +50,10 @@ namespace OpenRA.Mods.Common.Traits
.AsDecoration(); .AsDecoration();
} }
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
{
return bounds;
}
} }
} }

View File

@@ -11,6 +11,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
@@ -50,5 +51,10 @@ namespace OpenRA.Mods.Common.Traits.Render
return r.Select(a => a.OffsetBy(worldVisualOffset)); return r.Select(a => a.OffsetBy(worldVisualOffset));
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
{
return bounds;
}
} }
} }

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
@@ -40,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits.Render
this.info = info; this.info = info;
} }
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r) IEnumerable<IRenderable> IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
{ {
if (IsTraitDisabled) if (IsTraitDisabled)
return r; return r;
@@ -55,5 +56,19 @@ namespace OpenRA.Mods.Common.Traits.Render
return shadowSprites.Concat(r); return shadowSprites.Concat(r);
} }
IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> 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);
}
} }
} }