From f5ecb9ad994f3746a75852281e4a8a0731866c1c Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Mon, 27 Jan 2025 17:07:04 +0200 Subject: [PATCH] Add tileset to dump sheets --- .../Terrain/DefaultTileCache.cs | 16 +++++++------- .../Traits/World/TerrainRenderer.cs | 4 ++-- OpenRA.Mods.Common/TraitsInterfaces.cs | 2 +- .../UtilityCommands/CheckMissingSprites.cs | 2 +- .../DumpSequenceSheetsCommand.cs | 21 ++++++++++++++++++- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs index 3c1baba3ae..d73061c374 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs @@ -23,15 +23,15 @@ namespace OpenRA.Mods.Common.Terrain public sealed class DefaultTileCache : IDisposable { + public readonly Cache SheetBuilders; readonly Dictionary templates = []; - readonly Cache sheetBuilders; readonly MersenneTwister random; public Sprite MissingTile { get; } public DefaultTileCache(DefaultTerrain terrainInfo, Action onMissingImage = null) { - sheetBuilders = new Cache(t => new SheetBuilder(t, terrainInfo.SheetSize)); + SheetBuilders = new Cache(t => new SheetBuilder(t, terrainInfo.SheetSize)); random = new MersenneTwister(); @@ -101,14 +101,14 @@ namespace OpenRA.Mods.Common.Terrain var offset = new float3(f.Offset, zOffset); var type = SheetBuilder.FrameTypeToSheetType(f.Type); - var s = sheetBuilders[type].Allocate(f.Size, zRamp, offset); + var s = SheetBuilders[type].Allocate(f.Size, zRamp, offset); OpenRA.Graphics.Util.FastCopyIntoChannel(s, f.Data, f.Type); if (terrainInfo.EnableDepth) { var depthFrame = depthFrames != null ? depthFrames[j] : allFrames[j + frameCount]; var depthType = SheetBuilder.FrameTypeToSheetType(depthFrame.Type); - var ss = sheetBuilders[depthType].Allocate(depthFrame.Size, zRamp, offset); + var ss = SheetBuilders[depthType].Allocate(depthFrame.Size, zRamp, offset); OpenRA.Graphics.Util.FastCopyIntoChannel(ss, depthFrame.Data, depthFrame.Type); s = new SpriteWithSecondaryData(s, ss.Sheet, ss.Bounds, ss.Channel); } @@ -135,7 +135,7 @@ namespace OpenRA.Mods.Common.Terrain var missingSheetType = SheetType.Indexed; // Avoid creating an indexed sheet if all tiles are BGRA - var missing = sheetBuilders.FirstOrDefault(); + var missing = SheetBuilders.FirstOrDefault(); if (missing.Value != null && missing.Key == SheetType.BGRA) { missingDataLength = 4; @@ -143,8 +143,8 @@ namespace OpenRA.Mods.Common.Terrain missingSheetType = SheetType.BGRA; } - MissingTile = sheetBuilders[missingSheetType].Add(new byte[missingDataLength], missingFrameType, new Size(1, 1)); - foreach (var sb in sheetBuilders.Values) + MissingTile = SheetBuilders[missingSheetType].Add(new byte[missingDataLength], missingFrameType, new Size(1, 1)); + foreach (var sb in SheetBuilders.Values) sb.Current?.ReleaseBuffer(); } @@ -167,7 +167,7 @@ namespace OpenRA.Mods.Common.Terrain public void Dispose() { - foreach (var sb in sheetBuilders.Values) + foreach (var sb in SheetBuilders.Values) sb.Dispose(); } } diff --git a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs index 63f5d27d66..de00ab4e6a 100644 --- a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Traits [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] public class TerrainRendererInfo : TraitInfo, ITiledTerrainRendererInfo { - bool ITiledTerrainRendererInfo.ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError) + bool ITiledTerrainRendererInfo.ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError, out DefaultTileCache tileCache) { var missingImages = new HashSet(); var failed = false; @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits failed = true; } - var tileCache = new DefaultTileCache((DefaultTerrain)terrainInfo, OnMissingImage); + tileCache = new DefaultTileCache((DefaultTerrain)terrainInfo, OnMissingImage); foreach (var t in terrainInfo.Templates) { var templateInfo = (DefaultTerrainTemplateInfo)t.Value; diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index dc498e4e38..70f5a7b1bb 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -768,7 +768,7 @@ namespace OpenRA.Mods.Common.Traits [RequireExplicitImplementation] public interface ITiledTerrainRendererInfo : ITraitInfoInterface { - bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError); + bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError, out DefaultTileCache tileCache); } [RequireExplicitImplementation] diff --git a/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs b/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs index eb34591f40..96bca5e68c 100644 --- a/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs +++ b/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.UtilityCommands Console.WriteLine("Tileset: " + tileset); if (terrainInfo is ITemplatedTerrainInfo templatedTerrainInfo) foreach (var ttr in modData.DefaultRules.Actors[SystemActors.World].TraitInfos()) - failed |= ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine); + failed |= ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine, out _); var sequences = new SequenceSet(modData.DefaultFileSystem, modData, tileset, null); sequences.SpriteCache.LoadReservations(modData); diff --git a/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs b/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs index d9accb4ce3..5bcf667f73 100644 --- a/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs @@ -14,6 +14,8 @@ using System.Collections.Generic; using OpenRA.FileFormats; using OpenRA.FileSystem; using OpenRA.Graphics; +using OpenRA.Mods.Common.Terrain; +using OpenRA.Mods.Common.Traits; namespace OpenRA.Mods.Common.UtilityCommands { @@ -21,7 +23,7 @@ namespace OpenRA.Mods.Common.UtilityCommands { static readonly int[] ChannelMasks = [2, 1, 0, 3]; - string IUtilityCommand.Name => "--dump-sequence-sheets"; + string IUtilityCommand.Name => "--dump-sheets"; bool IUtilityCommand.ValidateArguments(string[] args) { @@ -80,6 +82,23 @@ namespace OpenRA.Mods.Common.UtilityCommands foreach (var s in sequence.SpriteCache.SheetBuilders[SheetType.BGRA].AllSheets) CommitSheet(null, s, sequencesName, palette, ref sheetCount); + modData.DefaultTerrainInfo.TryGetValue(sequence.TileSet, out var terrainInfo); + if (terrainInfo is ITemplatedTerrainInfo templatedTerrainInfo) + { + foreach (var ttr in modData.DefaultRules.Actors[SystemActors.World].TraitInfos()) + { + if (!ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine, out var tileCache)) + { + sb = tileCache.SheetBuilders[SheetType.Indexed]; + foreach (var s in sb.AllSheets) + CommitSheet(sb, s, terrainName, palette, ref sheetCount); + + foreach (var s in tileCache.SheetBuilders[SheetType.BGRA].AllSheets) + CommitSheet(null, s, terrainName, palette, ref sheetCount); + } + } + } + sequence.Dispose(); } }