From e61db3faea9d7efe93db27fe15c119f92bbbebf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 21 Jul 2025 10:53:28 +0200 Subject: [PATCH] Don't hardcode implementations in interfaces. --- .../Terrain/DefaultTileCache.cs | 23 +++++++++++-------- OpenRA.Mods.Common/Terrain/TileCache.cs | 22 ++++++++++++++++++ .../Traits/World/TerrainRenderer.cs | 2 +- OpenRA.Mods.Common/TraitsInterfaces.cs | 2 +- .../DumpSequenceSheetsCommand.cs | 4 ++-- 5 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 OpenRA.Mods.Common/Terrain/TileCache.cs diff --git a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs index d73061c374..78545767fc 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs @@ -21,9 +21,9 @@ namespace OpenRA.Mods.Common.Terrain { public record TheaterTemplate(Sprite[] Sprites, int Stride, int Variants); - public sealed class DefaultTileCache : IDisposable + public sealed class DefaultTileCache : ITileCache, IDisposable { - public readonly Cache SheetBuilders; + readonly Cache sheetBuilders; readonly Dictionary templates = []; readonly MersenneTwister random; @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Terrain 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(); } @@ -165,9 +165,14 @@ namespace OpenRA.Mods.Common.Terrain return template.Sprites[start * template.Stride + r.Index]; } + public SheetBuilder GetSheetBuilder(SheetType sheetType) + { + return sheetBuilders[sheetType]; + } + public void Dispose() { - foreach (var sb in SheetBuilders.Values) + foreach (var sb in sheetBuilders.Values) sb.Dispose(); } } diff --git a/OpenRA.Mods.Common/Terrain/TileCache.cs b/OpenRA.Mods.Common/Terrain/TileCache.cs new file mode 100644 index 0000000000..db24a53cc3 --- /dev/null +++ b/OpenRA.Mods.Common/Terrain/TileCache.cs @@ -0,0 +1,22 @@ +#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 690f38117f..2b0a852043 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 DefaultTileCache tileCache) + bool ITiledTerrainRendererInfo.ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError, out ITileCache tileCache) { var missingImages = new HashSet(); var failed = false; diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index ad50b5f247..f522d6390d 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 DefaultTileCache tileCache); + bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action onError, out ITileCache tileCache); } [RequireExplicitImplementation] diff --git a/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs b/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs index f06789ee41..fd26ac0306 100644 --- a/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/DumpSequenceSheetsCommand.cs @@ -94,11 +94,11 @@ namespace OpenRA.Mods.Common.UtilityCommands { if (!ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine, out var tileCache)) { - sb = tileCache.SheetBuilders[SheetType.Indexed]; + sb = tileCache.GetSheetBuilder(SheetType.Indexed); foreach (var s in sb.AllSheets) CommitSheet(sb, s, terrainName, palette, ref sheetCount); - foreach (var s in tileCache.SheetBuilders[SheetType.BGRA].AllSheets) + foreach (var s in tileCache.GetSheetBuilder(SheetType.BGRA).AllSheets) CommitSheet(null, s, terrainName, palette, ref sheetCount); } }