补充3.7及以下版本的多皮肤功能

This commit is contained in:
ww-rm
2025-04-15 20:19:32 +08:00
parent 695d3c0735
commit 2a55fd9c36
4 changed files with 80 additions and 52 deletions

View File

@@ -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();
}