导出数据转spine

This commit is contained in:
tianmo
2026-09-07 21:29:15 +08:00
parent d258d4f435
commit 3a7c0b4092
65 changed files with 6000 additions and 0 deletions
+146
View File
@@ -0,0 +1,146 @@
# 产品需求
## 1. 产品目标
DateToSpine 帮助用户批量处理仅保留运行时导出文件、但缺失原始 `.spine` 工程的资源。软件需要在转换前验证资源并显示可交互动画预览,用户确认后才调用本地 Spine Editor 生成可编辑工程。
产品目标是“尽可能恢复可编辑工程”,不是承诺字节级还原原工程。运行时导出时已经丢失的数据无法凭空恢复。
## 2. 用户前提
- 用户对待处理资源拥有合法使用和转换权限。
- 用户电脑已安装并激活 Spine Editor。
- 需要生成 `.spine` 时,本地已有与资源主/次版本相匹配的 Editor 版本。
- 未安装 Editor 时,软件仍可扫描、校验、配对和预览,但不能生成 `.spine`
## 3. 支持范围
### 3.1 骨骼数据
| 格式 | 支持状态 | 说明 |
|---|---|---|
| `.json` | 正式支持 | 必须通过 Spine schema 识别,不能把普通 JSON 当作骨骼数据 |
| `.skel` | 正式支持 | 按导出版本选择匹配 Runtime 和 Editor |
| `.skel.bytes` | 候选兼容 | 通过内容识别,扩展名支持在技术原型后决定 |
### 3.2 Spine 版本
| 版本 | 支持级别 |
|---|---|
| 3.8.20+ | 正式支持 |
| 3.8.0—3.8.19 | 尽力识别,不作正式保证 |
| 4.0.x | 正式支持 |
| 4.1.x | 正式支持 |
| 4.2.x | 正式支持 |
| 4.3.x | 正式支持 |
| 3.7.x 及更早 | 不支持 |
### 3.3 Atlas 与纹理页
- `.atlas``.atlas.txt`
- 单页和多页 Atlas
- PNG
- JPG/JPEG
- WebP
- 同一 Atlas 中不同扩展名的多页纹理
- Straight Alpha 和 Premultiplied Alpha
其他图片格式通过可扩展解码接口保留未来支持空间,但不属于首版承诺。
## 4. 主用户流程
主界面只暴露四个动作:
1. 用户把完整导出资源或资源文件夹拖入窗口。
2. 软件自动配对并显示预览;有多套资源时用顶部下拉框切换。
3. 用户用底部下拉框切换动画。
4. 用户点击“一键转换为 .spine”并选择保存位置。
版本检测、Atlas 配对、图片处理、Editor 验证和结果校验均在后台自动完成。只有自动找不到 Spine Editor 时,才要求用户指定 Spine 应用或可执行文件路径。普通流程不提供 Editor 管理页或技术参数面板。
## 5. 功能需求
### 5.1 扫描与配对
- 支持文件、文件夹和批量拖放。
- 支持递归扫描,允许配置最大深度。
- 根据 Atlas 中声明的页面名查找纹理,不能只依赖同名前缀。
- 根据附件 path、文件名、目录距离和名称前缀对数据与 Atlas 评分。
- 自动结果必须显示置信度。
- 歧义配对必须由用户确认,不能静默选择。
- 单个失败组不能终止整个批次。
### 5.2 预览
- 默认循环播放,支持动画切换。
- 画布自动适应窗口。
- 支持 Mesh、权重、Clipping、双颜色 Tint 和四种混合模式。
- 显示缺失纹理、版本错误和 Runtime 加载错误。
### 5.3 Editor 管理
- 自动查找常见安装位置。
- 自动查找失败时才显示路径选择器,支持自定义应用、可执行文件或安装目录。
- 支持一个安装入口对应多个本地可用版本。
- 转换前执行实际版本探测。
- 不读取、存储或传输 Spine 激活码。
### 5.4 批量转换
- 默认串行调用 Spine Editor,扫描和静态校验可并行。
- 支持停止等待中的任务和取消当前子进程。
- 支持跳过、自动重命名和覆盖策略。
- 默认不覆盖输入文件。
- 正式结果验证通过前只写入任务临时目录。
- 每组资源产生可读日志和机器可读报告。
## 6. 恢复能力边界
通常可恢复:骨骼、Slots、Skins、Attachments、约束、动画、Deform、事件和绘制顺序。
如果源文件导出时未启用 Nonessential data,可能永久缺失:
- 骨骼颜色和图标
- Mesh 手工边
- 编辑器辅助信息
- 部分附件原始尺寸
- 原工程图片和音频目录设置
- 编辑器视图与工作区状态
报告必须区分:
- 完整恢复
- 主体恢复但缺少 Nonessential data
- 工程生成成功但图片关联需要注意
- 转换失败
## 7. 非功能需求
- macOS 和 Windows 功能一致。
- 运行时完全离线,不依赖 CDN 或在线服务。
- 支持中文、空格、Unicode 和较长路径。
- 所有外部进程使用参数数组启动,不能拼接 shell 命令。
- 崩溃或取消不能留下半成品覆盖正式结果。
- 日志不能包含用户授权信息或不必要的绝对路径。
- 普通操作错误必须以用户可理解的语言呈现。
## 8. 首版不包含
- Spine 3.7 及更早版本。
- 绕过 Spine Editor 授权或下载 Editor。
- 自行生成或逆向写入 `.spine` 格式。
- 动画编辑功能。
- 云端转换、资源上传或账号系统。
- 将官方示例资产打包给最终用户。
## 9. 产品验收标准
- 五个目标版本均可完成 JSON、SKEL 的预览和转换测试。
- 断网环境可完成已准备版本的完整流程。
- PNG、JPG/JPEG、WebP 页面可预览。
- 纹理只允许使用匹配版本 Spine Editor 的官方 Texture Unpacker 解包。
- 生成物能被匹配版本 Editor 重新读取。
- 骨骼、Skin、附件、动画和事件数量通过语义核对。
- 原始输入不被修改。
- 单任务失败不影响批次其他任务。
- 最终安装包不含官方测试资源和 Spine Editor。
+217
View File
@@ -0,0 +1,217 @@
# 系统架构
## 1. 技术基线
| 项目 | 选择 |
|---|---|
| 语言 | C++20(第三方 Runtime target 可使用其原生标准) |
| UI | Qt 6 Widgets |
| 预览画布 | `QOpenGLWidget` + 自研批次渲染器 |
| 构建 | CMake 3.25+、CMake Presets |
| Windows 编译器 | Visual Studio 2022 / MSVC v143 |
| macOS 编译器 | Apple Clang |
| 进程管理 | `QProcess` |
| 设置存储 | `QSettings` |
| JSON | Qt JSON |
| 图片加载 | Qt Image plugins,随程序离线部署 |
| 测试 | Qt Test 或 Catch2,原型结束时二选一 |
CMake 只用于开发构建,不是最终用户的运行依赖。Windows 可以使用 Visual Studio Generator 或 Ninja + MSVC。
## 2. 分层结构
```text
UI
├─ 资源组表格
├─ 预览与播放控制
├─ Editor 管理
└─ 任务、日志与报告
Application Services
├─ ScanService
├─ PreviewService
├─ EditorRegistry
├─ RecoveryCoordinator
└─ ReportService
Domain
├─ AssetGroup
├─ SpineVersion
├─ EditorInstallation
├─ RecoveryJob
└─ RecoveryResult
Infrastructure
├─ Filesystem / Process
├─ Runtime Plugin Host
├─ Spine CLI Adapter
├─ Atlas Unpackers
└─ Output Publisher
```
UI 只表达状态和用户意图,不能直接调用 Spine CLI 或解析 Atlas。
## 3. 建议目录
```text
DateToSpine/
CMakeLists.txt
CMakePresets.json
cmake/
docs/
licenses/
resources/
icons/
shaders/
translations/
src/
app/
domain/
scan/
atlas/
editor/
preview/
recovery/
report/
platform/
macos/
windows/
ui/
util/
runtime-api/
runtime-plugins/
spine38/
spine40/
spine41/
spine42/
spine43/
third_party/
spine-runtimes/
licenses/
tests/
unit/
integration/
compatibility/
manifests/
fixtures/
generated/
external/
packaging/
macos/
windows/
```
`tests/fixtures/external/` 用于本地准备的官方测试资源,不进入发行包。
## 4. 多版本 Runtime 隔离
五套 Runtime 不能直接链接进同一个主程序命名空间。每个版本编译成独立动态模块,并隐藏所有上游 C++ 符号,只导出稳定的 DateToSpine C ABI。
```text
dts-runtime-3_8
dts-runtime-4_0
dts-runtime-4_1
dts-runtime-4_2
dts-runtime-4_3
```
公共 ABI 只允许:
- 固定宽度整数
- POD 结构体
- UTF-8 字节串
- 不透明句柄
- 显式长度的数组
- 函数指针回调
禁止跨模块传递 Qt 对象、STL 容器、异常或 Spine Runtime 类。
每个适配模块承担:
- 对应版本 JSON/SKEL 读取
- Atlas 绑定
- 动画状态推进
- Skin/Animation 查询和切换
- 把绘制结果转换为统一顶点、索引和 draw command
- 把上游错误转换为统一错误码
## 5. 预览渲染边界
Runtime 插件负责骨骼计算和裁剪;主程序渲染器负责:
- 纹理创建和缓存
- 顶点/索引上传
- Shader
- Blend mode
- 相机、背景和调试覆盖层
- DPI 和窗口生命周期
Runtime 不直接创建 Qt 或 OpenGL 对象。这使 Runtime 适配可独立测试,也避免上下文所有权问题。
## 6. Spine CLI 边界
所有 Editor 调用必须经过 `ISpineCli`
```text
probe installation
probe version
import data
export normalized json
unpack atlas
inspect project
```
实现要求:
- 使用 `QProcess::setProgram``setArguments`
- 不经过 shell。
- 每次调用有超时、取消令牌、工作目录和独立日志。
- 只终止本软件启动的子进程。
- 对 Windows 优先选择 `Spine.com`
- 对 macOS 把 `.app` 规范化为内部可执行文件。
## 7. 任务并发
- 扫描、哈希、图片头校验可以在线程池执行。
- OpenGL 资源操作只在所属渲染线程执行。
- Spine Editor 调用默认全局串行。
- Spine 官方 Atlas 解包与工程导入全局串行,并受任务取消状态约束。
- 每个恢复任务有独立临时目录和取消状态。
## 8. 文件长度和复杂度约束
自研代码执行以下软上限,超过时必须在评审中说明或拆分:
| 文件类型 | 建议上限 |
|---|---:|
| 头文件 | 200 行 |
| 普通 `.cpp` | 350 行 |
| UI `.cpp` | 450 行 |
| 单元测试文件 | 500 行 |
同时执行:
- 一个类只有一个主要职责。
- `MainWindow` 不包含解析、转换和进程逻辑。
- 禁止无边界的 `Utils` 类。
- 平台代码不得散落到业务模块。
- 版本差异留在 Runtime adapter 和 version policy 中。
- 第三方上游源码保持原样,位于 `third_party/`,不纳入自研文件行数限制。
CI 将检查自研源文件行数、循环依赖和禁止目录引用。
## 9. 可测试性
核心依赖使用小接口注入:
```text
IFileSystem
IProcessRunner
ISpineCli
IRuntimePlugin
IAtlasUnpacker
IClock
IReportSink
```
单元测试不启动真实 Editor;集成和兼容测试才调用本地 Spine Editor。
@@ -0,0 +1,193 @@
# 版本识别与 Spine Editor 检测
## 1. 目标
在用户确认转换前,软件必须回答:
1. 资源由哪个 Spine 主/次版本导出?
2. 本机是否有可以处理该版本的 Spine Editor
3. 配置路径是否指向可用的 Spine CLI?
4. 在断网状态下,该版本是否能实际启动和导入?
路径存在不等于 Editor 可用。当前实现先读取本机 Spine 更新缓存,只把已经存在的精确版本视为可转换;转换时再次执行同一门禁。
## 2. 资源版本识别
### 2.1 JSON
读取 `skeleton.spine` 字段,并同时验证最小 Spine schema
- 根对象
- `bones` 数组
- 可选 `slots``skins``animations`
- 版本字段格式
只解析识别所需的小范围数据。无 Spine schema 的业务 JSON 必须忽略。
### 2.2 SKEL
识别顺序:
1. 对二进制头执行有界读取,尝试提取 hash 和版本字符串。
2. 用候选版本 Runtime 插件执行只读探测。
3. 必要时用已配置 Editor 的 info 命令验证。
4. 多个版本都失败则要求用户选择版本,并标记为未确认。
解析必须限制字符串长度、数组大小和文件大小,损坏文件不能导致无限分配。
## 3. Editor 数据模型
```text
EditorInstallation
id
displayName
platform
userSelectedPath
canonicalExecutable
discoverySource
lastVerifiedAt
baseVersion
signatureStatus
capabilities[]
EditorCapability
versionLine // 3.8, 4.0, 4.1, 4.2, 4.3
launchSelector // 可选 -u 参数或独立 executable
status
lastProbeResult
```
同一个安装入口可以声明多个本地版本能力;多个安装入口也可以映射到同一版本。用户可为每个版本选择首选项。
## 4. 自动发现
### 4.1 macOS
优先位置:
```text
/Applications/Spine.app
~/Applications/Spine.app
```
补充来源:
- 系统应用索引
- 当前会话已知应用路径
- 历史用户配置
用户选择 `.app` 时规范化为:
```text
Spine.app/Contents/MacOS/Spine
```
不递归扫描整个磁盘。
### 4.2 Windows
发现来源:
- HKLM/HKCU 安装与卸载注册信息
- `Program Files``Program Files (x86)` 常见位置
- `PATH`
- 开始菜单快捷方式目标
- 历史用户配置
CLI 优先选择 `Spine.com`。如果用户选择 `Spine.exe`,查找同目录同名 `.com`;找不到时允许保存,但状态为“GUI 路径,CLI 待验证”。
## 5. 自定义路径
用户可选择:
- macOS `.app`
- 内部 Spine 可执行文件
- Windows `Spine.com``Spine.exe`
- 包含上述文件的目录
保存前执行路径规范化:
- 解析相对路径
- 清理多余分隔符
- 保留用户显示路径
- 保存 canonical path
- 记录文件标识和修改时间,用于发现安装被替换
路径移动或升级后,不自动删除旧配置,而是标记失效并允许重新定位。
## 6. 验证步骤
### 6.1 静态验证
- 文件存在且不是目录。
- 当前用户可执行。
- macOS bundle 结构或 Windows 同目录文件合理。
- 可选检查平台签名;旧版签名异常只警告,不直接否定合法安装。
### 6.2 基础进程验证
使用参数数组执行 `--version`,捕获:
- 退出码
- 标准输出和错误输出
- 启动耗时
- 报告版本
设置短超时,只终止该次探测进程。
### 6.3 版本能力验证
对用户配置的目标版本执行实际启动探测。若使用 `-u <version>` 选择器:
- 只允许已确认在本地缓存中存在的精确版本,例如资源线为 4.3 时选择本地最新的 `4.3.23`
- 不使用 `--force`
- 不使用 `latest``stable``beta``x.x.xx` 版本选择器。
- 不由 DateToSpine 发起下载。
- 缓存缺失时不启动 Spine Launcher,直接报告“本地未缓存目标版本”,从源头避免 Launcher 下载。
- 启动进程前再次检查精确缓存文件,避免检测后被移动导致意外联网。
当前 macOS 检查 `~/Library/Application Support/Spine/updates`Windows 检查 `%APPDATA%/Spine/updates``%LOCALAPPDATA%/Spine/updates`。后续若 Spine 改变缓存结构,需要同步更新并重新做断网回归。
### 6.4 导入冒烟测试
在用户点击“深度验证”或首次转换前,可在临时目录执行小型导入:
- 输入与版本匹配的最小测试数据。
- 输出到临时目录。
- 验证退出码和 `.spine` 可再次读取。
- 完成立即清理临时结果。
发行版不能使用未获再分发确认的官方测试资产作为内置冒烟样本;需要自有最小样本或仅对用户当前资源执行验证。
## 7. 状态与用户提示
```text
Available
PathMissing
NotExecutable
NotSpine
CliCompanionMissing
VersionMismatch
VersionNotPrepared
NotActivated
ProbeTimedOut
PermissionDenied
LaunchFailed
Unknown
```
每个状态需要:
- 用户可读说明
- 技术详情
- 可执行的修复建议
- 是否允许预览
- 是否允许转换
资源全部载入后,主界面顶部直接显示当前资源的结果,例如“可转换 · Spine 4.3.23”或“缺少 Spine 4.1”。自动检测失败时,转换按钮才变为“指定 Spine 路径”。
## 8. 离线要求
DateToSpine 本身不联网。完整转换成立的前提是对应 Editor 版本已经在本机准备好并能在断网时运行。
离线验收必须在网络被禁用的独立测试环境进行,不能只通过代码审查推断。
+186
View File
@@ -0,0 +1,186 @@
# 恢复流水线
## 1. 状态机
```text
Discovered
→ Grouped
→ PreflightPassed
→ PreviewReady
→ UserConfirmed
→ EditorVerified
→ AtlasUnpacked
→ ProjectImported
→ ProjectVerified
→ Published
```
任一步骤失败进入 `Failed(stage, code, details)`。取消进入 `Cancelled`。失败与取消不能发布半成品。
## 2. 资源组
一个 `AssetGroup` 包含:
```text
id
skeletonDataPath
skeletonFormat
detectedVersion
atlasPath
atlasPages[]
candidateScore
scale
alphaMode
warnings[]
```
Atlas 页面名是纹理配对的权威来源。文件前缀只作为寻找数据与 Atlas 关系的辅助信号。
## 3. 预检
转换前检查:
- 数据格式和版本
- 版本是否在支持范围
- Atlas 基础语法
- 所有页面是否存在
- 图片解码和尺寸
- Atlas scale/PMA
- 输出命名冲突
- 目标 Editor 可用性
- 临时目录和输出目录可写性
- 磁盘空间粗略估计
预检不修改输入。
## 4. 用户确认边界
预览阶段不得生成正式 `.spine`。允许的临时操作仅包括:
- Runtime 加载
- 图片解码
- 静态校验
- Editor 只读版本探测
只有用户点击“开始转换”后,才能调用导入和解包命令。
## 5. 临时工作区
```text
job-<uuid>/
source-links/
normalized/
unpacked-images/
intermediate/
logs/
publish/
```
- 优先使用复制或只读访问,不能修改源文件。
- 是否允许安全硬链接作为优化,在跨平台验证后决定。
- 每个任务独立,名称使用内部 UUID,避免用户文件名注入路径。
## 6. Atlas 解包
1. 只调用匹配版本 Spine Editor 的官方 Texture Unpacker。
2. 校验页面、region 数量、输出尺寸和文件存在性。
3. 官方失败或验证失败时终止任务并显示原因,不使用其他解包实现。
4. 原始 `.atlas` 和打包纹理页只作为只读输入,不复制到最终结果。
5. 工程导入必须读取 Atlas 的 `scale` 并使用 `-s <数值>`,使骨骼与官方解包图片采用相同打包比例。
详细规则见 `06-图集解包设计.md`
## 7. JSON 输入工程生成
1. 复制 JSON 到临时目录。
2. 保留所有未知字段。
3. 仅在必要时更新临时副本中的 `skeleton.images` 相对路径。
4. 使用匹配主/次版本的 Editor 导入。
5. 输出临时 `.spine`
6. 使用 Editor info 或再次导出执行语义验证。
禁止修改源 JSON。
## 8. SKEL 输入工程生成
SKEL 的图片路径自动关联是技术原型重点。候选官方流程:
1. 匹配版本 Editor 把 SKEL 导入临时 `.spine`
2. Editor 从临时工程导出规范化 JSON。
3. 在规范化 JSON 临时副本中设置 `skeleton.images`
4. 匹配版本 Editor 再导入为最终候选 `.spine`
5. 比较初次导入、规范化 JSON 和最终工程的语义计数。
此流程避免自行解析并序列化全部 SKEL,也避免修改未公开的 `.spine` 格式。
原型必须验证:
- 默认 JSON 导出是否保留全部运行时语义。
- 动画曲线、Deform、Linked Mesh、约束和事件是否无损。
- 图片相对路径是否被最终 `.spine` 保存。
- 3.8—4.3 是否行为一致。
若某版本失败,保留“工程 + images 目录 + 首次打开路径提示”作为降级方案,但正式自动化验收前必须由产品方确认是否接受。
## 9. Scale 与 Alpha
- Atlas 显式 `scale` 优先。
- 数据和 Atlas 都没有足够信息时,不猜测为确定值。
- 可提供 1、0.5、0.25 等候选并让用户预览比较。
- 用户可通过底部“去除预乘 Alpha”开关决定是否将解包图片转换为 Straight Alpha。
- 为保证各版本行为一致,官方解包使用临时 Atlas 副本并关闭其自动去预乘;开关开启后由本地像素处理统一完成转换。
- 临时 Atlas 不修改源文件,也不进入最终结果。
## 10. 结果验证
### 10.1 文件级
- `.spine` 存在且非空。
- 所有预期图片存在且可解码。
- 输出路径不逃逸目标目录。
- 临时文件未混入正式结果。
### 10.2 语义级
至少比较:
- 骨骼数和名称
- Slot 数和名称
- Skin 数和名称
- Attachment 类型与数量
- 约束类型与数量
- Animation 名称、数量和时长
- Event 名称和数量
- Deform timeline 存在性
Nonessential 缺失作为恢复等级,不作为运行时语义失败。
### 10.3 可读性
- 使用匹配 Editor 重新读取生成项目。
- 捕获所有 warning/error。
- 版本不匹配警告视为失败,除非用户启用实验模式。
## 11. 原子发布
验证通过后:
1. 在输出目录同一文件系统创建候选目录。
2. 应用重名策略。
3. 一次性重命名为正式结果。
4. 覆盖时先备份或移入可恢复位置。
5. 发布失败保留诊断,但不留下伪成功目录。
## 12. 输出结构
```text
Output/
hero/
hero.spine
images/
body.png
face/
eye.png
```
当前简化产品不输出原始 Atlas、打包纹理页、日志或恢复报告。发生错误时直接弹窗给出失败阶段和 Spine 输出摘要;成功时弹窗显示完整输出目录。
+156
View File
@@ -0,0 +1,156 @@
# 离线预览器
## 1. 目标
预览器在不调用 Spine Editor、不开启网络的情况下直接读取:
```text
.json/.skel + .atlas/.atlas.txt + texture pages
```
用户通过预览确认资源配对、版本、Scale、Alpha、动画和 Skin 后,才进入转换。
## 2. Runtime 版本矩阵
| 数据 | Runtime 插件 |
|---|---|
| 3.8.20+ | `dts-runtime-3_8` |
| 4.0.x | `dts-runtime-4_0` |
| 4.1.x | `dts-runtime-4_1` |
| 4.2.x | `dts-runtime-4_2` |
| 4.3.x | `dts-runtime-4_3` |
每个插件基于官方仓库对应分支的 `spine-cpp`。Runtime 与数据主/次版本必须一致。
## 3. 公共插件 ABI
公共 API 使用版本号和结构体大小实现向前兼容:
```text
dtsRuntimeGetApiVersion
dtsRuntimeCreate
dtsRuntimeDestroy
dtsRuntimeLoad
dtsRuntimeGetMetadata
dtsRuntimeGetAnimations
dtsRuntimeGetSkins
dtsRuntimeSetAnimation
dtsRuntimeSetSkin
dtsRuntimeSeek
dtsRuntimeUpdate
dtsRuntimeBuildFrame
dtsRuntimeGetLastError
```
设计规则:
- 调用方提供结构体 `size`
- 插件返回的内存由插件释放。
- 错误不能以 C++ 异常越过 ABI。
- 所有字符串为 UTF-8,并带长度。
- 插件的所有上游符号默认隐藏。
- 主程序校验插件文件和 ABI 版本后才加载。
## 4. 统一绘制数据
插件输出与 Runtime 版本无关的 draw list
```text
PreviewFrame
bounds
vertices[]
indices[]
commands[]
DrawCommand
textureHandle
firstIndex
indexCount
blendMode
premultipliedAlpha
```
顶点至少包含:
- position
- uv
- light color
- dark color
Clipping 优先在对应 Runtime/adapter 中完成,使主渲染器只处理最终三角形。
## 5. 纹理加载
主程序实现统一 Texture Provider
- 根据 Atlas 页面路径读取本地文件。
- 拒绝 HTTP/HTTPS 和 data URL。
- 规范化相对路径并阻止目录逃逸。
- 支持 PNG、JPG/JPEG、WebP。
- 保留源 Alpha 模式元数据。
- 缓存按 canonical path、修改时间和文件大小失效。
图片解码插件必须随安装包部署,不能在运行时下载。
## 6. 渲染功能
首版必须支持:
- Region 和 Mesh
- Weighted Mesh、Linked Mesh
- Clipping
- Normal、Additive、Multiply、Screen
- 单颜色和 Two Color Tint
- PMA 和 Straight Alpha
- 多页 Atlas
- 高 DPI
- 骨骼、Mesh、边界、裁剪调试层
Shader 作为本地资源随程序部署,并在构建期或启动期从本地加载。
## 7. 播放状态
每个预览会话保存:
```text
selectedAnimation
selectedSkin
loop
playbackSpeed
time
paused
camera
background
debugFlags
```
切换资源组时保留各组会话,避免用户往返查看时丢失位置。
Seek 需要确定性:先恢复 setup pose,再从动画起点应用到目标时间,不能依赖累积浮点步进得到任意帧。
## 8. 错误隔离
首版采用动态插件;技术原型评估损坏 SKEL 是否可能使上游 Runtime 崩溃。如果无法通过输入边界检查和测试降低风险,发布版改为每个版本一个 helper process
```text
UI ↔ local IPC ↔ preview-worker-4_2
```
是否进程隔离由原型的崩溃与模糊测试结果决定,不在未验证前锁死。
## 9. 性能目标
- 普通单骨骼资源首次预览在本地 SSD 上目标小于 1 秒。
- 预览默认 60 FPS;窗口不可见时暂停刷新。
- 大资源限制最大纹理尺寸、顶点数、附件数和单帧命令数。
- 纹理解码在线程池执行,OpenGL 创建在渲染线程执行。
- 切换动画不重复加载 Atlas 纹理。
## 10. 预览验收
- 五个版本官方示例的选定动画与官方参考视觉一致。
- 动画名、Skin 名和时长与 Runtime 数据一致。
- PMA/Straight Alpha 无明显黑边或白边。
- Mesh、Clipping、双颜色 Tint 和混合模式分别有测试样本。
- 缺失纹理不会导致崩溃,并能在画布上定位缺失项。
- 拔网后所有预览功能保持可用。
+67
View File
@@ -0,0 +1,67 @@
# Atlas 官方解包设计
## 1. 唯一实现
纹理恢复只调用用户本机、已授权且与数据版本匹配的 Spine Editor Texture Unpacker。项目不实现 Atlas 裁切、旋转、透明边恢复或图片重采样,也不存在自研兼容解包路径。
```text
本地匹配版本 Spine Texture Unpacker
输出校验
失败并向用户显示具体原因
```
官方解包失败、输出缺失或校验失败时,任务直接失败,不尝试以另一套图片算法生成看似成功的结果。
## 2. 官方调用
```text
Spine -u <本地精确缓存版本>
-i <Atlas 纹理页目录>
-o <临时 images 目录>
-c <Atlas 文件>
```
- 只允许精确的本地缓存版本,禁止 `latest`、通配版本和强制下载参数。
- 原始 Atlas 与纹理页保持只读。
- 输出先写入任务临时目录,验证成功后再发布。
- 记录退出码与进程输出;成功退出后仍检查是否实际生成图片。
- 最终结果不复制原始 `.atlas` 和打包纹理页。
## 3. PMA 处理
PMA 转换同样交给官方 Texture Unpacker
- 开启“去除预乘 Alpha”时,原样传入源 Atlas,由 Spine 根据 `pma: true` 执行官方转换。
- 关闭时,仅建立临时 Atlas 元数据副本并把 `pma: true` 改为 `pma: false`,使官方解包器保留打包像素。
- 不再由 Qt 解码、逐像素处理或重新保存解包图片,避免 JPEG/WebP 二次有损编码以及错误的重复去预乘。
## 4. Atlas Scale 与工程导入
Texture Unpacker 输出的是 Atlas 实际打包尺寸。例如页面声明 `scale: 0.5` 时,解出的图片也是原图的一半像素尺寸,这不是压缩错误。
生成工程时必须把同一 Atlas 传给官方导入参数:
```text
Spine -u <本地精确缓存版本>
-i <骨骼 JSON 或 SKEL>
-s <Atlas 的 scale 数值>
-o <目标 .spine>
--import
```
`-s <数值>` 让 Editor 按 Atlas 的打包比例缩放骨骼、附件和动画数据。使用数值是为了兼容 3.8—4.3;旧版 Editor 不接受 Atlas 路径作为 `-s` 的值。遗漏此参数会形成“附件位置沿用原始坐标、解包图片却是半尺寸”的工程,表现为局部图片缩小和脱节。
多页 Atlas 必须使用一致的 `scale`;未声明时按 `1.0`。若各页比例不同,任务会说明原因并停止,避免生成内部尺寸不一致的工程。
## 5. 验证与失败规则
每次解包后至少检查:
- 进程正常结束。
- `images/` 中存在可识别的图片输出。
- 最终 `.spine` 文件存在且非空。
- 3.8、4.0、4.1、4.2、4.3 均使用对应版本 Editor 做导入回归。
任何一步失败都弹窗显示所属阶段和 Spine 返回的原因,不切换到非官方实现。
+195
View File
@@ -0,0 +1,195 @@
# 测试策略
## 1. 测试目标
测试需要证明四件事:
1. 每个目标版本使用正确 Runtime 和 Editor。
2. 预览结果在语义和视觉上正确。
3. 生成 `.spine` 后运行时主体数据没有意外丢失。
4. 断网、损坏输入和批量失败情况下行为安全。
## 2. 测试层级
### 2.1 单元测试
不启动 Spine Editor
- 版本字符串解析
- Spine JSON schema 识别
- SKEL 头部有界探测
- Atlas parser
- 自动配对评分
- 路径规范化和逃逸防护
- 输出重名策略
- 恢复状态机
- 报告序列化
- Editor 命令参数生成
### 2.2 组件测试
- 每个 Runtime 插件独立加载相应版本资源。
- Texture Provider 解码 PNG、JPG、WebP。
- 统一 draw list 校验。
- 官方解包结果的尺寸、Alpha 与 golden image 对比。
- Editor Locator 使用模拟注册信息和目录结构。
### 2.3 Editor 集成测试
需要本地已激活的 Spine Editor
- `--version` 探测
- JSON 导入
- SKEL 导入
- Atlas 官方解包
- 临时工程导出规范化 JSON
- 最终 `.spine` 可重新读取
- 取消、超时和错误码映射
### 2.4 端到端测试
从目录扫描开始,经过预览、确认、解包、导入、验证和发布。检查输入目录完全未改变。
## 3. 版本矩阵
每个版本至少覆盖:
| 版本 | JSON | SKEL | 预览 | 官方解包 | 工程生成 | 语义回读 |
|---|---:|---:|---:|---:|---:|---:|
| 3.8.20+ | 必测 | 必测 | 必测 | 必测 | 必测 | 必测 |
| 4.0.x | 必测 | 必测 | 必测 | 必测 | 必测 | 必测 |
| 4.1.x | 必测 | 必测 | 必测 | 必测 | 必测 | 必测 |
| 4.2.x | 必测 | 必测 | 必测 | 必测 | 必测 | 必测 |
| 4.3.x | 必测 | 必测 | 必测 | 必测 | 必测 | 必测 |
## 4. 功能样本矩阵
- Region
- Unweighted/Weighted/Linked Mesh
- IK、Transform、Path constraints
- Clipping
- Deform
- Draw order
- Events
- 多动画、多 Skin
- Two Color Tint
- Normal/Additive/Multiply/Screen
- 单页、多页 Atlas
- PMA、Straight Alpha
- PNG、JPG/JPEG、WebP
- Atlas scale
- Polygon packing
不要求一个样本覆盖所有功能,采用可追踪的样本能力清单。
## 5. 官方测试资源
开发阶段从官方 `EsotericSoftware/spine-runtimes` 仓库各版本分支取得对应样例:
```text
3.8
4.0
4.1
4.2
4.3
```
每份资源由 manifest 记录:
```text
case id
source repository
branch
commit hash
relative paths
data version
features
expected animations/skins/counts
license reference
sha256
```
规则:
- 不用 4.3 资源测试旧 Runtime。
- 测试基于固定 commit,不追随浮动分支。
- 官方资源只放在开发测试缓存或 CI 临时空间。
- `tests/fixtures/external/` 不进入发行打包输入。
- 发行产物检查中把官方资源文件名和哈希作为禁止项。
- 未经许可确认,不把官方资源提交到对外发布制品。
## 6. 自有与生成测试数据
除官方样例外,创建可自由分发的最小数据用于:
- 安装后冒烟测试
- 损坏输入测试
- Unicode 路径测试
- 极限尺寸测试
- 输出命名冲突测试
生成数据的来源、生成脚本和许可必须清晰。若生成 `.spine`/导出数据需要 Spine Editor,构建产物仍按许可审查。
## 7. 视觉回归
在固定 viewport、背景、时间点、Skin 和动画下截图:
- 与批准的 golden image 比较。
- 对 JPG/WebP 使用合理像素误差。
- 对 Alpha 边缘增加专门区域检测。
- 单独测试 PMA 黑边、Straight Alpha 白边问题。
- GPU 差异造成的小量误差采用阈值,不使用完全逐字节相等。
## 8. 语义回归
转换前后生成规范摘要并比较:
```text
bones
slots
skins
attachments by type
constraints by type
animations and duration
events
deform timelines
draw-order timelines
```
Nonessential 数据单独报告,不与运行时语义失败混合。
## 9. 异常与安全测试
- 截断 SKEL
- 超长字符串和伪造数组长度
- 深层/异常 JSON
- Atlas 路径逃逸
- 重复 region 和页面
- 缺失或损坏图片
- 巨大图片和解压炸弹式输入
- Editor 路径失效
- Editor 未激活
- 子进程卡住、崩溃、返回非零
- 用户在各阶段取消
- 输出目录无权限或空间不足
## 10. 离线测试
在 macOS 和 Windows 上分别执行:
1. 准备并验证对应 Editor 版本。
2. 禁用网络接口或在隔离环境阻断网络。
3. 启动 DateToSpine。
4. 完成扫描、预览、官方解包、生成和回读。
5. 记录任何网络连接尝试。
6. 确认不存在 CDN、在线字体、在线 Shader、更新或遥测依赖。
## 11. 发行物检查
对最终 `.app/.dmg/.exe/installer` 解包检查:
- 不含官方测试素材。
- 不含 Spine Editor。
- 包含 Runtime License 和 Third-Party Notices。
- 包含所需 Qt 图片插件,WebP 在断网环境可用。
- 不含开发日志、绝对源码路径、测试缓存或调试密钥。
@@ -0,0 +1,133 @@
# 离线、打包与许可
## 1. 离线定义
DateToSpine 的“全功能离线”定义为:
- 应用本身不建立网络连接。
- 不使用 CDN、远程字体、远程 Shader、WebView 在线页面或在线 API。
- 不在运行时下载 Qt、Runtime、图片解码器或其他依赖。
- 不上传用户资源、路径、日志或统计数据。
- 不包含自动更新和联网遥测。
- 用户已经准备好的匹配版本 Spine Editor 可在断网环境中完成转换。
Spine Editor 是外部前置软件。DateToSpine 不控制 Editor 自身的授权策略,但必须在断网验收中验证既有激活和已缓存版本能够完成流程。
## 2. 构建期与运行期网络
- 开发机可以联网取得依赖和官方测试资源。
- 正式依赖必须锁定版本和校验值。
- 可复现构建应支持从内部或本地依赖缓存构建。
- 最终应用运行时不得使用网络。
- CI 下载的官方测试资源不进入打包阶段的输入集合。
## 3. macOS 打包
目标:
- Apple Silicon 原生包。
- Intel 或 Universal 2 是否首发,由原型性能和构建环境决定。
- `.app``.dmg`
- Qt framework、platform plugin、image plugin、Runtime 插件和本地资源完整部署。
- 正式发行执行代码签名和 notarization;这是发布流程,不是最终应用运行时联网依赖。
应用不得修改用户的 Spine.app 或其缓存。
## 4. Windows 打包
目标:
- Windows 10/11 x64。
- MSVC 2022 v143。
- 使用 `/MD` 与 Qt 官方构建一致。
- 部署 MSVC Runtime、Qt platform plugin、imageformats 和 Runtime 插件。
- 安装包格式在原型后从 MSIX、WiX/MSI 或 Inno Setup 中确定。
- 正式发行建议代码签名。
最终用户不需要安装 CMake、Visual Studio 或 Qt SDK。
## 5. Runtime 许可
项目集成官方 Spine Runtimes 时必须遵守:
- [Spine Runtimes License Agreement](https://esotericsoftware.com/spine-runtimes-license)
- [Spine Editor License Agreement](https://esotericsoftware.com/spine-editor-license)
发行前需要法务或产品负责人确认最终分发模式。技术实现至少保证:
- `licenses/` 保存完整、未修改的 Runtime 许可文本。
- 安装包包含 Runtime 许可和版权声明。
- About/关于 页面提供第三方许可入口。
- 不隐藏用户需要合法 Spine 许可的前提。
- 不分发 Spine Editor、激活信息或 Editor 更新文件。
- Runtime 插件不作为通用 SDK 对外提供开发接口。
## 6. 官方测试资源
已确认规则:
- 官方 GitHub 仓库资源只用于开发、兼容性测试和 CI。
- 官方测试资源不进入最终安装包。
- 打包清单不包含 `tests/fixtures/external/`
- 发行检查使用路径、文件名和 SHA-256 禁止列表防止误打包。
- 测试报告可记录资源 case id 和哈希,但不嵌入资源文件。
## 7. 第三方依赖清单
每个依赖记录:
```text
name
version/commit
source URL
license
modified or unmodified
linked statically or dynamically
included platforms
notices path
```
至少包括:
- Qt 6
- Spine Runtimes 3.8/4.0/4.1/4.2/4.3
- 测试框架
- 可能引入的日志或打包依赖
新增依赖必须经过:离线可部署性、许可证、维护状态、体积和安全评审。
## 8. 网络禁止措施
- 不链接应用层 HTTP 客户端,除非未来需求重新评审。
- 资源加载器只接受本地文件协议。
- 代码扫描阻止 CDN URL 和动态依赖下载逻辑。
- 集成测试在网络阻断环境运行。
- 打包后执行连接监控测试。
文档中的官方链接仅供人阅读,不会被应用自动访问。
## 9. 发行目录白名单
打包采取白名单而不是“复制整个构建目录”:
```text
application executable
Qt runtime libraries/plugins
dts runtime plugins
icons/translations/shaders
licenses/notices
user documentation
```
明确排除:
```text
tests/
official sample assets
source repository metadata
developer caches
temporary recovery jobs
Spine Editor binaries
activation information
debug-only symbols(独立保存,不进入普通安装包)
```
+131
View File
@@ -0,0 +1,131 @@
# 开发计划
## 1. 开发原则
- 先验证风险,再建设完整 UI。
- 每个阶段有可运行结果和退出标准。
- 未通过技术关卡时不扩大代码量掩盖问题。
- 文档、测试和代码同步更新。
- 当前文档批准后才进入功能开发。
## 2. 阶段 0:技术原型
### 目标
验证决定产品能否成立的核心问题。
### 工作项
1. 在 macOS 上发现并验证已安装 Spine Editor。
2. 验证自定义 `.app`/可执行文件路径。
3. 调用 3.8、4.0、4.1、4.2、4.3 本地版本。
4. 为五个版本各构建最小 `spine-cpp` adapter。
5. 用 JSON、SKEL、Atlas 和纹理加载一帧预览数据。
6. 验证 QOpenGLWidget 绘制 Region、Mesh、Clipping 和混合模式。
7. 验证官方 Texture Unpacker。
8. 验证 SKEL → 临时 `.spine` → JSON → 设置 images → 最终 `.spine`
9. 验证断网运行。
10. 在 Windows/MSVC 至少完成构建和 Editor CLI 冒烟测试。
### 技术关卡
- 五套 Runtime 可以隔离构建并通过统一 ABI 加载。
- 五个版本至少各有一个 JSON/SKEL 可预览。
- 本地 Editor 路径和版本能可靠识别。
- JSON/SKEL 可以生成可回读 `.spine`
- 图片路径能自动关联,或明确证明需要采用哪种降级方案。
- 官方解包和 PMA 行为被记录。
- 断网时已准备版本可执行完整流程。
任何关卡失败都先更新架构决策,不进入大规模 UI 开发。
## 3. 阶段 1:工程骨架与领域模型
- CMake Presets 和平台 toolchain。
- 目录、target 和第三方依赖边界。
- `AssetGroup``SpineVersion``RecoveryJob`
- 文件系统、进程和报告接口。
- 基础错误码和状态机。
- 单元测试框架和 CI 基线。
- 自研代码行数检查。
退出标准:macOS/Windows Debug 与 Release 构建通过,核心模型测试通过。
## 4. 阶段 2:扫描、配对与预检
- 递归扫描。
- JSON/SKEL 版本识别。
- Atlas parser。
- 页面解析和图片校验。
- 资源组配对评分。
- 手动修正模型。
- Unicode、长路径和安全边界。
退出标准:官方样例和异常样例能形成确定、可解释的资源组。
## 5. 阶段 3:离线预览器
- 五个 Runtime 插件完整实现。
- Texture Provider。
- OpenGL 批次渲染。
- 动画、Skin、Seek、速度控制。
- 调试显示。
- 视觉回归测试。
退出标准:五个版本功能矩阵通过,拔网预览正常。
## 6. 阶段 4Editor 管理与转换
- macOS/Windows 自动发现。
- 自定义路径 UI。
- 版本能力映射。
- Spine CLI 封装。
- JSON/SKEL 导入。
- 图片路径规范化。
- 语义回读验证。
- 原子发布和恢复报告。
退出标准:五个版本端到端转换通过,输入未改变。
## 7. 阶段 5Atlas 解包
- 官方解包器唯一流程。
- 官方结果验证。
- PMA、Scale、rotate、offset、多页和 polygon packing。
- PNG/JPG/WebP 测试。
退出标准:官方解包与失败原因可观察、可报告,且各版本具有视觉回归。
## 8. 阶段 6:批处理和用户体验
- 任务队列、取消和失败隔离。
- 批量重名策略。
- 进度、日志和错误建议。
- 设置迁移和会话恢复。
- 中英文界面。
- 无障碍和高 DPI 检查。
## 9. 阶段 7:发布准备
- macOS/Windows 安装包。
- Qt 和图片插件部署。
- Runtime 许可与 Third-Party Notices。
- 官方测试资源排除检查。
- 离线端到端测试。
- 签名、公证和干净机器安装测试。
- 性能、内存和损坏输入测试。
## 10. 建议评审点
每阶段完成后提交:
- 功能演示
- 自动测试结果
- 新增风险
- 文件长度报告
- 依赖与许可变更
- 下一阶段范围
## 11. 编码顺序建议
开始开发后的第一个提交不应是完整项目 UI,而应是阶段 0 的最小原型和实验记录。技术原型通过后,再固化公共接口和正式目录。
@@ -0,0 +1,102 @@
# 风险与架构决策
## 1. 风险台账
| ID | 风险 | 影响 | 应对 |
|---|---|---|---|
| R-01 | 不同 Spine 版本二进制格式不兼容 | 错误预览或导入失败 | 五套匹配 Runtime;Editor 主/次版本强校验 |
| R-02 | 3.8 早期格式变化 | 部分 3.8 文件无法读取 | 正式范围从 3.8.20 开始;旧文件尽力识别 |
| R-03 | SKEL 不含可直接修改的图片路径 | 生成工程显示 Missing | Editor 双重导入/导出原型;输出布局降级方案 |
| R-04 | 五套 Runtime 符号/API 冲突 | 无法链接或运行不稳定 | 独立动态模块、隐藏符号、稳定 C ABI |
| R-05 | 损坏输入使 Runtime 崩溃 | 主程序退出 | 有界预检、模糊测试;必要时改 helper process |
| R-06 | Spine Launcher 缺少目标缓存版本 | 离线转换失败 | 版本能力预检;不自动下载;明确修复提示 |
| R-07 | Editor 自身的联网或授权行为 | 离线验收失败 | 真正断网测试;明确前置条件;不修改或绕过 Editor |
| R-08 | PMA/WebP 边缘错误 | 预览或解包出现色边 | 格式矩阵与 Alpha 视觉回归;Alpha 处理交给官方解包器 |
| R-09 | Polygon-packed Mesh 难以还原原图 | 图片包含邻近像素或裁切错误 | 仅使用官方解包器;失败时报告限制并终止 |
| R-10 | 官方测试素材误入安装包 | 许可与体积风险 | 打包白名单、哈希禁止清单、发行物解包检查 |
| R-11 | Qt/Runtime 许可遗漏 | 无法合规发行 | 依赖清单、licenses、About 页面、发行关卡 |
| R-12 | 自定义路径和 Unicode 处理错误 | Editor 无法启动 | 参数数组、canonical path、双平台路径测试 |
| R-13 | 巨大资源耗尽内存 | 卡死或崩溃 | 输入限制、预算检查、按需解码、可取消任务 |
| R-14 | 跨补丁 Editor 行为变化 | 同一主/次版本结果不同 | 记录实际补丁;固定测试矩阵;报告转换环境 |
## 2. 已接受架构决策
### ADR-001:生成 `.spine` 使用官方 Editor
- 状态:接受
- 决策:调用本地已授权 Spine Editor,不自行写 `.spine`
- 原因:`.spine` 是编辑工程格式;官方 CLI 已提供数据导入能力。
### ADR-002:版本范围为 3.8.20+ 至 4.3
- 状态:接受
- 决策:3.8.20+、4.0、4.1、4.2、4.3;不支持 3.8 以下。
- 原因:覆盖目标游戏资源,同时控制旧格式维护成本。
### ADR-003:预览进入首版
- 状态:接受
- 决策:用户确认转换前必须可离线预览。
- 原因:避免批量生成后才发现配对、Scale、Alpha 或版本错误。
### ADR-004:每个主/次版本独立 Runtime
- 状态:接受
- 决策:五个 Runtime 插件,通过统一 C ABI 接入。
- 原因:官方要求 Runtime 与数据主/次版本同步,API 也会变化。
### ADR-005:仅使用官方 Atlas 解包
- 状态:接受
- 决策:官方 Texture Unpacker 是唯一纹理解包实现;失败时任务失败。
- 原因:官方对自身 Atlas、PMA、旋转和多边形打包语义最权威,且软件以前置正版 Spine 为使用条件。
### ADR-006:运行期全离线
- 状态:接受
- 决策:无 CDN、下载、遥测、资源上传和在线 API。
- 原因:资源敏感性、稳定性和用户要求。
### ADR-007:官方测试资源不发行
- 状态:接受
- 决策:官方资源只用于开发/CI,最终安装包不包含。
- 原因:用户明确要求,并减少许可与安装体积风险。
### ADR-008Qt 6 + CMake + MSVC/Apple Clang
- 状态:接受
- 决策:主程序 C++20CMake 3.25+Windows MSVC v143。
- 原因:跨平台 UI、进程管理、图片插件和成熟构建生态。
## 3. 原型后待决策事项
### ADR-P01Runtime 插件还是 helper process
默认先验证动态插件。若损坏文件可导致不可接受的进程级崩溃,则采用 helper process 隔离。
### ADR-P02macOS 架构
首发 Apple Silicon 或 Universal 2,根据目标用户和五套 Runtime 构建成本决定。
### ADR-P03:测试框架
Qt Test 与 Catch2 二选一,以 Runtime 插件和参数化兼容矩阵的便利性为主要标准。
### ADR-P04SKEL 图片路径自动化方案
由 Editor 双重导入/导出原型结果决定正式流程及是否存在可接受降级。
### ADR-P05Windows 安装器
在 MSIX、WiX/MSI、Inno Setup 中选择,需满足离线安装、签名和干净卸载。
## 4. 决策变更规则
变更已接受决策时必须记录:
- 变更原因
- 新证据或测试结果
- 对范围、兼容性和许可的影响
- 数据迁移或设置迁移方案
- 负责人和日期
@@ -0,0 +1,93 @@
# 阶段 0 技术原型记录
## 记录日期
2026-09-07
## 当前结论
首批工程骨架已经建立并在 macOS Apple Silicon 上通过构建测试。此阶段证明多版本 Runtime 隔离、基础输入识别、本地 Editor 发现和跨平台进程抽象可以按既定架构继续推进;尚未证明完整动画预览或 `.spine` 恢复流程。
## 本机环境
- Apple Clang 17
- CMake 4.4.3(项目最低要求仍为 3.25)
- Ninja 1.13.2
- Qt Base 6.11.2
- Qt Image Formats 6.11.2
- Spine Launcher 4.3.06 Apple Silicon
- Launcher 当前观察到启动 Spine Editor 3.8.99 Professional
只安装 Qt Base 与 Qt Image Formats,没有安装 Qt WebEngine、Location、NetworkAuth 等与产品无关的 Qt 元组件。
## 固定 Runtime 提交
| Runtime | 官方分支 | 提交 |
|---|---|---|
| 3.8 | `3.8` | `8b4844bd4b193ba9e54487ed397a777993cbad56` |
| 4.0 | `4.0` | `425ce416bb218b28caeec47b317aa57cd7140375` |
| 4.1 | `4.1` | `77a5db0ec6d16331f5efbaa7662bba9355bd3424` |
| 4.2 | `4.2` | `e7dc1435fa4a0083ab431f1b28e083c14a1f5c68` |
| 4.3 | `4.3` | `4309c05c287d3f15da778e68f5d2a483fe10a6a3` |
当前只展开各分支的 `spine-cpp` 源码。4.3 官方 Spineboy 资源仅用于开发测试,不进入安装目标和发行包。
## 已实现
- CMake/C++20 工程和 macOS、Windows Preset。
- 标准 C++ 核心库,不依赖 Qt。
- Spine 版本值对象和正式支持范围判断。
- JSON 最小 Spine schema 与版本探测。
- SKEL 二进制头部 hash/version 有界读取。
- Atlas 多页、page、region、PMA、scale、rotate、bounds/legacy 字段基础解析。
- macOS 常见 Spine 路径发现和 `.app` 规范化。
- Windows 常见路径骨架和 `.exe``.com` 规范化。
- 不经过 shell 的 POSIX/Windows 子进程执行器。
- 超时后终止本软件启动的整个子进程树。
- Launcher 版本与实际 Editor 版本分离解析。
- 五个 Runtime 独立静态目标和动态 adapter。
- 稳定 C ABI 版本与 metadata 加载验证。
- 极简 Qt 桌面外壳:资源拖放/选择、资源切换、动画切换和一键转换。
- Editor 自动发现;仅在自动发现失败时请求自定义路径。
- 4.3 Runtime 已实际加载官方 JSON、SKEL 和 Atlas,并输出动画/Skin/骨骼元数据。
- 4.3 Runtime 已输出裁剪后的纹理三角形,Qt 画布可循环播放并切换真实动画。
- 4.3 beta 后缀版本和新版 SKEL 文件头识别。
- CLI:Editor 发现、路径探测、数据版本检查。
## 构建与测试结果
- `cmake --preset macos-debug`:通过。
- `cmake --build --preset macos-debug`:通过。
- 五个官方 Runtime:通过 Apple Clang 编译。
- 五个 Runtime adapter:通过动态加载和 ABI/版本检查。
- 核心单元测试:全部通过。
- 官方 Spineboy JSON/SKEL 真实加载测试:通过,识别到 11 个动画。
- Qt 应用 offscreen 启动冒烟测试:通过。
Spine 4.3 上游源码在 Apple Clang 下产生一条未覆盖枚举值的 warning。第三方源码没有被修改,该警告暂不影响构建,后续记录在上游警告基线中。
## 实际 Editor 探测发现
直接执行本机 `Spine --version` 时先报告 Launcher 4.3.06,随后启动 3.8.99 Professional。旧版 launcher 在当前系统产生字体兼容警告,并且探测可能长时间不退出。
因此代码已经采用:
- 分离解析 Launcher 和 Editor 版本。
- 探测超时。
- 进程树终止。
- “已观察到 Spine 但探测超时”独立状态。
仅看到 Launcher 版本不能代表目标 Editor 版本可用。
## 尚未完成的阶段 0 关卡
1. 对 3.8—4.2 执行真实资源预览。
2. 目标 Editor 版本选择与离线缓存能力验证。
3. 官方 Texture Unpacker 调用与结果验证。
4. JSON/SKEL 到 `.spine` 的端到端恢复。
5. SKEL 图片路径双重导入/导出方案验证。
6. Windows MSVC 构建与真实 Editor 测试。
## 下一步
先扩展 Runtime C ABI,以 4.3 adapter 实现真实资源加载、动画/Skin 元数据与 draw list;通过后把版本差异分别适配到 4.2、4.1、4.0 和 3.8。随后接 Qt OpenGL 预览画布,再进入 Editor 导入和官方解包流水线。
@@ -0,0 +1,26 @@
# 极简界面阶段记录
## 交互结论
主界面已经收敛为“拖入、预览、切换动画、一键转换”。版本号、文件格式、校验状态和 Editor 管理等技术信息不再常驻显示。
## 当前可查看产出
- 空状态支持拖入 `.json``.skel``.atlas`、纹理或整个目录。
- 多套资源通过顶部单一选择框切换。
- 4.3 官方 Spineboy JSON/SKEL 可读取,动画选择框显示 11 个真实动画。
- 当前画布已使用官方 4.3 Runtime 绘制真实骨骼姿态,并默认循环播放 `idle`
- 动画下拉框会实际切换 Runtime 动画,不再只是显示名称。
- “一键转换为 .spine”按钮已接入本地 Spine Editor 自动发现和异步导入入口。
- 自动发现 Editor 失败时才弹出路径选择,不再提供独立管理窗口。
- 软件没有网络请求。
界面截图:`阶段产出/极简界面-资源已载入.png`
## 尚未宣称完成
- 当前真实动画渲染已覆盖 4.3,3.8—4.2 尚未接入统一绘制接口。
- 一键转换入口已形成,但官方解包、图片路径恢复和生成物回读验证尚未串成最终流水线。
- 3.8—4.2 Runtime 仍需补齐真实数据加载和绘制接口。
这些未完成项不会通过增加设置页面暴露给用户,仍保持后台自动化和极简主流程。
@@ -0,0 +1,40 @@
# 4.3 动画预览阶段记录
## 阶段结果
4.3 官方 Runtime 已从“只读资源信息”升级为真实动画绘制。主界面现在会直接显示骨骼角色,而不是整张 Atlas 纹理。
## 已实现
- Runtime ABI 增加动画选择、逐帧更新和绘制命令接口。
- 4.3 adapter 创建 `Skeleton``AnimationState``SkeletonRenderer`
- 输出世界坐标、UV、颜色、索引、纹理路径和混合模式。
- Runtime 内部完成 Mesh 和 Clipping 处理。
- Qt 独立预览画布按纹理三角形绘制并自动适应窗口。
- 支持 Normal、Additive、Multiply、Screen 四种混合模式映射。
- 默认循环播放动画列表第一项;列表为空时保持静态姿态,不启动动画播放。
- 用户切换下拉框时立即切换动画并循环播放。
- 预览画布尺寸独立于每帧骨骼边界;首次加载后锁定视口,动画过程不再忽大忽小。
- 默认以画布可容纳的最大比例显示,并保留少量安全边距。
- 滚动鼠标中键时,以鼠标所在位置为中心缩放画布。
- 单击鼠标中键时重置缩放和画布位置。
- 按住鼠标右键拖动时平移画布;右键短按时回到中心。
- 软件绘制路径消除了逐三角形抗锯齿造成的 Mesh 接缝。
## 测试证据
官方 Spineboy 4.3 JSON 测试已经验证:
- 动画可被选择。
- 每帧能产生绘制命令、顶点和三角形索引。
- 绘制命令引用的纹理文件存在。
- 时间推进后世界坐标确实发生变化。
- JSON 和 SKEL 仍能重复加载。
阶段截图:`阶段产出/骨骼动画预览-4.3.png`
固定画布截图:`阶段产出/固定画布最大显示-4.3.png`
## 后续范围
下一步复用相同 ABI 分别适配 4.2、4.1、4.0 和 3.8。各版本仍使用独立官方 Runtime,不把跨版本差异塞入界面代码。
@@ -0,0 +1,81 @@
# 离线转换与多版本回归记录
## 1. 本阶段结果
- 资源载入完成后自动检测匹配版本线,并在顶部显示是否可转换。
- 4.3 资源在本机使用已缓存的 Spine `4.3.23`,不再把资源导出补丁号直接传给 Launcher。
- 只传精确缓存版本;禁止 `latest`、通配版本和 `--force`
- 缓存缺失时不启动 Spine,转换任务内部也会二次拦截。
- 成功和失败都显示弹窗;失败弹窗包含具体阶段与进程输出摘要。
- 最终结果只包含 `.spine``images/`,不包含原始 Atlas 或打包纹理页。
- 底部增加“去除预乘 Alpha”开关,默认关闭。
界面产出:[离线转换与去预乘开关.png](阶段产出/离线转换与去预乘开关.png)
## 2. 输出结构
```text
选择的输出位置/
spineboy-pro/
spineboy-pro.spine
images/
head.png
torso.png
...
```
同名目录存在时使用 `-2``-3` 后缀。所有内容先写入同一输出磁盘的临时目录,校验成功后再整体发布;失败不会留下伪成功目录。
## 3. Alpha 处理
官方 CLI 没有独立的去预乘开关,而是读取 Atlas 的 `pma` 值。为让 3.8—4.3 具有统一、可控的行为:
1. 原始 Atlas 与纹理页始终只读。
2. 开启开关时原样传入 Atlas,由官方 Texture Unpacker 根据 `pma` 完成转换。
3. 关闭开关时建立临时 Atlas 元数据副本,将 `pma:true` 改为 `pma:false`,再由官方解包器保留打包像素。
4. 不使用 Qt 对输出图片做逐像素变换或重新编码。
5. 临时 Atlas 随任务工作区清理,不进入结果目录。
## 4. 工程图片尺寸问题
已确认根因不是官方解包器压缩图片。测试 Atlas 声明 `scale: 0.5`,官方解包得到的 `head.png` 为 136×149、`front-shin.png` 为 41×92,符合实际打包尺寸。旧流程导入骨骼数据时没有传 Atlas Scale,导致附件坐标保持原始尺寸,而图片只有打包尺寸,于是局部图片缩小、脱节。
修复后的工程导入读取 Atlas 的 `scale`,再增加 `-s <数值>`,由匹配版本 Spine Editor 统一缩放骨骼、附件与动画数据。使用数值可以兼容不接受 Atlas 路径参数的 4.0 等旧版 Editor。
## 5. 多版本预览回归
每条版本线使用对应官方 `spine-cpp` 和该分支的 Spineboy 开发样本。样本仅用于开发测试,不进入安装包。
| 版本 | JSON | SKEL | 动画选择 | 绘制帧 |
|---|---|---|---|---|
| 3.8 | 通过 | 通过 | 通过 | 通过 |
| 4.0 | 通过 | 通过 | 通过 | 通过 |
| 4.1 | 通过 | 通过 | 通过 | 通过 |
| 4.2 | 通过 | 通过 | 通过 | 通过 |
| 4.3 | 通过 | 通过 | 通过 | 通过 |
3.8—4.1 共享一个旧版绘制适配层,4.2 和 4.3 使用各自 Runtime 自带的 `SkeletonRenderer`,避免将版本差异堆叠到主界面代码。
### 5.1 旧版 UV 方向修正
3.8—4.2 的 Runtime 输出沿用 Y 轴向上的世界坐标,而当前 Qt 画布以左上角为原点。适配层在输出预览顶点时对这些版本执行 `y = -y`;旧版 UV 已经与 Runtime 的三角形顶点顺序配套,不能再次翻转。4.3 已符合当前预览器方向,不执行该转换。
修复后截图:[旧版预览方向修复-4.2.png](阶段产出/旧版预览方向修复-4.2.png)
## 6. 本机实际转换回归
所有命令均选择已经存在的精确缓存版本:
| 资源线 | 本地 Editor | JSON 导入 | SKEL 导入 | 解包图片数 |
|---|---:|---:|---:|---:|
| 3.8 | 3.8.99 | 前一轮通过;本轮缓存不可用 | 前一轮通过;本轮缓存不可用 | 40(前一轮) |
| 4.0 | 4.0.64 | 55,295 字节 | 58,616 字节 | 40 |
| 4.1 | 4.1.24 | 55,483 字节 | 58,908 字节 | 40 |
| 4.2 | 4.2.43 | 50,811 字节 | 54,940 字节 | 40 |
| 4.3 | 4.3.23 | 49,603 字节 | 49,905 字节 | 40 |
4.2 A/B 回导验证:未传比例时 `hip.y=247.27`、前胫骨长度为 `128.77`;传 `-s 0.5` 后分别为 `123.64``64.39`,Mesh 顶点也同步减半,而图片维持官方解包尺寸。这说明工程数据与图片比例已恢复一致。
本轮 3.8 缓存文件在回归前已不可用,ARM Launcher 无法加载旧 x86 版本,因此遵守离线约束,没有尝试联网补齐。3.8 官方样本不声明 Atlas `scale`,修复路径会使用 `1.0`,与原导入行为一致;待本机重新具备可运行的 3.8 Editor 后仍需补跑本轮实机导入。
自动测试与完整构建通过。官方测试资源仍位于开发期 `third_party` 目录,安装规则只复制 Runtime 许可文件。
+61
View File
@@ -0,0 +1,61 @@
# DateToSpine 开发文档
## 文档状态
- 状态:技术原型开发中,极简主界面已形成
- 文档基线:2026-09-07
- 当前目录包含设计文档、C++/Qt 工程、Runtime 适配器和自动测试
## 产品概述
DateToSpine 是一个面向 macOS 和 Windows 的离线桌面工具,用于扫描、预览并批量恢复 Spine 游戏运行时资源:
```text
.skel/.json + .atlas/.atlas.txt + texture pages
可编辑的 .spine 工程
```
软件内置匹配版本的官方 `spine-cpp` Runtime 以实现转换前预览。生成 `.spine` 时,用户电脑必须已经安装、激活并准备好与资源版本匹配的 Spine Editor。
## 已确认的产品决策
1. 正式支持 Spine `3.8.20+``4.0.x``4.1.x``4.2.x``4.3.x`
2. 不支持 Spine 3.8 以下版本。
3. 转换前必须支持离线预览,用户确认后才生成 `.spine`
4. 五个 Spine 主/次版本使用各自对应的官方 Runtime。
5. 生成 `.spine` 必须调用本地已授权的 Spine Editor,不自行编写或逆向 `.spine` 文件。
6. Atlas 纹理只使用 Spine 官方 Texture Unpacker 解包,不提供自研兜底。
7. 软件运行期不使用 CDN、在线 API、在线依赖下载、遥测或资源上传。
8. 官方测试资源仅用于开发和 CI 测试,不进入最终安装包。
9. 最终安装包只携带 Runtime 许可、第三方许可和必要声明,不携带 Spine Editor 或官方示例资源。
10. 自研源文件按职责拆分,禁止出现数千行的业务代码文件。
11. 主界面只保留拖入资源、预览/动画切换和一键转换;仅在 Editor 自动识别失败时请求路径。
## 文档索引
- [01-产品需求.md](01-产品需求.md):产品范围、用户流程和验收标准
- [02-系统架构.md](02-系统架构.md):技术架构、模块边界和代码约束
- [03-版本识别与编辑器检测.md](03-版本识别与编辑器检测.md):版本识别、本地 Editor 检测和自定义路径
- [04-恢复流水线.md](04-恢复流水线.md):恢复流水线、输出规则和错误处理
- [05-离线预览器.md](05-离线预览器.md):多版本 Runtime 与离线预览器
- [06-图集解包设计.md](06-图集解包设计.md):官方唯一解包、PMA 与 Atlas Scale 设计
- [07-测试策略.md](07-测试策略.md):测试矩阵、官方测试资源管理和验收
- [08-离线打包与许可.md](08-离线打包与许可.md):离线、发行与许可要求
- [09-开发计划.md](09-开发计划.md):阶段计划、技术关卡与完成定义
- [10-风险与架构决策.md](10-风险与架构决策.md):风险台账与架构决策记录
- [11-阶段0技术原型记录.md](11-阶段0技术原型记录.md):首批代码、构建证据和后续关卡
- [12-极简界面阶段记录.md](12-极简界面阶段记录.md):精简后的界面范围、当前产出与未完成项
- [13-四点三动画预览记录.md](13-四点三动画预览记录.md):4.3 真实骨骼绘制、动画切换和测试证据
- [14-离线转换与多版本回归记录.md](14-离线转换与多版本回归记录.md):本地版本门禁、完整输出、PMA 开关和 3.8—4.3 回归证据
## 官方参考资料
- [Spine Command Line Interface](https://en.esotericsoftware.com/spine-command-line-interface)
- [Importing skeleton data](https://esotericsoftware.com/blog/Importing-skeleton-data)
- [Spine versioning](https://esotericsoftware.com/spine-versioning)
- [spine-cpp Runtime Documentation](https://esotericsoftware.com/spine-cpp)
- [Spine JSON format](https://esotericsoftware.com/spine-json-format)
- [Spine binary format](https://esotericsoftware.com/spine-binary-format)
- [Spine Runtimes repository](https://github.com/EsotericSoftware/spine-runtimes)
- [Spine Runtimes License](https://esotericsoftware.com/spine-runtimes-license)
Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB