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
{
public delegate ISpriteFrame AdjustFrame(ISpriteFrame input, int index, int total);
public sealed class SpriteCache : IDisposable
{
public readonly Dictionary<SheetType, SheetBuilder> SheetBuilders;
@@ -26,7 +28,7 @@ namespace OpenRA.Graphics
readonly Dictionary<
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<int, Sprite[]> resolvedSprites = new();
@@ -49,7 +51,7 @@ namespace OpenRA.Graphics
}
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++;
spriteReservations[token] = (frames?.ToArray(), location, adjustFrame, premultiplied);
@@ -82,7 +84,7 @@ namespace OpenRA.Graphics
string Filename,
int FrameIndex,
bool Premultiplied,
Func<ISpriteFrame, ISpriteFrame> 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<ISpriteFrame, ISpriteFrame> AdjustFrame),
AdjustFrame AdjustFrame),
Sprite>(pendingResolve.Count);
foreach (var (filename, frameIndex, premultiplied, adjustFrame, frame, spritesForToken) in orderedPendingResolve)
{

View File

@@ -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<ISpriteFrame, ISpriteFrame> 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);