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();
}
}
}