diff --git a/SpineViewer/src/MainForm.Designer.cs b/SpineViewer/src/MainForm.Designer.cs index 4b7474f..e441a49 100644 --- a/SpineViewer/src/MainForm.Designer.cs +++ b/SpineViewer/src/MainForm.Designer.cs @@ -341,8 +341,8 @@ spinePreviewer.Name = "spinePreviewer"; spinePreviewer.PropertyGrid = propertyGrid_Previewer; spinePreviewer.Size = new Size(986, 766); + spinePreviewer.SpineListView = spineListView; spinePreviewer.TabIndex = 0; - spinePreviewer.RenderFrame += spinePreviewer_RenderFrame; // // panel_MainForm // diff --git a/SpineViewer/src/MainForm.cs b/SpineViewer/src/MainForm.cs index e7ca514..8b40d39 100644 --- a/SpineViewer/src/MainForm.cs +++ b/SpineViewer/src/MainForm.cs @@ -61,6 +61,7 @@ namespace SpineViewer Program.Logger.Warn("Warn Test"); Program.Logger.Error("Error Test"); Program.Logger.Fatal("Fatal Test"); + spinePreviewer.StopPreview(); } private void toolStripMenuItem_Exit_Click(object sender, EventArgs e) @@ -70,30 +71,8 @@ namespace SpineViewer #endregion - #region 画面参数 - #endregion - #region 预览画面 - private void spinePreviewer_RenderFrame(object sender, RenderFrameEventArgs e) - { - var target = e.RenderTarget; - var delta = e.Delta; - Spine.Spine[] spines = null; - - // 需要在控件线程拿到数组浅拷贝副本 - if (spineListView.InvokeRequired) - spineListView.Invoke(() => spines = spineListView.Spines.ToArray()); - else - spines = spineListView.Spines.ToArray(); - - foreach (var spine in spines.Reverse()) - { - spine.Update(delta); - target.Draw(spine); - } - } - #endregion #region 杂项 diff --git a/SpineViewer/src/SpinePreviewer.cs b/SpineViewer/src/SpinePreviewer.cs index 46b606c..6fc846b 100644 --- a/SpineViewer/src/SpinePreviewer.cs +++ b/SpineViewer/src/SpinePreviewer.cs @@ -8,6 +8,8 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Security.Policy; +using System.Diagnostics; +using NLog.Targets; namespace SpineViewer { @@ -58,6 +60,9 @@ namespace SpineViewer public bool FlipY { get => previewer.FlipY; set => previewer.FlipY = value; } } + [Category("鑷畾涔"), Description("鐩稿叧鑱旂殑 SpineListView")] + public SpineListView? SpineListView { get; set; } + [Category("鑷畾涔"), Description("鐢ㄤ簬鏄剧ず鐢婚潰灞炴х殑灞炴ч〉")] public PropertyGrid? PropertyGrid { @@ -71,14 +76,33 @@ namespace SpineViewer } private PropertyGrid? propertyGrid; - [Category("鑷畾涔"), Description("甯ф覆鏌撲簨浠")] - public event EventHandler? RenderFrame; - private void OnRenderFrame(float delta) { RenderFrame?.Invoke(this, new(RenderWindow, delta)); } + public const float ZOOM_MAX = 1000f; + public const float ZOOM_MIN = 0.001f; private readonly SFML.Graphics.RenderWindow RenderWindow; private readonly SFML.System.Clock Clock = new(); private readonly SFML.Graphics.Color BackgroundColor = SFML.Graphics.Color.Green; + private SFML.System.Vector2f? draggingSrc = null; + private Spine.Spine? draggingSpine = null; + + 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() { InitializeComponent(); @@ -90,9 +114,6 @@ namespace SpineViewer FlipY = true; } - public const float ZOOM_MAX = 1000f; - public const float ZOOM_MIN = 0.001f; - /// /// 鍒嗚鲸鐜 /// @@ -233,12 +254,18 @@ namespace SpineViewer } } + /// + /// 寮濮嬮瑙 + /// public void StartPreview() { if (!backgroundWorker.IsBusy) backgroundWorker.RunWorkerAsync(); } + /// + /// 鍋滄棰勮 + /// public void StopPreview() { if (backgroundWorker.IsBusy) @@ -275,17 +302,54 @@ namespace SpineViewer private void panel_MouseDown(object sender, MouseEventArgs e) { - + // 鍙抽敭浼樺厛绾ч珮, 杩涘叆鐢婚潰鎷栧姩妯″紡, 闇瑕侀噸鏂拌褰曟簮鐐 + if ((e.Button & MouseButtons.Right) != 0) + { + draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y)); + Cursor = Cursors.Hand; + } + // 鎸変笅浜嗗乏閿苟涓斿彸閿槸鏉惧紑鐨 + else if ((e.Button & MouseButtons.Left) != 0 && (MouseButtons & MouseButtons.Right) == 0) + { + draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y)); + } } private void panel_MouseMove(object sender, MouseEventArgs e) { + if (draggingSrc is null) + return; + var src = (SFML.System.Vector2f)draggingSrc; + var dst = RenderWindow.MapPixelToCoords(new(e.X, e.Y)); + var delta = dst - src; + + if ((e.Button & MouseButtons.Right) != 0) + { + Center -= new SizeF(delta.X, delta.Y); + } + else if ((e.Button & MouseButtons.Left) != 0) + { + // TODO: 绉诲姩 Spine + } } private void panel_MouseUp(object sender, MouseEventArgs e) { - + // 鍙抽敭楂樹紭鍏堢骇, 缁撴潫鐢婚潰鎷栧姩妯″紡 + if ((e.Button & MouseButtons.Right) != 0) + { + draggingSrc = null; + draggingSpine = null; + Cursor = Cursors.Default; + PropertyGrid?.Refresh(); + } + // 鎸変笅浜嗗乏閿苟涓斿彸閿槸鏉惧紑鐨 + else if ((e.Button & MouseButtons.Left) != 0 && (MouseButtons & MouseButtons.Right) == 0) + { + draggingSrc = null; + draggingSpine = null; + } } private void panel_MouseWheel(object sender, MouseEventArgs e) @@ -297,16 +361,22 @@ namespace SpineViewer private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { RenderWindow.SetActive(true); + float delta = 0; while (!backgroundWorker.CancellationPending) { - var delta = Clock.ElapsedTime.AsSeconds(); + delta = Clock.ElapsedTime.AsSeconds(); Clock.Restart(); // TODO: 缁樺埗缃戞牸绾 RenderWindow.Clear(BackgroundColor); - OnRenderFrame(delta); + foreach (var spine in Spines.Reverse()) + { + spine.Update(delta); + RenderWindow.Draw(spine); + } + RenderWindow.Display(); } @@ -314,25 +384,4 @@ namespace SpineViewer } } - /// - /// RenderFrame 浜嬩欢鍙傛暟 - /// - public class RenderFrameEventArgs : EventArgs - { - /// - /// 娓叉煋鐩爣 - /// - public SFML.Graphics.RenderTarget RenderTarget { get; } - - /// - /// 璺濈涓婁竴甯х粡杩囩殑鏃堕棿, 鍗曚綅绉 - /// - public float Delta { get; } - - public RenderFrameEventArgs(SFML.Graphics.RenderTarget renderTarget, float delta) - { - RenderTarget = renderTarget; - Delta = delta; - } - } }