Add tileset to dump sheets

This commit is contained in:
Gustas
2025-01-27 17:07:04 +02:00
committed by Matthias Mailänder
parent 84378969c3
commit f5ecb9ad99
5 changed files with 32 additions and 13 deletions

View File

@@ -23,15 +23,15 @@ namespace OpenRA.Mods.Common.Terrain
public sealed class DefaultTileCache : IDisposable
{
public readonly Cache<SheetType, SheetBuilder> SheetBuilders;
readonly Dictionary<ushort, TheaterTemplate> templates = [];
readonly Cache<SheetType, SheetBuilder> sheetBuilders;
readonly MersenneTwister random;
public Sprite MissingTile { get; }
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();
}
@@ -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();
}
}

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

View File

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

View File

@@ -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<ITiledTerrainRendererInfo>())
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);

View File

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