From 4b07e02acb2f377792c3eb5e1615ced0505bcfa1 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Mon, 31 Mar 2025 01:44:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Spine/Implementations/Spine/Spine21.cs | 77 ++++++----- .../Spine/Implementations/Spine/Spine36.cs | 65 +++++---- .../Spine/Implementations/Spine/Spine37.cs | 44 +++---- .../Spine/Implementations/Spine/Spine38.cs | 44 +++---- .../Spine/Implementations/Spine/Spine40.cs | 44 +++---- .../Spine/Implementations/Spine/Spine41.cs | 44 +++---- .../Spine/Implementations/Spine/Spine42.cs | 44 +++---- SpineViewer/Spine/Spine.cs | 123 +++++++++++++----- 8 files changed, 257 insertions(+), 228 deletions(-) diff --git a/SpineViewer/Spine/Implementations/Spine/Spine21.cs b/SpineViewer/Spine/Implementations/Spine/Spine21.cs index 16b042a..24e00fa 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine21.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine21.cs @@ -92,7 +92,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get { @@ -106,11 +106,11 @@ namespace SpineViewer.Spine.Implementations.Spine set { // 保存状态 - var position = Position; - var flipX = FlipX; - var flipY = FlipY; - var animation = Track0Animation; // TODO: 适配多轨道 - var skin = Skin; + var pos = position; + var fX = flipX; + var fY = flipY; + var animation = track0Animation; // TODO: 适配多轨道 + var sk = skin; var val = Math.Max(value, SCALE_MIN); if (skeletonBinary is not null) @@ -130,38 +130,37 @@ namespace SpineViewer.Spine.Implementations.Spine animationState = new AnimationState(animationStateData); // 恢复状态 - Position = position; - FlipX = flipX; - FlipY = flipY; - Track0Animation = animation; // TODO: 适配多轨道 - Skin = skin; + position = pos; + flipX = fX; + flipY = fY; + track0Animation = animation; // TODO: 适配多轨道 + skin = sk; } } - public override PointF Position - { - get => new(skeleton.X, skeleton.Y); - set - { - skeleton.X = value.X; + protected override PointF position + { + get => new(skeleton.X, skeleton.Y); + set + { + skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); - } + } } - public override bool FlipX + protected override bool flipX { get => skeleton.FlipX; - set { skeleton.FlipX = value; Update(0); } + set => skeleton.FlipX = value; } - public override bool FlipY + protected override bool flipY { get => skeleton.FlipY; - set { skeleton.FlipY = value; Update(0); } + set => skeleton.FlipY = value; } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -169,11 +168,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -182,11 +180,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -238,7 +235,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -258,7 +255,7 @@ namespace SpineViewer.Spine.Implementations.Spine // }; //} - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -330,13 +327,13 @@ namespace SpineViewer.Spine.Implementations.Spine { if (vertexArray.VertexCount > 0) { - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -379,24 +376,24 @@ namespace SpineViewer.Spine.Implementations.Spine //clipping.ClipEnd(slot); } - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; //clipping.ClipEnd(); // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine36.cs b/SpineViewer/Spine/Implementations/Spine/Spine36.cs index 05124aa..e21c551 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine36.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine36.cs @@ -91,7 +91,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get { @@ -105,11 +105,11 @@ namespace SpineViewer.Spine.Implementations.Spine set { // 保存状态 - var position = Position; - var flipX = FlipX; - var flipY = FlipY; - var animation = Track0Animation; // TODO: 适配多轨道 - var skin = Skin; + var pos = position; + var fX = flipX; + var fY = flipY; + var animation = track0Animation; // TODO: 适配多轨道 + var sk = skin; var val = Math.Max(value, SCALE_MIN); if (skeletonBinary is not null) @@ -129,38 +129,37 @@ namespace SpineViewer.Spine.Implementations.Spine animationState = new AnimationState(animationStateData); // 恢复状态 - Position = position; - FlipX = flipX; - FlipY = flipY; - Track0Animation = animation; // TODO: 适配多轨道 - Skin = skin; + position = pos; + flipX = fX; + flipY = fY; + track0Animation = animation; // TODO: 适配多轨道 + skin = sk; } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.FlipX; - set { skeleton.FlipX = value; Update(0); } + set => skeleton.FlipX = value; } - public override bool FlipY + protected override bool flipY { get => skeleton.FlipY; - set { skeleton.FlipY = value; Update(0); } + set => skeleton.FlipY = value; } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -168,11 +167,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -181,11 +179,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -197,7 +194,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -217,7 +214,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -287,13 +284,13 @@ namespace SpineViewer.Spine.Implementations.Spine { if (vertexArray.VertexCount > 0) { - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -337,23 +334,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine37.cs b/SpineViewer/Spine/Implementations/Spine/Spine37.cs index 2c3837b..38ea611 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine37.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine37.cs @@ -89,51 +89,47 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get => Math.Abs(skeleton.ScaleX); set { skeleton.ScaleX = Math.Sign(skeleton.ScaleX) * value; skeleton.ScaleY = Math.Sign(skeleton.ScaleY) * value; - Update(0); } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.ScaleX < 0; set { if (skeleton.ScaleX > 0 && value || skeleton.ScaleX < 0 && !value) skeleton.ScaleX *= -1; - Update(0); } } - public override bool FlipY + protected override bool flipY { get => skeleton.ScaleY < 0; set { if (skeleton.ScaleY > 0 && value || skeleton.ScaleY < 0 && !value) skeleton.ScaleY *= -1; - Update(0); } } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -141,11 +137,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -154,11 +149,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -170,7 +164,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -190,7 +184,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -261,13 +255,13 @@ namespace SpineViewer.Spine.Implementations.Spine if (vertexArray.VertexCount > 0) { // XXX: 实测不用设置 sampler2D 的值也正确 - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -311,23 +305,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine38.cs b/SpineViewer/Spine/Implementations/Spine/Spine38.cs index 5209e3b..565a6c8 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine38.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine38.cs @@ -95,51 +95,47 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get => Math.Abs(skeleton.ScaleX); set { skeleton.ScaleX = Math.Sign(skeleton.ScaleX) * value; skeleton.ScaleY = Math.Sign(skeleton.ScaleY) * value; - Update(0); } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.ScaleX < 0; set { if (skeleton.ScaleX > 0 && value || skeleton.ScaleX < 0 && !value) skeleton.ScaleX *= -1; - Update(0); } } - public override bool FlipY + protected override bool flipY { get => skeleton.ScaleY < 0; set { if (skeleton.ScaleY > 0 && value || skeleton.ScaleY < 0 && !value) skeleton.ScaleY *= -1; - Update(0); } } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -147,11 +143,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -160,11 +155,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -176,7 +170,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -196,7 +190,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -267,13 +261,13 @@ namespace SpineViewer.Spine.Implementations.Spine if (vertexArray.VertexCount > 0) { // XXX: 实测不用设置 sampler2D 的值也正确 - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -317,23 +311,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 调试包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine40.cs b/SpineViewer/Spine/Implementations/Spine/Spine40.cs index a43561b..434fe15 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine40.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine40.cs @@ -91,51 +91,47 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get => Math.Abs(skeleton.ScaleX); set { skeleton.ScaleX = Math.Sign(skeleton.ScaleX) * value; skeleton.ScaleY = Math.Sign(skeleton.ScaleY) * value; - Update(0); } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.ScaleX < 0; set { if (skeleton.ScaleX > 0 && value || skeleton.ScaleX < 0 && !value) skeleton.ScaleX *= -1; - Update(0); } } - public override bool FlipY + protected override bool flipY { get => skeleton.ScaleY < 0; set { if (skeleton.ScaleY > 0 && value || skeleton.ScaleY < 0 && !value) skeleton.ScaleY *= -1; - Update(0); } } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -143,11 +139,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -156,11 +151,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -172,7 +166,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -192,7 +186,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -263,13 +257,13 @@ namespace SpineViewer.Spine.Implementations.Spine if (vertexArray.VertexCount > 0) { // XXX: 实测不用设置 sampler2D 的值也正确 - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -313,23 +307,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine41.cs b/SpineViewer/Spine/Implementations/Spine/Spine41.cs index 701413f..c2bfc17 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine41.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine41.cs @@ -91,51 +91,47 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get => Math.Abs(skeleton.ScaleX); set { skeleton.ScaleX = Math.Sign(skeleton.ScaleX) * value; skeleton.ScaleY = Math.Sign(skeleton.ScaleY) * value; - Update(0); } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.ScaleX < 0; set { if (skeleton.ScaleX > 0 && value || skeleton.ScaleX < 0 && !value) skeleton.ScaleX *= -1; - Update(0); } } - public override bool FlipY + protected override bool flipY { get => skeleton.ScaleY < 0; set { if (skeleton.ScaleY > 0 && value || skeleton.ScaleY < 0 && !value) skeleton.ScaleY *= -1; - Update(0); } } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -143,11 +139,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -156,11 +151,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -172,7 +166,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -192,7 +186,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -263,13 +257,13 @@ namespace SpineViewer.Spine.Implementations.Spine if (vertexArray.VertexCount > 0) { // XXX: 实测不用设置 sampler2D 的值也正确 - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -313,23 +307,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Implementations/Spine/Spine42.cs b/SpineViewer/Spine/Implementations/Spine/Spine42.cs index 0717ec0..aa98047 100644 --- a/SpineViewer/Spine/Implementations/Spine/Spine42.cs +++ b/SpineViewer/Spine/Implementations/Spine/Spine42.cs @@ -91,51 +91,47 @@ namespace SpineViewer.Spine.Implementations.Spine public override string FileVersion { get => skeletonData.Version; } - public override float Scale + protected override float scale { get => Math.Abs(skeleton.ScaleX); set { skeleton.ScaleX = Math.Sign(skeleton.ScaleX) * value; skeleton.ScaleY = Math.Sign(skeleton.ScaleY) * value; - Update(0); } } - public override PointF Position + protected override PointF position { get => new(skeleton.X, skeleton.Y); set { skeleton.X = value.X; skeleton.Y = value.Y; - Update(0); } } - public override bool FlipX + protected override bool flipX { get => skeleton.ScaleX < 0; set { if (skeleton.ScaleX > 0 && value || skeleton.ScaleX < 0 && !value) skeleton.ScaleX *= -1; - Update(0); } } - public override bool FlipY + protected override bool flipY { get => skeleton.ScaleY < 0; set { if (skeleton.ScaleY > 0 && value || skeleton.ScaleY < 0 && !value) skeleton.ScaleY *= -1; - Update(0); } } - public override string Skin + protected override string skin { get => skeleton.Skin?.Name ?? "default"; set @@ -143,11 +139,10 @@ namespace SpineViewer.Spine.Implementations.Spine if (!skinNames.Contains(value)) return; skeleton.SetSkin(value); skeleton.SetSlotsToSetupPose(); - Update(0); } } - public override string Track0Animation + protected override string track0Animation { get => animationState.GetCurrent(0)?.Animation.Name ?? EMPTY_ANIMATION; set @@ -156,11 +151,10 @@ namespace SpineViewer.Spine.Implementations.Spine animationState.SetAnimation(0, EmptyAnimation, false); else if (animationNames.Contains(value)) animationState.SetAnimation(0, value, true); - Update(0); } } - public override RectangleF Bounds + protected override RectangleF bounds { get { @@ -172,7 +166,7 @@ namespace SpineViewer.Spine.Implementations.Spine public override float GetAnimationDuration(string name) { return skeletonData.FindAnimation(name)?.Duration ?? 0f; } - public override void Update(float delta) + protected override void update(float delta) { animationState.Update(delta); animationState.Apply(skeleton); @@ -192,7 +186,7 @@ namespace SpineViewer.Spine.Implementations.Spine }; } - public override void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) + protected override void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { vertexArray.Clear(); states.Texture = null; @@ -263,13 +257,13 @@ namespace SpineViewer.Spine.Implementations.Spine if (vertexArray.VertexCount > 0) { // XXX: 实测不用设置 sampler2D 的值也正确 - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); vertexArray.Clear(); @@ -313,23 +307,23 @@ namespace SpineViewer.Spine.Implementations.Spine } clipping.ClipEnd(); - if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) + if (usePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive)) states.Shader = Shader.FragmentShader; else states.Shader = null; // 调试纹理 - if (!IsDebug || DebugTexture) + if (!isDebug || debugTexture) target.Draw(vertexArray, states); // 包围盒 - if (IsDebug && IsSelected && DebugBounds) + if (isDebug && isSelected && debugBounds) { - var bounds = Bounds; - boundsVertices[0] = boundsVertices[4] = new(new(bounds.Left, bounds.Top), BoundsColor); - boundsVertices[1] = new(new(bounds.Right, bounds.Top), BoundsColor); - boundsVertices[2] = new(new(bounds.Right, bounds.Bottom), BoundsColor); - boundsVertices[3] = new(new(bounds.Left, bounds.Bottom), BoundsColor); + var b = bounds; + boundsVertices[0] = boundsVertices[4] = new(new(b.Left, b.Top), BoundsColor); + boundsVertices[1] = new(new(b.Right, b.Top), BoundsColor); + boundsVertices[2] = new(new(b.Right, b.Bottom), BoundsColor); + boundsVertices[3] = new(new(b.Left, b.Bottom), BoundsColor); target.Draw(boundsVertices); } } diff --git a/SpineViewer/Spine/Spine.cs b/SpineViewer/Spine/Spine.cs index 0f73104..4a30fc5 100644 --- a/SpineViewer/Spine/Spine.cs +++ b/SpineViewer/Spine/Spine.cs @@ -19,7 +19,7 @@ using SpineViewer.Exporter; namespace SpineViewer.Spine { /// - /// Spine 基类, 使用静态方法 New 来创建具体版本对象 + /// Spine 基类, 使用静态方法 New 来创建具体版本对象, 该类是线程安全的 /// public abstract class Spine : ImplementationResolver, SFML.Graphics.Drawable, IDisposable { @@ -53,6 +53,11 @@ namespace SpineViewer.Spine return New(version, [skelPath, atlasPath]).PostInit(); } + /// + /// 数据锁 + /// + private readonly object _lock = new(); + /// /// 构造函数 /// @@ -74,9 +79,7 @@ namespace SpineViewer.Spine AnimationNames = animationNames.AsReadOnly(); // 必须 Update 一次否则包围盒还没有值 - Update(0); - - InitBounds = Bounds; + update(0); // XXX: tex 没办法在这里主动 Dispose // 批量添加在获取预览图的时候极大概率会和预览线程死锁 @@ -84,7 +87,7 @@ namespace SpineViewer.Spine // 除此之外, 似乎还和 tex 的 Dispose 有关 // 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁 var tex = new SFML.Graphics.RenderTexture(PREVIEW_WIDTH, PREVIEW_HEIGHT); - tex.SetView(InitBounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT)); + tex.SetView(bounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT)); tex.Clear(SFML.Graphics.Color.Transparent); tex.Draw(this); tex.Display(); @@ -101,8 +104,8 @@ namespace SpineViewer.Spine } // 取最后一个作为初始, 尽可能去显示非默认的内容 - Skin = SkinNames.Last(); - Track0Animation = AnimationNames.Last(); + skin = SkinNames.Last(); + track0Animation = AnimationNames.Last(); return this; } @@ -158,13 +161,23 @@ namespace SpineViewer.Spine /// 是否被隐藏, 被隐藏的模型将仅仅在列表显示, 不参与其他行为 /// [Category("[1] 设置"), DisplayName("是否隐藏")] - public bool IsHidden { get; set; } = false; + public bool IsHidden + { + get { lock (_lock) return isHidden; } + set { lock (_lock) isHidden = value; } + } + protected bool isHidden = false; /// /// 是否使用预乘Alpha /// [Category("[1] 设置"), DisplayName("预乘Alpha通道")] - public bool UsePremultipliedAlpha { get; set; } = true; + public bool UsePremultipliedAlpha + { + get { lock (_lock) return usePremultipliedAlpha; } + set { lock (_lock) usePremultipliedAlpha = value; } + } + protected bool usePremultipliedAlpha = true; #endregion @@ -174,26 +187,46 @@ namespace SpineViewer.Spine /// 缩放比例 /// [Category("[2] 变换"), DisplayName("缩放比例")] - public abstract float Scale { get; set; } + public float Scale + { + get { lock (_lock) return scale; } + set { lock (_lock) { scale = value; update(0); } } + } + protected abstract float scale { get; set; } /// /// 位置 /// [TypeConverter(typeof(PointFConverter))] [Category("[2] 变换"), DisplayName("位置")] - public abstract PointF Position { get; set; } + public PointF Position + { + get { lock (_lock) return position; } + set { lock (_lock) { position = value; update(0); } } + } + protected abstract PointF position { get; set; } /// /// 水平翻转 /// [Category("[2] 变换"), DisplayName("水平翻转")] - public abstract bool FlipX { get; set; } + public bool FlipX + { + get { lock (_lock) return flipX; } + set { lock (_lock) { flipX = value; update(0); } } + } + protected abstract bool flipX { get; set; } /// /// 垂直翻转 /// [Category("[2] 变换"), DisplayName("垂直翻转")] - public abstract bool FlipY { get; set; } + public bool FlipY + { + get { lock (_lock) return flipY; } + set { lock (_lock) { flipY = value; update(0); } } + } + protected abstract bool flipY { get; set; } #endregion @@ -211,7 +244,12 @@ namespace SpineViewer.Spine /// [TypeConverter(typeof(SkinConverter))] [Category("[3] 动画"), DisplayName("皮肤")] - public abstract string Skin { get; set; } + public string Skin + { + get { lock (_lock) return skin; } + set { lock (_lock) { skin = value; update(0); } } + } + protected abstract string skin { get; set; } /// /// 包含的所有动画名称 @@ -225,7 +263,12 @@ namespace SpineViewer.Spine /// [TypeConverter(typeof(AnimationConverter))] [Category("[3] 动画"), DisplayName("默认轨道动画")] - public abstract string Track0Animation { get; set; } + public string Track0Animation + { + get { lock (_lock) return track0Animation; } + set { lock (_lock) { track0Animation = value; update(0); } } + } + protected abstract string track0Animation { get; set; } /// /// 默认轨道动画时长 @@ -241,25 +284,45 @@ namespace SpineViewer.Spine /// 显示调试 /// [Browsable(false)] - public bool IsDebug { get; set; } = false; + public bool IsDebug + { + get { lock (_lock) return isDebug; } + set { lock (_lock) isDebug = value; } + } + protected bool isDebug = false; /// /// 显示纹理 /// [Category("[4] 调试"), DisplayName("显示纹理")] - public bool DebugTexture { get; set; } = true; + public bool DebugTexture + { + get { lock (_lock) return debugTexture; } + set { lock (_lock) debugTexture = value; } + } + protected bool debugTexture = true; /// /// 显示包围盒 /// [Category("[4] 调试"), DisplayName("显示包围盒")] - public bool DebugBounds { get; set; } = true; + public bool DebugBounds + { + get { lock (_lock) return debugBounds; } + set { lock (_lock) debugBounds = value; } + } + protected bool debugBounds = true; /// /// 显示骨骼 /// [Category("[4] 调试"), DisplayName("显示骨架")] - public bool DebugBones { get; set; } = false; + public bool DebugBones + { + get { lock (_lock) return debugBones; } + set { lock (_lock) debugBones = value; } + } + protected bool debugBones = false; #endregion @@ -272,19 +335,19 @@ namespace SpineViewer.Spine /// 是否被选中 /// [Browsable(false)] - public bool IsSelected { get; set; } = false; + public bool IsSelected + { + get { lock (_lock) return isSelected; } + set { lock (_lock) isSelected = value; } + } + protected bool isSelected = false; /// /// 骨骼包围盒 /// [Browsable(false)] - public abstract RectangleF Bounds { get; } - - /// - /// 初始状态下的骨骼包围盒 - /// - [Browsable(false)] - public RectangleF InitBounds { get; private set; } + public RectangleF Bounds { get { lock (_lock) return bounds; } } + protected abstract RectangleF bounds { get; } /// /// 骨骼预览图 @@ -300,7 +363,8 @@ namespace SpineViewer.Spine /// /// 更新内部状态 /// - public abstract void Update(float delta); + public void Update(float delta) { lock (_lock) update(delta); } + protected abstract void update(float delta); #region SFML.Graphics.Drawable 接口实现 @@ -327,7 +391,8 @@ namespace SpineViewer.Spine /// /// SFML.Graphics.Drawable 接口实现 /// - public abstract void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states); + public void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states) { lock (_lock) draw(target, states); } + protected abstract void draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states); #endregion }