diff --git a/SpineViewer/Spine/Spine.cs b/SpineViewer/Spine/Spine.cs index 408872f..d6f72de 100644 --- a/SpineViewer/Spine/Spine.cs +++ b/SpineViewer/Spine/Spine.cs @@ -312,7 +312,7 @@ namespace SpineViewer.Spine public string DefaultAnimationName { get => animationNames.Last(); } /// - /// 当前动画名称 + /// 当前动画名称, 如果设置的动画不存在则忽略 /// [TypeConverter(typeof(AnimationConverter))] [Category("动画"), DisplayName("当前动画")] @@ -330,35 +330,6 @@ namespace SpineViewer.Spine [Browsable(false)] public abstract RectangleF Bounds { get; } - /// - /// 获取初始状态下合适的 View, 参数单位为像素 - /// - public SFML.Graphics.View GetInitView(uint width, uint height, uint paddingL = 1, uint paddingR = 1, uint paddingT = 1, uint paddingB = 1) - { - var tmp = CurrentAnimation; - CurrentAnimation = EMPTY_ANIMATION; - var bounds = Bounds; - CurrentAnimation = tmp; - - float sizeX = bounds.Width; - float sizeY = bounds.Height; - float innerW = width - paddingL - paddingR; - float innerH = height - paddingT - paddingB; - - float scale = 1; - if ((sizeY / sizeX) < (innerH / innerW)) - scale = sizeX / innerW; // 相同的 X, 视窗 Y 更大 - else - scale = sizeY / innerH; // 相同的 Y, 视窗 X 更大 - - var x = bounds.X + bounds.Width / 2 + ((float)paddingL - (float)paddingR) * scale; - var y = bounds.Y + bounds.Height / 2 + ((float)paddingT - (float)paddingB) * scale; - var viewX = width * scale; - var viewY = height * scale; - - return new(new(x, y), new(viewX, -viewY)); - } - /// /// 骨骼预览图 /// @@ -405,19 +376,51 @@ namespace SpineViewer.Spine public abstract void Update(float delta); /// - /// 顶点坐标缓冲区 + /// 获取初始状态下合适的 View, 参数单位为像素 /// - protected float[] worldVerticesBuffer = new float[1024]; + public SFML.Graphics.View GetInitView(Size resolution, Padding padding) => + GetInitView((uint)resolution.Width, (uint)resolution.Height, (uint)padding.Left, (uint)padding.Right, (uint)padding.Top, (uint)padding.Bottom); /// - /// 顶点缓冲区 + /// 获取初始状态下合适的 View, 参数单位为像素 /// - protected SFML.Graphics.VertexArray vertexArray = new(SFML.Graphics.PrimitiveType.Triangles); + public SFML.Graphics.View GetInitView(uint width, uint height, Padding padding) => + GetInitView(width, height, (uint)padding.Left, (uint)padding.Right, (uint)padding.Top, (uint)padding.Bottom); /// - /// SFML.Graphics.Drawable 接口实现 TODO: 增加调试内容绘制 + /// 获取初始状态下合适的 View, 参数单位为像素 /// - public abstract void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states); + public SFML.Graphics.View GetInitView(Size resolution, uint paddingL = 1, uint paddingR = 1, uint paddingT = 1, uint paddingB = 1) => + GetInitView((uint)resolution.Width, (uint)resolution.Height, paddingL, paddingR, paddingT, paddingB); + + /// + /// 获取初始状态下合适的 View, 参数单位为像素 + /// + public SFML.Graphics.View GetInitView(uint width, uint height, uint paddingL = 1, uint paddingR = 1, uint paddingT = 1, uint paddingB = 1) + { + var tmp = CurrentAnimation; + CurrentAnimation = EMPTY_ANIMATION; + var bounds = Bounds; + CurrentAnimation = tmp; + + float sizeX = bounds.Width; + float sizeY = bounds.Height; + float innerW = width - paddingL - paddingR; + float innerH = height - paddingT - paddingB; + + float scale = 1; + if ((sizeY / sizeX) < (innerH / innerW)) + scale = sizeX / innerW; // 相同的 X, 视窗 Y 更大 + else + scale = sizeY / innerH; // 相同的 Y, 视窗 X 更大 + + var x = bounds.X + bounds.Width / 2 + ((float)paddingL - (float)paddingR) * scale; + var y = bounds.Y + bounds.Height / 2 + ((float)paddingT - (float)paddingB) * scale; + var viewX = width * scale; + var viewY = height * scale; + + return new(new(x, y), new(viewX, -viewY)); + } /// /// 是否被选中 @@ -442,5 +445,24 @@ namespace SpineViewer.Spine /// [Browsable(false)] public bool DebugBones { get; set; } = false; + + #region SFML.Graphics.Drawable 接口实现 + + /// + /// 顶点坐标缓冲区 + /// + protected float[] worldVerticesBuffer = new float[1024]; + + /// + /// 顶点缓冲区 + /// + protected SFML.Graphics.VertexArray vertexArray = new(SFML.Graphics.PrimitiveType.Triangles); + + /// + /// SFML.Graphics.Drawable 接口实现 TODO: 增加调试内容绘制 + /// + public abstract void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states); + + #endregion } }