From 44c6747decd4d98c2267b64bc7b629d888b9b66d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 21 Jul 2025 19:28:58 +0100 Subject: [PATCH] Replace ITileCache with IDumpSheetsTerrainInfo. --- OpenRA.Mods.Common/Terrain/DefaultTerrain.cs | 16 +++++++++++- .../Terrain/DefaultTileCache.cs | 2 +- OpenRA.Mods.Common/Terrain/TileCache.cs | 22 ---------------- .../Traits/World/TerrainRenderer.cs | 4 +-- OpenRA.Mods.Common/TraitsInterfaces.cs | 2 +- .../UtilityCommands/CheckMissingSprites.cs | 2 +- .../DumpSequenceSheetsCommand.cs | 26 ++++++------------- 7 files changed, 28 insertions(+), 46 deletions(-) delete mode 100644 OpenRA.Mods.Common/Terrain/TileCache.cs diff --git a/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs b/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs index bb0caf3522..d21648c6d9 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs @@ -14,7 +14,9 @@ using System.Collections.Immutable; using System.IO; using System.Linq; using OpenRA.FileSystem; +using OpenRA.Graphics; using OpenRA.Mods.Common.MapGenerator; +using OpenRA.Mods.Common.UtilityCommands; using OpenRA.Primitives; using OpenRA.Support; @@ -66,7 +68,7 @@ namespace OpenRA.Mods.Common.Terrain } } - public class DefaultTerrain : ITemplatedTerrainInfo, ITerrainInfoNotifyMapCreated + public class DefaultTerrain : ITemplatedTerrainInfo, IDumpSheetsTerrainInfo, ITerrainInfoNotifyMapCreated { [FluentReference] public readonly string Name; @@ -180,12 +182,24 @@ namespace OpenRA.Mods.Common.Terrain IEnumerable ITerrainInfo.RestrictedPlayerColors { get { return TerrainInfo.Where(ti => ti.RestrictPlayerColor).Select(ti => ti.Color); } } float ITerrainInfo.MinHeightColorBrightness => MinHeightColorBrightness; float ITerrainInfo.MaxHeightColorBrightness => MaxHeightColorBrightness; + TerrainTile ITerrainInfo.DefaultTerrainTile => new(Templates.First().Key, 0); string[] ITemplatedTerrainInfo.EditorTemplateOrder => EditorTemplateOrder; IReadOnlyDictionary ITemplatedTerrainInfo.Templates => Templates; IReadOnlyDictionary> ITemplatedTerrainInfo.MultiBrushCollections => MultiBrushCollections; + void IDumpSheetsTerrainInfo.DumpSheets(string terrainName, ImmutablePalette palette, ref int sheetCount) + { + var tileCache = new DefaultTileCache(this); + var sb = tileCache.GetSheetBuilder(SheetType.Indexed); + foreach (var s in sb.AllSheets) + DumpSequenceSheetsCommand.CommitSheet(sb, s, terrainName, palette, ref sheetCount); + + foreach (var s in tileCache.GetSheetBuilder(SheetType.BGRA).AllSheets) + DumpSequenceSheetsCommand.CommitSheet(null, s, terrainName, palette, ref sheetCount); + } + void ITerrainInfoNotifyMapCreated.MapCreated(Map map) { // Randomize PickAny tile variants. diff --git a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs index 78545767fc..3ffcb85dcd 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.Common.Terrain { public record TheaterTemplate(Sprite[] Sprites, int Stride, int Variants); - public sealed class DefaultTileCache : ITileCache, IDisposable + public sealed class DefaultTileCache : IDisposable { readonly Cache sheetBuilders; readonly Dictionary templates = []; diff --git a/OpenRA.Mods.Common/Terrain/TileCache.cs b/OpenRA.Mods.Common/Terrain/TileCache.cs deleted file mode 100644 index db24a53cc3..0000000000 --- a/OpenRA.Mods.Common/Terrain/TileCache.cs +++ /dev/null @@ -1,22 +0,0 @@ -#region Copyright & License Information -/* - * Copyright (c) The OpenRA Developers and Contributors - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Graphics; - -namespace OpenRA -{ - public interface ITileCache - { - bool HasTileSprite(TerrainTile r, int? variant = null); - Sprite TileSprite(TerrainTile r, int? variant = null); - SheetBuilder GetSheetBuilder(SheetType sheetType); - } -} diff --git a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs index 2b0a852043..9bf20c5340 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, out ITileCache tileCache) + bool ITiledTerrainRendererInfo.ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError) { var missingImages = new HashSet(); var failed = false; @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits failed = true; } - tileCache = new DefaultTileCache((DefaultTerrain)terrainInfo, OnMissingImage); + var 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 f522d6390d..44a403ed1f 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -783,7 +783,7 @@ namespace OpenRA.Mods.Common.Traits [RequireExplicitImplementation] public interface ITiledTerrainRendererInfo : ITraitInfoInterface { - bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError, out ITileCache tileCache); + bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError); } [RequireExplicitImplementation] diff --git a/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs b/OpenRA.Mods.Common/UtilityCommands/CheckMissingSprites.cs index 96bca5e68c..eb34591f40 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, out _); + failed |= ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine); 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 219f26c69e..bf694ca855 100644 --- a/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs @@ -14,11 +14,14 @@ 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 { + public interface IDumpSheetsTerrainInfo : ITerrainInfo + { + void DumpSheets(string terrainName, ImmutablePalette palette, ref int sheetCount); + } + sealed class DumpSequenceSheetsCommand : IUtilityCommand { static readonly int[] ChannelMasks = [2, 1, 0, 3]; @@ -88,27 +91,14 @@ namespace OpenRA.Mods.Common.UtilityCommands CommitSheet(null, sheet, 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)) - { - sheetBuilder = tileCache.GetSheetBuilder(SheetType.Indexed); - foreach (var sheet in sheetBuilder.AllSheets) - CommitSheet(sheetBuilder, sheet, terrainName, palette, ref sheetCount); - - foreach (var sheet in tileCache.GetSheetBuilder(SheetType.BGRA).AllSheets) - CommitSheet(null, sheet, terrainName, palette, ref sheetCount); - } - } - } + if (terrainInfo is IDumpSheetsTerrainInfo dsi) + dsi.DumpSheets(terrainName, palette, ref sheetCount); sequence.Dispose(); } } - static void CommitSheet(SheetBuilder builder, Sheet sheet, string name, ImmutablePalette palette, ref int count) + public static void CommitSheet(SheetBuilder builder, Sheet sheet, string name, ImmutablePalette palette, ref int count) { if (builder == null) sheet.AsPng().Save($"{count++}.{name}.png", Png.Compression.BEST_SPEED);