layout: restructure into src/ tests/ android/ scripts/ tools/
- extension/src/{port,platform,codepage} -> src/; native_render -> src/host
(+ dxt, shaders/); libgr2 -> src/gr2; extension/third_party -> third_party
- extension/tests -> tests/port, libgr2/tests -> tests/gr2
- android-native -> android (build.sh, push-client.sh moved in)
- script -> scripts; tools/40250 -> tools/server; oracle -> tools/granny-oracle;
perf tools -> tools/perf
- all build trees under build/ (native, release, android, port-gate)
- xrender:: CMake aliases -> mt::; port-map ledger impl paths rewritten
No code changes. ctest 15/15, port_gate macos+android PASS, port_map check 0 errors.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
70710477cf
commit
a46093104c
@@ -38,7 +38,7 @@ PoC 不是"移植一小部分客户端",而是把跨平台方案里所有真
|
||||
PoC 的价值是**降低不确定性**,go 和 no-go 都是有效产出。
|
||||
|
||||
> **进度(2026-08-29)**:M0 完成(9166/9166 解析零崩溃)。M1/M2 代码完成,
|
||||
> **数值保真已对拍真 Granny 2.9.12**(骨骼世界矩阵 + 蒙皮顶点 ≤ 6.5e-5,见 `oracle/`)。
|
||||
> **数值保真已对拍真 Granny 2.9.12**(骨骼世界矩阵 + 蒙皮顶点 ≤ 6.5e-5,见 `tools/granny-oracle/`)。
|
||||
> M3 iOS 端已交叉编译 + 模拟器运行 + 渲染与桌面一致;Android 脚手架待 NDK + 真机。
|
||||
> **PoC 的核心技术问题(能否脱离 Granny 正确读 + 播 Metin2 gr2)= 已用数值证据回答「能」**。
|
||||
> 剩余是真机验证(性能 / 生命周期 / mediump)+ Android 端。
|
||||
@@ -262,7 +262,7 @@ bgfx 自己不管窗口。计划做法:`sokol_app` 拿到原生 window handle
|
||||
|
||||
### M0 第一件事:锁定 oracle 用的 Granny 版本
|
||||
|
||||
资产是文件格式 v6(约 2.6–2.9 era),但 `m2dev-client-src` 头文件写 2.11.8。**oracle 必须用实际能正确加载这批资产的那个 `granny2.dll` 版本**去 dump,否则是拿错误的参考去校 libgr2。M0 起手要确认:这批 gr2 在哪个 Granny 版本下 `GrannyGetFileInfo` 返回完全正常(骨骼数、顶点数、动画时长都合理),把那个 DLL 固定进 `oracle/`。
|
||||
资产是文件格式 v6(约 2.6–2.9 era),但 `m2dev-client-src` 头文件写 2.11.8。**oracle 必须用实际能正确加载这批资产的那个 `granny2.dll` 版本**去 dump,否则是拿错误的参考去校 libgr2。M0 起手要确认:这批 gr2 在哪个 Granny 版本下 `GrannyGetFileInfo` 返回完全正常(骨骼数、顶点数、动画时长都合理),把那个 DLL 固定进 `tools/granny-oracle/`。
|
||||
|
||||
---
|
||||
|
||||
@@ -348,7 +348,7 @@ bgfx 自己不管窗口。计划做法:`sokol_app` 拿到原生 window handle
|
||||
|
||||
**oracle 自身要先过自检**(在被信任之前):加载一个 gr2、dump t=0 的骨骼矩阵,应与该 gr2 存的 bind pose(`InverseWorld4x4` 求逆)一致。过不了这条,下游全建在沙子上 —— 这是 M0 的隐性前置门禁。
|
||||
|
||||
这套 dump 是 Windows-only,永远留在 Windows。`oracle/` 的搭建(把 `EterGrnLib` 从完整客户端里单独抽出来编、两层矩阵 dump、确定态改造)**从 M0 起,是关键路径**,需要一个会 Windows / D3D 构建的人,[§09 工作量表](#工作量)里单列。
|
||||
这套 dump 是 Windows-only,永远留在 Windows。`tools/granny-oracle/` 的搭建(把 `EterGrnLib` 从完整客户端里单独抽出来编、两层矩阵 dump、确定态改造)**从 M0 起,是关键路径**,需要一个会 Windows / D3D 构建的人,[§09 工作量表](#工作量)里单列。
|
||||
|
||||
### 数值层
|
||||
|
||||
@@ -409,7 +409,7 @@ bgfx 自己不管窗口。计划做法:`sokol_app` 拿到原生 window handle
|
||||
|
||||
| 领域 | 风险 | 影响 / 缓解 | 严重度 |
|
||||
|---|---|---|---|
|
||||
| **oracle** | granny2.dll 版本与资产格式不匹配(资产 v6,src 头写 2.11.8) | 拿错误参考校 libgr2,全盘失真。**M0 起手锁定"能正确加载这批资产的 DLL 版本"**,固定进 `oracle/`(见 [§05](#m0-第一件事锁定-oracle-用的-granny-版本))。 | **高** |
|
||||
| **oracle** | granny2.dll 版本与资产格式不匹配(资产 v6,src 头写 2.11.8) | 拿错误参考校 libgr2,全盘失真。**M0 起手锁定"能正确加载这批资产的 DLL 版本"**,固定进 `tools/granny-oracle/`(见 [§05](#m0-第一件事锁定-oracle-用的-granny-版本))。 | **高** |
|
||||
| gr2 | **section 全部 Oodle1 压缩**(M0 T1 实测确认,非可选);个别文件可能混 Oodle0 / BitKnit | Oodle0/1 有公开重实现(~200 行 LZ 变体),M0 T2 必做;BitKnit 无公开实现 —— 9166 全样本 0 个,若真遇到 → Windows 侧 Granny SDK 离线转未压缩。 | 中 |
|
||||
| gr2 | 自描述类型树递归 / 未知类型 / 重定位表 | 写通用类型树遍历器(不假设布局)+ 与 SDK dump 逐字段对拍。 | 中 |
|
||||
| 动画 | Granny 曲线压缩格式多样(关键帧数组、D3/D4nK 量化、B 样条拟合) | 三层退路:① M0 统计实际用到的子类型,多数只需实现关键帧 + 简单量化;② `granny_curve*.cpp` 当算法参照;③ **子类型超范围就走"oracle 离线烘焙成密集关键帧"(每骨每帧一个 TRS),libgr2 只读烘焙格式,PoC 完全绕开曲线解码,代价是动画数据变大 + 一个烘焙工具**。加了 ③ 后此项可视为"中"。 | **高** → 中(有 ③ 兜底) |
|
||||
@@ -461,7 +461,7 @@ xrender-poc/
|
||||
sokol/ 仅 sokol_app.h
|
||||
glm/
|
||||
reuse/ EterBase/ EterPack/ EterImageLib/ ← 冻结快照 + 本项目修复提交(非引用)
|
||||
libgr2/
|
||||
src/gr2/
|
||||
include/ src/ gr2_file.* gr2_types.* gr2_skeleton.*
|
||||
gr2_mesh.* gr2_anim.* gr2_decompress.*
|
||||
engine/ rhi.*(包 bgfx::) skinning.* animation.* material.* scene.* camera.*
|
||||
@@ -474,7 +474,7 @@ xrender-poc/
|
||||
+ vs_pnt_skinned.sc(新写)
|
||||
shaders.cmake 可移植编译步骤:shaderc → metal / 300_es / s_5_0 → bin2c
|
||||
platform/ macos/ ios/ android/ (壳工程 + toolchain)
|
||||
oracle/ Windows-only:锁定版 granny2.dll + EterGrnLib
|
||||
tools/granny-oracle/ Windows-only:锁定版 granny2.dll + EterGrnLib
|
||||
dump 两层骨骼矩阵 + 蒙皮顶点 + 确定态截图;坐标约定写死
|
||||
tools/ gr2dump/ (M0 CLI) gr2fuzz/ snapshot_compare/ anim_bake/(曲线退路)
|
||||
test/ assets.list(M0 产出) golden/ oracle_dumps/ noise_floor.json
|
||||
@@ -486,7 +486,7 @@ xrender-poc/
|
||||
|
||||
从 **M0** 起,两件事并行:
|
||||
|
||||
1. **锁定 oracle 的 Granny 版本** —— 确认这批 v6 资产在哪个 `granny2.dll` 下 `GrannyGetFileInfo` 完全正常,固定进 `oracle/`。
|
||||
1. **锁定 oracle 的 Granny 版本** —— 确认这批 v6 资产在哪个 `granny2.dll` 下 `GrannyGetFileInfo` 完全正常,固定进 `tools/granny-oracle/`。
|
||||
2. **写 `gr2dump`** —— 输出 `warrior_cheongrin*.gr2` 的结构化 dump(骨架 / 网格 / 曲线)+ glTF;结构化 dump 与 oracle 逐字段对拍(这是主验证),glTF 仅供 Blender 目视骨架和 bind pose。
|
||||
|
||||
这是单块价值最高、且不依赖任何 RHI / 平台决策的第一块砖。
|
||||
|
||||
Reference in New Issue
Block a user