From c82d1b437e715aa4b7ccdec06962842e873cc683 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 26 Jun 2023 01:56:20 +1000 Subject: [PATCH] Fix some MapPainter warnings (#17639) --- Content.MapRenderer/Painters/EntityData.cs | 21 ++++++--------- Content.MapRenderer/Painters/EntityPainter.cs | 13 ++++----- Content.MapRenderer/Painters/GridPainter.cs | 19 ++++++------- Content.MapRenderer/Painters/MapPainter.cs | 27 ++++++++++--------- Content.MapRenderer/Painters/TilePainter.cs | 8 +++--- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Content.MapRenderer/Painters/EntityData.cs b/Content.MapRenderer/Painters/EntityData.cs index 8ce8f767d2..8aad0c7e93 100644 --- a/Content.MapRenderer/Painters/EntityData.cs +++ b/Content.MapRenderer/Painters/EntityData.cs @@ -1,20 +1,15 @@ using Robust.Client.GameObjects; +using Robust.Shared.GameObjects; -namespace Content.MapRenderer.Painters +namespace Content.MapRenderer.Painters; + +public readonly record struct EntityData(EntityUid Owner, SpriteComponent Sprite, float X, float Y) { - public sealed class EntityData - { - public EntityData(SpriteComponent sprite, float x, float y) - { - Sprite = sprite; - X = x; - Y = y; - } + public readonly EntityUid Owner = Owner; - public SpriteComponent Sprite { get; } + public readonly SpriteComponent Sprite = Sprite; - public float X { get; } + public readonly float X = X; - public float Y { get; } - } + public readonly float Y = Y; } diff --git a/Content.MapRenderer/Painters/EntityPainter.cs b/Content.MapRenderer/Painters/EntityPainter.cs index 0ef968b2d5..3aae7a3846 100644 --- a/Content.MapRenderer/Painters/EntityPainter.cs +++ b/Content.MapRenderer/Painters/EntityPainter.cs @@ -38,23 +38,24 @@ public sealed class EntityPainter // TODO cache this shit what are we insane entities.Sort(Comparer.Create((x, y) => x.Sprite.DrawDepth.CompareTo(y.Sprite.DrawDepth))); + var xformSystem = _sEntityManager.System(); foreach (var entity in entities) { - Run(canvas, entity); + Run(canvas, entity, xformSystem); } Console.WriteLine($"{nameof(EntityPainter)} painted {entities.Count} entities in {(int) stopwatch.Elapsed.TotalMilliseconds} ms"); } - public void Run(Image canvas, EntityData entity) + public void Run(Image canvas, EntityData entity, SharedTransformSystem xformSystem) { if (!entity.Sprite.Visible || entity.Sprite.ContainerOccluded) { return; } - var worldRotation = _sEntityManager.GetComponent(entity.Sprite.Owner).WorldRotation; + var worldRotation = xformSystem.GetWorldRotation(entity.Owner); foreach (var layer in entity.Sprite.AllLayers) { if (!layer.Visible) @@ -70,7 +71,7 @@ public sealed class EntityPainter var rsi = layer.ActualRsi; Image image; - if (rsi == null || rsi.Path == null || !rsi.TryGetState(layer.RsiState, out var state)) + if (rsi == null || !rsi.TryGetState(layer.RsiState, out var state)) { image = _errorImage; } @@ -89,7 +90,7 @@ public sealed class EntityPainter image = image.CloneAs(); - (int, int, int, int) GetRsiFrame(RSI? rsi, Image image, EntityData entity, ISpriteLayer layer, int direction) + static (int, int, int, int) GetRsiFrame(RSI? rsi, Image image, EntityData entity, ISpriteLayer layer, int direction) { if (rsi is null) return (0, 0, EyeManager.PixelsPerMeter, EyeManager.PixelsPerMeter); @@ -115,7 +116,7 @@ public sealed class EntityPainter var rect = new Rectangle(x, y, width, height); if (!new Rectangle(Point.Empty, image.Size()).Contains(rect)) { - Console.WriteLine($"Invalid layer {rsi!.Path}/{layer.RsiState.Name}.png for entity {_sEntityManager.ToPrettyString(entity.Sprite.Owner)} at ({entity.X}, {entity.Y})"); + Console.WriteLine($"Invalid layer {rsi!.Path}/{layer.RsiState.Name}.png for entity {_sEntityManager.ToPrettyString(entity.Owner)} at ({entity.X}, {entity.Y})"); return; } diff --git a/Content.MapRenderer/Painters/GridPainter.cs b/Content.MapRenderer/Painters/GridPainter.cs index 0659be190c..519b991da1 100644 --- a/Content.MapRenderer/Painters/GridPainter.cs +++ b/Content.MapRenderer/Painters/GridPainter.cs @@ -45,24 +45,24 @@ namespace Content.MapRenderer.Painters _decals = GetDecals(); } - public void Run(Image gridCanvas, MapGridComponent grid) + public void Run(Image gridCanvas, EntityUid gridUid, MapGridComponent grid) { var stopwatch = new Stopwatch(); stopwatch.Start(); - if (!_entities.TryGetValue(grid.Owner, out var entities)) + if (!_entities.TryGetValue(gridUid, out var entities)) { - Console.WriteLine($"No entities found on grid {grid.Owner}"); + Console.WriteLine($"No entities found on grid {gridUid}"); return; } // Decals are always painted before entities, and are also optional. - if (_decals.TryGetValue(grid.Owner, out var decals)) + if (_decals.TryGetValue(gridUid, out var decals)) _decalPainter.Run(gridCanvas, CollectionsMarshal.AsSpan(decals)); _entityPainter.Run(gridCanvas, entities); - Console.WriteLine($"{nameof(GridPainter)} painted grid {grid.Owner} in {(int) stopwatch.Elapsed.TotalMilliseconds} ms"); + Console.WriteLine($"{nameof(GridPainter)} painted grid {gridUid} in {(int) stopwatch.Elapsed.TotalMilliseconds} ms"); } private ConcurrentDictionary> GetEntities() @@ -91,7 +91,7 @@ namespace Content.MapRenderer.Painters var position = transform.LocalPosition; var (x, y) = TransformLocalPosition(position, grid); - var data = new EntityData(sprite, x, y); + var data = new EntityData(entity, sprite, x, y); components.GetOrAdd(transform.GridUid.Value, _ => new List()).Add(data); } @@ -108,21 +108,22 @@ namespace Content.MapRenderer.Painters stopwatch.Start(); var decals = new Dictionary>(); + var query = _sEntityManager.AllEntityQueryEnumerator(); - foreach (var grid in _sMapManager.GetAllGrids()) + while (query.MoveNext(out var uid, out var grid)) { // TODO this needs to use the client entity manager because the client // actually has the correct z-indices for decals for some reason when the server doesn't, // BUT can't do that yet because the client hasn't actually received everything yet // for some reason decal moment i guess. - if (_sEntityManager.TryGetComponent(grid.Owner, out var comp)) + if (_sEntityManager.TryGetComponent(uid, out var comp)) { foreach (var chunk in comp.ChunkCollection.ChunkCollection.Values) { foreach (var decal in chunk.Decals.Values) { var (x, y) = TransformLocalPosition(decal.Coordinates, grid); - decals.GetOrNew(grid.Owner).Add(new DecalData(decal, x, y)); + decals.GetOrNew(uid).Add(new DecalData(decal, x, y)); } } } diff --git a/Content.MapRenderer/Painters/MapPainter.cs b/Content.MapRenderer/Painters/MapPainter.cs index 5d4b19f72e..42c004c874 100644 --- a/Content.MapRenderer/Painters/MapPainter.cs +++ b/Content.MapRenderer/Painters/MapPainter.cs @@ -60,8 +60,9 @@ namespace Content.MapRenderer.Painters var tilePainter = new TilePainter(client, server); var entityPainter = new GridPainter(client, server); - MapGridComponent[] grids = null!; + (EntityUid Uid, MapGridComponent Grid)[] grids = null!; var xformQuery = sEntityManager.GetEntityQuery(); + var xformSystem = sEntityManager.System(); await server.WaitPost(() => { @@ -73,12 +74,12 @@ namespace Content.MapRenderer.Painters } var mapId = sMapManager.GetAllMapIds().Last(); - grids = sMapManager.GetAllMapGrids(mapId).ToArray(); + grids = sMapManager.GetAllMapGrids(mapId).Select(o => (o.Owner, o)).ToArray(); foreach (var grid in grids) { - var gridXform = xformQuery.GetComponent(grid.Owner); - gridXform.WorldRotation = Angle.Zero; + var gridXform = xformQuery.GetComponent(grid.Uid); + xformSystem.SetWorldRotation(gridXform, Angle.Zero); } }); @@ -88,16 +89,16 @@ namespace Content.MapRenderer.Painters foreach (var grid in grids) { // Skip empty grids - if (grid.LocalAABB.IsEmpty()) + if (grid.Grid.LocalAABB.IsEmpty()) { - Console.WriteLine($"Warning: Grid {grid.Owner} was empty. Skipping image rendering."); + Console.WriteLine($"Warning: Grid {grid.Uid} was empty. Skipping image rendering."); continue; } - var tileXSize = grid.TileSize * TilePainter.TileImageSize; - var tileYSize = grid.TileSize * TilePainter.TileImageSize; + var tileXSize = grid.Grid.TileSize * TilePainter.TileImageSize; + var tileYSize = grid.Grid.TileSize * TilePainter.TileImageSize; - var bounds = grid.LocalAABB; + var bounds = grid.Grid.LocalAABB; var left = bounds.Left; var right = bounds.Right; @@ -111,16 +112,16 @@ namespace Content.MapRenderer.Painters await server.WaitPost(() => { - tilePainter.Run(gridCanvas, grid); - entityPainter.Run(gridCanvas, grid); + tilePainter.Run(gridCanvas, grid.Uid, grid.Grid); + entityPainter.Run(gridCanvas, grid.Uid, grid.Grid); gridCanvas.Mutate(e => e.Flip(FlipMode.Vertical)); }); var renderedImage = new RenderedGridImage(gridCanvas) { - GridUid = grid.Owner, - Offset = xformQuery.GetComponent(grid.Owner).WorldPosition + GridUid = grid.Uid, + Offset = xformSystem.GetWorldPosition(grid.Uid), }; yield return renderedImage; diff --git a/Content.MapRenderer/Painters/TilePainter.cs b/Content.MapRenderer/Painters/TilePainter.cs index 1d5460d97a..461bad9f21 100644 --- a/Content.MapRenderer/Painters/TilePainter.cs +++ b/Content.MapRenderer/Painters/TilePainter.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Timing; @@ -26,7 +27,7 @@ namespace Content.MapRenderer.Painters _cResourceCache = client.ResolveDependency(); } - public void Run(Image gridCanvas, MapGridComponent grid) + public void Run(Image gridCanvas, EntityUid gridUid, MapGridComponent grid) { var stopwatch = new Stopwatch(); stopwatch.Start(); @@ -55,7 +56,7 @@ namespace Content.MapRenderer.Painters i++; }); - Console.WriteLine($"{nameof(TilePainter)} painted {i} tiles on grid {grid.Owner} in {(int) stopwatch.Elapsed.TotalMilliseconds} ms"); + Console.WriteLine($"{nameof(TilePainter)} painted {i} tiles on grid {gridUid} in {(int) stopwatch.Elapsed.TotalMilliseconds} ms"); } private Dictionary> GetTileImages( @@ -87,7 +88,8 @@ namespace Content.MapRenderer.Painters for (var i = 0; i < definition.Variants; i++) { - var tileImage = tileSheet.Clone(o => o.Crop(new Rectangle(tileSize * i, 0, 32, 32))); + var index = i; + var tileImage = tileSheet.Clone(o => o.Crop(new Rectangle(tileSize * index, 0, 32, 32))); images[path].Add(tileImage); } }