Files
workinf_Blender_Wasm/docs/status/N-015.md
mes123456 0fe8d2bb56
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance M8-M11 parity workflows
2026-08-17 04:37:07 -04:00

183 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# N-015 非 Mesh 几何数据块
状态:`BLOCKED / in_progress`M8 自动 demand paging、联合重开、64 MiB sparse 门和三轴 density
golden 已完成;深度合成、完整 Volume 材质/GLB/USD 与 512 MiB/1 GiB 联合故障矩阵仍阻断)
更新时间2026-08-16
## 当前声明
当前声明覆盖 Blender 5.2 `.blend` 中有限非 Mesh 数据的稳定识别、Main 权威写回、undo/redo、
保存重开、真实 evaluated mesh 报告和 WNM 二进制分块。Curve cyclic/handle 已有有界
属性读写、多目标选择、连续临时预览、handle-local gizmo 和单事务平移提交;未声明完整
topology editor。
Volume 采用“桌面/服务端 OpenVDB 转 NanoVDB浏览器分块读取并以 WebGPU 渲染”的固定架构。
浏览器不直接解码 OpenVDB当前已完成真实资源 catalog、独立 OpenVDB 13 -> NanoVDB 32 desktop
converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开、Float32 CPU/WGSL 树遍历、
有界体积积分、主线程/Offscreen 生产视口、显式 hash 校验 GPU 分页/LRU、有限 grid 材质、
Volume Main/asset binding 联合重开、自动缺页重绘、64 MiB sparse 门和 OpenVDB/WebGPU 三轴
density golden。深度合成、完整 Volume 材质/GLB/USD 与更大真实 bundle 联合故障矩阵尚未完成,
因此 N-015 整体保持 `BLOCKED`
| 数据族 | Reader | Web 预览 | 当前门 |
| --- | --- | --- | --- |
| legacy Curve | 控制点、spline offset、resolution | WNM 控制折线depsgraph 真 mesh | `READY` |
| legacy Surface | 控制点、spline offset、resolution | WNM 控制折线depsgraph 真 mesh | `READY` |
| Font | body、对齐、extrude/bevel/offset 与摘要 | depsgraph 真 mesh源文本仍保留 | `READY`(无控制笼) |
| Metaball | 元素类型、位置、半径、尺度 | bounded sphere proxydepsgraph implicit mesh | `READY` |
| PointCloud | position/radius/POINT 属性 | WNM 分块 Points | `READY`(空数据为 `summary-only` |
| Curves/Hair | position/radius/curve/POINT 属性 | WNM 分块 Points/curve line | `READY`(缺数据阻断) |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU 可渲染真实 density/color/temperature/emission自动分页、联合重开与三轴 density golden 已接入 | `BLOCKED`(深度合成/完整材质与 IO/更大联合故障矩阵) |
## 已实现任务
1. `NonMeshDataIR` 加入 SceneIR schema 1可选字段保持旧快照兼容。
2. parser 校验类型、状态、有限数、三元控制点、spline offset、Metaball 元素和错误码。
3. native reader 为数据块生成稳定 ID并把对象 `dataId` 指向同一 IDWeb runtime 注册
`ID_MB``ID_PT``ID_VO`,不再把三类对象降为 Empty。
4. 单数据块最多读取 1M 点;越界或不完整数据返回
`NON_MESH_DATA_BUDGET_EXCEEDED`
5. `NonMeshGeometryChunk` WNM schema 1 提供 65,536 点分块、SHA-256、属性 domain/storage、
256 MB 场景预算和 1M 点性能门Worker/主线程/Offscreen 均传输并消费分块。
6. native reader 读取 PointCloud/Curves/Hair 的 position、radius、curve offset 和属性值,
不以摘要计数伪造点Volume 保留项目路径和 OpenVDB grid metadataraw `.vdb` 必须提交桌面/
服务端转换,浏览器不接 OpenVDB decoder。
7. depsgraph 对 Curve/Surface/Font/Metaball 通过 `BKE_mesh_new_from_object` 输出真实位置、法线、
边/三角索引、UV、材质槽和 source face/edge mapping并在 1M/2M 拓扑预算处结构化阻断。
Web ID registry 已注册 `ID_VF` 并在加载时恢复 Blender 未写入 `.blend``<builtin>` 字体
引用Curve/Surface/Font/Metaball 的几何计数、边界、面积和位置/索引矩均通过 Blender
5.2 desktop golden。
8. Main 已支持 Curve/Surface 控制点、resolution、有界 cyclic/handle 类型与 Bezier 左右 handle
坐标、Font body/geometry/layout 标量属性spacing、line distance、word space、shear、font
size、x/y offset、逐字符 kern/material/style flags 和最多 256 个 textbox、
`.blend` 内已有/packed VFont 的 regular/bold/italic/bold-italic 四样式链接、
Metaball element 写回,以及 bounded Poly Curve create、delete、1D Poly/Bezier/NURBS conversion、
二维 Surface U/V dimensions/order/rational weight 网格替换和 Curve/Surface/Font/Metaball 数据块
重命名;一维多 spline 创建/删除/重排和批量 handle/cyclic 已由单个原子 Main 事务覆盖。
多 handle 选择、高亮和有界平移已由单个 Main transaction 覆盖;连续拖拽在主线程与
Offscreen Three 场景中做绝对坐标 previewpointer cancel 恢复且 pointer up 只提交一次 Main。
handle-local gizmo 以所选 handle 质心为原点、控制点到 handle 的对齐平均切向为 X 轴,
构造稳定正交 Y/Z 轴并在两个 renderer 中投影。单用户、undo/redo、save/reopen 由
`check-nonmesh-roundtrip.mjs` 验证。
9. 主线程与 OffscreenCanvas 对 PointCloud/Curve 控制点和 Bezier handle 代理提供 bounded raycast并对 Mesh 的
VERT/EDGE/FACE 使用一致的三角顶点、边索引解析,回传既有 selection callback。selection
history schema 2 覆盖跨对象、多 data block、多 element kind、revision/stale-hit、undo/redo
和有界 selected/unselected range patch并兼容 schema 1。Bezier 左/右 handle 以全局控制点
映射独立拾取;多 handle 选择、高亮和有界平移经精确 Main 命令写回并通过 undo/redo、
save/reopen。连续 preview、局部轴投影和局部轴 Main delta 已接通。
10. `queryNonMeshCapability(dataId)` 返回 N-015 `READY/BLOCKED` 与机器可读错误码GLB 对未求值
非 Mesh 拒绝导出。Font/Metaball/二维 NURBS Surface 的 depsgraph 三角网格与 Curve 的
evaluated edge line primitive 已通过 GLB 导出和 Blender 5.2 桌面回导几何校验;零三角且零边的结果仍返回
`GLB_NON_MESH_UNMAPPED`,不生成空 primitive。确定性 USDA 1.0 序列化器将三角求值写为
`UsdGeomMesh`、edge-only 求值写为 `UsdGeomBasisCurves`,缺 buffer/空场景结构化阻断;四对象
已通过 USD-enabled Blender 5.2.0 LTS desktop reimport。PointCloud 使用 GLB `POINTS`/USD
`UsdGeomPoints`Curves/Hair 使用 GLB `LINES`/USD `UsdGeomBasisCurves`radius 映射 USD
widthstyped WNM 属性映射 primvarsGLB 属性损失结构化报告7 对象 desktop reimport 已通过。
Volume 不生成 proxy 导出GLB/USD 映射与 loss fixture 重新列入阻断切片。
11. Blender 5.2 fixture 已包含真实 PointCloud/Curves 属性Chromium 主线程/Offscreen、真实
depsgraph、WNM 1M 性能测试均接入。
12. `CurveGizmoDragIR` 为 PREVIEW/COMMIT 请求绑定 data ID、base revision、局部 axis vector、
轴向 delta 和最多 256 个去重 handle identityUI gizmo 在单次 pointer commit 时先执行 stale revision、
重复 handle、有限坐标和预算校验pointer move 仅更新 renderer 临时坐标pointer cancel
恢复pointer up 再合并为一次 `setCurveTopology` Main 事务。分块控制点会先按 point offset
重组为有界 `Float32Array`,因此内联和二进制 Curve 使用同一局部坐标契约。
13. 当前 WASM build 保持 `WITH_OPENVDB=OFF``VDBConversionRequestIR` 记录源 hash、grid
allowlist、量化、chunk size、desktop/server converter identity`NanoVDBBundleManifestIR`
校验 grid type/class/semantic、transform/bounds、材质映射、连续 32-byte 对齐 range、逐块与
整包 SHA-256、CPU/GPU 预算。raw VDB 浏览器门固定返回 `VDB_CONVERSION_REQUIRED`
14. 浏览器 `streamNanoVDBChunks` 已按 range 串行读取、逐块复验和报告进度HTTP adapter 严格要求
`206 Content-Range`,对临时状态/网络异常有界重试,并以稳定 ETag/`If-Range` 从中断 body 的
精确偏移续传ETag 改变、错位 range 和短响应均阻断。协议 fixture 不冒充 native decoder。
15. 独立 `tools/vdb` native target 已实际链接 OpenVDB 13.0/TBB调用 NanoVDB 32.9 adapter
转换真实多 grid fog、level set、大 bounds 稀疏体和 CC-BY-4.0 官方 sphere转换 report 记录
segment/payload range、type/class、transform、bounds 和 active voxel。资源库 14 条记录均绑定
license/origin/byte length/SHA-256截断 VDB 被真实 reader 拒绝,语义相同但 UUID 不同的源得到
相同 NanoVDB bundle hash。
16. 受控 server job 已覆盖 content-hash 幂等、bubblewrap/只读 root/资源限制、进度、超时、取消、
原子输出和 HMAC 构件签名;相同输入的 desktop/server bundle hash 一致。
17. OPFS 已覆盖逐块复验、staging 原子提交、内容去重、取消/残留恢复、source/converter/shader
binding 失效、Worker 重开和 bundle LRU真实 15 MiB NanoVDB bundle 已通过重开复验。读取时
再验 chunk hashchunk tamper、有效结构的 manifest rollback、真实 quota 和旧 bundle 保持均通过。
18. Float32 NanoVDB 已有 CPU reference 与 WGSL root/internal/leaf 遍历native/CPU/GPU 固定点值和
active 状态一致Chromium WebGPU 有界积分输出确定性 96x96 image hash。
19. Volume source/display/interpolation/step/velocity 属性已写入 Blender Main并通过 undo/redo、
save/reopen它不等于 Principled Volume 完整节点语义。
20. GPU grid 支持初始空驻留、经 manifest chunk hash 校验的显式单页加载、页表间接寻址、确定性
LRU 替换和设备重建后按需页重放;多材质 grid 按同一 manifest `maxResidentBytes` 分配页槽,
Chromium 以 GPU 数据读取验证被触碰页保留、旧页淘汰和恢复后内容一致。
21. GPU feedback buffer、revision gate、manifest range/hash page request、同页请求合并、frame pin
LRU、渐进重绘预算、网络精确 offset 续传、Worker restart 和 device-loss 可见页回放已形成自动
demand paging 最小闭环hash 失败、stale feedback、取消和 OOM 均不污染 resident/page table。
22. 64 MiB sparse HTTP bundle 以 4 MiB page 实际 range 读取,首 page、总耗时、峰值工作集和取消
延迟均有 Chromium 证据;取消后 coordinator/consumer 归零,未将逻辑 64 MiB fixture 写入仓库。
23. 同一保存 hash 下Volume Main 属性、OPFS project revision、NanoVDB binding 和 bundle/grid bytes
在 Worker 清空后联合重开;主线程和 Offscreen 两个生产视口都从恢复 asset 输出非空像素。
24. OpenVDB 13 native `density` reader 按 `volume-wgsl-v1` 有界积分生成 X/Y/Z 三轴 64x64 RGBA8
desktop/Chromium 发布 golden主线程与 Offscreen WebGPU 对 49,152 bytes 的最大通道误差、MAE、RMS 和 alpha 覆盖
差均为 0。门限仍固定为 2/0.1/0.5/0.002,漂移返回 `NANOVDB_GOLDEN_MISMATCH`
## 后续分解
1. N-015-C1按 handle 本地原点/方向放置的专用 gizmo UI、连续多 handle 拖拽 preview、
多 handle 选择、高亮、局部轴单事务平移、
多 spline 创建/删除/重排、批量 handle/cyclic editor transaction 和二维 Surface U/V
topology/order/rational weight 网格替换已完成;完整 topology editor 不在本切片声明内。
2. N-015-C2任意外部路径的新字体导入与资源沙箱已有/packed VFont 的四 style link Main
写回、字符级样式、kern/material 与 textbox 已完成并通过 PFB desktop/WASM golden。
3. N-015-D1跨对象 selection history、多目标 element identity、range patch、左右 handle
raycast、多 handle preview、handle-local gizmo 与单次 Main 写回已完成。
4. N-015-D2evaluated preview 与源控制笼分层显示、WebGPU 等价。
5. N-015-B3/D2/E1Volume真实资源、desktop/server converter、可续传 HTTP range、OPFS、
有界网络/Worker/quota/tamper/device-loss 故障门、Float32 WGSL core、自动 GPU paging/LRU、
resident/page-table OOM、Main/binding/双视口联合重开、64 MiB sparse 和三轴 density golden 已完成;
继续执行场景深度合成、完整 Principled Volume/GLB/USD loss 与 512 MiB/1 GiB 联合故障矩阵。
6. N-015-E2100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quotaChromium
64 KiB 真实 quota、失败后旧 revision 保持、Worker restart 恢复已通过。后续浏览器验收
仅以 Chromium 为基线,不配置 Firefox/WebKit。
## 停止条件
- `summary-only` 不得进入 `READY`
- legacy 控制折线不得标记为 evaluated/tessellated curve。
- Metaball sphere proxy 不得用于导出或保存为求值曲面。
- Volume/VDB 不得生成占位几何;协议 fixture 不得作为真实 decoder/renderer 证据。
- 浏览器构建不得通过开启 `WITH_OPENVDB` 绕过 desktop/server 转换边界。
- 场景深度合成、完整 Volume 材质/IO 和更大真实 bundle 联合故障矩阵未齐前VDB 与 N-015 保持
`BLOCKED`M8 完成不能自动把 N-015 全域标为 `COMPLETE`
- Metaball sphere proxy 不得进入 GLBGLB 只能消费 depsgraph evaluated mesh。
- 任意新增 Main authoring 命令在 save/reopen 与 undo/redo 完成前不得开放 UI。
## 验收命令
```bash
source tools/web/emscripten-env.sh
cmake --build build_web_blender6 --target web_engine -- -j8
bash tools/web/install-web-engine-assets.sh
build_blender_5.2.0/bin/blender -b --factory-startup \
--python tools/web/generate-nonmesh-fixture.py -- tests/files/web/nonmesh_scene.blend
npm --prefix web run typecheck
npm --prefix web run lint
npm --prefix web run test:nonmesh-roundtrip
npm --prefix web run test:nonmesh-desktop-golden
npm --prefix web run test:nonmesh-glb-blender-roundtrip
npm --prefix web run test:nonmesh-usd-serialization
BLENDER_BIN=/path/to/usd-enabled/blender \
npm --prefix web run test:nonmesh-usd-blender-roundtrip
npm --prefix web run test:nonmesh-binary
npm --prefix web run test:nonmesh-interaction
npm --prefix web run test:vdb
npm --prefix web run test:vdb-availability
npm --prefix web run test:vdb-native
npm --prefix web run test:vdb-server
npm --prefix web run test:vdb-opfs
npm --prefix web run test:vdb-webgpu
npm --prefix web run test:vdb-viewport
npm --prefix web run test:vdb-faults
npm --prefix web run test:nanovdb-sparse-performance
npm --prefix web run test:nanovdb-volume-roundtrip
npm --prefix web run test:nanovdb-render-golden
node tools/vdb/generate-volume-golden.mjs --check
WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- -g "real OPFS quota|reports quota exhaustion"
WEB_TEST_PORT=5201 npm --prefix web run test:e2e -- -g "N-015|non-mesh"
```