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
}