延迟运行时属性在第一次调用时初始化

This commit is contained in:
ww-rm
2025-04-20 14:05:04 +08:00
parent b802ec252a
commit c4f17e3f06

View File

@@ -20,18 +20,6 @@ namespace SpineViewer.Controls
public SpinePreviewPanel() public SpinePreviewPanel()
{ {
InitializeComponent(); InitializeComponent();
renderWindow = new(panel_Render.Handle);
renderWindow.SetActive(false);
wallpaperWindow = new(wallpaperForm.Handle);
wallpaperWindow.SetVisible(false);
wallpaperWindow.SetActive(false);
// 设置默认参数
Resolution = new(2048, 2048);
Zoom = 1;
Center = new(0, 0);
FlipY = true;
MaxFps = 30;
} }
/// <summary> /// <summary>
@@ -73,6 +61,8 @@ namespace SpineViewer.Controls
get => resolution; get => resolution;
set set
{ {
if (renderWindow is null) return;
if (value == resolution) return; if (value == resolution) return;
if (value.Width <= 0) value.Width = 100; if (value.Width <= 0) value.Width = 100;
if (value.Height <= 0) value.Height = 100; if (value.Height <= 0) value.Height = 100;
@@ -113,12 +103,16 @@ namespace SpineViewer.Controls
{ {
get get
{ {
if (renderWindow is null) return new(-1, -1);
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
var center = view.Center; var center = view.Center;
return new(center.X, center.Y); return new(center.X, center.Y);
} }
set set
{ {
if (renderWindow is null) return;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
view.Center = new(value.X, value.Y); view.Center = new(value.X, value.Y);
renderWindow.SetView(view); renderWindow.SetView(view);
@@ -135,11 +129,15 @@ namespace SpineViewer.Controls
{ {
get get
{ {
if (renderWindow is null) return -1;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
return resolution.Width / Math.Abs(view.Size.X); return resolution.Width / Math.Abs(view.Size.X);
} }
set set
{ {
if (renderWindow is null) return;
value = Math.Clamp(value, 0.001f, 1000f); value = Math.Clamp(value, 0.001f, 1000f);
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
var signX = Math.Sign(view.Size.X); var signX = Math.Sign(view.Size.X);
@@ -159,11 +157,15 @@ namespace SpineViewer.Controls
{ {
get get
{ {
if (renderWindow is null) return -1;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
return view.Rotation; return view.Rotation;
} }
set set
{ {
if (renderWindow is null) return;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
view.Rotation = value; view.Rotation = value;
renderWindow.SetView(view); renderWindow.SetView(view);
@@ -180,11 +182,15 @@ namespace SpineViewer.Controls
{ {
get get
{ {
if (renderWindow is null) return false;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
return view.Size.X < 0; return view.Size.X < 0;
} }
set set
{ {
if (renderWindow is null) return;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
var size = view.Size; var size = view.Size;
if (size.X > 0 && value || size.X < 0 && !value) if (size.X > 0 && value || size.X < 0 && !value)
@@ -204,11 +210,15 @@ namespace SpineViewer.Controls
{ {
get get
{ {
if (renderWindow is null) return false;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
return view.Size.Y < 0; return view.Size.Y < 0;
} }
set set
{ {
if (renderWindow is null) return;
using var view = renderWindow.GetView(); using var view = renderWindow.GetView();
var size = view.Size; var size = view.Size;
if (size.Y > 0 && value || size.Y < 0 && !value) if (size.Y > 0 && value || size.Y < 0 && !value)
@@ -238,7 +248,17 @@ namespace SpineViewer.Controls
/// </summary> /// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)] [Browsable(false)]
public uint MaxFps { get => maxFps; set { renderWindow.SetFramerateLimit(value); maxFps = value; } } public uint MaxFps
{
get => maxFps;
set
{
if (renderWindow is null) return;
renderWindow.SetFramerateLimit(value);
maxFps = value;
}
}
private uint maxFps = 60; private uint maxFps = 60;
/// <summary> /// <summary>
@@ -256,6 +276,8 @@ namespace SpineViewer.Controls
get => enableDesktopProjection; get => enableDesktopProjection;
set set
{ {
if (renderWindow is null) return;
if (enableDesktopProjection == value) return; if (enableDesktopProjection == value) return;
if (value) if (value)
{ {
@@ -275,15 +297,17 @@ namespace SpineViewer.Controls
} }
private bool enableDesktopProjection = false; private bool enableDesktopProjection = false;
#endregion
#region
/// <summary> /// <summary>
/// 预览画面背景色 /// 预览画面背景色
/// </summary> /// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public SFML.Graphics.Color BackgroundColor { get; set; } = new(105, 105, 105); public SFML.Graphics.Color BackgroundColor { get; set; } = new(105, 105, 105);
#endregion
#region
/// <summary> /// <summary>
/// 预览画面坐标轴颜色 /// 预览画面坐标轴颜色
/// </summary> /// </summary>
@@ -297,7 +321,7 @@ namespace SpineViewer.Controls
/// <summary> /// <summary>
/// 渲染窗口 /// 渲染窗口
/// </summary> /// </summary>
private readonly SFML.Graphics.RenderWindow renderWindow; private SFML.Graphics.RenderWindow renderWindow;
/// <summary> /// <summary>
/// 壁纸窗口 /// 壁纸窗口
@@ -350,6 +374,23 @@ namespace SpineViewer.Controls
/// </summary> /// </summary>
public void StartRender() public void StartRender()
{ {
// 延迟到第一次开启渲染时进行初始化
if (renderWindow is null)
{
renderWindow = new(panel_Render.Handle);
renderWindow.SetActive(false);
wallpaperWindow = new(wallpaperForm.Handle);
wallpaperWindow.SetVisible(false);
wallpaperWindow.SetActive(false);
// 设置默认参数
Resolution = new(2048, 2048);
Zoom = 1;
Center = new(0, 0);
FlipY = true;
MaxFps = 30;
}
if (task is not null) return; if (task is not null) return;
cancelToken = new(); cancelToken = new();
task = Task.Run(RenderTask, cancelToken.Token); task = Task.Run(RenderTask, cancelToken.Token);
@@ -466,8 +507,7 @@ namespace SpineViewer.Controls
private void panel_RenderContainer_SizeChanged(object sender, EventArgs e) private void panel_RenderContainer_SizeChanged(object sender, EventArgs e)
{ {
if (renderWindow is null) if (renderWindow is null) return;
return;
float parentW = panel_Render.Parent.Width; float parentW = panel_Render.Parent.Width;
float parentH = panel_Render.Parent.Height; float parentH = panel_Render.Parent.Height;
@@ -484,6 +524,8 @@ namespace SpineViewer.Controls
private void panel_Render_MouseDown(object sender, MouseEventArgs e) private void panel_Render_MouseDown(object sender, MouseEventArgs e)
{ {
if (renderWindow is null) return;
// 右键优先级高, 进入画面拖动模式, 需要重新记录源点 // 右键优先级高, 进入画面拖动模式, 需要重新记录源点
if ((e.Button & MouseButtons.Right) != 0) if ((e.Button & MouseButtons.Right) != 0)
{ {
@@ -563,8 +605,9 @@ namespace SpineViewer.Controls
private void panel_Render_MouseMove(object sender, MouseEventArgs e) private void panel_Render_MouseMove(object sender, MouseEventArgs e)
{ {
if (draggingSrc is null) if (renderWindow is null) return;
return;
if (draggingSrc is null) return;
var src = (SFML.System.Vector2f)draggingSrc; var src = (SFML.System.Vector2f)draggingSrc;
var dst = renderWindow.MapPixelToCoords(new(e.X, e.Y)); var dst = renderWindow.MapPixelToCoords(new(e.X, e.Y));