Spatially partition some actor overlays

This commit is contained in:
reaperrr
2017-09-28 11:15:40 +02:00
committed by RoosterDragon
parent 6ef95405bf
commit 04fb0f209d
16 changed files with 52 additions and 10 deletions

View File

@@ -100,9 +100,9 @@ namespace OpenRA.Graphics
palettes[name].Palette = pal; palettes[name].Palette = pal;
} }
List<IFinalizedRenderable> GenerateRenderables() List<IFinalizedRenderable> GenerateRenderables(IEnumerable<Actor> actorsInBox)
{ {
var actors = World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight).Append(World.WorldActor); var actors = actorsInBox.Append(World.WorldActor);
if (World.RenderPlayer != null) if (World.RenderPlayer != null)
actors = actors.Append(World.RenderPlayer.PlayerActor); actors = actors.Append(World.RenderPlayer.PlayerActor);
@@ -126,13 +126,15 @@ namespace OpenRA.Graphics
return renderables; return renderables;
} }
List<IFinalizedRenderable> GenerateOverlayRenderables() List<IFinalizedRenderable> GenerateOverlayRenderables(IEnumerable<Actor> actorsInBox)
{ {
var aboveShroud = World.ActorsWithTrait<IRenderAboveShroud>().Where(a => a.Actor.IsInWorld && !a.Actor.Disposed) var aboveShroud = World.ActorsWithTrait<IRenderAboveShroud>()
.SelectMany(a => a.Trait.RenderAboveShroud(a.Actor, this)); .Where(a => a.Actor.IsInWorld && !a.Actor.Disposed && (!a.Trait.SpatiallyPartitionable || actorsInBox.Contains(a.Actor)))
.SelectMany(a => a.Trait.RenderAboveShroud(a.Actor, this));
var aboveShroudSelected = World.Selection.Actors.Where(a => !a.Disposed) var aboveShroudSelected = World.Selection.Actors.Where(a => a.IsInWorld && !a.Disposed)
.SelectMany(a => a.TraitsImplementing<IRenderAboveShroudWhenSelected>() .SelectMany(a => a.TraitsImplementing<IRenderAboveShroudWhenSelected>()
.Where(t => !t.SpatiallyPartitionable || actorsInBox.Contains(a))
.SelectMany(t => t.RenderAboveShroud(a, this))); .SelectMany(t => t.RenderAboveShroud(a, this)));
var aboveShroudEffects = World.Effects.Select(e => e as IEffectAboveShroud) var aboveShroudEffects = World.Effects.Select(e => e as IEffectAboveShroud)
@@ -169,7 +171,8 @@ namespace OpenRA.Graphics
RefreshPalette(); RefreshPalette();
var renderables = GenerateRenderables(); var onScreenActors = World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight);
var renderables = GenerateRenderables(onScreenActors);
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor); var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
Game.Renderer.EnableScissor(bounds); Game.Renderer.EnableScissor(bounds);
@@ -202,7 +205,7 @@ namespace OpenRA.Graphics
Game.Renderer.DisableScissor(); Game.Renderer.DisableScissor();
var finalOverlayRenderables = GenerateOverlayRenderables(); var finalOverlayRenderables = GenerateOverlayRenderables(onScreenActors);
// HACK: Keep old grouping behaviour // HACK: Keep old grouping behaviour
var groupedOverlayRenderables = finalOverlayRenderables.GroupBy(prs => prs.GetType()); var groupedOverlayRenderables = finalOverlayRenderables.GroupBy(prs => prs.GetType());

View File

@@ -322,8 +322,18 @@ namespace OpenRA.Traits
public interface IRenderAboveWorld { void RenderAboveWorld(Actor self, WorldRenderer wr); } public interface IRenderAboveWorld { void RenderAboveWorld(Actor self, WorldRenderer wr); }
public interface IRenderShroud { void RenderShroud(Shroud shroud, WorldRenderer wr); } public interface IRenderShroud { void RenderShroud(Shroud shroud, WorldRenderer wr); }
public interface IRenderAboveShroud { IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr); }
public interface IRenderAboveShroudWhenSelected { IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr); } public interface IRenderAboveShroud
{
IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr);
bool SpatiallyPartitionable { get; }
}
public interface IRenderAboveShroudWhenSelected
{
IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr);
bool SpatiallyPartitionable { get; }
}
public interface ITargetableInfo : ITraitInfoInterface public interface ITargetableInfo : ITraitInfoInterface
{ {

View File

@@ -156,6 +156,8 @@ namespace OpenRA.Mods.Cnc.Traits
WVec.Zero, -511, pal, 1f, true); WVec.Zero, -511, pal, 1f, true);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
class MinefieldOrderGenerator : IOrderGenerator class MinefieldOrderGenerator : IOrderGenerator
{ {
readonly List<Actor> minelayers; readonly List<Actor> minelayers;

View File

@@ -60,5 +60,7 @@ namespace OpenRA.Mods.Cnc.Traits
Color.FromArgb(96, Color.Black)); Color.FromArgb(96, Color.Black));
} }
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
} }
} }

