Skip to content

Commit

Permalink
WorldRenderer, replace foreach ActorsWithTraits with ApplyToActorsWit…
Browse files Browse the repository at this point in the history
…hTrait. #18798.
  • Loading branch information
anvilvapre committed Aug 10, 2021
1 parent 0249116 commit ff0b756
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 15 deletions.
31 changes: 16 additions & 15 deletions OpenRA.Game/Graphics/WorldRenderer.cs
Expand Up @@ -153,14 +153,14 @@ void GenerateRenderables()
// PERF: Avoid LINQ.
void GenerateOverlayRenderables()
{
foreach (var a in World.ActorsWithTrait<IRenderAboveShroud>())
World.ApplyToActorsWithTrait<IRenderAboveShroud>((actor, trait) =>
{
if (!a.Actor.IsInWorld || a.Actor.Disposed || (a.Trait.SpatiallyPartitionable && !onScreenActors.Contains(a.Actor)))
continue;
if (!actor.IsInWorld || actor.Disposed || (trait.SpatiallyPartitionable && !onScreenActors.Contains(actor)))
return;
foreach (var renderable in a.Trait.RenderAboveShroud(a.Actor, this))
foreach (var renderable in trait.RenderAboveShroud(actor, this))
preparedOverlayRenderables.Add(renderable.PrepareRender(this));
}
});

foreach (var a in World.Selection.Actors)
{
Expand Down Expand Up @@ -195,14 +195,14 @@ void GenerateOverlayRenderables()
// PERF: Avoid LINQ.
void GenerateAnnotationRenderables()
{
foreach (var a in World.ActorsWithTrait<IRenderAnnotations>())
World.ApplyToActorsWithTrait<IRenderAnnotations>((Actor actor, IRenderAnnotations trait) =>
{
if (!a.Actor.IsInWorld || a.Actor.Disposed || (a.Trait.SpatiallyPartitionable && !onScreenActors.Contains(a.Actor)))
continue;
if (!actor.IsInWorld || actor.Disposed || (trait.SpatiallyPartitionable && !onScreenActors.Contains(actor)))
return;
foreach (var renderAnnotation in a.Trait.RenderAnnotations(a.Actor, this))
foreach (var renderAnnotation in trait.RenderAnnotations(actor, this))
preparedAnnotationRenderables.Add(renderAnnotation.PrepareRender(this));
}
});

foreach (var a in World.Selection.Actors)
{
Expand Down Expand Up @@ -278,15 +278,16 @@ public void Draw()
if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer();

foreach (var a in World.ActorsWithTrait<IRenderAboveWorld>())
if (a.Actor.IsInWorld && !a.Actor.Disposed)
a.Trait.RenderAboveWorld(a.Actor, this);
World.ApplyToActorsWithTrait<IRenderAboveWorld>((actor, trait) =>
{
if (actor.IsInWorld && !actor.Disposed)
trait.RenderAboveWorld(actor, this);
});

if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer();

foreach (var a in World.ActorsWithTrait<IRenderShroud>())
a.Trait.RenderShroud(this);
World.ApplyToActorsWithTrait<IRenderShroud>((Actor actor, IRenderShroud trait) => trait.RenderShroud(this));

if (enableDepthBuffer)
Game.Renderer.Context.DisableDepthBuffer();
Expand Down
5 changes: 5 additions & 0 deletions OpenRA.Game/World.cs
Expand Up @@ -508,6 +508,11 @@ public void ApplyToActorsWithTraitTimed<T>(Action<Actor, T> action, string text)
TraitDict.ApplyToActorsWithTraitTimed<T>(action, text);
}

public void ApplyToActorsWithTrait<T>(Action<Actor, T> action)
{
TraitDict.ApplyToActorsWithTrait<T>(action);
}

public IEnumerable<Actor> ActorsHavingTrait<T>()
{
return TraitDict.ActorsHavingTrait<T>();
Expand Down

0 comments on commit ff0b756

Please sign in to comment.