Fix some MapPainter warnings (#17639)

This commit is contained in:
metalgearsloth
2023-06-26 01:56:20 +10:00
committed by GitHub
parent 09d327cc99
commit c82d1b437e
5 changed files with 44 additions and 44 deletions

View File

@@ -1,20 +1,15 @@
using Robust.Client.GameObjects; 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 readonly EntityUid Owner = Owner;
{
public EntityData(SpriteComponent sprite, float x, float y)
{
Sprite = sprite;
X = x;
Y = y;
}
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;
}
} }

View File

@@ -38,23 +38,24 @@ public sealed class EntityPainter
// TODO cache this shit what are we insane // TODO cache this shit what are we insane
entities.Sort(Comparer<EntityData>.Create((x, y) => x.Sprite.DrawDepth.CompareTo(y.Sprite.DrawDepth))); entities.Sort(Comparer<EntityData>.Create((x, y) => x.Sprite.DrawDepth.CompareTo(y.Sprite.DrawDepth)));
var xformSystem = _sEntityManager.System<SharedTransformSystem>();
foreach (var entity in entities) 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"); 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) if (!entity.Sprite.Visible || entity.Sprite.ContainerOccluded)
{ {
return; return;
} }
var worldRotation = _sEntityManager.GetComponent<TransformComponent>(entity.Sprite.Owner).WorldRotation; var worldRotation = xformSystem.GetWorldRotation(entity.Owner);
foreach (var layer in entity.Sprite.AllLayers) foreach (var layer in entity.Sprite.AllLayers)
{ {
if (!layer.Visible) if (!layer.Visible)
@@ -70,7 +71,7 @@ public sealed class EntityPainter
var rsi = layer.ActualRsi; var rsi = layer.ActualRsi;
Image image; 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; image = _errorImage;
} }
@@ -89,7 +90,7 @@ public sealed class EntityPainter
image = image.CloneAs<Rgba32>(); image = image.CloneAs<Rgba32>();
(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) if (rsi is null)
return (0, 0, EyeManager.PixelsPerMeter, EyeManager.PixelsPerMeter); return (0, 0, EyeManager.PixelsPerMeter, EyeManager.PixelsPerMeter);
@@ -115,7 +116,7 @@ public sealed class EntityPainter
var rect = new Rectangle(x, y, width, height); var rect = new Rectangle(x, y, width, height);
if (!new Rectangle(Point.Empty, image.Size()).Contains(rect)) 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; return;
} }

View File

@@ -45,24 +45,24 @@ namespace Content.MapRenderer.Painters
_decals = GetDecals(); _decals = GetDecals();
} }
public void Run(Image gridCanvas, MapGridComponent grid) public void Run(Image gridCanvas, EntityUid gridUid, MapGridComponent grid)
{ {
var stopwatch = new Stopwatch(); var stopwatch = new Stopwatch();
stopwatch.Start(); 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; return;
} }
// Decals are always painted before entities, and are also optional. // 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)); _decalPainter.Run(gridCanvas, CollectionsMarshal.AsSpan(decals));
_entityPainter.Run(gridCanvas, entities); _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<EntityUid, List<EntityData>> GetEntities() private ConcurrentDictionary<EntityUid, List<EntityData>> GetEntities()
@@ -91,7 +91,7 @@ namespace Content.MapRenderer.Painters
var position = transform.LocalPosition; var position = transform.LocalPosition;
var (x, y) = TransformLocalPosition(position, grid); 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<EntityData>()).Add(data); components.GetOrAdd(transform.GridUid.Value, _ => new List<EntityData>()).Add(data);
} }
@@ -108,21 +108,22 @@ namespace Content.MapRenderer.Painters
stopwatch.Start(); stopwatch.Start();
var decals = new Dictionary<EntityUid, List<DecalData>>(); var decals = new Dictionary<EntityUid, List<DecalData>>();
var query = _sEntityManager.AllEntityQueryEnumerator<MapGridComponent>();
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 // 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, // 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 // BUT can't do that yet because the client hasn't actually received everything yet
// for some reason decal moment i guess. // for some reason decal moment i guess.
if (_sEntityManager.TryGetComponent<DecalGridComponent>(grid.Owner, out var comp)) if (_sEntityManager.TryGetComponent<DecalGridComponent>(uid, out var comp))
{ {
foreach (var chunk in comp.ChunkCollection.ChunkCollection.Values) foreach (var chunk in comp.ChunkCollection.ChunkCollection.Values)
{ {
foreach (var decal in chunk.Decals.Values) foreach (var decal in chunk.Decals.Values)
{ {
var (x, y) = TransformLocalPosition(decal.Coordinates, grid); 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));
} }
} }
} }

