From 8c5a28657454bc1f3fa5c175f25378e8323660c4 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 3 Aug 2024 21:54:29 +0100 Subject: [PATCH] Call AdjustFrame with frame index and total. --- OpenRA.Game/Graphics/SpriteCache.cs | 18 ++++++++++++------ OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs | 5 ++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/OpenRA.Game/Graphics/SpriteCache.cs b/OpenRA.Game/Graphics/SpriteCache.cs index fe9d4c4ca4..7f79607fae 100644 --- a/OpenRA.Game/Graphics/SpriteCache.cs +++ b/OpenRA.Game/Graphics/SpriteCache.cs @@ -18,6 +18,8 @@ using OpenRA.Primitives; namespace OpenRA.Graphics { + public delegate ISpriteFrame AdjustFrame(ISpriteFrame input, int index, int total); + public sealed class SpriteCache : IDisposable { public readonly Dictionary SheetBuilders; @@ -26,7 +28,7 @@ namespace OpenRA.Graphics readonly Dictionary< int, - (int[] Frames, MiniYamlNode.SourceLocation Location, Func AdjustFrame, bool Premultiplied)> spriteReservations = new(); + (int[] Frames, MiniYamlNode.SourceLocation Location, AdjustFrame AdjustFrame, bool Premultiplied)> spriteReservations = new(); readonly Dictionary> reservationsByFilename = new(); readonly Dictionary resolvedSprites = new(); @@ -49,7 +51,7 @@ namespace OpenRA.Graphics } public int ReserveSprites(string filename, IEnumerable frames, MiniYamlNode.SourceLocation location, - Func adjustFrame = null, bool premultiplied = false) + AdjustFrame adjustFrame = null, bool premultiplied = false) { var token = nextReservationToken++; spriteReservations[token] = (frames?.ToArray(), location, adjustFrame, premultiplied); @@ -82,7 +84,7 @@ namespace OpenRA.Graphics string Filename, int FrameIndex, bool Premultiplied, - Func AdjustFrame, + AdjustFrame AdjustFrame, ISpriteFrame Frame, Sprite[] SpritesForToken)>(); foreach (var (filename, tokens) in reservationsByFilename) @@ -101,11 +103,15 @@ namespace OpenRA.Graphics throw new InvalidOperationException($"{rs.Location}: {filename} does not contain frames: " + string.Join(',', rs.Frames.Where(f => f >= loadedFrames.Length))); - foreach (var i in rs.Frames ?? Enumerable.Range(0, loadedFrames.Length)) + var frames = rs.Frames ?? Enumerable.Range(0, loadedFrames.Length); + var total = rs.Frames?.Length ?? loadedFrames.Length; + + var j = 0; + foreach (var i in frames) { var frame = loadedFrames[i]; if (rs.AdjustFrame != null) - frame = rs.AdjustFrame(frame); + frame = rs.AdjustFrame(frame, j++, total); pendingResolve.Add((filename, i, rs.Premultiplied, rs.AdjustFrame, frame, resolved)); } } @@ -131,7 +137,7 @@ namespace OpenRA.Graphics string Filename, int FrameIndex, bool Premultiplied, - Func AdjustFrame), + AdjustFrame AdjustFrame), Sprite>(pendingResolve.Count); foreach (var (filename, frameIndex, premultiplied, adjustFrame, frame, spritesForToken) in orderedPendingResolve) { diff --git a/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs b/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs index 22620ba6db..5878a0d141 100644 --- a/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs +++ b/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs @@ -9,7 +9,6 @@ */ #endregion -using System; using OpenRA.Graphics; using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.D2k.SpriteLoaders; @@ -62,11 +61,11 @@ namespace OpenRA.Mods.D2k.Graphics var offset = LoadField(Offset, data, defaults); var blendMode = LoadField(BlendMode, data, defaults); - Func adjustFrame = null; + AdjustFrame adjustFrame = null; if (remapColor != default || convertShroudToFog) adjustFrame = RemapFrame; - ISpriteFrame RemapFrame(ISpriteFrame f) => + ISpriteFrame RemapFrame(ISpriteFrame f, int index, int total) => (f is R8Loader.RemappableFrame rf) ? rf.WithSequenceFlags(useShadow, convertShroudToFog, remapColor) : f; var combineNode = data.NodeWithKeyOrDefault(Combine.Key);