Files
workinf_Blender_Wasm/docs/status/N-015.md
mes123456 0fe8d2bb56
Some checks are pending
M6 deployable RC / quick (push) Waiting to run
M6 deployable RC / chromium (push) Blocked by required conditions
M6 deployable RC / release (push) Blocked by required conditions
Advance M8-M11 parity workflows
2026-08-17 04:37:07 -04:00

14 KiB
Raw Blame History

N-015 非 Mesh 几何数据块

状态:BLOCKED / in_progressM8 自动 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_MBID_PTID_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 UsdGeomPointsCurves/Hair 使用 GLB LINES/USD UsdGeomBasisCurvesradius 映射 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=OFFVDBConversionRequestIR 记录源 hash、grid allowlist、量化、chunk size、desktop/server converter identityNanoVDBBundleManifestIR 校验 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 保持 BLOCKEDM8 完成不能自动把 N-015 全域标为 COMPLETE
  • Metaball sphere proxy 不得进入 GLBGLB 只能消费 depsgraph evaluated mesh。
  • 任意新增 Main authoring 命令在 save/reopen 与 undo/redo 完成前不得开放 UI。

验收命令

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"