增加GetResolutionBounds方法
This commit is contained in:
@@ -23,7 +23,7 @@ namespace SpineViewer.Controls
|
|||||||
renderWindow.SetActive(false);
|
renderWindow.SetActive(false);
|
||||||
|
|
||||||
// 设置默认参数
|
// 设置默认参数
|
||||||
Resolution = Screen.PrimaryScreen.Bounds.Size;
|
Resolution = new(2048, 2048);
|
||||||
Center = new(0, 0);
|
Center = new(0, 0);
|
||||||
FlipY = true;
|
FlipY = true;
|
||||||
MaxFps = 30;
|
MaxFps = 30;
|
||||||
|
|||||||
@@ -29,45 +29,21 @@ namespace SpineViewer.Extensions
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取某个包围盒下合适的视图
|
/// 获取适合指定画布参数下能够覆盖包围盒的视区包围盒
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static SFML.Graphics.View GetView(this RectangleF bounds, Size resolution, Padding padding)
|
public static RectangleF GetResolutionBounds(this RectangleF bounds, Size resolution, Padding padding, Padding margin)
|
||||||
=> bounds.GetView((uint)resolution.Width, (uint)resolution.Height, (uint)padding.Left, (uint)padding.Right, (uint)padding.Top, (uint)padding.Bottom);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取某个包围盒下合适的视图
|
|
||||||
/// </summary>
|
|
||||||
public static SFML.Graphics.View GetView(this RectangleF bounds, uint width, uint height, Padding padding)
|
|
||||||
=> bounds.GetView(width, height, (uint)padding.Left, (uint)padding.Right, (uint)padding.Top, (uint)padding.Bottom);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取某个包围盒下合适的视图
|
|
||||||
/// </summary>
|
|
||||||
public static SFML.Graphics.View GetView(this RectangleF bounds, Size resolution, uint paddingL = 1, uint paddingR = 1, uint paddingT = 1, uint paddingB = 1)
|
|
||||||
=> bounds.GetView((uint)resolution.Width, (uint)resolution.Height, paddingL, paddingR, paddingT, paddingB);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取某个包围盒下合适的视图
|
|
||||||
/// </summary>
|
|
||||||
public static SFML.Graphics.View GetView(this RectangleF bounds, uint width, uint height, uint paddingL = 1, uint paddingR = 1, uint paddingT = 1, uint paddingB = 1)
|
|
||||||
{
|
{
|
||||||
float sizeX = bounds.Width;
|
float sizeW = bounds.Width;
|
||||||
float sizeY = bounds.Height;
|
float sizeH = bounds.Height;
|
||||||
float innerW = width - paddingL - paddingR;
|
float innerW = resolution.Width - padding.Horizontal;
|
||||||
float innerH = height - paddingT - paddingB;
|
float innerH = resolution.Height - padding.Vertical;
|
||||||
|
float scale = Math.Max(sizeW / innerW, sizeH / innerH); // 取两方向上较大的缩放比, 以此让画布可以覆盖内容
|
||||||
float scale = 1;
|
return new(
|
||||||
if (sizeY / sizeX < innerH / innerW)
|
bounds.X + (padding.Left + margin.Left - padding.Right - margin.Right) * scale,
|
||||||
scale = sizeX / innerW; // 相同的 X, 视窗 Y 更大
|
bounds.Y + (padding.Top + margin.Top - padding.Bottom - margin.Bottom) * scale,
|
||||||
else
|
(resolution.Width + margin.Horizontal) * scale,
|
||||||
scale = sizeY / innerH; // 相同的 Y, 视窗 X 更大
|
(resolution.Height + margin.Vertical) * scale
|
||||||
|
);
|
||||||
var x = bounds.X + bounds.Width / 2 + (paddingL - (float)paddingR) * scale;
|
|
||||||
var y = bounds.Y + bounds.Height / 2 + (paddingT - (float)paddingB) * scale;
|
|
||||||
var viewX = width * scale;
|
|
||||||
var viewY = height * scale;
|
|
||||||
|
|
||||||
return new(new(x, y), new(viewX, -viewY));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,14 +20,9 @@ namespace SpineViewer.Spine
|
|||||||
protected const string EMPTY_ANIMATION = "<Empty>";
|
protected const string EMPTY_ANIMATION = "<Empty>";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 预览图宽
|
/// 预览图像素大小
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected const uint PREVIEW_WIDTH = 256;
|
protected static readonly Size PreviewResolution = new(256, 256);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 预览图高
|
|
||||||
/// </summary>
|
|
||||||
protected const uint PREVIEW_HEIGHT = 256;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建特定版本的 Spine
|
/// 创建特定版本的 Spine
|
||||||
@@ -81,8 +76,12 @@ namespace SpineViewer.Spine
|
|||||||
// 虽然两边不会同时调用 Draw, 但是死锁似乎和 Draw 函数有关
|
// 虽然两边不会同时调用 Draw, 但是死锁似乎和 Draw 函数有关
|
||||||
// 除此之外, 似乎还和 tex 的 Dispose 有关
|
// 除此之外, 似乎还和 tex 的 Dispose 有关
|
||||||
// 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁
|
// 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁
|
||||||
var tex = new SFML.Graphics.RenderTexture(PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
var tex = new SFML.Graphics.RenderTexture((uint)PreviewResolution.Width, (uint)PreviewResolution.Height);
|
||||||
using var view = getCurrentBounds().GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
var bounds = getCurrentBounds().GetResolutionBounds(PreviewResolution, new(0), new(0));
|
||||||
|
using var view = new SFML.Graphics.View(
|
||||||
|
new(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2),
|
||||||
|
new(bounds.Width, -bounds.Height)
|
||||||
|
);
|
||||||
tex.SetView(view);
|
tex.SetView(view);
|
||||||
tex.Clear(SFML.Graphics.Color.Transparent);
|
tex.Clear(SFML.Graphics.Color.Transparent);
|
||||||
tex.Draw(this);
|
tex.Draw(this);
|
||||||
|
|||||||
Reference in New Issue
Block a user