From 2a55fd9c365595ae6d5b3ff59aeb63b256731cfb Mon Sep 17 00:00:00 2001 From: ww-rm Date: Tue, 15 Apr 2025 20:19:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=853.7=E5=8F=8A=E4=BB=A5?= =?UTF-8?q?=E4=B8=8B=E7=89=88=E6=9C=AC=E7=9A=84=E5=A4=9A=E7=9A=AE=E8=82=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpineObject/SpineObject21.cs | 46 ++++++++++--------- .../SpineObject/SpineObject36.cs | 36 +++++++++++---- .../SpineObject/SpineObject37.cs | 43 +++++++++++------ SpineViewer/Spine/SpineObject.cs | 7 --- 4 files changed, 80 insertions(+), 52 deletions(-) diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs index 38e03e4..acb0910 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject21.cs @@ -14,7 +14,17 @@ namespace SpineViewer.Spine.Implementations.SpineObject [SpineImplementation(SpineVersion.V21)] internal class SpineObject21 : Spine.SpineObject { - private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); + //private static SFML.Graphics.BlendMode GetSFMLBlendMode(BlendMode spineBlendMode) + //{ + // return spineBlendMode switch + // { + // BlendMode.Normal => BlendMode.Normal, + // BlendMode.Additive => BlendMode.Additive, + // BlendMode.Multiply => BlendMode.Multiply, + // BlendMode.Screen => BlendMode.Screen, + // _ => throw new NotImplementedException($"{spineBlendMode}"), + // }; + //} private class TextureLoader : SpineRuntime21.TextureLoader { @@ -34,11 +44,13 @@ namespace SpineViewer.Spine.Implementations.SpineObject ((SFML.Graphics.Texture)texture).Dispose(); } } - private static TextureLoader textureLoader = new(); - private Atlas atlas; - private SkeletonBinary? skeletonBinary; - private SkeletonJson? skeletonJson; + private readonly static TextureLoader textureLoader = new(); + private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); + + private readonly Atlas atlas; + private readonly SkeletonBinary? skeletonBinary; + private readonly SkeletonJson? skeletonJson; private SkeletonData skeletonData; private AnimationStateData animationStateData; @@ -80,7 +92,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject foreach (var anime in skeletonData.Animations) animationNames.Add(anime.Name); - skeleton = new Skeleton(skeletonData); + skeleton = new Skeleton(skeletonData) { Skin = new(Guid.NewGuid().ToString()) }; // 挂载一个空皮肤当作容器 animationStateData = new AnimationStateData(skeletonData); animationState = new AnimationState(animationStateData); } @@ -161,14 +173,18 @@ namespace SpineViewer.Spine.Implementations.SpineObject protected override void addSkin(string name) { - if (!skinNames.Contains(name)) return; - skeleton.SetSkin(name); // XXX: 3.7 及以下不支持 AddSkin + if (skeletonData.FindSkin(name) is Skin sk) + { + // XXX: 3.7 及以下不支持 AddSkin + foreach (var (k, v) in sk.Attachments) + skeleton.Skin.AddAttachment(k.Key, k.Value, v); + } skeleton.SetSlotsToSetupPose(); } protected override void clearSkin() { - skeleton.SetSkin(skeletonData.DefaultSkin); + skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); } @@ -243,18 +259,6 @@ namespace SpineViewer.Spine.Implementations.SpineObject skeleton.UpdateWorldTransform(); } - //private SFML.Graphics.BlendMode GetSFMLBlendMode(BlendMode spineBlendMode) - //{ - // return spineBlendMode switch - // { - // BlendMode.Normal => BlendMode.Normal, - // BlendMode.Additive => BlendMode.Additive, - // BlendMode.Multiply => BlendMode.Multiply, - // BlendMode.Screen => BlendMode.Screen, - // _ => throw new NotImplementedException($"{spineBlendMode}"), - // }; - //} - protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { triangleVertices.Clear(); diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs index b830826..28b5c8b 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject36.cs @@ -14,7 +14,17 @@ namespace SpineViewer.Spine.Implementations.SpineObject [SpineImplementation(SpineVersion.V36)] internal class SpineObject36 : Spine.SpineObject { - private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); + private static SFML.Graphics.BlendMode GetSFMLBlendMode(BlendMode spineBlendMode) + { + return spineBlendMode switch + { + BlendMode.Normal => SFMLBlendMode.NormalPma, + BlendMode.Additive => SFMLBlendMode.AdditivePma, + BlendMode.Multiply => SFMLBlendMode.MultiplyPma, + BlendMode.Screen => SFMLBlendMode.ScreenPma, + _ => throw new NotImplementedException($"{spineBlendMode}"), + }; + } private class TextureLoader : SpineRuntime36.TextureLoader { @@ -34,18 +44,20 @@ namespace SpineViewer.Spine.Implementations.SpineObject ((SFML.Graphics.Texture)texture).Dispose(); } } - private static TextureLoader textureLoader = new(); - private Atlas atlas; - private SkeletonBinary? skeletonBinary; - private SkeletonJson? skeletonJson; + private static readonly TextureLoader textureLoader = new(); + private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); + + private readonly Atlas atlas; + private readonly SkeletonBinary? skeletonBinary; + private readonly SkeletonJson? skeletonJson; private SkeletonData skeletonData; private AnimationStateData animationStateData; private Skeleton skeleton; private AnimationState animationState; - private SkeletonClipping clipping = new(); + private readonly SkeletonClipping clipping = new(); public SpineObject36(string skelPath, string atlasPath) : base(skelPath, atlasPath) { @@ -79,7 +91,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject foreach (var anime in skeletonData.Animations) animationNames.Add(anime.Name); - skeleton = new Skeleton(skeletonData); + skeleton = new Skeleton(skeletonData) { Skin = new(Guid.NewGuid().ToString()) }; // 挂载一个空皮肤当作容器 animationStateData = new AnimationStateData(skeletonData); animationState = new AnimationState(animationStateData); } @@ -160,14 +172,18 @@ namespace SpineViewer.Spine.Implementations.SpineObject protected override void addSkin(string name) { - if (!skinNames.Contains(name)) return; - skeleton.SetSkin(name); // XXX: 3.7 及以下不支持 AddSkin + if (skeletonData.FindSkin(name) is Skin sk) + { + // XXX: 3.7 及以下不支持 AddSkin + foreach (var (k, v) in sk.Attachments) + skeleton.Skin.AddAttachment(k.slotIndex, k.name, v); + } skeleton.SetSlotsToSetupPose(); } protected override void clearSkin() { - skeleton.SetSkin(skeletonData.DefaultSkin); + skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); } diff --git a/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs b/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs index 93e9f1d..0a9751b 100644 --- a/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs +++ b/SpineViewer/Spine/Implementations/SpineObject/SpineObject37.cs @@ -11,7 +11,17 @@ namespace SpineViewer.Spine.Implementations.SpineObject [SpineImplementation(SpineVersion.V37)] internal class SpineObject37 : Spine.SpineObject { - private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); + private static SFML.Graphics.BlendMode GetSFMLBlendMode(BlendMode spineBlendMode) + { + return spineBlendMode switch + { + BlendMode.Normal => SFMLBlendMode.NormalPma, + BlendMode.Additive => SFMLBlendMode.AdditivePma, + BlendMode.Multiply => SFMLBlendMode.MultiplyPma, + BlendMode.Screen => SFMLBlendMode.ScreenPma, + _ => throw new NotImplementedException($"{spineBlendMode}"), + }; + } private class TextureLoader : SpineRuntime37.TextureLoader { @@ -32,18 +42,19 @@ namespace SpineViewer.Spine.Implementations.SpineObject } } - private static TextureLoader textureLoader = new(); + private static readonly TextureLoader textureLoader = new(); + private static readonly Animation EmptyAnimation = new(EMPTY_ANIMATION, [], 0); - private Atlas atlas; - private SkeletonBinary? skeletonBinary; - private SkeletonJson? skeletonJson; - private SkeletonData skeletonData; - private AnimationStateData animationStateData; + private readonly Atlas atlas; + private readonly SkeletonBinary? skeletonBinary; + private readonly SkeletonJson? skeletonJson; + private readonly SkeletonData skeletonData; + private readonly AnimationStateData animationStateData; - private Skeleton skeleton; - private AnimationState animationState; + private readonly Skeleton skeleton; + private readonly AnimationState animationState; - private SkeletonClipping clipping = new(); + private readonly SkeletonClipping clipping = new(); public SpineObject37(string skelPath, string atlasPath) : base(skelPath, atlasPath) { @@ -77,7 +88,7 @@ namespace SpineViewer.Spine.Implementations.SpineObject foreach (var anime in skeletonData.Animations) animationNames.Add(anime.Name); - skeleton = new Skeleton(skeletonData); + skeleton = new Skeleton(skeletonData) { Skin = new(Guid.NewGuid().ToString()) }; // 挂载一个空皮肤当作容器 animationStateData = new AnimationStateData(skeletonData); animationState = new AnimationState(animationStateData); } @@ -132,14 +143,18 @@ namespace SpineViewer.Spine.Implementations.SpineObject protected override void addSkin(string name) { - if (!skinNames.Contains(name)) return; - skeleton.SetSkin(name); // XXX: 3.7 及以下不支持 AddSkin + if (skeletonData.FindSkin(name) is Skin sk) + { + // XXX: 3.7 及以下不支持 AddSkin + foreach (var (k, v) in sk.Attachments) + skeleton.Skin.AddAttachment(k.slotIndex, k.name, v); + } skeleton.SetSlotsToSetupPose(); } protected override void clearSkin() { - skeleton.SetSkin(skeletonData.DefaultSkin); + skeleton.Skin.Attachments.Clear(); skeleton.SetSlotsToSetupPose(); } diff --git a/SpineViewer/Spine/SpineObject.cs b/SpineViewer/Spine/SpineObject.cs index 1527597..e85367e 100644 --- a/SpineViewer/Spine/SpineObject.cs +++ b/SpineViewer/Spine/SpineObject.cs @@ -52,7 +52,6 @@ namespace SpineViewer.Spine /// 日志器 /// protected readonly Logger logger = LogManager.GetCurrentClassLogger(); - private bool skinLoggerWarned = false; /// /// 构造函数 @@ -351,12 +350,6 @@ namespace SpineViewer.Spine { loadedSkins.Add(name); reloadSkins(); - - if (!skinLoggerWarned && Version < SpineVersion.V38 && loadedSkins.Count > 1) - { - logger.Warn($"Multiplt skins not supported in SpineVersion {Version.GetName()}"); - skinLoggerWarned = true; - } } }