Advance WebGPU volume and bounded workflows

This commit is contained in:
mes123456
2026-08-14 18:08:29 -04:00
parent 3da1dfc804
commit 68d50f810f
119 changed files with 9028 additions and 430 deletions

View File

@@ -1,15 +1,21 @@
# N-015 非 Mesh 几何数据块
状态:`in_progress`本地有界切片已落地VDB renderer/完整交互仍阻断)
状态:`BLOCKED / in_progress`VDB core 已覆盖 server、OPFS、Float32 WebGPU 与 Main 属性重开;
生产视口、高级材质、分页和发布 golden 仍阻断)
更新时间2026-08-12
更新时间2026-08-14
## 当前声明
当前声明覆盖 Blender 5.2 `.blend` 中有限非 Mesh 数据的稳定识别、Main 权威写回、undo/redo、
保存重开、真实 evaluated mesh 报告和 WNM 二进制分块。Curve cyclic/handle 已有有界
属性读写、多目标选择和单事务平移提交未声明完整 topology editor、连续 gizmo preview、
VDB 体渲染或完整 Volume USD loss fixture
属性读写、多目标选择、连续临时预览、handle-local gizmo 和单事务平移提交未声明完整
topology editor
Volume 采用“桌面/服务端 OpenVDB 转 NanoVDB浏览器分块读取并以 WebGPU 渲染”的固定架构。
浏览器不直接解码 OpenVDB当前已完成真实资源 catalog、独立 OpenVDB 13 -> NanoVDB 32 desktop
converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开、Float32 CPU/WGSL 树遍历、
有界体积积分和 Volume Main 属性保存重开。主线程/Offscreen 生产视口、高级 grid 材质、GPU
分页和发布 golden 尚未完成,因此 N-015 整体保持 `BLOCKED`
| 数据族 | Reader | Web 预览 | 当前门 |
| --- | --- | --- | --- |
@@ -19,7 +25,7 @@ VDB 体渲染或完整 Volume USD loss fixture。
| 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 | 项目内 OpenVDB path/grid metadata | 无 renderer可取消 decoder API | `NON_MESH_RESOURCE_MISSING` 或预算阻断 |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU core 可渲染真实 Float32 density生产视口未接入 | `BLOCKED` |
## 已实现任务
@@ -32,7 +38,8 @@ VDB 体渲染或完整 Volume USD loss fixture。
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 metadata 和可取消 decoder。
不以摘要计数伪造点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>` 字体
@@ -45,15 +52,17 @@ VDB 体渲染或完整 Volume USD loss fixture。
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 覆盖连续拖拽 preview
handle 专用 gizmo UI 仍阻断。单用户、undo/redo、save/reopen 由
多 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。完整连续 gizmo preview 仍未声明
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 桌面回导几何校验;零三角且零边的结果仍返回
@@ -62,31 +71,52 @@ VDB 体渲染或完整 Volume USD loss fixture。
已通过 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 loss fixture 仍由 VDB 资源/renderer 阻断
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、轴向 delta 和最多
256 个去重 handle identity现有 UI gizmo 在单次 pointer commit 时先执行 stale revision、
重复 handle、有限坐标和预算校验,再合并为一次 `setCurveTopology` Main 事务。连续 preview
仍未开放。
13. `test:vdb-availability` 确认当前 WASM build 为 `WITH_OPENVDB=OFF`
`WITH_NANOVDB=ON` metadata-only项目和本机资源库没有可用 `.vdb`。因此真实 decoder、
renderer 和 Volume loss fixture 继续 `BLOCKED`
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 完整节点语义。
## 后续分解
1. N-015-B3接入真实 OpenVDB decoder 与体素纹理/射线步进;在此之前保持 Volume renderer 阻断。
2. N-015-C1连续多 handle 拖拽 preview 与专用 gizmo UI多 handle 选择、高亮、单事务平移、
1. N-015-C1按 handle 本地原点/方向放置的专用 gizmo UI、连续多 handle 拖拽 preview、
多 handle 选择、高亮、局部轴单事务平移、
多 spline 创建/删除/重排、批量 handle/cyclic editor transaction 和二维 Surface U/V
topology/order/rational weight 网格替换已完成。
3. N-015-C2任意外部路径的新字体导入与资源沙箱已有/packed VFont 的四 style link Main
topology/order/rational weight 网格替换已完成;完整 topology editor 不在本切片声明内
2. N-015-C2任意外部路径的新字体导入与资源沙箱已有/packed VFont 的四 style link Main
写回、字符级样式、kern/material 与 textbox 已完成并通过 PFB desktop/WASM golden。
4. N-015-D1跨对象 selection history、多目标 element identity、range patch、左右 handle
raycast多 handle Main 写回已完成;连续拖拽 preview 归入 C1 阻断
5. N-015-D2evaluated preview 与源控制笼分层显示、WebGPU 等价。
6. N-015-E1补齐 Volume 的完整 loss fixturePointCloud/Curves/Hair、Curve line bake、真实
4x4 NURBS Surface mesh、desktop geometry golden、7 对象 GLB 与 USDA desktop round-trip 已通过。
7. N-015-E2100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quotaChromium
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 和 Main Volume 属性重开已完成;
继续执行生产 GPU paging、Principled Volume grid 语义、GLB/USD loss、大 bundle/OOM 和
desktop/Chromium golden未完成项保持阻断。
6. N-015-E2100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quotaChromium
64 KiB 真实 quota、失败后旧 revision 保持、Worker restart 恢复已通过。后续浏览器验收
仅以 Chromium 为基线,不配置 Firefox/WebKit。
@@ -95,7 +125,9 @@ VDB 体渲染或完整 Volume USD loss fixture。
- `summary-only` 不得进入 `READY`
- legacy 控制折线不得标记为 evaluated/tessellated curve。
- Metaball sphere proxy 不得用于导出或保存为求值曲面。
- Volume decoder/renderer、Hair 属性 buffer 缺失时不得生成占位几何
- Volume/VDB 不得生成占位几何;协议 fixture 不得作为真实 decoder/renderer 证据
- 浏览器构建不得通过开启 `WITH_OPENVDB` 绕过 desktop/server 转换边界。
- 生产视口、GPU paging、完整材质、故障门和发布 golden 未齐前VDB 与 N-015 保持 `BLOCKED`
- Metaball sphere proxy 不得进入 GLBGLB 只能消费 depsgraph evaluated mesh。
- 任意新增 Main authoring 命令在 save/reopen 与 undo/redo 完成前不得开放 UI。
@@ -117,8 +149,9 @@ 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-availability
npm --prefix web run test:vdb
npm --prefix web run test:vdb-availability
npm --prefix web run test:vdb-native
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"
```