diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs index c1e564a..2b52fe9 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs @@ -153,7 +153,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject position = pos; flipX = fX; flipY = fY; - foreach (var s in loadedSkins) addSkin(s); + reloadSkins(); for (int i = 0; i < animations.Length; i++) setAnimation(i, animations[i]); } } @@ -191,7 +191,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject skeleton.SetSlotsToSetupPose(); } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); @@ -229,7 +229,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.FlipY = skeleton.FlipY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var name in loadedSkins) + foreach (var (name, _) in skinLoadStatus.Where(e => e.Value)) { foreach (var (k, v) in skeletonData.FindSkin(name).Attachments) tmpSkeleton.Skin.AddAttachment(k.Key, k.Value, v); diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs index 3c48fe7..d9bacac 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs @@ -152,7 +152,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject position = pos; flipX = fX; flipY = fY; - foreach (var s in loadedSkins) addSkin(s); + reloadSkins(); for (int i = 0; i < animations.Length; i++) setAnimation(i, animations[i]); } } @@ -190,7 +190,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject skeleton.SetSlotsToSetupPose(); } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); @@ -229,7 +229,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.FlipY = skeleton.FlipY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var name in loadedSkins) + foreach (var (name, _) in skinLoadStatus.Where(e => e.Value)) { foreach (var (k, v) in skeletonData.FindSkin(name).Attachments) tmpSkeleton.Skin.AddAttachment(k.slotIndex, k.name, v); diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs index 71c1562..c432c01 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs @@ -161,7 +161,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject skeleton.SetSlotsToSetupPose(); } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); @@ -200,7 +200,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.ScaleY = skeleton.ScaleY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var name in loadedSkins) + foreach (var (name, _) in skinLoadStatus.Where(e => e.Value)) { foreach (var (k, v) in skeletonData.FindSkin(name).Attachments) tmpSkeleton.Skin.AddAttachment(k.slotIndex, k.name, v); diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject38.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject38.cs index a0da77f..30e5fbe 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject38.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject38.cs @@ -166,7 +166,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject } } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Clear(); skeleton.SetSlotsToSetupPose(); @@ -205,7 +205,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.ScaleY = skeleton.ScaleY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var sk in loadedSkins) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); + foreach (var (sk, _) in skinLoadStatus.Where(e => e.Value)) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); foreach (var tr in animationState.Tracks.Select((_, i) => i).Where(i => animationState.Tracks.Items[i] is not null)) { var ani = animationState.GetCurrent(tr).Animation; diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject40.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject40.cs index 73c1c9e..cedfb5f 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject40.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject40.cs @@ -161,7 +161,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject } } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Clear(); skeleton.SetSlotsToSetupPose(); @@ -200,7 +200,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.ScaleY = skeleton.ScaleY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var sk in loadedSkins) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); + foreach (var (sk, _) in skinLoadStatus.Where(e => e.Value)) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); foreach (var tr in animationState.Tracks.Select((_, i) => i).Where(i => animationState.Tracks.Items[i] is not null)) { var ani = animationState.GetCurrent(tr).Animation; diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject41.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject41.cs index 93e662b..6c5e757 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject41.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject41.cs @@ -161,7 +161,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject } } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Clear(); skeleton.SetSlotsToSetupPose(); @@ -200,7 +200,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.ScaleY = skeleton.ScaleY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var sk in loadedSkins) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); + foreach (var (sk, _) in skinLoadStatus.Where(e => e.Value)) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); foreach (var tr in animationState.Tracks.Select((_, i) => i).Where(i => animationState.Tracks.Items[i] is not null)) { var ani = animationState.GetCurrent(tr).Animation; diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject42.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject42.cs index c931e35..455036a 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject42.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject42.cs @@ -161,7 +161,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject } } - protected override void clearSkin() + protected override void clearSkins() { skeleton.Skin.Clear(); skeleton.SetSlotsToSetupPose(); @@ -200,7 +200,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject tmpSkeleton.ScaleY = skeleton.ScaleY; tmpSkeleton.X = skeleton.X; tmpSkeleton.Y = skeleton.Y; - foreach (var sk in loadedSkins) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); + foreach (var (sk, _) in skinLoadStatus.Where(e => e.Value)) tmpSkeleton.Skin.AddSkin(skeletonData.FindSkin(sk)); foreach (var tr in animationState.Tracks.Select((_, i) => i).Where(i => animationState.Tracks.Items[i] is not null)) { var ani = animationState.GetCurrent(tr).Animation; diff --git a/SpineViewer/Spine/SpineObject.cs b/SpineViewer/Spine/SpineObject.cs index 4b92d7e..6464038 100644 --- a/SpineViewer/Spine/SpineObject.cs +++ b/SpineViewer/Spine/SpineObject.cs @@ -8,6 +8,7 @@ using SpineViewer.Extensions; using SpineViewer.Utils; using System.Collections.Immutable; using System.Collections.Frozen; +using System.Linq; namespace SpineViewer.Spine { @@ -92,13 +93,11 @@ namespace SpineViewer.Spine tex.Display(); Preview = tex.Texture.CopyToBitmap(); - // 默认初始化10个空位 - for (int i = 0; i < 10; i++) - { - setAnimation(i, AnimationNames.First()); - loadedSkins.Add(SkinNames.First()); - } - reloadSkins(); + // 初始化皮肤加载情况 + foreach (var n in SkinNames) skinLoadStatus[n] = false; + + // 默认初始化10个动画空位 + for (int i = 0; i < 10; i++) setAnimation(i, AnimationNames.First()); return this; } @@ -341,70 +340,53 @@ namespace SpineViewer.Spine public ImmutableArray AnimationNames { get; protected set; } /// - /// 获取已加载的皮肤列表快照, 允许出现重复值 + /// 皮肤的加载情况记录表 /// - public string[] GetLoadedSkins() { lock (_lock) return loadedSkins.ToArray(); } - protected readonly List loadedSkins = []; + protected readonly Dictionary skinLoadStatus = []; /// - /// 加载指定皮肤, 添加至列表末尾, 如果不存在则忽略, 允许加载重复的值 + /// 查询皮肤是否被加载, 皮肤不存在时返回 false + /// + public bool GetSkinStatus(string name) { lock (_lock) return skinLoadStatus.TryGetValue(name, out var status) && status; } + + /// + /// 加载指定皮肤, 如果不存在则忽略, 允许重复加载 /// public void LoadSkin(string name) { - if (!SkinNames.Contains(name)) return; + if (!skinLoadStatus.ContainsKey(name)) return; lock (_lock) { - loadedSkins.Add(name); + skinLoadStatus[name] = true; reloadSkins(); } } /// - /// 卸载列表指定位置皮肤, 如果超出范围则忽略 + /// 卸载指定皮肤, 如果不存在则忽略, 允许重复卸载 /// - public void UnloadSkin(int idx) + public void UnloadSkin(string name) { + if (!skinLoadStatus.ContainsKey(name)) return; lock (_lock) { - if (idx < 0 || idx >= loadedSkins.Count) return; - loadedSkins.RemoveAt(idx); + skinLoadStatus[name] = false; reloadSkins(); } } /// - /// 替换皮肤列表指定位置皮肤, 超出范围或者皮肤不存在则忽略 - /// - public void ReplaceSkin(int idx, string name) - { - lock (_lock) - { - if (idx < 0 || idx >= loadedSkins.Count || !SkinNames.Contains(name)) return; - loadedSkins[idx] = name; - reloadSkins(); - } - } - - /// - /// 重新加载现有皮肤列表, 用于刷新等操作 + /// 刷新已加载皮肤 /// public void ReloadSkins() { lock (_lock) reloadSkins(); } - private void reloadSkins() + protected void reloadSkins() { - clearSkin(); - foreach (var s in loadedSkins.Distinct()) addSkin(s); + clearSkins(); + foreach (var (name, _) in skinLoadStatus.Where(e => e.Value)) addSkin(name); update(0); } - - /// - /// 加载皮肤, 如果不存在则忽略 - /// protected abstract void addSkin(string name); - - /// - /// 清空加载的所有皮肤 - /// - protected abstract void clearSkin(); + protected abstract void clearSkins(); /// /// 获取所有非 null 的轨道索引快照