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 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 Dictionary<ushort, TheaterTemplate> templates = [];
readonly MersenneTwister random; readonly MersenneTwister random;
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Terrain
public DefaultTileCache(DefaultTerrain terrainInfo, Action<uint, string> onMissingImage = null) 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(); random = new MersenneTwister();
@@ -101,14 +101,14 @@ namespace OpenRA.Mods.Common.Terrain
var offset = new float3(f.Offset, zOffset); var offset = new float3(f.Offset, zOffset);
var type = SheetBuilder.FrameTypeToSheetType(f.Type); 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); OpenRA.Graphics.Util.FastCopyIntoChannel(s, f.Data, f.Type);
if (terrainInfo.EnableDepth) if (terrainInfo.EnableDepth)
{ {
var depthFrame = depthFrames != null ? depthFrames[j] : allFrames[j + frameCount]; var depthFrame = depthFrames != null ? depthFrames[j] : allFrames[j + frameCount];
var depthType = SheetBuilder.FrameTypeToSheetType(depthFrame.Type); 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); OpenRA.Graphics.Util.FastCopyIntoChannel(ss, depthFrame.Data, depthFrame.Type);
s = new SpriteWithSecondaryData(s, ss.Sheet, ss.Bounds, ss.Channel); s = new SpriteWithSecondaryData(s, ss.Sheet, ss.Bounds, ss.Channel);
} }
@@ -135,7 +135,7 @@ namespace OpenRA.Mods.Common.Terrain
var missingSheetType = SheetType.Indexed; var missingSheetType = SheetType.Indexed;
// Avoid creating an indexed sheet if all tiles are BGRA // 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) if (missing.Value != null && missing.Key == SheetType.BGRA)
{ {
missingDataLength = 4; missingDataLength = 4;
@@ -143,8 +143,8 @@ namespace OpenRA.Mods.Common.Terrain
missingSheetType = SheetType.BGRA; missingSheetType = SheetType.BGRA;
} }
MissingTile = SheetBuilders[missingSheetType].Add(new byte[missingDataLength], missingFrameType, new Size(1, 1)); MissingTile = sheetBuilders[missingSheetType].Add(new byte[missingDataLength], missingFrameType, new Size(1, 1));
foreach (var sb in SheetBuilders.Values) foreach (var sb in sheetBuilders.Values)
sb.Current?.ReleaseBuffer(); sb.Current?.ReleaseBuffer();
} }
@@ -165,9 +165,14 @@ namespace OpenRA.Mods.Common.Terrain
return template.Sprites[start * template.Stride + r.Index]; return template.Sprites[start * template.Stride + r.Index];
} }
public SheetBuilder GetSheetBuilder(SheetType sheetType)
{
return sheetBuilders[sheetType];
}
public void Dispose() public void Dispose()
{ {
foreach (var sb in SheetBuilders.Values) foreach (var sb in sheetBuilders.Values)
sb.Dispose(); 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)] [TraitLocation(SystemActors.World | SystemActors.EditorWorld)]
public class TerrainRendererInfo : TraitInfo, ITiledTerrainRendererInfo 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 missingImages = new HashSet<string>();
var failed = false; var failed = false;

View File

@@ -783,7 +783,7 @@ namespace OpenRA.Mods.Common.Traits
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface ITiledTerrainRendererInfo : ITraitInfoInterface 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] [RequireExplicitImplementation]

View File

@@ -94,11 +94,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
{ {
if (!ttr.ValidateTileSprites(templatedTerrainInfo, Console.WriteLine, out var tileCache)) 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) foreach (var s in sb.AllSheets)
CommitSheet(sb, s, terrainName, palette, ref sheetCount); 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); CommitSheet(null, s, terrainName, palette, ref sheetCount);
} }
} }