View File

@@ -60,8 +60,9 @@ namespace Content.MapRenderer.Painters
var tilePainter = new TilePainter(client, server); var tilePainter = new TilePainter(client, server);
var entityPainter = new GridPainter(client, server); var entityPainter = new GridPainter(client, server);
MapGridComponent[] grids = null!; (EntityUid Uid, MapGridComponent Grid)[] grids = null!;
var xformQuery = sEntityManager.GetEntityQuery<TransformComponent>(); var xformQuery = sEntityManager.GetEntityQuery<TransformComponent>();
var xformSystem = sEntityManager.System<SharedTransformSystem>();
await server.WaitPost(() => await server.WaitPost(() =>
{ {
@@ -73,12 +74,12 @@ namespace Content.MapRenderer.Painters
} }
var mapId = sMapManager.GetAllMapIds().Last(); 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) foreach (var grid in grids)
{ {
var gridXform = xformQuery.GetComponent(grid.Owner); var gridXform = xformQuery.GetComponent(grid.Uid);
gridXform.WorldRotation = Angle.Zero; xformSystem.SetWorldRotation(gridXform, Angle.Zero);
} }
}); });
@@ -88,16 +89,16 @@ namespace Content.MapRenderer.Painters
foreach (var grid in grids) foreach (var grid in grids)
{ {
// Skip empty 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; continue;
} }
var tileXSize = grid.TileSize * TilePainter.TileImageSize; var tileXSize = grid.Grid.TileSize * TilePainter.TileImageSize;
var tileYSize = 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 left = bounds.Left;
var right = bounds.Right; var right = bounds.Right;
@@ -111,16 +112,16 @@ namespace Content.MapRenderer.Painters
await server.WaitPost(() => await server.WaitPost(() =>
{ {
tilePainter.Run(gridCanvas, grid); tilePainter.Run(gridCanvas, grid.Uid, grid.Grid);
entityPainter.Run(gridCanvas, grid); entityPainter.Run(gridCanvas, grid.Uid, grid.Grid);
gridCanvas.Mutate(e => e.Flip(FlipMode.Vertical)); gridCanvas.Mutate(e => e.Flip(FlipMode.Vertical));
}); });
var renderedImage = new RenderedGridImage<Rgba32>(gridCanvas) var renderedImage = new RenderedGridImage<Rgba32>(gridCanvas)
{ {
GridUid = grid.Owner, GridUid = grid.Uid,
Offset = xformQuery.GetComponent(grid.Owner).WorldPosition Offset = xformSystem.GetWorldPosition(grid.Uid),
}; };
yield return renderedImage; yield return renderedImage;

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.ResourceManagement; using Robust.Client.ResourceManagement;
using Robust.Shared.GameObjects;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Map.Components; using Robust.Shared.Map.Components;
using Robust.Shared.Timing; using Robust.Shared.Timing;
@@ -26,7 +27,7 @@ namespace Content.MapRenderer.Painters
_cResourceCache = client.ResolveDependency<IResourceCache>(); _cResourceCache = client.ResolveDependency<IResourceCache>();
} }
public void Run(Image gridCanvas, MapGridComponent grid) public void Run(Image gridCanvas, EntityUid gridUid, MapGridComponent grid)
{ {
var stopwatch = new Stopwatch(); var stopwatch = new Stopwatch();
stopwatch.Start(); stopwatch.Start();
@@ -55,7 +56,7 @@ namespace Content.MapRenderer.Painters
i++; 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<string, List<Image>> GetTileImages( private Dictionary<string, List<Image>> GetTileImages(
@@ -87,7 +88,8 @@ namespace Content.MapRenderer.Painters
for (var i = 0; i < definition.Variants; i++) 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); images[path].Add(tileImage);
} }
} }