Spatially partition some actor overlays
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,5 +56,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
{
|
{
|
||||||
return RangeCircleRenderables(self, wr);
|
return RangeCircleRenderables(self, wr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -112,5 +112,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
{
|
{
|
||||||
return RangeCircleRenderables(wr);
|
return RangeCircleRenderables(wr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user