View File

@@ -56,5 +56,7 @@ namespace OpenRA.Mods.Cnc.Traits
{ {
return RangeCircleRenderables(self, wr); return RangeCircleRenderables(self, wr);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
} }
} }

View File

@@ -99,6 +99,8 @@ namespace OpenRA.Mods.Common.Traits
return RangeCircleRenderables(wr); return RangeCircleRenderables(wr);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
float ISelectionBar.GetValue() float ISelectionBar.GetValue()
{ {
// Visible to player and allies // Visible to player and allies

View File

@@ -83,6 +83,8 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
void INotifyBecomingIdle.OnBecomingIdle(Actor a) void INotifyBecomingIdle.OnBecomingIdle(Actor a)
{ {
if (a.IsIdle) if (a.IsIdle)

View File

@@ -97,5 +97,7 @@ namespace OpenRA.Mods.Common.Traits.Render
var aiSquadInfo = "{0}, {1}".F(squad.Type, squad.TargetActor); var aiSquadInfo = "{0}, {1}".F(squad.Type, squad.TargetActor);
yield return new TextRenderable(font, self.CenterPosition + offset, 0, color, aiSquadInfo); yield return new TextRenderable(font, self.CenterPosition + offset, 0, color, aiSquadInfo);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return true; } }
} }
} }

View File

@@ -69,6 +69,8 @@ namespace OpenRA.Mods.Common.Traits.Render
info.ContrastColor); info.ContrastColor);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
void ITick.Tick(Actor self) void ITick.Tick(Actor self)
{ {
lineAngle += info.UpdateLineTick; lineAngle += info.UpdateLineTick;

View File

@@ -112,5 +112,7 @@ namespace OpenRA.Mods.Common.Traits.Render
{ {
return RangeCircleRenderables(wr); return RangeCircleRenderables(wr);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
} }
} }

View File

@@ -82,6 +82,8 @@ namespace OpenRA.Mods.Common.Traits.Render
return DrawDecorations(self, wr); return DrawDecorations(self, wr);
} }
bool IRenderAboveShroud.SpatiallyPartitionable { get { return true; } }
IEnumerable<IRenderable> DrawDecorations(Actor self, WorldRenderer wr) IEnumerable<IRenderable> DrawDecorations(Actor self, WorldRenderer wr)
{ {
var selected = self.World.Selection.Contains(self); var selected = self.World.Selection.Contains(self);

View File

@@ -92,6 +92,9 @@ namespace OpenRA.Mods.Common.Traits.Render
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None; return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
bool IRenderAboveShroud.SpatiallyPartitionable { get { return true; } }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return true; } }
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr) IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
{ {
if (IsTraitDisabled || self.IsDead || !self.IsInWorld || Anim == null) if (IsTraitDisabled || self.IsDead || !self.IsInWorld || Anim == null)

View File

@@ -97,6 +97,8 @@ namespace OpenRA.Mods.Common.Traits.Render
return RenderRangeCircle(self, wr); return RenderRangeCircle(self, wr);
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr) void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
{ {
if (Info.Visible == RangeCircleVisibility.Always && Visible) if (Info.Visible == RangeCircleVisibility.Always && Visible)

View File

@@ -62,6 +62,8 @@ namespace OpenRA.Mods.Common.Traits.Render
yield return r; yield return r;
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return true; } }
IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr, PaletteReference palette) IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr, PaletteReference palette)
{ {
var group = self.World.Selection.GetControlGroupForActor(self); var group = self.World.Selection.GetControlGroupForActor(self);

View File

@@ -79,6 +79,8 @@ namespace OpenRA.Mods.Common.Traits.Render
yield return r; yield return r;
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return true; } }
IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr) IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
{ {
var group = self.World.Selection.GetControlGroupForActor(self); var group = self.World.Selection.GetControlGroupForActor(self);

View File

@@ -88,6 +88,8 @@ namespace OpenRA.Mods.Common.Traits.Render
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None; return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
} }
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return true; } }
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr) IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
{ {
if (IsTraitDisabled || self.IsDead || !self.IsInWorld) if (IsTraitDisabled || self.IsDead || !self.IsInWorld)