延迟运行时属性在第一次调用时初始化
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user