From 71e3ca4493d51a979b659bfebc0614c97ab0c39e Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 11 Oct 2020 11:54:35 +0100 Subject: [PATCH] Sort renderables in-place in WorldRenderer.GenerateRenderables --- OpenRA.Game/Graphics/WorldRenderer.cs | 6 ++++-- .../Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs | 2 +- OpenRA.Mods.Common/Traits/Carryall.cs | 2 +- OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs | 2 +- OpenRA.Mods.Common/Widgets/ActorPreviewWidget.cs | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index d70abc81e4..387f1fdb78 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -20,7 +20,7 @@ namespace OpenRA.Graphics { public sealed class WorldRenderer : IDisposable { - public static readonly Func RenderableScreenZPositionComparisonKey = + public static readonly Func RenderableZPositionComparisonKey = r => ZPosition(r.Pos, r.ZOffset); public readonly Size TileSize; @@ -133,7 +133,9 @@ namespace OpenRA.Graphics foreach (var e in World.ScreenMap.RenderableEffectsInBox(Viewport.TopLeft, Viewport.BottomRight)) 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)); // PERF: Reuse collection to avoid allocations. diff --git a/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs b/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs index 5e0d93615a..08e61b0802 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var r in RenderFootprint(wr, topLeft, footprint, info.FootprintUnderPreview)) yield return r; - foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey)) + foreach (var r in previewRenderables.OrderBy(WorldRenderer.RenderableZPositionComparisonKey)) yield return r; if (info.FootprintOverPreview != PlaceBuildingCellType.None) diff --git a/OpenRA.Mods.Common/Traits/Carryall.cs b/OpenRA.Mods.Common/Traits/Carryall.cs index 44933577b2..0d4d714f1b 100644 --- a/OpenRA.Mods.Common/Traits/Carryall.cs +++ b/OpenRA.Mods.Common/Traits/Carryall.cs @@ -249,7 +249,7 @@ namespace OpenRA.Mods.Common.Traits var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))); var previewRenderables = carryablePreview .SelectMany(p => p.Render(wr, self.CenterPosition + offset)) - .OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey); + .OrderBy(WorldRenderer.RenderableZPositionComparisonKey); foreach (var r in previewRenderables) yield return r; diff --git a/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs index 14e05686ef..42fb5f436d 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs @@ -147,7 +147,7 @@ namespace OpenRA.Mods.Common.Traits return terrainOrResourcePreview; if (Type == EditorCursorType.Actor) - return Actor.Render().OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey); + return Actor.Render().OrderBy(WorldRenderer.RenderableZPositionComparisonKey); return NoRenderables; } diff --git a/OpenRA.Mods.Common/Widgets/ActorPreviewWidget.cs b/OpenRA.Mods.Common/Widgets/ActorPreviewWidget.cs index 06108135d1..c0f5fc6589 100644 --- a/OpenRA.Mods.Common/Widgets/ActorPreviewWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ActorPreviewWidget.cs @@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Widgets renderables = preview .SelectMany(p => p.RenderUI(worldRenderer, origin, scale)) - .OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey) + .OrderBy(WorldRenderer.RenderableZPositionComparisonKey) .Select(r => r.PrepareRender(worldRenderer)) .ToArray(); }