Don't hardcode implementations in interfaces.

This commit is contained in:
Matthias Mailänder
2025-07-21 10:53:28 +02:00
committed by Gustas Kažukauskas
parent 0fac8d0d31
commit e61db3faea
5 changed files with 40 additions and 13 deletions

View File

@@ -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<SheetType, SheetBuilder> SheetBuilders;
readonly Cache<SheetType, SheetBuilder> sheetBuilders;
readonly Dictionary<ushort, TheaterTemplate> templates = [];
readonly MersenneTwister random;
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Terrain
public DefaultTileCache(DefaultTerrain terrainInfo, Action<uint, string> onMissingImage = null)
{
SheetBuilders = new Cache<SheetType, SheetBuilder>(t => new SheetBuilder(t, terrainInfo.SheetSize));
sheetBuilders = new Cache<SheetType, SheetBuilder>(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();
}
}

View File

@@ -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);
}
}

View File

@@ -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<string> onError, out DefaultTileCache tileCache)
bool ITiledTerrainRendererInfo.ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action<string> onError, out ITileCache tileCache)
{
var missingImages = new HashSet<string>();
var failed = false;

View File

@@ -783,7 +783,7 @@ namespace OpenRA.Mods.Common.Traits
[RequireExplicitImplementation]
public interface ITiledTerrainRendererInfo : ITraitInfoInterface
{
bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action<string> onError, out DefaultTileCache tileCache);
bool ValidateTileSprites(ITemplatedTerrainInfo terrainInfo, Action<string> onError, out ITileCache tileCache);
}
[RequireExplicitImplementation]

View File

@@ -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);
}
}