Interleave renderables for effects and actors.

Previously, renderables from actors were z-ordered, but effects were excluded and not ordered. Now we order them all as a whole.
This commit is contained in:
RoosterDragon
2015-11-26 02:00:42 +00:00
parent 7cc8846d72
commit a50fa4fcaa

View File

@@ -94,10 +94,7 @@ namespace OpenRA.Graphics
List<IFinalizedRenderable> GenerateRenderables() List<IFinalizedRenderable> GenerateRenderables()
{ {
var actors = World.ScreenMap.ActorsInBox(Viewport.TopLeft, Viewport.BottomRight) var actors = World.ScreenMap.ActorsInBox(Viewport.TopLeft, Viewport.BottomRight).Append(World.WorldActor);
.Append(World.WorldActor);
// Include player actor for the rendered player
if (World.RenderPlayer != null) if (World.RenderPlayer != null)
actors = actors.Append(World.RenderPlayer.PlayerActor); actors = actors.Append(World.RenderPlayer.PlayerActor);
@@ -105,19 +102,14 @@ namespace OpenRA.Graphics
if (World.OrderGenerator != null) if (World.OrderGenerator != null)
worldRenderables = worldRenderables.Concat(World.OrderGenerator.Render(this, World)); worldRenderables = worldRenderables.Concat(World.OrderGenerator.Render(this, World));
worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this)));
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey); worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
// Effects are drawn on top of all actors
// HACK: Effects aren't interleaved with actors.
var effectRenderables = World.Effects
.SelectMany(e => e.Render(this));
if (World.OrderGenerator != null) if (World.OrderGenerator != null)
effectRenderables = effectRenderables.Concat(World.OrderGenerator.RenderAfterWorld(this, World)); worldRenderables = worldRenderables.Concat(World.OrderGenerator.RenderAfterWorld(this, World));
Game.Renderer.WorldVoxelRenderer.BeginFrame(); Game.Renderer.WorldVoxelRenderer.BeginFrame();
var renderables = worldRenderables.Concat(effectRenderables) var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList();
.Select(r => r.PrepareRender(this)).ToList();
Game.Renderer.WorldVoxelRenderer.EndFrame(); Game.Renderer.WorldVoxelRenderer.EndFrame();
return renderables; return renderables;