Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FirstNonEmptyBounds method for IDecorationBounds interface. #14930

Merged
merged 1 commit into from Mar 18, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 28 additions & 0 deletions OpenRA.Game/Traits/TraitsInterfaces.cs
Expand Up @@ -110,6 +110,34 @@ public interface IAutoMouseBounds { Rectangle AutoMouseoverBounds(Actor self, Wo
// HACK: This provides a shim for legacy code until it can be rewritten
public interface IDecorationBounds { Rectangle DecorationBounds(Actor self, WorldRenderer wr); }
public interface IDecorationBoundsInfo : ITraitInfoInterface { }
public static class DecorationBoundsExtensions
{
public static Rectangle FirstNonEmptyBounds(this IEnumerable<IDecorationBounds> decorationBounds, Actor self, WorldRenderer wr)
{
// PERF: Avoid LINQ.
foreach (var decoration in decorationBounds)
{
var bounds = decoration.DecorationBounds(self, wr);
if (!bounds.IsEmpty)
return bounds;
}

return Rectangle.Empty;
}

public static Rectangle FirstNonEmptyBounds(this IDecorationBounds[] decorationBounds, Actor self, WorldRenderer wr)
{
// PERF: Avoid LINQ.
foreach (var decoration in decorationBounds)
{
var bounds = decoration.DecorationBounds(self, wr);
if (!bounds.IsEmpty)
return bounds;
}

return Rectangle.Empty;
}
}

public interface IIssueOrder
{
Expand Down
10 changes: 2 additions & 8 deletions OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs
Expand Up @@ -163,10 +163,7 @@ public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{
if (unit.CanBeViewedByPlayer(manager.Self.Owner))
{
var bounds = unit.TraitsImplementing<IDecorationBounds>()
.Select(b => b.DecorationBounds(unit, wr))
.FirstOrDefault(b => !b.IsEmpty);

var bounds = unit.TraitsImplementing<IDecorationBounds>().FirstNonEmptyBounds(unit, wr);
yield return new SelectionBoxRenderable(unit, bounds, Color.Red);
}
}
Expand Down Expand Up @@ -281,10 +278,7 @@ public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{
if (unit.CanBeViewedByPlayer(manager.Self.Owner))
{
var bounds = unit.TraitsImplementing<IDecorationBounds>()
.Select(b => b.DecorationBounds(unit, wr))
.FirstOrDefault(b => !b.IsEmpty);

var bounds = unit.TraitsImplementing<IDecorationBounds>().FirstNonEmptyBounds(unit, wr);
yield return new SelectionBoxRenderable(unit, bounds, Color.Red);
}
}
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Render/RenderNameTag.cs
Expand Up @@ -50,7 +50,7 @@ public RenderNameTag(Actor self, RenderNameTagInfo info)

public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{
var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);
var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
var effectPos = wr.ProjectedPosition(new int2((bounds.Left + bounds.Right) / 2, bounds.Y - spaceBuffer));

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs
Expand Up @@ -89,7 +89,7 @@ IEnumerable<IRenderable> DrawDecorations(Actor self, WorldRenderer wr)
var selected = self.World.Selection.Contains(self);
var regularWorld = self.World.Type == WorldType.Regular;
var statusBars = Game.Settings.Game.StatusBars;
var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);

// Health bars are shown when:
// * actor is selected
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Render/WithDecoration.cs
Expand Up @@ -106,7 +106,7 @@ IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
if (!ShouldRender(self) || self.World.FogObscures(self))
return Enumerable.Empty<IRenderable>();

var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);
var halfSize = (0.5f * Anim.Image.Size.XY).ToInt2();

var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2;
Expand Down
Expand Up @@ -72,7 +72,7 @@ IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr, PaletteR

pipImages.PlayFetchIndex(Info.GroupSequence, () => (int)group);

var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);
var boundsOffset = 0.5f * new float2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom);
if (Info.ReferencePoint.HasFlag(ReferencePoints.Top))
boundsOffset -= new float2(0, 0.5f * bounds.Height);
Expand Down
Expand Up @@ -87,7 +87,7 @@ IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
if (group == null)
yield break;

var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);
var number = group.Value.ToString();
var halfSize = font.Measure(number) / 2;

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs
Expand Up @@ -105,7 +105,7 @@ IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
if (!ShouldRender(self) || self.World.FogObscures(self))
return Enumerable.Empty<IRenderable>();

var bounds = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
var bounds = decorationBounds.FirstNonEmptyBounds(self, wr);
var halfSize = font.Measure(Info.Text) / 2;

var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2;
Expand Down
Expand Up @@ -138,9 +138,7 @@ public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
foreach (var unit in power.UnitsInRange(xy))
{
var bounds = unit.TraitsImplementing<IDecorationBounds>()
.Select(b => b.DecorationBounds(unit, wr))
.FirstOrDefault(b => !b.IsEmpty);
var bounds = unit.TraitsImplementing<IDecorationBounds>().FirstNonEmptyBounds(unit, wr);
yield return new SelectionBoxRenderable(unit, bounds, Color.Red);
}
}
Expand Down
Expand Up @@ -51,10 +51,7 @@ void DrawRollover(Actor unit)
// TODO: Integrate this with SelectionDecorations to unhardcode the *Renderable
if (unit.Info.HasTraitInfo<SelectableInfo>())
{
var bounds = unit.TraitsImplementing<IDecorationBounds>()
.Select(b => b.DecorationBounds(unit, worldRenderer))
.FirstOrDefault(b => !b.IsEmpty);

var bounds = unit.TraitsImplementing<IDecorationBounds>().FirstNonEmptyBounds(unit, worldRenderer);
new SelectionBarsRenderable(unit, bounds, true, true).Render(worldRenderer);
}
}
Expand Down