Sort renderables in-place in WorldRenderer.GenerateRenderables
This commit is contained in:
@@ -20,7 +20,7 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
public sealed class WorldRenderer : IDisposable
|
public sealed class WorldRenderer : IDisposable
|
||||||
{
|
{
|
||||||
public static readonly Func<IRenderable, int> RenderableScreenZPositionComparisonKey =
|
public static readonly Func<IRenderable, int> RenderableZPositionComparisonKey =
|
||||||
r => ZPosition(r.Pos, r.ZOffset);
|
r => ZPosition(r.Pos, r.ZOffset);
|
||||||
|
|
||||||
public readonly Size TileSize;
|
public readonly Size TileSize;
|
||||||
@@ -133,7 +133,9 @@ namespace OpenRA.Graphics
|
|||||||
foreach (var e in World.ScreenMap.RenderableEffectsInBox(Viewport.TopLeft, Viewport.BottomRight))
|
foreach (var e in World.ScreenMap.RenderableEffectsInBox(Viewport.TopLeft, Viewport.BottomRight))
|
||||||
renderablesBuffer.AddRange(e.Render(this));
|
renderablesBuffer.AddRange(e.Render(this));
|
||||||
|
|
||||||
foreach (var renderable in renderablesBuffer.OrderBy(RenderableScreenZPositionComparisonKey))
|
renderablesBuffer.Sort((x, y) => RenderableZPositionComparisonKey(x).CompareTo(RenderableZPositionComparisonKey(y)));
|
||||||
|
|
||||||
|
foreach (var renderable in renderablesBuffer)
|
||||||
preparedRenderables.Add(renderable.PrepareRender(this));
|
preparedRenderables.Add(renderable.PrepareRender(this));
|
||||||
|
|
||||||
// PERF: Reuse collection to avoid allocations.
|
// PERF: Reuse collection to avoid allocations.
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var r in RenderFootprint(wr, topLeft, footprint, info.FootprintUnderPreview))
|
foreach (var r in RenderFootprint(wr, topLeft, footprint, info.FootprintUnderPreview))
|
||||||
yield return r;
|
yield return r;
|
||||||
|
|
||||||
foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey))
|
foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableZPositionComparisonKey))
|
||||||
yield return r;
|
yield return r;
|
||||||
|
|
||||||
if (info.FootprintOverPreview != PlaceBuildingCellType.None)
|
if (info.FootprintOverPreview != PlaceBuildingCellType.None)
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation)));
|
var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation)));
|
||||||
var previewRenderables = carryablePreview
|
var previewRenderables = carryablePreview
|
||||||
.SelectMany(p => p.Render(wr, self.CenterPosition + offset))
|
.SelectMany(p => p.Render(wr, self.CenterPosition + offset))
|
||||||
.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey);
|
.OrderBy(WorldRenderer.RenderableZPositionComparisonKey);
|
||||||
|
|
||||||
foreach (var r in previewRenderables)
|
foreach (var r in previewRenderables)
|
||||||
yield return r;
|
yield return r;
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return terrainOrResourcePreview;
|
return terrainOrResourcePreview;
|
||||||
|
|
||||||
if (Type == EditorCursorType.Actor)
|
if (Type == EditorCursorType.Actor)
|
||||||
return Actor.Render().OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey);
|
return Actor.Render().OrderBy(WorldRenderer.RenderableZPositionComparisonKey);
|
||||||
|
|
||||||
return NoRenderables;
|
return NoRenderables;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
|
|
||||||
renderables = preview
|
renderables = preview
|
||||||
.SelectMany(p => p.RenderUI(worldRenderer, origin, scale))
|
.SelectMany(p => p.RenderUI(worldRenderer, origin, scale))
|
||||||
.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey)
|
.OrderBy(WorldRenderer.RenderableZPositionComparisonKey)
|
||||||
.Select(r => r.PrepareRender(worldRenderer))
|
.Select(r => r.PrepareRender(worldRenderer))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user