Call AdjustFrame with frame index and total.

This commit is contained in:
Paul Chote
2024-08-03 21:54:29 +01:00
committed by Gustas
parent 0c0c65df78
commit 8c5a286574
2 changed files with 14 additions and 9 deletions

View File

@@ -18,6 +18,8 @@ using OpenRA.Primitives;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
public delegate ISpriteFrame AdjustFrame(ISpriteFrame input, int index, int total);
public sealed class SpriteCache : IDisposable public sealed class SpriteCache : IDisposable
{ {
public readonly Dictionary<SheetType, SheetBuilder> SheetBuilders; public readonly Dictionary<SheetType, SheetBuilder> SheetBuilders;
@@ -26,7 +28,7 @@ namespace OpenRA.Graphics
readonly Dictionary< readonly Dictionary<
int, int,
(int[] Frames, MiniYamlNode.SourceLocation Location, Func<ISpriteFrame, ISpriteFrame> AdjustFrame, bool Premultiplied)> spriteReservations = new(); (int[] Frames, MiniYamlNode.SourceLocation Location, AdjustFrame AdjustFrame, bool Premultiplied)> spriteReservations = new();
readonly Dictionary<string, List<int>> reservationsByFilename = new(); readonly Dictionary<string, List<int>> reservationsByFilename = new();
readonly Dictionary<int, Sprite[]> resolvedSprites = new(); readonly Dictionary<int, Sprite[]> resolvedSprites = new();
@@ -49,7 +51,7 @@ namespace OpenRA.Graphics
} }
public int ReserveSprites(string filename, IEnumerable<int> frames, MiniYamlNode.SourceLocation location, public int ReserveSprites(string filename, IEnumerable<int> frames, MiniYamlNode.SourceLocation location,
Func<ISpriteFrame, ISpriteFrame> adjustFrame = null, bool premultiplied = false) AdjustFrame adjustFrame = null, bool premultiplied = false)
{ {
var token = nextReservationToken++; var token = nextReservationToken++;
spriteReservations[token] = (frames?.ToArray(), location, adjustFrame, premultiplied); spriteReservations[token] = (frames?.ToArray(), location, adjustFrame, premultiplied);
@@ -82,7 +84,7 @@ namespace OpenRA.Graphics
string Filename, string Filename,
int FrameIndex, int FrameIndex,
bool Premultiplied, bool Premultiplied,
Func<ISpriteFrame, ISpriteFrame> AdjustFrame, AdjustFrame AdjustFrame,
ISpriteFrame Frame, ISpriteFrame Frame,
Sprite[] SpritesForToken)>(); Sprite[] SpritesForToken)>();
foreach (var (filename, tokens) in reservationsByFilename) foreach (var (filename, tokens) in reservationsByFilename)
@@ -101,11 +103,15 @@ namespace OpenRA.Graphics
throw new InvalidOperationException($"{rs.Location}: {filename} does not contain frames: " + throw new InvalidOperationException($"{rs.Location}: {filename} does not contain frames: " +
string.Join(',', rs.Frames.Where(f => f >= loadedFrames.Length))); 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]; var frame = loadedFrames[i];
if (rs.AdjustFrame != null) if (rs.AdjustFrame != null)
frame = rs.AdjustFrame(frame); frame = rs.AdjustFrame(frame, j++, total);
pendingResolve.Add((filename, i, rs.Premultiplied, rs.AdjustFrame, frame, resolved)); pendingResolve.Add((filename, i, rs.Premultiplied, rs.AdjustFrame, frame, resolved));
} }
} }
@@ -131,7 +137,7 @@ namespace OpenRA.Graphics
string Filename, string Filename,
int FrameIndex, int FrameIndex,
bool Premultiplied, bool Premultiplied,
Func<ISpriteFrame, ISpriteFrame> AdjustFrame), AdjustFrame AdjustFrame),
Sprite>(pendingResolve.Count); Sprite>(pendingResolve.Count);
foreach (var (filename, frameIndex, premultiplied, adjustFrame, frame, spritesForToken) in orderedPendingResolve) foreach (var (filename, frameIndex, premultiplied, adjustFrame, frame, spritesForToken) in orderedPendingResolve)
{ {

View File

@@ -9,7 +9,6 @@
*/ */
#endregion #endregion
using System;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Graphics;
using OpenRA.Mods.D2k.SpriteLoaders; using OpenRA.Mods.D2k.SpriteLoaders;
@@ -62,11 +61,11 @@ namespace OpenRA.Mods.D2k.Graphics
var offset = LoadField(Offset, data, defaults); var offset = LoadField(Offset, data, defaults);
var blendMode = LoadField(BlendMode, data, defaults); var blendMode = LoadField(BlendMode, data, defaults);
Func<ISpriteFrame, ISpriteFrame> adjustFrame = null; AdjustFrame adjustFrame = null;
if (remapColor != default || convertShroudToFog) if (remapColor != default || convertShroudToFog)
adjustFrame = RemapFrame; 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; (f is R8Loader.RemappableFrame rf) ? rf.WithSequenceFlags(useShadow, convertShroudToFog, remapColor) : f;
var combineNode = data.NodeWithKeyOrDefault(Combine.Key); var combineNode = data.NodeWithKeyOrDefault(Combine.Key);