开始停止预览改成同步等待
This commit is contained in:
7
SpineViewer/src/SpinePreviewer.Designer.cs
generated
7
SpineViewer/src/SpinePreviewer.Designer.cs
generated
@@ -29,7 +29,6 @@
|
|||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
panel = new Panel();
|
panel = new Panel();
|
||||||
backgroundWorker = new System.ComponentModel.BackgroundWorker();
|
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// panel
|
// panel
|
||||||
@@ -45,11 +44,6 @@
|
|||||||
panel.MouseUp += panel_MouseUp;
|
panel.MouseUp += panel_MouseUp;
|
||||||
panel.MouseWheel += panel_MouseWheel;
|
panel.MouseWheel += panel_MouseWheel;
|
||||||
//
|
//
|
||||||
// backgroundWorker
|
|
||||||
//
|
|
||||||
backgroundWorker.WorkerSupportsCancellation = true;
|
|
||||||
backgroundWorker.DoWork += backgroundWorker_DoWork;
|
|
||||||
//
|
|
||||||
// SpinePreviewer
|
// SpinePreviewer
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(11F, 24F);
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
@@ -65,6 +59,5 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private Panel panel;
|
private Panel panel;
|
||||||
private System.ComponentModel.BackgroundWorker backgroundWorker;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ namespace SpineViewer
|
|||||||
private static readonly SFML.Graphics.Color AxisColor = SFML.Graphics.Color.Red;
|
private static readonly SFML.Graphics.Color AxisColor = SFML.Graphics.Color.Red;
|
||||||
|
|
||||||
private readonly SFML.Graphics.RectangleShape BackgroundCell = new() { FillColor = new(220, 220, 220) };
|
private readonly SFML.Graphics.RectangleShape BackgroundCell = new() { FillColor = new(220, 220, 220) };
|
||||||
private readonly SFML.Graphics.VertexArray XAxisVertex = new (SFML.Graphics.PrimitiveType.Lines, 2);
|
private readonly SFML.Graphics.VertexArray XAxisVertex = new(SFML.Graphics.PrimitiveType.Lines, 2);
|
||||||
private readonly SFML.Graphics.VertexArray YAxisVertex = new(SFML.Graphics.PrimitiveType.Lines, 2);
|
private readonly SFML.Graphics.VertexArray YAxisVertex = new(SFML.Graphics.PrimitiveType.Lines, 2);
|
||||||
|
|
||||||
private readonly SFML.Graphics.RenderWindow RenderWindow;
|
private readonly SFML.Graphics.RenderWindow RenderWindow;
|
||||||
@@ -92,25 +92,8 @@ namespace SpineViewer
|
|||||||
private SFML.System.Vector2f? draggingSrc = null;
|
private SFML.System.Vector2f? draggingSrc = null;
|
||||||
private Spine.Spine? draggingSpine = null;
|
private Spine.Spine? draggingSpine = null;
|
||||||
|
|
||||||
/// <summary>
|
private Task? task = null;
|
||||||
/// 安全获取 Spine 列表
|
private CancellationTokenSource? cancelToken = null;
|
||||||
/// </summary>
|
|
||||||
private Spine.Spine[] Spines
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (SpineListView is null)
|
|
||||||
return [];
|
|
||||||
|
|
||||||
// 需要在控件线程拿到数组浅拷贝副本
|
|
||||||
Spine.Spine[] spines = null;
|
|
||||||
if (SpineListView.InvokeRequired)
|
|
||||||
SpineListView.Invoke(() => spines = SpineListView.Spines.ToArray());
|
|
||||||
else
|
|
||||||
spines = SpineListView.Spines.ToArray();
|
|
||||||
return spines;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SpinePreviewer()
|
public SpinePreviewer()
|
||||||
{
|
{
|
||||||
@@ -273,8 +256,10 @@ namespace SpineViewer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void StartPreview()
|
public void StartPreview()
|
||||||
{
|
{
|
||||||
if (!backgroundWorker.IsBusy)
|
if (task is not null)
|
||||||
backgroundWorker.RunWorkerAsync();
|
return;
|
||||||
|
cancelToken = new();
|
||||||
|
task = Task.Run(RenderTask, cancelToken.Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -282,8 +267,12 @@ namespace SpineViewer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void StopPreview()
|
public void StopPreview()
|
||||||
{
|
{
|
||||||
if (backgroundWorker.IsBusy)
|
if (task is null || cancelToken is null)
|
||||||
backgroundWorker.CancelAsync();
|
return;
|
||||||
|
cancelToken.Cancel();
|
||||||
|
task.Wait();
|
||||||
|
cancelToken = null;
|
||||||
|
task = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SpinePreviewer_SizeChanged(object sender, EventArgs e)
|
private void SpinePreviewer_SizeChanged(object sender, EventArgs e)
|
||||||
@@ -328,12 +317,16 @@ namespace SpineViewer
|
|||||||
{
|
{
|
||||||
draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y));
|
draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y));
|
||||||
var src = new PointF(((SFML.System.Vector2f)draggingSrc).X, ((SFML.System.Vector2f)draggingSrc).Y);
|
var src = new PointF(((SFML.System.Vector2f)draggingSrc).X, ((SFML.System.Vector2f)draggingSrc).Y);
|
||||||
foreach (var spine in Spines)
|
|
||||||
|
if (SpineListView is not null)
|
||||||
{
|
{
|
||||||
if (spine.Bounds.Contains(src))
|
foreach (var spine in SpineListView.Spines)
|
||||||
{
|
{
|
||||||
draggingSpine = spine;
|
if (spine.Bounds.Contains(src))
|
||||||
break;
|
{
|
||||||
|
draggingSpine = spine;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,35 +427,42 @@ namespace SpineViewer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
|
private void RenderTask()
|
||||||
{
|
{
|
||||||
RenderWindow.SetActive(true);
|
try
|
||||||
float delta;
|
|
||||||
|
|
||||||
while (!backgroundWorker.CancellationPending)
|
|
||||||
{
|
{
|
||||||
delta = Clock.ElapsedTime.AsSeconds();
|
RenderWindow.SetActive(true);
|
||||||
Clock.Restart();
|
|
||||||
|
|
||||||
RenderWindow.Clear(BackgroundColor);
|
float delta;
|
||||||
|
while (cancelToken is not null && !cancelToken.IsCancellationRequested)
|
||||||
// 渲染背景网格
|
|
||||||
DrawBackground();
|
|
||||||
|
|
||||||
|
|
||||||
// 渲染 Spine
|
|
||||||
foreach (var spine in Spines.Reverse())
|
|
||||||
{
|
{
|
||||||
spine.Update(delta);
|
delta = Clock.ElapsedTime.AsSeconds();
|
||||||
RenderWindow.Draw(spine);
|
Clock.Restart();
|
||||||
|
|
||||||
|
RenderWindow.Clear(BackgroundColor);
|
||||||
|
|
||||||
|
// 渲染背景网格
|
||||||
|
DrawBackground();
|
||||||
|
|
||||||
|
// 渲染 Spine
|
||||||
|
if (SpineListView is not null)
|
||||||
|
{
|
||||||
|
foreach (var spine in SpineListView.Spines.Reverse())
|
||||||
|
{
|
||||||
|
spine.Update(delta);
|
||||||
|
RenderWindow.Draw(spine);
|
||||||
|
// TODO: 渲染包围盒
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderWindow.Display();
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderWindow.Display();
|
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
RenderWindow.SetActive(false);
|
{
|
||||||
|
RenderWindow.SetActive(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,4 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<metadata name="backgroundWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</metadata>
|
|
||||||
</root>
|
</root>
|
||||||
Reference in New Issue
Block a user