Call AdjustFrame with frame index and total.
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user