using SpineViewer.Spine; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace SpineViewer.Exporter { /// /// 导出器基类 /// public abstract class Exporter(ExportArgs exportArgs) : ImplementationResolver { /// /// 创建指定类型导出器 /// /// 导出类型 /// 匹配的导出参数 /// 匹配的导出器 public static Exporter New(ExportType exportType, ExportArgs exportArgs) => New(exportType, exportArgs); /// /// 导出参数 /// public ExportArgs ExportArgs { get; } = exportArgs; /// /// 可用于文件名的时间戳字符串 /// protected readonly string timestamp = DateTime.Now.ToString("yyMMddHHmmss"); /// /// 获取供渲染的 SFML.Graphics.RenderTexture /// private SFML.Graphics.RenderTexture GetRenderTexture() { var tex = new SFML.Graphics.RenderTexture((uint)ExportArgs.Resolution.Width, (uint)ExportArgs.Resolution.Height); tex.Clear(SFML.Graphics.Color.Transparent); tex.SetView(ExportArgs.View); return tex; } /// /// 获取单个模型的单帧画面 /// protected SFMLImageVideoFrame GetFrame(Spine.Spine spine) { // tex 必须临时创建, 随用随取, 防止出现跨线程的情况 using var tex = GetRenderTexture(); tex.Clear(ExportArgs.BackgroundColor); tex.Draw(spine); tex.Display(); return new(tex.Texture.CopyToImage()); } /// /// 获取模型列表的单帧画面 /// protected SFMLImageVideoFrame GetFrame(Spine.Spine[] spinesToRender) { // tex 必须临时创建, 随用随取, 防止出现跨线程的情况 using var tex = GetRenderTexture(); tex.Clear(ExportArgs.BackgroundColor); foreach (var spine in spinesToRender) tex.Draw(spine); tex.Display(); return new(tex.Texture.CopyToImage()); } /// /// 每个模型在同一个画面进行导出 /// protected abstract void ExportSingle(Spine.Spine[] spinesToRender, BackgroundWorker? worker = null); /// /// 每个模型独立导出 /// protected abstract void ExportIndividual(Spine.Spine[] spinesToRender, BackgroundWorker? worker = null); /// /// 执行导出 /// /// 要进行导出的 Spine 列表 /// 用来执行该函数的 worker public virtual void Export(Spine.Spine[] spines, BackgroundWorker? worker = null) { var spinesToRender = spines.Where(sp => !ExportArgs.RenderSelectedOnly || sp.IsSelected).Reverse().ToArray(); if (ExportArgs.ExportSingle) ExportSingle(spinesToRender, worker); else ExportIndividual(spinesToRender, worker); Program.LogCurrentMemoryUsage(); } } }