Advance WebGPU volume and bounded workflows
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Blender 5.2 Web 功能对标与全量迁移台账
|
||||
|
||||
更新时间:2026-08-12
|
||||
更新时间:2026-08-13
|
||||
|
||||
本文件以仓库内 `blender-5.2.0/source/blender/` 为基线,记录 Blender 功能域在 Web
|
||||
项目中的迁移方式和唯一领取顺序。`completed_current_scope` 只表示声明子集通过验收,
|
||||
@@ -37,14 +37,14 @@
|
||||
| NLA | `in_progress` Action Clip/reverse/repeat 子集 | 多轨混合、Transition/Meta、Animated Time、UI 和导出 | N-014 |
|
||||
| Curve/Curves/Surface/Text/Metaball | `in_progress` reader/预览子集 | 数据块 IR、Main operator、tessellation 和保存闭环 | N-015 |
|
||||
| Point Cloud/Volume/Hair | `in_progress` 摘要/资源门 | 有界数据读取、分块 buffer、视口和资源预算 | N-015 |
|
||||
| Grease Pencil/Drawing | `planned` | layer/frame/drawing/stroke、onion skin 和基础 modifier | N-016 |
|
||||
| Vertex/Weight/Texture Paint | `planned` | Main/PBVH image transaction、颜色管理和恢复 | N-017 |
|
||||
| Rigid/Soft Body、Cloth、Fluid、Particles | `planned` | 优先消费 desktop bake;WASM 求值逐 family feature probe | N-018 |
|
||||
| Camera/Light/World/Color Management | `metadata/viewport subset` | SceneIR/Three/WebGPU 映射、阴影、曝光和差异报告 | N-019 |
|
||||
| Grease Pencil/Drawing | `in_progress` 有界 Main/3D editor | layer/frame/drawing/stroke、onion skin 和基础 modifier | N-016 |
|
||||
| Vertex/Weight/Texture Paint | `in_progress` vertex color/weight Main 子集 | Main/PBVH image transaction、颜色管理和恢复 | N-017 |
|
||||
| Rigid/Soft Body、Cloth、Fluid、Particles | `in_progress` reader/cache/playback 安全层 | 优先消费 desktop bake;WASM 求值逐 family feature probe | N-018 |
|
||||
| Camera/Light/World/Color Management | `in_progress` Main/viewport subset | SceneIR/Three/WebGPU 映射、阴影、曝光和差异报告 | N-019 |
|
||||
| Eevee/Cycles/Freestyle/Render Result | `planned` | WebGPU 实时子集;Cycles/硬件后端采用服务端 Blender | N-019 |
|
||||
| Compositor | `planned` | 受限 node graph + WebGPU/CPU executor;完整图可服务端执行 | N-020 |
|
||||
| Video Sequencer/Audio | `planned` | strip/time/edit proxy;codec 能力探测;最终编码可服务端 | N-021 |
|
||||
| Movie Tracking/Mask | `planned` | 数据/编辑协议和基础浏览器工具;重计算按能力门 | N-022 |
|
||||
| Compositor | `in_progress` 有限 Main reader/CPU executor | 受限 node graph + WebGPU/CPU executor;完整图可服务端执行 | N-020 |
|
||||
| Video Sequencer/Audio | `in_progress` reader/transition 子集 | strip/time/edit proxy;codec 能力探测;最终编码可服务端 | N-021 |
|
||||
| Movie Tracking/Mask | `in_progress` Mask reader/raycast/marquee | 数据/编辑协议和基础浏览器工具;重计算按能力门 | N-022 |
|
||||
| Asset Browser/Library/Override | `partial` | catalog、preview、append/link/override、路径与来源沙箱 | N-023 |
|
||||
| Import/Export formats | `GLB subset` | glTF/OBJ/PLY/STL/USD/Alembic 能力矩阵和 desktop round-trip | N-023 |
|
||||
| Blender editors/workspaces/keymap | `partial shell` | View3D/Outliner/Properties/UV/Node/Graph/Dope/NLA/Spreadsheet | N-024 |
|
||||
@@ -84,21 +84,27 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
65,536 点 chunks、SHA-256、256 MB 场景预算和 1M 点性能门。
|
||||
2. N-015-B(`done_current_scope`):native reader 已读取真实 PointCloud/Curves position、
|
||||
radius、curve offset 和属性;depsgraph 对 Curve/Surface/Font/Metaball 输出真实 mesh、UV、
|
||||
材质槽和 source face mapping;Volume 保持项目路径与 VDB grid/decoder 安全门。
|
||||
材质槽和 source face mapping;Volume 保留 metadata,并采用 desktop/server OpenVDB ->
|
||||
NanoVDB、浏览器 range stream + WebGPU 的重新纳入方案。
|
||||
3. N-015-C(`in_progress`):Curve/Surface control point/resolution、有界 cyclic/handle metadata、
|
||||
bounded Poly Curve create/delete、Poly/Bezier conversion、Curve/Surface/Font/Metaball 数据块 rename、
|
||||
Font body/geometry properties、逐字符样式/textbox、已有/packed VFont 四样式链接和
|
||||
Metaball element Main command 已支持并通过 undo/save/reopen;一维多 spline 创建/删除/重排、
|
||||
批量 handle/cyclic 和二维 Surface U/V topology/order/rational weight transaction 已通过
|
||||
undo/save/reopen 与 depsgraph 求值;多 handle 选择拖拽/gizmo UI 和任意外部路径字体导入仍推进。
|
||||
undo/save/reopen 与 depsgraph 求值;多 handle 连续 preview、handle-local 原点/正交方向及
|
||||
单次 Main commit 已完成,任意外部路径字体导入仍推进。
|
||||
4. N-015-D(`in_progress`):Three.js 主线程和 OffscreenCanvas Worker 共享 WNM chunks,真实
|
||||
PointCloud/Curves 可预览,Point/Curve bounded raycast、Metaball proxy 与 evaluated mesh 分层;
|
||||
左右 handle identity raycast/单 handle 轴向 gizmo 已完成;WebGPU、跨对象 selection history、
|
||||
多 handle 拖拽和 SceneDelta range patch 仍待完成。
|
||||
左右 handle identity raycast、跨对象 selection history、range patch、多 handle 拖拽和
|
||||
handle-local gizmo 已完成;WebGPU 等价显示仍待完成。
|
||||
5. N-015-E(`in_progress`):Blender 5.2 fixture、Chromium 双 renderer、depsgraph 真求值、GLB
|
||||
拒绝/映射和 USD loss report、Main roundtrip、desktop golden、7 对象 GLB/USD round-trip、
|
||||
1M binary gate、Worker restart 与 Chromium 真实 OPFS quota 已接入;VDB renderer 仍是
|
||||
当前阻断。后续浏览器验收仅覆盖 Chromium,不配置 Firefox/WebKit。
|
||||
1M binary gate、Worker restart 与 Chromium 真实 OPFS quota 已接入。VDB 转换请求、NanoVDB
|
||||
grid/material/chunk manifest、逐块 hash/range streamer、分阶段能力门、14 条真实资源 catalog
|
||||
和 OpenVDB 13 -> NanoVDB 32 desktop converter 已完成;server job、HTTP body 断点续传、OPFS、
|
||||
有界 Float32 WebGPU 双视口和 Main Volume 属性保存重开已有专项证据。GPU resident paging、
|
||||
联合重开、完整材质、大 bundle/OOM 和 golden 仍 `BLOCKED`。后续浏览器验收仅覆盖
|
||||
Chromium,不配置 Firefox/WebKit。
|
||||
|
||||
专项字段、验收命令和停止条件见 `docs/status/N-015.md`。
|
||||
|
||||
@@ -107,13 +113,15 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
1. N-016-A:Layer/Frame/Drawing/Stroke/Point/Attribute schema 与最大 layer/frame/point 预算。
|
||||
2. N-016-B:Main create/remove/reorder layer,insert/remove frame,draw/erase stroke transaction。
|
||||
3. N-016-C:material、onion skin、cyclic stroke、radius/opacity/color 和基础 modifier reader。
|
||||
4. N-016-D:Chromium 主线程/Offscreen 的 3D current-frame stroke preview 已完成;2D editor、
|
||||
stroke/point selection、timeline/dope integration、gizmo 和 worker restart 继续推进。
|
||||
4. N-016-D:Chromium 主线程/Offscreen 的 3D current-frame stroke preview、点 raycast、多选
|
||||
高亮、连续 drag preview、单次 gizmo Main commit、真实 drawing frame 的有界 Dope 导航和
|
||||
Worker 保存重开已完成;完整 2D canvas/marquee 与完整 timeline/dope 编辑继续推进。
|
||||
5. N-016-E:desktop drawing hash、像素 golden、save/reopen 和 GLB/USD loss report。
|
||||
|
||||
## N-017 Paint 与权重
|
||||
|
||||
1. N-017-A:Vertex Color/Weight/Texture Paint stroke schema、PBVH/UV hit 和 brush 预算。
|
||||
1. N-017-A:Vertex Color/Weight/Texture Paint stroke schema、UV hit、uniform-grid 候选查询、
|
||||
显式深度可见性门和 brush 预算;真实 PBVH/深度采样仍阻断。
|
||||
2. N-017-B:vertex color 与 vertex group Main transaction、normalize/limit/mirror 权重。
|
||||
3. N-017-C:packed/UDIM image tile transaction、色彩空间、dirty tile 和原子保存。
|
||||
4. N-017-D:armature deform golden、seam bleed、mask/face selection 和 undo/redo。
|
||||
@@ -123,21 +131,25 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
|
||||
1. N-018-A:Rigid Body、Soft Body、Cloth、Fluid、Dynamic Paint、Particle/Hair 能力清单。
|
||||
2. N-018-B:每 family 的 settings/dependency/cache manifest;目标对象和 collection 防循环。
|
||||
3. N-018-C:先消费 Blender desktop deterministic bake,frame seek 不允许复用错误帧。
|
||||
3. N-018-C:frame seek 不允许复用错误帧;浏览器自有 BTF1 已连接不可变 SceneIR preview、
|
||||
可取消顺序播放和跨 Storage Worker 重启精确读取;Blender desktop deterministic bake family
|
||||
decoder、正式 viewport UI 控制和 100 帧 golden 仍阻断。
|
||||
4. N-018-D:逐 family 探测 WASM solver;初始化、线程或内存门失败时保持 bake-only。
|
||||
5. N-018-E:浏览器 bake start/cancel/commit、故障恢复、长任务进度和 100 帧 golden。
|
||||
|
||||
## N-019 灯光与渲染
|
||||
|
||||
1. N-019-A:Camera、Light、World、View Transform、Exposure、Mist、Shadow 的完整 SceneIR。
|
||||
2. N-019-B:Three/WebGPU 映射和 capability report;材质/灯光变化使用增量更新。
|
||||
2. N-019-B:Three/WebGPU 映射和 capability report;共享 PBR 路径已应用有界 Kelvin 线性灯光
|
||||
颜色,材质/灯光变化使用增量更新。
|
||||
3. N-019-C:Eevee 有限特性矩阵、shadow map、transparent sorting、probe 和后处理。
|
||||
4. N-019-D:Cycles/Freestyle/硬件 denoise 使用服务端 Blender job 协议与结果 hash。
|
||||
5. N-019-E:desktop/Web 像素误差、色彩管理、设备丢失和 1M 三角形性能门。
|
||||
|
||||
## N-020 Compositor
|
||||
|
||||
1. N-020-A:Compositor GraphIR、socket/link、image/render-layer 资源和 cycle 校验。
|
||||
1. N-020-A:Compositor GraphIR、socket/link、image/render-layer 资源和 cycle 校验;真实 Main
|
||||
Exposure 与默认 Invert 参数链已进入 CPU executor,其他参数节点仍按 Unsupported 保留。
|
||||
2. N-020-B:Transform/Color/Alpha/Blur/Mix 等有限 node 的 CPU/WebGPU executor。
|
||||
3. N-020-C:viewer/composite output、frame cache、tile budget 和 worker cancellation。
|
||||
4. N-020-D:unsupported node 保留 metadata 并可提交服务端 Blender,不删图继续执行。
|
||||
@@ -146,7 +158,8 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
## N-021 Sequencer 与音频
|
||||
|
||||
1. N-021-A:Scene/Movie/Image/Sound/Effect/Meta strip schema、channel、range 和 proxy metadata。
|
||||
2. N-021-B:Main add/remove/move/trim/split、transition 和 modifier 白名单。
|
||||
2. N-021-B:Main add/remove/move/trim/split、transition 和 modifier 白名单;CROSS/GAMMA_CROSS
|
||||
已有真实依赖顺序、进度和静帧 source-frame 解析,尚未接媒体解码。
|
||||
3. N-021-C:WebCodecs/HTMLMedia capability probe、waveform/proxy 和精确 timeline seek。
|
||||
4. N-021-D:浏览器不支持的 codec/混音/编码提交服务端;资源路径必须沙箱化。
|
||||
5. N-021-E:A/V sync、frame hash、save/reopen、丢帧和损坏媒体测试。
|
||||
@@ -156,7 +169,8 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
1. N-022-A:MovieClip、Track/Marker、Plane Track、Mask Layer/Spline/Point schema。
|
||||
2. N-022-B:Main marker/mask edit、selection、keyframe 和 camera solve metadata。
|
||||
3. N-022-C:浏览器 tracking feature probe;完整 solve 可使用服务端 Blender。
|
||||
4. N-022-D:Clip/Mask editors、overlay 和 compositor/scene resource binding。
|
||||
4. N-022-D:Clip/Mask editors、overlay 和 compositor/scene resource binding;真实 Main Mask 的
|
||||
锁定过滤、稳定点 raycast 与 replace/add/toggle marquee 已验证。
|
||||
5. N-022-E:desktop solve/error golden、媒体故障、保存和重开。
|
||||
|
||||
## N-023 Asset、Library 与 IO
|
||||
@@ -165,7 +179,8 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
2. N-023-B:Append/Link/Library Override Main transaction、reload/relocate 和循环依赖门。
|
||||
3. N-023-C:glTF/OBJ/PLY/STL 首批本地 IO;USD/Alembic 按编译能力或服务端执行。
|
||||
4. N-023-D:每格式 import -> save -> reopen -> export -> desktop reimport 语义比较。
|
||||
5. N-023-E:zip bomb、路径穿越、外部 URI、许可证和大文件流式预算。
|
||||
5. N-023-E:zip bomb、路径穿越、外部 URI、许可证和大文件流式预算;archive 重复/前缀冲突、
|
||||
累计压缩预算和确定性 range plan 已落地,真实 ZIP 解码仍阻断。
|
||||
|
||||
## N-024 Editors 与工作流
|
||||
|
||||
@@ -175,6 +190,9 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
4. N-024-D:Blender-compatible keymap、可配置 shortcut、gizmo、drag preview/commit。
|
||||
5. N-024-E:desktop/mobile layout、键盘/触控/笔、无重叠截图和 accessibility 门。
|
||||
|
||||
当前有界切片还包括 workspace/editor/mode 作用域 keymap,以及可执行、上下文过滤的 F3
|
||||
operator search;这不等价于 Blender 全量 operator registry、context menu 或 editor writer。
|
||||
|
||||
## N-025 Scripting 与平台适配
|
||||
|
||||
1. N-025-A:默认拒绝任意 Python、Text autorun、driver expression 和 add-on 安装。
|
||||
@@ -183,6 +201,9 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
4. N-025-D:CUDA/Metal/HIP/OptiX、native window、file watcher 等返回平台能力报告。
|
||||
5. N-025-E:恶意脚本、依赖混淆、逃逸、重放和审计日志发布门。
|
||||
|
||||
当前拒绝审计已具备有界 SHA-256 链、严格 UTC 顺序、requestId replay 与篡改拒绝;
|
||||
无网络 sandbox 和持久化发布审计仍阻断。
|
||||
|
||||
## N-026 全域发布门
|
||||
|
||||
1. 生成 machine-readable parity manifest:每个 Blender family 为
|
||||
@@ -192,6 +213,11 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
|
||||
4. `.blend`/image/media/script fuzz、OPFS quota、OOM、设备丢失、网络中断和恢复验证。
|
||||
5. 许可证/source offer/SBOM、确定性包、文档状态与测试报告一致后才能发布。
|
||||
|
||||
当前证据为 13 条有效记录、15 个缺失,整体仍为 `BLOCKED`;新增 VDB 边界记录只证明
|
||||
转换/manifest/range 协议与显式阻断;已通过 1M geometry、
|
||||
600 帧 OPFS simulation cache、4K/8K texture、运行中断网和主线程 WebGL device loss,
|
||||
仍缺 10M geometry、长媒体、OOM 及 N-016 至 N-025 上游 family 的完整验收。
|
||||
|
||||
## 默认验收入口
|
||||
|
||||
新增任务必须把专项命令接入 `web/package.json`,并至少执行:
|
||||
|
||||
@@ -133,9 +133,9 @@ transmission material 数、shadow caster 数、WASM/GPU 内存压力和帧时
|
||||
|
||||
- PBR-007-A:done_current_scope;`render-assets.ts` 定义 schema v1、SHA-256、MIME/尺寸/字节预算和稳定错误码,App 从 `requestAsset` 生成载荷并同时写入 OPFS。
|
||||
- PBR-007-B:done_current_scope;Base Color/Emission 使用 sRGB,Normal/Data 使用 non-color/linear,主线程和 Worker 使用相同 `GPUTextureStore`。
|
||||
- PBR-007-C:in_progress;ImageBitmap 解码、旧 Texture dispose、状态回传已完成;mipmap、anisotropy、GPU context-loss 恢复和全局显存预算仍未开放。
|
||||
- PBR-007-C:in_progress;ImageBitmap 解码、旧 Texture dispose、状态回传和主线程 WebGL context-loss 恢复已完成;mipmap、anisotropy、Offscreen context-loss 恢复和全局显存预算仍未开放。
|
||||
- PBR-007-D:Normal Map 切线空间、UV Map 选择、wrap/filter 和缺失纹理 fallback。
|
||||
- PBR-007-E:in_progress;双后端同一载荷正例已覆盖,context-loss/Worker crash 后重新上传仍属于 PBR-011 故障注入门。
|
||||
- PBR-007-E:in_progress;双后端同一载荷正例和主线程真实 `WEBGL_lose_context` 恢复已覆盖,Offscreen context-loss/Worker crash 后重新上传仍属于 PBR-011 故障注入门。
|
||||
|
||||
### PBR-008 UDIM 与外部资源:in_progress(manifest/阻断已完成,多 tile 采样未声明)
|
||||
|
||||
@@ -169,7 +169,10 @@ transmission material 数、shadow caster 数、WASM/GPU 内存压力和帧时
|
||||
|
||||
- PBR-012-A:done_current_scope;`queryRenderCapability` 明确返回 `WEBGPU_RENDERER_UNAVAILABLE`,没有 WebGPU renderer bundle 时不伪装为 WebGPU。
|
||||
- PBR-012-B:done_current_scope(安全门);BLOOM/SSAO/SSR/TAA/DOF/MOTION_BLUR 未有真实 pass 时返回 `POSTPROCESS_PASS_UNAVAILABLE`,未声明假实现。
|
||||
- PBR-012-C:done_current_scope(安全门);Volume/SSS 返回独立 `VOLUME_SHADER_UNAVAILABLE`/`SUBSURFACE_SHADER_UNAVAILABLE`,任意 Shader node 返回 `SHADER_NODE_UNSUPPORTED`。
|
||||
- PBR-012-C:in_progress;Volume 已重新纳入 desktop/server OpenVDB -> NanoVDB + WebGPU
|
||||
路径,当前完成 manifest/material/range 安全门,真实 WGSL/材质/golden 前仍返回
|
||||
`VOLUME_SHADER_UNAVAILABLE`;SSS 与任意 Shader node 仍分别结构化阻断。详细任务见
|
||||
`docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md`。
|
||||
- PBR-012-D:浏览器 path tracer 若引入,作为独立 Render backend,不声称 Cycles 等价。
|
||||
|
||||
## 8. 当前验收
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Web Blender 项目现状与后续连续任务
|
||||
|
||||
更新时间:2026-08-12
|
||||
更新时间:2026-08-14
|
||||
|
||||
## 1. 当前结论
|
||||
|
||||
@@ -37,9 +37,10 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
|
||||
| SceneIR 扩展 | tangent/split normal/seam/sharp/vertex group/attribute/UV,native WBG1、资源 Delta 和 mesh byte-range patch | 已完成当前数据契约 |
|
||||
| Sculpt 属性 | Mask/Face Set 的 SceneIR、WBG1 header v2、Delta、Main、undo 和保存重开 | 已完成属性子集;有界四笔刷 Main stroke 已开放,PBVH/完整求值未开放 |
|
||||
| Simulation cache | Blender 5.2/source blend/hash/frame manifest、OPFS 内容寻址、schema 6、重启逐帧复验 | 已完成缓存安全层;Simulation evaluator 未开放 |
|
||||
| 发布性能/故障门 | Chromium 118 条 E2E、1M geometry、600 帧 OPFS cache、4K/8K texture、运行中断网、主线程 WebGL context loss | 已完成已声明门;10M、长媒体、OOM 和 Offscreen device loss 仍缺 |
|
||||
| Shader Main | RGB/Value/Principled/Image Texture/Normal Map/Output 整图事务、资源门和保存重开 | 已完成六节点写回子集;任意图/编译仍阻断 |
|
||||
| NLA Main | 单对象 Action Clip 整栈写回、SceneIR 重开和 native frame 求值 | 已完成有限 Action Clip 子集 |
|
||||
| 非 Mesh 数据块 | Curve/Surface/Font/Metaball Main 权威写回与保存重开、真实 evaluated mesh、PointCloud/Curves/Hair 属性、WNM chunks、双 viewport、desktop golden 与 7 对象 GLB/USD round-trip | 有界本地切片 in_progress;VDB renderer、完整 topology editor/跨对象 history/range patch、外部字体导入、跨浏览器 OPFS 性能仍阻断 |
|
||||
| 非 Mesh 数据块 | Curve/Surface/Font/Metaball Main 权威写回与保存重开、真实 evaluated mesh、PointCloud/Curves/Hair 属性、WNM chunks、双 viewport、handle-local 连续 preview/单次 Main commit、desktop golden 与 7 对象 GLB/USD round-trip | N-015 整体 BLOCKED;VDB 资源 catalog、desktop OpenVDB->NanoVDB 与分块协议已完成,server/WebGPU/保存重开/golden 未完成 |
|
||||
|
||||
## 3. 部分完成或仍有边界的能力
|
||||
|
||||
@@ -52,7 +53,7 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
|
||||
| `.blend` 保存 | 场景状态、modifier、Mesh Edit、材质/UV、动画/约束和对象层级命令均写 Main;历史、原子保存、快照和日志重放可恢复 | skin/shape-key decimate 保持结构化阻断 |
|
||||
| Blender UI 对标 | 默认区域、当前 Mesh Edit、raycast、多选、拖拽 gizmo、层级/材质/动画面板和核心快捷键已闭环 | Sculpt、Geometry Nodes 编辑器等未声明能力继续结构化阻断 |
|
||||
| 未声明能力扩展 | 四项协议/安全门均已细分;Sculpt 属性/有界 Main stroke、Simulation cache、六节点 Shader Main 和 Action Clip NLA Main 已有正例 | PBVH、GN lazy-function/Simulation 求值、其余 Shader Node、Web compiler、完整 NLA/UI/GLB 图映射仍 planned/结构化阻断 |
|
||||
| 非 Mesh 数据块 | 1M 点 reader budget、ID_MB/PT/VO/VF 注册、Main control-point/topology/body/element/Font style link commands、一维多 spline 与批量 handle/cyclic、二维 Surface topology transaction、undo/save/reopen、真实 evaluated mesh、WNM SHA chunks、handle raycast/gizmo、7 对象 GLB/USD 和 Chromium quota | 多 handle 选择拖拽/gizmo UI、跨对象 history/range delta、新外部字体导入、VDB renderer/voxel upload 仍 planned/阻断 |
|
||||
| 非 Mesh 数据块 | 1M 点 reader budget、ID_MB/PT/VO/VF 注册、Main control-point/topology/body/element/Font style link commands、一维多 spline 与批量 handle/cyclic、二维 Surface topology transaction、undo/save/reopen、真实 evaluated mesh、WNM SHA chunks、handle raycast/handle-local 连续 preview/单次 commit、7 对象 GLB/USD、Chromium quota、VDB/NanoVDB 协议与 desktop converter | 新外部字体导入及 VDB server job、WebGPU renderer、材质、保存重开和 golden 仍 planned/阻断 |
|
||||
| 大场景 | Worker 二进制解码、per-mesh/range transferable、linked Mesh 实例化、LOD/OPFS cache、frustum culling、能力门 OffscreenCanvas Worker、100k/1M 内存门 | 超出当前 WBG1 的网络式渐进流送仍属于后续性能扩展 |
|
||||
| Decimate 全对标 | Collapse 的当前网格集合已覆盖,错误路径结构化 | Un-Subdivide、Dissolve、所有 delimiter/权重/对称组合及大模型性能矩阵未完成 |
|
||||
|
||||
@@ -181,9 +182,11 @@ Blender 5.2 全域功能矩阵、浏览器/服务端边界和 N-015 至 N-026
|
||||
`NonMeshDataIR`、native SDNA reader、Main 权威 Curve/Surface/Font/Metaball 写回、bounded Poly Curve create/delete、Poly/Bezier conversion、非 Mesh 数据块 rename、Curve 有界 topology/Font geometry、undo/redo、
|
||||
save/reopen、真实 legacy evaluated mesh、PointCloud/Curves 属性和 WNM 二进制分块已经接通。
|
||||
主线程与 OffscreenCanvas 消费同一 chunks;GLB 只接受真实 evaluated mesh,USD 提供
|
||||
`UsdGeomMesh`、`UsdGeomPoints`、`UsdGeomBasisCurves` 和 `OpenVDBAsset` 的机器可读映射/损失。
|
||||
VDB renderer、完整 Curve handle/cyclic topology editor、二维 Surface mutation、跨对象 history/range patch、新字体导入和跨浏览器 OPFS quota 仍按
|
||||
`docs/status/N-015.md` 的阻断项推进。
|
||||
`UsdGeomMesh`、`UsdGeomPoints` 和 `UsdGeomBasisCurves` 的机器可读映射/损失。
|
||||
VDB 已改为 desktop/server OpenVDB -> NanoVDB、浏览器分块读取 + WebGPU。真实资源 catalog、
|
||||
desktop converter 和协议/range 基础件已接通,但 server job、renderer、材质、保存重开和 golden 仍阻断;handle-local 专用 gizmo
|
||||
已接通,新字体导入等剩余项按 `docs/status/N-015.md` 和
|
||||
`docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md` 推进。
|
||||
|
||||
### PBR-001 至 PBR-012 模型物理渲染(核心切片 done_current_scope,资产/高级渲染安全门 in_progress)
|
||||
|
||||
@@ -192,10 +195,19 @@ VDB renderer、完整 Curve handle/cyclic topology editor、二维 Surface mutat
|
||||
现已接通 SHA-256 GPU 纹理载荷、颜色空间、尺寸预算、ImageBitmap 解码和双后端状态;PBR-008
|
||||
现已接通 UDIM manifest/缺失资源/多 tile 结构化阻断;PBR-009 已支持有限 packed raster
|
||||
equirectangular PMREM/IBL 生命周期;PBR-012 已提供 WebGPU、任意 Shader、Volume/SSS 和
|
||||
高级后处理的能力查询门。HDR/EXR、多 tile 采样、context-loss 恢复、真实 WebGPU renderer、
|
||||
高级后处理的能力查询门。主线程 WebGL context-loss 已有显式恢复与真实 Chromium 门;
|
||||
HDR/EXR、多 tile 采样、Offscreen context-loss、真实 WebGPU renderer、
|
||||
高级 pass 和未声明 Shader 家族仍不得声称完成。架构映射、细分状态、停止条件和验收命令统一维护在
|
||||
`docs/PBR_RENDERING_IMPLEMENTATION_PLAN.md`。
|
||||
|
||||
### N-026 当前发布实况
|
||||
|
||||
`docs/status/release-evidence.json` 已生成 13 条成功 command/output/artifact-hash 记录;其中
|
||||
VDB 边界记录没有设置发布 true 字段,只证明 Phase 0 协议门。
|
||||
`test:release-evidence` 计算为 15 个缺失并保持 `BLOCKED`。其中 3 个是实际证据字段
|
||||
`performance.geometry10M`、`performance.longMedia`、`faults.oom`,其余 12 个来自仍为
|
||||
`BLOCKED` 的 N-016 至 N-026 family。浏览器范围仅为 Chromium。
|
||||
|
||||
## 6. 当前验收命令
|
||||
|
||||
```bash
|
||||
@@ -223,9 +235,16 @@ npm --prefix web run test:topology-collapse
|
||||
npm --prefix web run test:capability-gates
|
||||
npm --prefix web run test:simulation-cache
|
||||
npm --prefix web run test:release-performance
|
||||
npm --prefix web run test:simulation-cache-performance
|
||||
npm --prefix web run test:network-interruption
|
||||
npm --prefix web run test:device-loss
|
||||
npm --prefix web run test:texture-4k-performance
|
||||
npm --prefix web run test:texture-8k-performance
|
||||
npm --prefix web run test:malicious-blends
|
||||
npm --prefix web run test:browser
|
||||
npm --prefix web run release:offline
|
||||
npm --prefix web run release:evidence
|
||||
npm --prefix web run test:release-evidence
|
||||
WEB_TEST_PORT=5193 npm --prefix web run test:e2e # 5173 被占用时指定可用端口
|
||||
WEB_TEST_PORT=5193 npm --prefix web run test:e2e -- -g "N-015|non-mesh"
|
||||
```
|
||||
|
||||
242
docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md
Normal file
242
docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md
Normal file
@@ -0,0 +1,242 @@
|
||||
# VDB -> NanoVDB -> WebGPU 实施方案
|
||||
|
||||
更新时间:2026-08-13
|
||||
|
||||
## 1. 范围与完成定义
|
||||
|
||||
VDB 重新纳入 N-015/N-019/N-023/N-026。产品链路固定为:桌面工具或受控服务端使用
|
||||
OpenVDB 读取 `.vdb`,转换为 NanoVDB;浏览器只读取受校验的 `.nvdb` 分块,并由 WebGPU
|
||||
执行稀疏树遍历、采样和体积积分。
|
||||
|
||||
浏览器 Blender WASM 必须继续保持 `WITH_OPENVDB=OFF`。`WITH_OPENVDB=ON` 或
|
||||
`WITH_NANOVDB=ON` 只能证明编译/链接选项,不能证明以下能力:
|
||||
|
||||
- 外部 VDB 的受限读取、分块上传、失败恢复和缓存淘汰;
|
||||
- NanoVDB 数据布局与 WGSL 遍历正确;
|
||||
- density/temperature/color/emission/velocity 的 Blender 材质语义;
|
||||
- `.blend` 保存、转换产物绑定、重开和资源丢失诊断;
|
||||
- 与 Blender 5.2 桌面图像/数值 golden 一致;
|
||||
- 大体积、损坏输入、OOM、取消和 Chromium WebGPU 性能门。
|
||||
|
||||
只有上述链路均有真实资源与自动测试证据时,VDB 才能从 `BLOCKED` 转为可发布能力。
|
||||
|
||||
## 2. 架构和信任边界
|
||||
|
||||
```text
|
||||
.blend + .vdb
|
||||
|
|
||||
| source SHA-256, grid allowlist, budgets
|
||||
v
|
||||
Desktop/Server Blender 5.2 + OpenVDB + NanoVDB
|
||||
|
|
||||
| deterministic .nvdb + manifest.json + converter identity
|
||||
v
|
||||
Project asset store / HTTP Range / OPFS content-addressed cache
|
||||
|
|
||||
| contiguous ranges, per-chunk SHA-256, whole-bundle SHA-256
|
||||
v
|
||||
Chromium Storage/Render Worker
|
||||
|
|
||||
| bounded GPU pages, validated grid ranges and transforms
|
||||
v
|
||||
WebGPU storage buffers + WGSL NanoVDB traversal + volume integrator
|
||||
```
|
||||
|
||||
信任边界如下:
|
||||
|
||||
1. `.vdb` 是不可信输入,只允许进入桌面/服务端转换沙箱;浏览器不加载 OpenVDB。
|
||||
2. 转换器输出也不直接信任。浏览器先校验 schema、路径、预算、连续 range、分块 hash 和整包
|
||||
hash,再允许 GPU 上传。
|
||||
3. manifest 是持久化真源,路径必须位于项目资源根;HTTP 必须返回精确 `206 Content-Range`,
|
||||
OPFS 必须使用 content-addressed key。
|
||||
4. GPU resident set 独立受限,CPU/网络总包预算不能代替 GPU 预算。
|
||||
5. Main 只保存源绑定、转换版本、产物 hash、grid/material 映射;不能把临时 URL 或未验证
|
||||
GPU 状态写成已完成资源。
|
||||
|
||||
## 3. 产物与协议
|
||||
|
||||
### 3.1 转换请求
|
||||
|
||||
`VDBConversionRequestIR` 固定记录 schema、job、项目内 `.vdb` 路径、源字节数/hash、源 grid
|
||||
清单、选择 grid、量化策略、分块大小和输出 `.nvdb` 路径。`VDBConverterIdentityIR` 固定记录
|
||||
DESKTOP/SERVER、Blender/OpenVDB/NanoVDB 版本和转换器可执行文件 hash。
|
||||
|
||||
同一源 hash、转换器 identity、选择 grid、量化和 chunk size 必须产生相同的 bundle hash;分别生成
|
||||
但语义相同的 OpenVDB fixture 允许因文件 UUID 而有不同源 hash,其 NanoVDB grid/bundle 应一致。
|
||||
job ID 和输出路径不进入内容键;不能仅以文件名作为缓存键。
|
||||
|
||||
### 3.2 NanoVDB bundle manifest
|
||||
|
||||
`NanoVDBBundleManifestIR` schema 1 记录:
|
||||
|
||||
- 源 `.vdb` 与 bundle `.nvdb` 的项目路径、长度和 SHA-256,以及包含 grid/量化/chunk 参数的
|
||||
canonical conversion request SHA-256;
|
||||
- 每个 grid 的 value type/class/semantic、active voxel、标准 NanoVDB segment 范围、内部 grid
|
||||
payload 范围、index/world bounds、voxel size 和 4x4 index-to-world;文件内 payload 偏移不要求
|
||||
对齐,上传到 GPU storage buffer 时另行满足 32-byte alignment;
|
||||
- density/temperature/color/emission/velocity 材质绑定和受限参数;
|
||||
- 32-byte 对齐、连续覆盖整个 bundle 的 chunks,以及每块 SHA-256;
|
||||
- `NANOVDB_STORAGE_BUFFER`、GPU page/resident budget 和 `volume-wgsl-v1` 语义版本。
|
||||
|
||||
首期 GPU value type 白名单为 Float32、Float16、Vec3f32、Vec4f32。Double、Bool、Int、Point
|
||||
Index、未知 grid class 返回 `NANOVDB_GRID_UNSUPPORTED`,不进行隐式转换。
|
||||
|
||||
### 3.3 浏览器流送
|
||||
|
||||
`streamNanoVDBChunks` 串行执行 range read -> 分块 hash -> consumer upload,并在每块后报告字节
|
||||
进度。串行是首期的确定性基线;通过内存峰值和取消测试后才能加入最多 4 路的有界并发。
|
||||
`createHttpNanoVDBRangeSource` 只接受 HTTP 206,且 `Content-Range` 的起点、终点、总长度必须
|
||||
与 manifest 精确一致。resumable adapter 对临时状态和网络异常做有界重试;response body 中断后
|
||||
保留已收字节,以相同 ETag 的 `If-Range` 从精确偏移续传,干净结束的短响应仍直接拒绝。
|
||||
|
||||
OPFS 适配器以 `bundleSha256/chunkIndex` 为 key 原子提交。所有块校验完成后才提交完整 bundle
|
||||
manifest;中断留下的 staging 数据不会被重开流程发现,重开后的每次 chunk 读取仍重新校验 SHA-256。
|
||||
|
||||
## 4. 材质与渲染语义
|
||||
|
||||
首期声明 `Principled Volume` 有界子集:
|
||||
|
||||
| Blender 语义 | NanoVDB/manifest | WebGPU 行为 |
|
||||
| --- | --- | --- |
|
||||
| Density | `densityGrid` + `densityScale` | 非负消光/散射密度 |
|
||||
| Temperature | `temperatureGrid` + scale | 只在 Blackbody emission 开启时采样 |
|
||||
| Color | `colorGrid` 或常量颜色 | 线性工作空间散射颜色 |
|
||||
| Emission | `emissionGrid` + scale | 线性辐射项;负值钳制并报告 |
|
||||
| Velocity | `velocityGrid` | 首期仅保留/报告,motion blur 未验证前不消费 |
|
||||
| Anisotropy | manifest scalar | Henyey-Greenstein,范围 `[-0.99, 0.99]` |
|
||||
|
||||
首期只开放单 Volume、单散射/吸收积分、线性/最近采样、对象变换和 scene exposure。多重散射、
|
||||
体积阴影、烟火黑体、motion blur、多个 volume overlap、Cycles 等价保持独立阻断。
|
||||
|
||||
WGSL 实现必须包括 NanoVDB header/version/magic 检查、root/internal/leaf address 上界检查、空
|
||||
节点跳跃、index-to-world/world-to-index、ray-box intersection、自适应步长上限、early
|
||||
transmittance termination 和 NaN 防护。shader 不能通过越界 buffer read 猜测无效节点。
|
||||
|
||||
## 5. 保存与重开
|
||||
|
||||
保存流程分两层:
|
||||
|
||||
1. Blender Main 中的 Volume 保留项目相对 `.vdb` 引用和 grid/material 参数。
|
||||
2. Web project manifest 保存 `sourceSha256 -> conversion request -> bundleSha256` 绑定、转换器
|
||||
identity、chunk manifest 和 OPFS/object-store 定位信息。
|
||||
|
||||
重开时先比较 `.blend` Volume 引用、源 hash 和 bundle manifest。源改变、converter 改变、bundle
|
||||
缺失、hash 不符或 shader semantic version 不符均返回结构化 `BLOCKED` 并要求重转;不能静默
|
||||
复用旧缓存。保存成功标准包括:清空 Worker、重新打开 `.blend`、重新发现 bundle、逐块复验、
|
||||
恢复同一 grid/material 映射并得到相同像素/采样摘要。
|
||||
|
||||
## 6. 详细任务分解
|
||||
|
||||
### Phase 0:能力声明与协议
|
||||
|
||||
- `VDB-001`:删除浏览器伪 decoder 入口,raw `.vdb` 浏览器解码固定返回
|
||||
`VDB_CONVERSION_REQUIRED`。状态:`done_current_scope`。
|
||||
- `VDB-002`:实现 source manifest、conversion request、converter identity、路径/hash/预算门。
|
||||
状态:`done_current_scope`。
|
||||
- `VDB-003`:实现 NanoVDB bundle/grid/material/GPU/chunk manifest、range plan、分块与整包
|
||||
hash 校验。状态:`done_current_scope`。
|
||||
- `VDB-004`:实现串行 range streamer 和严格 HTTP 206 适配器。状态:`done_current_scope`。
|
||||
- `VDB-005`:能力门分别报告 desktop converter、server converter、stream、WebGPU renderer;
|
||||
禁止单一布尔值概括全链路。状态:`done_current_scope`。
|
||||
|
||||
### Phase 1:真实资源与转换器
|
||||
|
||||
- `VDB-010`:在本机资源库收录许可证明确的 tiny smoke、density+temperature、color、level-set、
|
||||
大稀疏体积和损坏文件;记录来源 URL、许可证、原始 SHA-256。状态:`done_current_scope`;
|
||||
资源库为 `/home/mes123456/resource-library/blender-web-vdb`,含 14 条受 hash 约束记录。
|
||||
- `VDB-011`:建立 native/desktop CMake preset,OpenVDB 只在该目标开启;固定 Blender 5.2、
|
||||
OpenVDB/NanoVDB 版本并生成可执行文件 hash。状态:`done_current_scope`;desktop target 实际
|
||||
链接 OpenVDB 13.0/TBB 并生成 NanoVDB 32.9,浏览器仍保持 `WITH_OPENVDB=OFF`。
|
||||
- `VDB-012`:实现 grid inventory 预扫、allowlist、active voxel/内存/输出预算和取消,调用官方
|
||||
OpenVDB/NanoVDB API 写出确定性 `.nvdb`。状态:`done_current_scope`;inventory、allowlist、源/输出/
|
||||
grid/active voxel 预算、LOSSLESS/FP16、report、确定性、cancel-file、timeout 和失败原子清理已验证。
|
||||
- `VDB-013`:实现服务端 job API:content hash 幂等、上传/转换/下载、进度、超时、取消、日志、
|
||||
不可信输入隔离和输出签名。状态:`done_current_scope`;当前以 bubblewrap、只读 root、资源限制、
|
||||
HMAC 构件签名和原子输出为受控本地服务基线。
|
||||
- `VDB-014`:桌面与服务端对同一 fixture 的 manifest/bundle hash 相同;版本变化必须导致缓存
|
||||
key 变化。状态:`done_current_scope`;语义相同的 VDB、官方 sphere 重转及桌面/隔离服务端
|
||||
转换均得到相同 NanoVDB hash。
|
||||
|
||||
### Phase 2:存储与流送
|
||||
|
||||
- `VDB-020`:实现项目 asset manifest 和 source/bundle binding,支持 source hash 变化失效。
|
||||
状态:`done_current_scope`。
|
||||
- `VDB-021`:实现 OPFS range source、staging/journal/atomic commit、重启发现和 LRU page cache。
|
||||
状态:`done_current_scope`;已验证真实 bundle、取消清理、Worker 重开、tamper gate 和 bundle LRU。
|
||||
- `VDB-022`:实现 HTTP Range 重试、ETag/If-Range、断点续传、重复/乱序/短响应拒绝。
|
||||
状态:`done_current_scope`;临时状态/网络异常重试、稳定 ETag、response-body 精确偏移续传、
|
||||
ETag 改变、错位 `Content-Range`、短响应和逐块 hash 均有 Chromium 故障门。
|
||||
- `VDB-023`:增加网络中断、Worker terminate、quota、tamper、manifest rollback 测试。
|
||||
状态:`done_current_scope`;网络/body 中断、Worker terminate、真实 OPFS quota、chunk tamper、
|
||||
manifest rollback、incomplete staging recovery 和旧 bundle 保持均已验证。
|
||||
- `VDB-024`:在 512 MiB CPU、1 GiB bundle、512 MiB GPU 上限下验证峰值;不得整包复制到
|
||||
JS heap。`planned`。
|
||||
|
||||
### Phase 3:WebGPU NanoVDB
|
||||
|
||||
- `VDB-030`:加入 Chromium WebGPU capability probe、adapter/device limits 和 device loss 状态机。
|
||||
状态:`done_current_scope`;真实 adapter/device limit probe、device loss、device 重建和重传后
|
||||
固定点 sample 一致已完成;生产视口资源重建仍归 `VDB-034`。
|
||||
- `VDB-031`:实现 NanoVDB Float/Vec leaf traversal WGSL 和 CPU reference sampler;用固定 index
|
||||
点比较值与 active/inactive 状态。状态:`in_progress`;Float32 CPU/WGSL 与 native sample 已逐点
|
||||
一致,Float16/Vec 仍保持阻断。
|
||||
- `VDB-032`:实现 GPU page allocator、storage buffer upload、indirection、resident LRU 和
|
||||
dispose;每页上传前已通过 chunk hash。`BLOCKED`。
|
||||
- `VDB-033`:实现对象 bounds raycast、front-to-back ray marching、步长/early exit 和深度合成。
|
||||
状态:`in_progress`;有界正交 bounds、front-to-back integration、early exit 和确定性 96x96
|
||||
Chromium 图像已完成,生产相机深度合成待接入。
|
||||
- `VDB-034`:接入主线程/Offscreen renderer 的相同 volume scene delta;device loss 后重建已
|
||||
验证页面。`BLOCKED`。
|
||||
|
||||
### Phase 4:材质、Main 与导出
|
||||
|
||||
- `VDB-040`:读取 Blender Volume/Principled Volume 节点并生成显式 material mapping/loss report。
|
||||
状态:`in_progress`;density、常量 color/emission、anisotropy、nearest/linear 已映射,
|
||||
color/temperature/emission grid 和 velocity 明确生成 loss。
|
||||
- `VDB-041`:density/temperature/color/emission/anisotropy 的 Main writer、undo/redo 和原子事务。
|
||||
状态:`in_progress`;Volume source/display/interpolation/step/velocity Main 写回、undo/redo、保存重开
|
||||
已完成,Principled Volume 完整节点事务仍阻断。
|
||||
- `VDB-042`:保存 `.blend` 与 Web asset binding,清空 Worker 后重开并重新流送。`BLOCKED`。
|
||||
状态:`in_progress`;Main Volume 保存重开与 OPFS asset binding/Worker 重开分别通过,尚待生产视口
|
||||
联合重开闭环。
|
||||
- `VDB-043`:GLB 明确报告 Volume 无核心映射;USD 仅在 desktop USD/OpenVDB 路径真实可用时
|
||||
写入 field asset,不把 bounds proxy 当体积导出。`BLOCKED`。
|
||||
|
||||
### Phase 5:真实验收与发布
|
||||
|
||||
- `VDB-050`:desktop OpenVDB -> NanoVDB grid count/name/type/transform/bounds/value sample golden。
|
||||
- `VDB-051`:Blender 5.2 与 Chromium WebGPU 的至少 3 个视角像素 golden,分别比较 alpha、
|
||||
transmittance、color,记录容差与色彩空间。
|
||||
- `VDB-052`:64 MiB/512 MiB/1 GiB sparse bundle 的首帧、渐进清晰、峰值 CPU/GPU 和取消门。
|
||||
- `VDB-053`:损坏 magic/version/tree offset/hash、zip bomb 等价超预算、NaN transform、设备丢失、
|
||||
网络中断和 OOM 门。
|
||||
- `VDB-054`:保存重开、资源缺失、源变更重转、旧 schema migration、离线 OPFS 重开。
|
||||
- `VDB-055`:N-026 证据记录包含真实转换器、资源、Chromium WebGPU、desktop golden 和构件 hash。
|
||||
|
||||
Phase 5 全部任务当前为 `BLOCKED`,不能由 Phase 0 的协议 fixture 代替。
|
||||
|
||||
## 7. 验收命令与停止条件
|
||||
|
||||
当前可运行门:
|
||||
|
||||
```bash
|
||||
npm --prefix web run typecheck
|
||||
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
|
||||
```
|
||||
|
||||
阶段停止条件:
|
||||
|
||||
- 新增资源若无许可证/来源/hash:不得进入 VDB catalog 或 golden。
|
||||
- desktop converter 已构建;server job API 未实现时 `SERVER_CONVERSION` 保持 `BLOCKED`。
|
||||
- 无 CPU reference sample 对照:WGSL traversal 不得进入 `READY`。
|
||||
- 仅能显示 box/point proxy:体渲染仍为 `BLOCKED`。
|
||||
- 未验证 material mapping、Main 保存重开或 desktop/Chromium golden:N-015 与 N-019 仍为
|
||||
`BLOCKED`。
|
||||
- Chromium 是当前唯一浏览器门;不配置 Firefox/WebKit,也不把未测浏览器写成兼容。
|
||||
@@ -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 proxy;depsgraph 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 metadata,raw `.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 场景中做绝对坐标 preview,pointer 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
|
||||
widths,typed WNM 属性映射 primvars,GLB 属性损失结构化报告,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 identity;UI 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 hash,chunk 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-D2:evaluated preview 与源控制笼分层显示、WebGPU 等价。
|
||||
6. N-015-E1:补齐 Volume 的完整 loss fixture;PointCloud/Curves/Hair、Curve line bake、真实
|
||||
4x4 NURBS Surface mesh、desktop geometry golden、7 对象 GLB 与 USDA desktop round-trip 已通过。
|
||||
7. N-015-E2:100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quota;Chromium
|
||||
3. N-015-D1:跨对象 selection history、多目标 element identity、range patch、左右 handle
|
||||
raycast、多 handle preview、handle-local gizmo 与单次 Main 写回已完成。
|
||||
4. N-015-D2:evaluated preview 与源控制笼分层显示、WebGPU 等价。
|
||||
5. N-015-B3/D2/E1(Volume):真实资源、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-E2:100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quota;Chromium
|
||||
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 不得进入 GLB;GLB 只能消费 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"
|
||||
```
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# N-016 Grease Pencil
|
||||
|
||||
状态:`BLOCKED`(协议、有限 reader/Main transaction、当前帧及相邻帧 onion preview 已落地;
|
||||
完整 2D/3D 编辑器、modifier 语义和桌面 golden 仍阻断)
|
||||
完整 2D canvas/Dope 编辑、modifier 语义和桌面 golden 仍阻断)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -28,12 +28,24 @@
|
||||
有界 X 轴平移;协议先校验 point identity、revision、有限坐标和 1M 点预算,再保留 radius、
|
||||
opacity、vertex color、cyclic、material index 并合并为一个 `setGreasePencilStrokes` Main
|
||||
transaction。它是点级整帧原子写回,不等同于完整 2D 画布选择或连续 gizmo。
|
||||
8. N-016-D(视口点编辑部分):当前 drawing 为每条 stroke 建立独立 Three `Points` 代理,
|
||||
主线程和 OffscreenCanvas 使用 data/layer/frame/stroke/point 五级身份 raycast;Edit Mode
|
||||
可高亮、Shift/Ctrl 多选同一 drawing 的点,并由轴向 gizmo 合并为一个 revision-bound
|
||||
`setGreasePencilStrokes` Main transaction。跨 drawing 追加会重置选择,避免错误混写。
|
||||
9. N-016-D(连续预览部分):轴向 gizmo 的 pointer move 从当前 SceneIR 绝对计算选中点坐标,
|
||||
同时更新真实 stroke 线和隐藏 point raycast proxy;pointer cancel/commit 均恢复预览基线,
|
||||
pointer up 才提交一次 Main。主线程与 OffscreenCanvas 重复回归一致。
|
||||
10. N-016-D(时间线部分):现有 Dope Sheet 在活动 Grease Pencil 对象上显示真实 layer drawing
|
||||
frame 并通过既有 `setFrame` Main 命令导航;不提供帧拖拽、重排或插值伪语义。
|
||||
11. N-016-D(重启部分):真实 Grease Pencil fixture 经首个 WebEngine Worker 点编辑和 `.blend`
|
||||
保存后,终止 Worker 并由全新 Worker 重开;data/layer/drawing identity、位置、radius、opacity
|
||||
均重新解析验证。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-016-C:material datablock 事务、onion fade/range 完整语义和完整 Grease Pencil modifier reader。
|
||||
- N-016-D:2D 画布 raycast/marquee、多点可视选择、timeline/dope integration、连续 gizmo 和
|
||||
worker restart;3D current-frame stroke viewport 与 Properties 单点原子平移已完成。
|
||||
- N-016-D:完整 2D canvas/marquee 和完整 timeline/dope 编辑;3D current-frame 点 raycast、
|
||||
多点高亮、连续 preview、单次 gizmo commit、有界 drawing frame 导航和 worker restart 已完成。
|
||||
- N-016-E:desktop drawing hash、Chromium 像素 golden、GLB/USD loss report 和 OPFS。
|
||||
|
||||
## 验收
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# N-017 Paint 与权重
|
||||
|
||||
状态:`BLOCKED`(stroke/patch schema、真实 Three raycast 命中、Main 顶点色/权重 transaction
|
||||
已落地;PBVH brush、texture paint 和 GPU/image 生命周期未实现)
|
||||
状态:`BLOCKED`(stroke/patch schema、真实 Three raycast 命中、选择/遮罩门和 Main 顶点色/权重
|
||||
transaction 已落地;PBVH brush、texture paint 和 GPU/image 生命周期未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -25,15 +25,25 @@
|
||||
front-face 法线门;它不宣称 PBVH 加速或桌面 brush 等价。`UdimTilePatchIR` 约束 1001-1999
|
||||
tile、RGBA8、色彩空间、尺寸/256 MiB 预算、revision、base/result SHA-256,并在内存中验证
|
||||
原子 range patch;尚未绑定 Blender packed image/UDIM Main 写回与保存。
|
||||
9. N-017-A(空间查询部分):uniform-grid spatial index 在 1M vertex/1M cell 预算内按 brush AABB
|
||||
粗筛候选,再执行球半径、front-face、falloff 精筛;depth-gated 查询必须显式提供已验证可见
|
||||
vertex ID 集合,缺失或重复会拒绝。该结构减少全量扫描,但不是 Blender PBVH。
|
||||
10. N-017-A/B(选择与遮罩部分):brush query 可要求稳定 vertex identity 的 selection 硬门,并以
|
||||
`[0,1]` mask weight 乘入 falloff;重复、未知或越界 identity 会拒绝。颜色和权重 patch 以当前
|
||||
revision、当前值、目标值及 brush weight 确定性混合,过期 revision 不会提交。
|
||||
11. Properties paint 面板可对当前真实 VERT selection 执行 selection-masked `Blend Color` 和
|
||||
`Blend Weight`,每次仅提交一个 Main transaction。Blender 5.2 reader 从 Mesh
|
||||
`vertex_group_names` 恢复顶点组摘要及 skin weight 名称;新增组经 undo/redo、保存重开后保持。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-017-A:真实 PBVH 加速结构、由深度缓冲生成的遮挡标记,以及 brush falloff 与桌面语义的
|
||||
golden 对照;基础 Mesh/UV raycast hit 和有界 CPU 候选 falloff 已完成。
|
||||
- N-017-A:真实 PBVH、由 viewport 深度缓冲生成可见 vertex 集合,以及 brush falloff 桌面
|
||||
golden;基础 Mesh/UV hit、uniform-grid 候选查询和可见性硬门已完成。
|
||||
- N-017-B:limit/clean、已验证拓扑映射上的 mirror、桌面 brush/falloff 对照。
|
||||
- N-017-C:Blender packed/UDIM tile Main transaction、dirty tile、色彩转换和原子保存;当前
|
||||
只有内容哈希绑定的浏览器内存 patch 边界。
|
||||
- N-017-D/E:armature golden、seam bleed、mask/selection、GPU dispose、quota、坏图和 UI。
|
||||
- N-017-D/E:armature golden、seam bleed、face mask、GPU dispose、quota、坏图和桌面 UI 对照;
|
||||
vertex selection 与数值 mask 门已完成,不等同于完整 Paint 面/纹理遮罩系统。
|
||||
|
||||
## 验收
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# N-018 Physics 与 Simulation
|
||||
|
||||
状态:`BLOCKED`(family capability、settings/dependency/cache manifest 与错误帧门已落地;
|
||||
cache playback、WASM solver 和 bake job 未实现)
|
||||
状态:`BLOCKED`(family capability、settings/dependency/cache manifest、错误帧门及浏览器自有
|
||||
BTF1 播放会话已落地;desktop bake playback、WASM solver 和 bake job 未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -24,12 +24,22 @@ cache playback、WASM solver 和 bake job 未实现)
|
||||
frame、对象 stable ID、精确字节长度、有限 translation、单位 quaternion、非零 scale 和重复
|
||||
ID。该格式仅是浏览器自有的 cache playback primitive,不是 Blender desktop bake family
|
||||
payload,因此 capability inventory 的 `cachePlayback` 仍为 `BLOCKED`。
|
||||
8. N-018-C(预览适配):精确帧匹配的 BTF1 可不可变地映射到 SceneIR preview,按 stable object
|
||||
ID 更新 translation/quaternion/scale、Euler、local/world matrix 和当前帧;未知对象、错帧、
|
||||
层级环或缺父对象拒绝。该适配只证明浏览器自有 transform cache,不改变 desktop family
|
||||
bake playback 的 `BLOCKED` 状态。
|
||||
9. N-018-C(浏览器播放会话):BTF1 支持有界范围顺序播放、精确 seek 和 cancel;新请求会使旧
|
||||
异步读取失效,即使底层读取器忽略 `AbortSignal`,迟到结果也不会覆盖当前预览。每帧都从同一
|
||||
不可变基准 SceneIR 应用绝对变换,避免逐帧累计误差。
|
||||
10. N-018-C(持久缓存集成):两帧真实 BTF1 经过 content-addressed Simulation cache 写入,终止
|
||||
Storage Worker 后由新 Worker 精确 range 读取第二帧并应用到 SceneIR;帧 hash、magic、offset
|
||||
和最终 object translation 均验证。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-018-A/B:从真实 Main 提取完整 family settings、collection/effector/collision 依赖。
|
||||
- N-018-C:desktop bake payload 的逐 family decoder、与 depsgraph/viewport 的 frame playback
|
||||
连接和 100 帧 golden;浏览器自有 transform frame decoder 已完成但不替代 Blender bake。
|
||||
- N-018-C:desktop bake payload 的逐 family decoder、正式 viewport UI 播放控制和 100 帧
|
||||
golden;浏览器自有 transform frame decoder/SceneIR 播放会话已完成但不替代 Blender bake。
|
||||
- N-018-D:逐 family WASM solver 初始化、线程、内存和确定性验证。
|
||||
- N-018-E:bake start/cancel/commit、服务端 job、故障恢复、进度与 UI。
|
||||
|
||||
@@ -41,6 +51,6 @@ npm --prefix web run test:simulation-cache
|
||||
npm --prefix web run test:physics-main-reader
|
||||
```
|
||||
|
||||
本轮在 Chromium 隔离端口复验 content-addressed cache 的 Worker restart、目标帧 range read 与
|
||||
帧 SHA-256 门通过;没有 desktop bake family decoder 或 solver,因此 playback/solver/bake 状态
|
||||
不变,继续为 `BLOCKED`。
|
||||
本轮在 Chromium 隔离端口复验 content-addressed cache 的 Worker restart、目标帧 range read、
|
||||
帧 SHA-256、BTF1 seek/play/cancel 和迟到结果抑制通过;没有 desktop bake family decoder 或
|
||||
solver,因此 desktop playback/solver/bake 状态不变,继续为 `BLOCKED`。
|
||||
|
||||
@@ -13,20 +13,29 @@ Three exposure/shadow 映射已落地;Scene 颜色管理 writer 和渲染等
|
||||
3. N-019-B(部分):主线程和 OffscreenCanvas renderer 都优先使用 Scene color-management
|
||||
exposure,World exposure 仅作旧数据回退;Light exposure 转换为强度,`castsShadow:false`
|
||||
不再被 Three 强制打开。
|
||||
4. 白平衡读取有完整性门:Main Light/World 重写若导致 Blender 5.2 tint 序列化为异常近零值,
|
||||
4. N-019-B(部分):World/Scene Main delta 保留版本化集合,主线程与 Offscreen renderer
|
||||
对环境颜色、曝光和 scene render settings 变更触发确定性的 renderer rebuild;未知 delta
|
||||
版本和重复 ID 继续拒绝。
|
||||
5. 白平衡读取有完整性门:Main Light/World 重写若导致 Blender 5.2 tint 序列化为异常近零值,
|
||||
不暴露垃圾数值而返回 `whiteBalanceStatus: BLOCKED`。
|
||||
5. Camera 严格白名单写回覆盖 Perspective/Orthographic、lens/sensor/sensor fit、shift、clip、
|
||||
6. Camera 严格白名单写回覆盖 Perspective/Orthographic、lens/sensor/sensor fit、shift、clip、
|
||||
ortho scale 和 DOF enable/focus distance/f-stop/blades/rotation/ratio;near/far 与范围在修改前
|
||||
拒绝,已通过 undo/redo 和 save/reopen。
|
||||
7. N-019-B(色温部分):`useTemperature:true` 时,共享 PBR 适配器把 800–20000 K 的有界
|
||||
黑体近似归一到 6500 K 中性白并转换为线性 RGB,再乘入 Light color;关闭色温时原始颜色
|
||||
保持不变。主线程与 Offscreen Worker 共用该实现,数值门和原生 temperature 保存重开通过。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-019-A:Scene color-management writer;直接 DNA 写入会破坏 white balance,必须改接
|
||||
Blender/RNA 颜色管理 API 后才能开放。Camera writer 已完成。
|
||||
- N-019-B/C:AgX/Standard/Raw 的视觉等价、temperature 颜色、Area spread、Mist、DOF、
|
||||
- N-019-B/C:AgX/Standard/Raw 的视觉等价、Area spread、Mist、DOF、
|
||||
transparent sorting、probe 和高级 shadow 参数。
|
||||
- N-019-D:Cycles/Freestyle/denoise 服务端 job 协议与结果 hash。
|
||||
- N-019-E:desktop/Chromium 像素 golden、设备丢失和 1M triangles。
|
||||
- N-019-B/C/E(Volume):Float32 NanoVDB WGSL 树遍历和有界 density ray integration 已有真实
|
||||
Chromium 数值/图像专项门;GPU page allocator、生产视口深度合成、temperature/color/emission
|
||||
grid 语义和 desktop/Chromium 三视角 golden 仍阻断,不能据此声明发布级体渲染。
|
||||
|
||||
## 验收
|
||||
|
||||
|
||||
@@ -18,12 +18,23 @@
|
||||
identifier、socket identifier 和 link;活动 Group Output/旧 Composite 映射为 Composite,
|
||||
Viewer 和常量 RGBA 映射到已验证节点,其他节点原样保留 `blenderType` 为 Unsupported。
|
||||
4096 nodes/16384 links、重复 destination、缺 output 或不可读 node tree 返回 blocked status。
|
||||
6. N-020-C(部分):CPU executor 在长像素/blur 循环中周期检查 cancellation,不再只在节点
|
||||
边界取消;内容寻址 frame key 绑定规范化 GraphIR、资源 Float32 内容 SHA-256、frame 和输出
|
||||
尺寸。有界 LRU cache 以克隆后的真实 buffer 字节计费(最多 256 MiB),命中返回隔离副本,
|
||||
调用方修改结果不会污染缓存。它是内存帧缓存,不等同于 tile scheduler 或 OPFS 持久缓存。
|
||||
7. N-020-A/B(真实参数链):Blender 5.2 Main reader 从真实 socket default 读取 Exposure,并仅在
|
||||
factor=1、invert color=true、invert alpha=false 时把 Invert 映射到当前 CPU 精确子集;Group
|
||||
Output 的动态 `Socket_0` 规范化为 GraphIR `Image`。桌面生成 fixture 经 WASM/Worker 后直接由
|
||||
CPU executor 求值 Constant→Exposure→Invert→Composite,RGBA 结果通过;未连接的 Glare 仍保留
|
||||
Unsupported 并使完整图 capability gate 保持阻断。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-020-A:Main graph 写回,以及 Transform/Invert/Exposure/Alpha Over/Blur/Mix/Image/Render Layer
|
||||
的逐节点参数与 resource/pass reader;基础真实图结构、常量色、Viewer/Composite 已完成。
|
||||
- N-020-B/C:WebGPU executor、tile/frame cache、增量 invalidation 和 GPU dispose。
|
||||
- N-020-A:Main graph 写回,以及 Transform、非默认 Invert、Alpha Over、Blur、Mix、Image/Render
|
||||
Layer 的逐节点参数与 resource/pass reader;基础真实图结构、常量色、Exposure、默认 Invert、
|
||||
Viewer/Composite 已完成。
|
||||
- N-020-B/C:WebGPU executor、tile scheduler、OPFS 持久 frame cache、增量 invalidation 和 GPU
|
||||
dispose;CPU 周期取消和内容寻址内存 LRU 已完成。
|
||||
- N-020-D:服务端 Blender job、source hash 和结果提交。
|
||||
- N-020-E:desktop HDR/alpha/color-space golden、OOM/fault/device-loss。
|
||||
|
||||
|
||||
@@ -12,17 +12,24 @@ Main 写回、媒体解码/渲染、音频波形和服务端编码仍未实现
|
||||
timeline;编辑后重新解析依赖和预算,锁定 strip 与 stale revision 会拒绝。
|
||||
3. N-021-B/C:`sequencerSourceFrame` 对 speed、trim、split 使用确定性的 source-frame
|
||||
映射,避免左右片段复用越界源帧。
|
||||
4. N-021-C/D(门):运行时只报告 WebCodecs/HTMLMedia 需要精确 probe;codec 必须
|
||||
4. N-021-B/C(部分):`resolveSequencerFrame` 在切分边界解析当前顶层 strip、source frame
|
||||
与依赖;META 覆盖的子 strip 和 inactive dependency 不会泄漏到渲染帧。
|
||||
5. N-021-C/D(门):运行时只报告 WebCodecs/HTMLMedia 需要精确 probe;codec 必须
|
||||
出现在已验证 MIME 集合中才可放行,本地编码固定为 `BLOCKED`。
|
||||
5. N-021-A(部分):Blender 5.2 `Scene.ed/Editing.seqbase` 读取 Scene、Movie、Image、Sound、
|
||||
6. N-021-A(部分):Blender 5.2 `Scene.ed/Editing.seqbase` 读取 Scene、Movie、Image、Sound、
|
||||
Meta 和协议支持的 Effect;显示范围由持久 `start/startofs/endofs/len` 计算,保留 channel、
|
||||
mute/lock、相对媒体路径、24/1.001 FPS 和 effect input stable ID。绝对路径、未知类型、
|
||||
坏依赖或超预算将 Scene sequencer 标为 `BLOCKED`。
|
||||
7. N-021-B(transition 子集):CROSS/GAMMA_CROSS 可按半开显示区间确定性解析 `[0,1)` 进度,
|
||||
保持 Blender `input1,input2` 顺序,并为两个活动依赖返回各自 source frame;越界、依赖缺失、
|
||||
muted 输入和非 cross effect 拒绝。
|
||||
8. 桌面 Blender 5.2 fixture 经 WASM/Worker 后,在真实 CROSS 中间帧得到 factor 0.5;两个单张
|
||||
Image strip 的 source range 为 `0..1`,显示 20 帧仍固定到 source frame 1,不伪造成图像序列。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-021-A/B:Main strip 写回、transition/modifier 完整参数、undo/redo 和 save/reopen;
|
||||
基础真实 reader 已完成。
|
||||
- N-021-A/B:Main strip 写回、非 CROSS transition/modifier 完整参数、undo/redo 和 save/reopen;
|
||||
基础真实 reader 与 CROSS/GAMMA_CROSS 帧描述已完成。
|
||||
- N-021-C:WebCodecs 精确 seek/decode、音频 waveform、proxy 生成、A/V sync、丢帧和
|
||||
损坏媒体处理。
|
||||
- N-021-D:浏览器不支持的 codec、混音与最终编码的服务端 Blender job。
|
||||
|
||||
@@ -13,17 +13,26 @@
|
||||
修改使用 revision 事务,锁定项和 stale revision 会拒绝,提交后再次完整解析。
|
||||
4. N-022-C(门):marker/mask schema edit 可用;browser tracking 只有显式 probe 成功后
|
||||
放行,camera solve 保持 `BLOCKED` 并要求受验证的服务端 Blender。
|
||||
5. N-022-A(部分):Blender 5.2 Mask Main reader 输出 layer、spline 和 Bezier point,保留
|
||||
5. N-022-D(部分):按屏幕射线对可见、未锁定且非零透明度的 Mask Bezier 段做有界采样,
|
||||
返回稳定的 layer/spline/point/segment identity;精确点命中优先于段命中,未声明的
|
||||
selection/raycast 编辑器仍保持阻断。
|
||||
6. N-022-A(部分):Blender 5.2 Mask Main reader 输出 layer、spline 和 Bezier point,保留
|
||||
cyclic/fill、viewport visibility、lock/hide-select、opacity、handle type/坐标、feather 与
|
||||
selection;1024 layer、100k spline、1M point 预算在分配前检查。MovieClip 不能从外部路径
|
||||
推导内容 SHA-256,继续阻断而不使用路径散列冒充源摘要。
|
||||
7. N-022-D(选择子集):Mask point marquee 支持 replace/add/toggle,验证矩形、已有 stable
|
||||
identity、重复项和 1M point 预算;输出按 Main 中的 mask/layer/spline/point 顺序确定化,隐藏、
|
||||
锁定和零透明度 layer 不会成为新选中项。
|
||||
8. Blender 5.2 fixture 同时包含锁定层和可编辑层,经 WASM/Worker 后实证锁定点不可 raycast,
|
||||
可编辑点返回稳定 identity,跨两层的 marquee 仅选择可编辑点,toggle 可确定性清空。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-022-A/B:真实 MovieClip reader、Mask/MovieClip 写回、undo/redo 和 save/reopen;Mask reader
|
||||
已完成。
|
||||
- N-022-C:浏览器 tracking 实现、完整 camera/plane solve 与服务端 job/hash 提交。
|
||||
- N-022-D:Clip/Mask editor、overlay、selection/raycast 和 compositor/scene 实际绑定。
|
||||
- N-022-D:完整 Clip/Mask editor、overlay、handle/segment marquee 与 compositor/scene 实际绑定;
|
||||
point raycast 和 point marquee 的真实 Main 子集已完成。
|
||||
- N-022-E:desktop solve/error golden、媒体故障和 Chromium 测试。
|
||||
|
||||
## 验收
|
||||
|
||||
@@ -12,22 +12,38 @@ IO 安全门已落地;Append/Link/Override Main、非 GLB 本地导入和跨
|
||||
content-addressed index 报告 `LOCAL_BOUNDED`,OPFS 只在运行时 API 存在时报告 `PROBE_REQUIRED`。
|
||||
3. N-023-C(门):现有 GLB 导出与 USD semantic analysis 可放行;GLTF/OBJ/PLY/STL、
|
||||
USD/Alembic 实际导入保持 `IO_FORMAT_UNSUPPORTED`,库 mutation 需要真实 Main。
|
||||
4. N-023-E:项目路径、外部 URI、archive entry 数量/单项/总量、压缩展开比率均有边界。
|
||||
5. N-023-B(部分):Blender 5.2 Main reader 输出 linked Library stable ID、项目相对路径、
|
||||
4. N-023-A/B(部分):预览字节先验 SHA-256 和 byte length,再校验 PNG signature/尺寸;
|
||||
WebP 仅在 RIFF/WEBP 容器签名正确时进入后续解码门,不从元数据伪造预览内容。
|
||||
5. N-023-E:项目路径、外部 URI、archive entry 数量/单项/总量、压缩展开比率均有边界。
|
||||
6. N-023-B(部分):Blender 5.2 Main reader 输出 linked Library stable ID、项目相对路径、
|
||||
packed/external 状态、只读标志和 archive-parent dependency;1024 library/每库 1024 dependency、
|
||||
重复 ID、缺依赖、依赖环与项目外路径由 SceneIR 再校验。缺外部库字节时返回
|
||||
`LINKED_LIBRARY_RESOURCE_REQUIRED`,不从路径伪造 SHA-256 或声称已加载。
|
||||
7. N-023-E(archive 结构门):除 traversal 与展开比预算外,重复规范路径、文件/目录前缀冲突、
|
||||
累计压缩/解压字节和声明源长度不一致均拒绝;`planIOArchiveRanges` 按路径生成确定性、安全整数
|
||||
compressed offset 计划。它为后续流式解包提供边界,不代表已有 ZIP decoder。
|
||||
8. N-023-E(NanoVDB range 基础件):`.nvdb` manifest 要求连续、32-byte 对齐、逐块 hash;
|
||||
HTTP source 只接受与 manifest 精确一致的 `206 Content-Range`,并按块校验后消费;临时错误重试、
|
||||
稳定 ETag/If-Range、response-body 偏移续传、错位/短响应拒绝均已完成。OPFS 原子
|
||||
staging/commit、source/bundle binding、Worker 重开、tamper/rollback/quota recovery 和 bundle LRU
|
||||
已完成;大 bundle 性能仍未实现。
|
||||
9. VDB 独立资源库包含 generated/official/source/derived/report/manifest/license,14 条记录逐项绑定
|
||||
byte length 与 SHA-256;官方 sphere 使用 CC-BY-4.0 和 Git LFS 权威 hash,未放入仓库工作树。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-023-B:Append/Link/Library Override、reload/relocate 和真实 Main transaction;只读 library
|
||||
inventory 已完成。
|
||||
- N-023-C/D:GLTF/OBJ/PLY/STL、USD/Alembic import/export/save/reopen/desktop reimport。
|
||||
- N-023-E:zip fuzz、OPFS quota/recovery、license/source offer 发布审计和大文件流式性能。
|
||||
- N-023-E:真实 zip decoder/fuzz、OPFS quota/recovery、license/source offer 发布审计和大文件
|
||||
流式性能;archive 路径冲突、双向字节预算与确定性 range plan 已完成。
|
||||
- N-023-E(VDB):GPU page resident LRU 和 64 MiB–1 GiB bundle 中断/内存性能门。
|
||||
|
||||
## 验收
|
||||
|
||||
```bash
|
||||
WEB_TEST_PORT=5323 npm --prefix web run test:e2e -- --grep "N-023 asset"
|
||||
npm --prefix web run test:library-main-reader
|
||||
npm --prefix web run test:vdb
|
||||
npm --prefix web run test:vdb-native
|
||||
```
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# N-024 Editors 与工作流
|
||||
|
||||
状态:`BLOCKED`(统一 context、真实 Main 只读布局清单、selection sync、keymap 和布局预算
|
||||
已落地;完整 Blender editor writer、运行时焦点、gizmo/触控和跨设备 golden 未实现)
|
||||
状态:`BLOCKED`(统一 context、真实 Main 只读布局清单、selection sync、上下文 keymap、
|
||||
可执行 operator search 和布局预算已落地;完整 Blender editor writer、运行时焦点、
|
||||
gizmo/触控和跨设备 golden 未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -11,16 +12,24 @@
|
||||
workflow state,rect 边界与不可重叠布局经过校验。
|
||||
3. N-024-C(部分):selection sync 以 revision 事务更新 active object 与 selected IDs,
|
||||
active object 必须属于 selection,过期 revision 会拒绝。
|
||||
4. N-024-D(门):keymap 绑定和预算可验证;writer、gizmo 与 touch drag 保持能力阻断。
|
||||
5. N-024-B(Main reader):从 Blender `WorkSpace`、`WorkSpaceLayout`、`bScreen`、`ScrArea`
|
||||
4. N-024-D(部分):key chord 统一规范化 modifier、key 大小写和排序,启用绑定的冲突会在
|
||||
resolver 层拒绝,禁用绑定不参与冲突;writer、gizmo 与 touch drag 保持能力阻断。
|
||||
5. N-024-D(门):keymap 绑定和预算可验证;writer、gizmo 与 touch drag 保持能力阻断。
|
||||
6. N-024-B(Main reader):从 Blender `WorkSpace`、`WorkSpaceLayout`、`bScreen`、`ScrArea`
|
||||
和 `ARegion` 读取有界 workspace/area/region 清单、编辑器类型、可见性与归一化布局;
|
||||
不完整或包含未知 editor 的 workspace 被跳过,首个完整 workspace/area 只作为确定性只读 context,
|
||||
不声称恢复 Blender 运行时焦点。
|
||||
7. N-024-D(上下文 keymap):同一 key chord 可按 workspace、editor、mode 隔离;仅作用域
|
||||
相交的启用绑定视为冲突,resolver 使用当前 workflow context 确定命令。
|
||||
8. N-024-C(operator search):F3 搜索结果来自当前 workspace/mode/Main 状态;命令可执行
|
||||
workspace/mode 切换、Add Cube、Apply Transform、Undo/Redo/Save。Chromium 用真实 `.blend`
|
||||
验证了 Edit Mode 隐藏 Object-only Add Cube,Object Mode 执行后 Main revision 只增加一次。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-024-B/C:Properties、UV/Image、Node、Graph、Dope Sheet、NLA、Spreadsheet 等 editor
|
||||
专属数据读取/写回、真实运行时焦点、selection history、operator search 和 context menu。
|
||||
专属数据读取/写回、真实运行时焦点、跨 editor selection history 和 context menu;当前
|
||||
operator search 仅覆盖已注册的安全命令子集,不代表 Blender 全量 operator registry。
|
||||
- N-024-D/E:Blender-compatible keymap 执行、gizmo/drag preview/commit、桌面/mobile/笔
|
||||
触控布局、无重叠截图和 accessibility golden。
|
||||
|
||||
@@ -29,4 +38,5 @@
|
||||
```bash
|
||||
npm --prefix web run test:editor-main-reader
|
||||
WEB_TEST_PORT=5324 npm --prefix web run test:e2e -- --grep "N-024 editor"
|
||||
WEB_TEST_PORT=5407 npm --prefix web run test:e2e -- --grep "operator search executes"
|
||||
```
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# N-025 Scripting 与平台
|
||||
|
||||
状态:`BLOCKED`(默认拒绝策略、真实 Main Text 来源清单、签名 manifest、权限/资源预算、
|
||||
平台报告和服务端 hash 门已落地;本地隔离执行、真实 server job 与发布审计未实现)
|
||||
平台报告、服务端 hash 门和请求决策审计已落地;本地隔离执行、真实 server job 与发布审计未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -19,13 +19,19 @@
|
||||
6. `test:scripting-isolation` 独立验证未批准 key 返回 `SCRIPT_SIGNATURE_INVALID`,批准 key
|
||||
仍返回 `SCRIPT_SANDBOX_UNAVAILABLE`,server job 返回 `SERVER_JOB_UNAVAILABLE`;测试不创建
|
||||
本地执行器,也不把签名校验误报为 sandbox。
|
||||
7. 每次本地脚本请求都可生成冻结的 `ScriptExecutionAuditIR`:绑定 canonical manifest/source
|
||||
SHA-256、权限、CPU/内存/墙钟预算、批准 key 命中、UTC 时间戳、请求摘要和明确拒绝码;
|
||||
审计凭证仍只能是 `DENY`,不能绕过 sandbox 门。
|
||||
8. N-025-E(审计链):至多 65,536 条拒绝审计按 sequence、前项 SHA-256 与 canonical
|
||||
entry SHA-256 串联;读取时重新校验请求摘要和整条链,拒绝 requestId 重放、非递增 UTC
|
||||
时间戳、内容篡改、断链与超预算日志。该链是内存/序列化协议,不声称已持久化发布审计。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-025-B/C:签名验证密钥管理、无网络 CPython/native sandbox、server Blender job 和
|
||||
output hash 提交。
|
||||
- N-025-D/E:真实 GPU/native window/file watcher 适配、恶意脚本/依赖混淆/逃逸/重放、
|
||||
审计日志和发布门。
|
||||
审计日志持久化和发布门;本地请求级审计凭证已完成,不代表隔离执行完成。
|
||||
|
||||
## 验收
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
# N-026 全域发布门
|
||||
|
||||
状态:`BLOCKED`(machine-readable parity manifest、依赖/状态检查、命令/hash 证据绑定、
|
||||
Chromium 完整套件、离线包/OPFS、SPDX SBOM 和部分性能/故障证据已落地;10M/大纹理/
|
||||
长媒体、simulation cache 性能、OOM/device loss/network interruption 与上游能力仍未齐)
|
||||
Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M geometry、simulation cache 性能和
|
||||
4K/8K texture、运行中断网和主线程 WebGL device loss 证据已落地;10M/长媒体、OOM 与上游能力仍未齐)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
1. N-026-A:版本化 schema 3 `ReleaseManifestIR` 为每个 family 记录 `LOCAL_EXACT`、
|
||||
`LOCAL_BOUNDED`、`SERVER` 或 `BLOCKED`、roadmap 状态、完成/阻断切片、验收命令和
|
||||
依赖;缺失 family、非法非阻断状态或依赖环会拒绝。
|
||||
`LOCAL_BOUNDED`、`SERVER` 或 `BLOCKED`、roadmap 状态、完成/阻断/明确排除切片、验收命令和
|
||||
依赖;同一切片跨状态重复、缺失 family、非法非阻断状态或依赖环会拒绝。
|
||||
2. N-026-B/C:Chromium 主线程/OffscreenCanvas、offline/Worker restart/OPFS recovery、
|
||||
1M/10M geometry、4K/8K texture、长媒体、simulation cache、OOM/device loss/网络
|
||||
中断/损坏 blend/zip bomb 等证据字段必须逐项为 true 才能放行。
|
||||
@@ -20,19 +20,41 @@ Chromium 完整套件、离线包/OPFS、SPDX SBOM 和部分性能/故障证据
|
||||
完整 suite 或其余 family 的桌面 golden。发布门 schema 3 仅接受 Chromium 浏览器证据,
|
||||
Firefox/WebKit 不在本项目当前测试配置内。
|
||||
5. N-015 Curve/Surface/Font/Metaball 已通过 Blender 5.2 desktop geometry golden;这四类及
|
||||
PointCloud/Curves/Hair 共 7 对象已通过 GLB/USDA desktop round-trip。Volume/VDB 仍无 renderer
|
||||
与 loss fixture,这些证据也不替代其余 family 的 desktop golden。
|
||||
PointCloud/Curves/Hair 共 7 对象已通过 GLB/USDA desktop round-trip。Volume/VDB 已重新纳入,
|
||||
当前已有真实资源/license/hash、OpenVDB 13->NanoVDB 32 desktop 转换、manifest/range 和确定性
|
||||
证据;server job、OPFS 重开、Float32 WebGPU core 和 Main Volume 属性保存重开已有专项证据,
|
||||
生产视口、GPU paging、GLB/USD loss 和 desktop/Chromium 发布 golden 仍计为阻断。
|
||||
6. 当前发布包已通过本地 third-party notices、Blender/Three license 文件、无远程运行时依赖、
|
||||
非空 SHA-256 manifest、SPDX 2.3 lockfile/vendored SBOM、对应源码提供和离线二进制/源码包
|
||||
确定性复建;100k/1M decimate、5 类损坏 blend 和 archive 高压缩比拒绝有实际命令记录。
|
||||
7. `docs/status/release-evidence.json` 记录 Chromium 完整 E2E + release suite 以及上述发布命令;
|
||||
`docs/web/sbom.spdx.json` 确定性覆盖 npm lockfile 与 notices 中显式 vendored/native 组件。
|
||||
8. simulation cache 性能门在 Chromium 中写入并重开真实 OPFS 内容寻址缓存,逐帧范围读取、
|
||||
SHA-256 复验、解码并发布 600 帧 BTF1/SceneIR;25 秒动画量级的写入加播放总耗时须小于
|
||||
30 秒。该门衡量浏览器缓存管线,不声称 native physics 求解或 bake 性能已完成。
|
||||
9. network interruption 门在 Chromium 页面和 Worker 启动后切换真实 offline context,离线完成
|
||||
Main Add Cube、`.blend` 下载保存和保存文件重开,检查 revision 与 4 个对象均保持;该门不把
|
||||
未实现的远端 job 断点续传计为完成。
|
||||
10. 主线程视口显式跟踪 `lost -> restoring -> ready` WebGL 状态;Chromium 使用
|
||||
`WEBGL_lose_context` 真正丢失并恢复 context,恢复后重新应用 PBR 配置、绘制非空像素并
|
||||
完成一次 Main 编辑。OffscreenCanvas Worker device loss 尚未计入该证据。
|
||||
11. 4K texture 门在 Chromium 生成 4096x4096 PNG,经 SHA-256/维度/字节预算校验、
|
||||
`createImageBitmap` 解码、GPUTextureStore 和 Three.js WebGL 实际采样,要求非空彩色像素且
|
||||
解码上传渲染小于 30 秒。
|
||||
12. evidence record 只能绑定 schema 中已知且值为 true 的字段;任何绑定字段的记录必须包含
|
||||
至少一个唯一构件 SHA-256,manifest `generatedAt` 必须是可往返的 canonical UTC 时间戳。
|
||||
13. 8K texture 门先要求 WebGL `MAX_TEXTURE_SIZE >= 8192`,再对 8192x8192 PNG 执行同样的
|
||||
SHA-256、解码、GPU 上传和实际采样,独立 Chromium 进程内耗时须小于 45 秒。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- 跨 family 桌面 golden、10M、4K/8K texture、长媒体、simulation cache 性能和 OOM/device loss/
|
||||
network interruption fault 仍无真实证据;本项目当前只配置 Chromium,上游 N-015 至 N-025
|
||||
- 跨 family 桌面 golden、10M、长媒体和 OOM fault 仍无真实证据;
|
||||
本项目当前只配置 Chromium,上游 N-015 至 N-025
|
||||
的阻断能力会传递到发布门。
|
||||
- VDB 发布证据已覆盖 server job、HTTP 续传/OPFS 分块恢复、quota/tamper/rollback、Float32 WebGPU
|
||||
数值/专项像素、双生产视口、有限材质映射与 Volume Main 属性重开;仍缺 resident 分页、生产
|
||||
Offscreen device-loss 重建、OOM/大 bundle、完整材质和三视角
|
||||
desktop/Chromium golden。
|
||||
- 完整 native dependency/license 审计仍需发行审核;当前 SBOM 覆盖 lockfile 和显式 notices,
|
||||
不声称替代 Blender 全部传递依赖的发布级法律审计。
|
||||
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"updatedAt": "2026-08-12",
|
||||
"updatedAt": "2026-08-14",
|
||||
"source": "docs/BLENDER_5_2_WEB_FEATURE_PARITY.md",
|
||||
"statusEnum": ["LOCAL_EXACT", "LOCAL_BOUNDED", "SERVER", "BLOCKED"],
|
||||
"families": [
|
||||
{
|
||||
"id": "N-015",
|
||||
"name": "Non-mesh geometry",
|
||||
"status": "LOCAL_BOUNDED",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "in_progress",
|
||||
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-local-availability-assessment", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium"],
|
||||
"blockedSlices": ["B3-vdb-renderer", "C1-continuous-handle-gizmo-preview", "C2-new-external-font-import", "E1-volume-loss-fixture"],
|
||||
"acceptance": ["web:test:nonmesh-roundtrip", "web:test:nonmesh-desktop-golden", "web:test:nonmesh-glb-blender-roundtrip", "web:test:nonmesh-usd-serialization", "web:test:nonmesh-usd-blender-roundtrip", "web:test:nonmesh-binary", "web:test:vdb", "web:test:vdb-availability", "web:test:selection-history", "web:test:nonmesh-interaction", "web:e2e:N-015|non-mesh", "web:e2e:real OPFS quota"],
|
||||
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-conversion-request-boundary", "B3-nanovdb-manifest-range-hash-protocol", "B3-nanovdb-serial-range-streamer", "B3-vdb-stage-capability-gates", "B3-vdb-real-resource-license-hash-catalog", "B3-desktop-openvdb13-nanovdb32-converter", "B3-native-conversion-determinism-malformed-input", "B3-vdb-server-job-isolation-cancel-timeout", "B3-vdb-desktop-server-hash-equality", "B3-nanovdb-http-retry-if-range-body-resume", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-continuous-handle-gizmo-preview-single-commit", "C1-handle-local-origin-orientation-gizmo", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "C3-volume-main-properties-save-reopen", "C3-nanovdb-opfs-binding-worker-reopen", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "D2-nanovdb-float32-cpu-wgsl-sampling", "D2-nanovdb-bounded-webgpu-integration", "D2-webgpu-device-loss-session-recovery", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
|
||||
"blockedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-paging-advanced-material", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
|
||||
"excludedSlices": [],
|
||||
"acceptance": ["web:test:nonmesh-roundtrip", "web:test:nonmesh-desktop-golden", "web:test:nonmesh-glb-blender-roundtrip", "web:test:nonmesh-usd-serialization", "web:test:nonmesh-usd-blender-roundtrip", "web:test:nonmesh-binary", "web:test:selection-history", "web:test:nonmesh-interaction", "web:test:vdb", "web:test:vdb-availability", "web:test:vdb-native", "web:test:vdb-server", "web:test:vdb-opfs", "web:test:vdb-webgpu", "web:test:vdb-viewport", "web:test:vdb-faults", "web:e2e:N-015|non-mesh", "web:e2e:real OPFS quota"],
|
||||
"dependencies": []
|
||||
},
|
||||
{
|
||||
@@ -19,8 +20,8 @@
|
||||
"name": "Grease Pencil",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-schema-budget", "A-main-reader", "B-layer-frame-stroke-transaction-partial", "C-point-radius-opacity-color-cyclic-material-partial", "C-bounded-previous-next-onion-preview", "D-current-frame-stroke-preview-main-offscreen-chromium", "D-editor-layer-frame-selection-context-partial", "D-editor-main-layer-frame-panel-partial", "D-single-point-revision-bound-main-translation"],
|
||||
"blockedSlices": ["C-material-modifier-full-semantics", "D-full-2d-canvas-multipoint-dope-gizmo-restart", "E-desktop-browser-golden-export-opfs"],
|
||||
"completedSlices": ["A-schema-budget", "A-main-reader", "B-layer-frame-stroke-transaction-partial", "C-point-radius-opacity-color-cyclic-material-partial", "C-bounded-previous-next-onion-preview", "D-current-frame-stroke-preview-main-offscreen-chromium", "D-editor-layer-frame-selection-context-partial", "D-editor-main-layer-frame-panel-partial", "D-single-point-revision-bound-main-translation", "D-viewport-point-raycast-multipoint-gizmo-transaction", "D-continuous-point-preview-single-main-commit", "D-bounded-drawing-frame-dope-navigation", "D-worker-restart-save-reopen"],
|
||||
"blockedSlices": ["C-material-modifier-full-semantics", "D-full-2d-canvas-marquee-dope-editor", "E-desktop-browser-golden-export-opfs"],
|
||||
"acceptance": ["web:test:grease-pencil", "web:test:grease-pencil-editor", "web:e2e:N-016 Grease Pencil"],
|
||||
"dependencies": ["N-015"]
|
||||
},
|
||||
@@ -29,8 +30,8 @@
|
||||
"name": "Paint and weights",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-stroke-hit-weight-schema-budget-partial", "A-three-raycast-source-face-barycentric-uv", "A-bounded-cpu-candidate-falloff", "B-main-vertex-color-partial", "B-main-vertex-weight-normalize-partial", "B-selected-vertex-color-weight-ui-transaction-partial", "C-udim-memory-range-patch-hash-boundary"],
|
||||
"blockedSlices": ["A-real-pbvh-depth-occlusion-desktop-falloff", "B-clean-mirror-desktop-brush", "C-blender-packed-udim-dirty-atomic-save", "D-E-mask-selection-gpu-quota-golden-ui"],
|
||||
"completedSlices": ["A-stroke-hit-weight-schema-budget-partial", "A-three-raycast-source-face-barycentric-uv", "A-bounded-cpu-candidate-falloff", "A-uniform-grid-candidate-depth-visibility-gate", "A-selection-mask-identity-gated-brush-patch", "B-main-vertex-color-partial", "B-main-vertex-weight-normalize-partial", "B-selected-vertex-color-weight-ui-transaction-partial", "B-selection-masked-color-weight-main-transaction", "B-blender52-vertex-group-summary-save-reopen", "C-udim-memory-range-patch-hash-boundary"],
|
||||
"blockedSlices": ["A-real-pbvh-depth-occlusion-desktop-falloff", "B-clean-mirror-desktop-brush", "C-blender-packed-udim-dirty-atomic-save", "D-E-face-mask-gpu-quota-desktop-golden"],
|
||||
"acceptance": ["web:test:paint-roundtrip", "web:e2e:N-017 paint"],
|
||||
"dependencies": ["N-016"]
|
||||
},
|
||||
@@ -39,7 +40,7 @@
|
||||
"name": "Physics and simulation",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-family-capability-inventory", "A-authoritative-main-physics-reader-partial", "B-settings-dependency-cache-manifest-partial", "B-cloth-softbody-collision-settings-sha256-save-reopen", "C-exact-frame-selection-gate", "C-content-addressed-frame-range-read-hash-gate", "C-browser-transform-frame-binary-decoder"],
|
||||
"completedSlices": ["A-family-capability-inventory", "A-authoritative-main-physics-reader-partial", "B-settings-dependency-cache-manifest-partial", "B-cloth-softbody-collision-settings-sha256-save-reopen", "C-exact-frame-selection-gate", "C-content-addressed-frame-range-read-hash-gate", "C-browser-transform-frame-binary-decoder", "C-browser-transform-sceneir-preview", "C-browser-transform-cancellable-playback-session", "C-browser-transform-storage-restart-playback"],
|
||||
"blockedSlices": ["A-B-full-family-settings-effectors-cache-binding", "C-desktop-bake-decoder-playback-100-frame-golden", "D-wasm-solvers", "E-bake-server-recovery-progress-ui"],
|
||||
"acceptance": ["web:e2e:N-018 physics", "web:test:simulation-cache", "web:test:physics-main-reader"],
|
||||
"dependencies": ["N-017"]
|
||||
@@ -49,8 +50,8 @@
|
||||
"name": "Lighting and render",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "B-three-exposure-shadow-mapping-partial", "A-white-balance-integrity-gate"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
|
||||
"acceptance": ["web:test:lighting-roundtrip", "web:e2e:N-019 Scene exposure"],
|
||||
"dependencies": ["N-018"]
|
||||
},
|
||||
@@ -59,7 +60,7 @@
|
||||
"name": "Compositor",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "B-bounded-cpu-executor-partial", "C-image-operation-budget-cancel-partial", "D-unsupported-node-preservation-gate"],
|
||||
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "D-unsupported-node-preservation-gate"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:compositor-main-reader", "web:e2e:N-020 CPU compositor"],
|
||||
"dependencies": ["N-019"]
|
||||
@@ -69,7 +70,7 @@
|
||||
"name": "Sequencer and audio",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "C-runtime-codec-probe-gate"],
|
||||
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:sequencer-main-reader", "web:e2e:N-021 sequencer"],
|
||||
"dependencies": ["N-020"]
|
||||
@@ -79,7 +80,7 @@
|
||||
"name": "Tracking and masks",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-clip-track-plane-mask-schema", "A-main-mask-layer-spline-point-reader", "B-revision-marker-mask-edit-partial", "B-source-hash-binding-validation", "C-browser-probe-solve-gate"],
|
||||
"completedSlices": ["A-clip-track-plane-mask-schema", "A-main-mask-layer-spline-point-reader", "B-revision-marker-mask-edit-partial", "B-source-hash-binding-validation", "C-browser-probe-solve-gate", "D-mask-bezier-stable-identity-raycast", "D-mask-stable-identity-marquee-selection", "D-real-main-locked-editable-raycast-marquee"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:mask-main-reader", "web:e2e:N-022 tracking"],
|
||||
"dependencies": ["N-021"]
|
||||
@@ -89,9 +90,9 @@
|
||||
"name": "Assets, libraries and IO",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:library-main-reader", "web:e2e:N-023 asset"],
|
||||
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "A-preview-content-signature-dimension-verification", "A-vdb-external-resource-license-sha-catalog", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-http206-range-hash-streaming-boundary", "E-nanovdb-http-retry-if-range-body-resume", "E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru", "E-nanovdb-opfs-tamper-rollback-quota-recovery"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-gpu-resident-page-cache-large-bundle"],
|
||||
"acceptance": ["web:test:library-main-reader", "web:test:vdb-faults", "web:e2e:N-023 asset"],
|
||||
"dependencies": ["N-022"]
|
||||
},
|
||||
{
|
||||
@@ -99,7 +100,7 @@
|
||||
"name": "Editors and workflow",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-unified-area-region-context", "B-read-only-editor-manifest-partial", "B-main-workspace-area-region-reader", "C-selection-sync-revision-partial", "D-keymap-layout-budget-gates"],
|
||||
"completedSlices": ["A-unified-area-region-context", "B-read-only-editor-manifest-partial", "B-main-workspace-area-region-reader", "C-selection-sync-revision-partial", "C-executable-context-filtered-operator-search", "D-keymap-layout-budget-gates", "D-normalized-key-chord-conflict-resolution", "D-context-scoped-keymap-resolution"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:editor-main-reader", "web:e2e:N-024 editor"],
|
||||
"dependencies": ["N-023"]
|
||||
@@ -109,7 +110,7 @@
|
||||
"name": "Scripting and platform",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-default-deny-script-policy", "A-main-text-source-inventory-reader", "B-signed-manifest-permission-budget", "B-approved-key-still-sandbox-blocked-audit", "C-server-source-hash-job-gate", "D-platform-capability-report"],
|
||||
"completedSlices": ["A-default-deny-script-policy", "A-main-text-source-inventory-reader", "B-signed-manifest-permission-budget", "B-approved-key-still-sandbox-blocked-audit", "B-request-decision-audit-receipt", "C-server-source-hash-job-gate", "D-platform-capability-report", "E-bounded-replay-resistant-audit-hash-chain"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:script-main-reader", "web:test:scripting-isolation", "web:e2e:N-025 script"],
|
||||
"dependencies": ["N-024"]
|
||||
@@ -119,8 +120,8 @@
|
||||
"name": "Release gate",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-machine-readable-parity-manifest", "A-dependency-status-validation", "A-command-hash-evidence-binding", "B-chromium-runtime-evidence-gate", "B-chromium-full-suite-evidence", "C-performance-fault-provenance-gate", "C-performance-1M-malicious-input-partial", "C-zip-bomb-ratio-rejection", "C-release-package-notices-partial", "C-spdx-2.3-lockfile-sbom", "D-deterministic-manifest-serialization", "D-offline-reproducible-source-archive-partial"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"completedSlices": ["A-machine-readable-parity-manifest", "A-dependency-status-validation", "A-command-hash-evidence-binding", "A-known-enabled-field-artifact-binding", "B-chromium-runtime-evidence-gate", "B-chromium-full-suite-evidence", "C-performance-fault-provenance-gate", "C-performance-1M-malicious-input-partial", "C-performance-4k-texture-upload-render", "C-performance-8k-texture-upload-render", "C-simulation-cache-opfs-playback-performance", "C-network-interruption-main-save-reopen", "C-main-thread-webgl-device-loss-recovery", "C-zip-bomb-ratio-rejection", "C-vdb-resource-converter-provenance-partial", "C-vdb-network-opfs-quota-tamper-device-loss-partial", "C-release-package-notices-partial", "C-spdx-2.3-lockfile-sbom", "D-deterministic-manifest-serialization", "D-offline-reproducible-source-archive-partial"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E", "C-vdb-server-webgpu-save-reopen-golden-evidence"],
|
||||
"acceptance": ["web:e2e:N-026 release", "web:test:release-evidence", "web:test:browser", "web:test:release-package", "web:release:offline", "web:test:release-performance", "web:test:malicious-blends"],
|
||||
"dependencies": ["N-015", "N-016", "N-017", "N-018", "N-019", "N-020", "N-021", "N-022", "N-023", "N-024", "N-025"]
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"schemaVersion": 3,
|
||||
"source": "docs/status/parity-ledger.json",
|
||||
"sourceSha256": "bc1de45b23987518f38d629361693bad977a49da69b509ade1bee0aee36e272f",
|
||||
"generatedAt": "2026-08-12T23:22:09.909Z",
|
||||
"sourceSha256": "fbd0b368e00d2dbeb7d63e248ae2cdb6228a20520b44a14722a21aa0693a6395",
|
||||
"generatedAt": "2026-08-14T14:56:43.298Z",
|
||||
"families": [
|
||||
{
|
||||
"id": "N-015",
|
||||
"name": "Non-mesh geometry",
|
||||
"status": "LOCAL_BOUNDED",
|
||||
"status": "BLOCKED",
|
||||
"roadmapStatus": "in_progress",
|
||||
"completedSlices": [
|
||||
"A1",
|
||||
@@ -16,13 +16,24 @@
|
||||
"A2-multichunk-attribute-completeness",
|
||||
"B2",
|
||||
"B3-metadata",
|
||||
"B3-vdb-local-availability-assessment",
|
||||
"B3-vdb-conversion-request-boundary",
|
||||
"B3-nanovdb-manifest-range-hash-protocol",
|
||||
"B3-nanovdb-serial-range-streamer",
|
||||
"B3-vdb-stage-capability-gates",
|
||||
"B3-vdb-real-resource-license-hash-catalog",
|
||||
"B3-desktop-openvdb13-nanovdb32-converter",
|
||||
"B3-native-conversion-determinism-malformed-input",
|
||||
"B3-vdb-server-job-isolation-cancel-timeout",
|
||||
"B3-vdb-desktop-server-hash-equality",
|
||||
"B3-nanovdb-http-retry-if-range-body-resume",
|
||||
"C1-topology-partial",
|
||||
"C1-handle-points-partial",
|
||||
"C1-handle-preview-raycast-partial",
|
||||
"C1-handle-identity-gizmo-main-roundtrip",
|
||||
"C1-multi-handle-selection-highlight-bounded-commit",
|
||||
"C1-gizmo-revision-delta-transaction-boundary",
|
||||
"C1-continuous-handle-gizmo-preview-single-commit",
|
||||
"C1-handle-local-origin-orientation-gizmo",
|
||||
"C1-rename-partial",
|
||||
"C1-create-delete-poly-partial",
|
||||
"C1-poly-bezier-nurbs-1d-conversion",
|
||||
@@ -34,12 +45,17 @@
|
||||
"C2-existing-packed-vfont-style-links",
|
||||
"C2-builtin-font-evaluation-exact",
|
||||
"C3-roundtrip",
|
||||
"C3-volume-main-properties-save-reopen",
|
||||
"C3-nanovdb-opfs-binding-worker-reopen",
|
||||
"D1-raycast-partial",
|
||||
"D1-offscreen-vert-edge-partial",
|
||||
"D1-selection-history-partial",
|
||||
"D1-cross-object-history-range-patch",
|
||||
"D1-handle-identity-axis-gizmo",
|
||||
"D2-partial",
|
||||
"D2-nanovdb-float32-cpu-wgsl-sampling",
|
||||
"D2-nanovdb-bounded-webgpu-integration",
|
||||
"D2-webgpu-device-loss-session-recovery",
|
||||
"E1-partial",
|
||||
"E1-desktop-geometry-golden",
|
||||
"E1-true-2d-surface-desktop-golden",
|
||||
@@ -49,14 +65,17 @@
|
||||
"E1-pointcloud-curves-hair-glb-usd-loss-fixture",
|
||||
"E2-1M-chromium",
|
||||
"E2-chromium-worker-recovery",
|
||||
"E2-opfs-quota-chromium"
|
||||
"E2-opfs-quota-chromium",
|
||||
"E2-vdb-network-worker-quota-tamper-rollback-faults"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"B3-vdb-renderer",
|
||||
"C1-continuous-handle-gizmo-preview",
|
||||
"C2-new-external-font-import",
|
||||
"E1-volume-loss-fixture"
|
||||
"D2-nanovdb-production-viewport-paging-advanced-material",
|
||||
"C3-volume-combined-asset-viewport-reopen",
|
||||
"E1-volume-glb-usd-loss-desktop-chromium-golden",
|
||||
"E2-vdb-large-stream-device-loss-oom"
|
||||
],
|
||||
"excludedSlices": [],
|
||||
"acceptance": [
|
||||
"web:test:nonmesh-roundtrip",
|
||||
"web:test:nonmesh-desktop-golden",
|
||||
@@ -64,10 +83,16 @@
|
||||
"web:test:nonmesh-usd-serialization",
|
||||
"web:test:nonmesh-usd-blender-roundtrip",
|
||||
"web:test:nonmesh-binary",
|
||||
"web:test:vdb",
|
||||
"web:test:vdb-availability",
|
||||
"web:test:selection-history",
|
||||
"web:test:nonmesh-interaction",
|
||||
"web:test:vdb",
|
||||
"web:test:vdb-availability",
|
||||
"web:test:vdb-native",
|
||||
"web:test:vdb-server",
|
||||
"web:test:vdb-opfs",
|
||||
"web:test:vdb-webgpu",
|
||||
"web:test:vdb-viewport",
|
||||
"web:test:vdb-faults",
|
||||
"web:e2e:N-015|non-mesh",
|
||||
"web:e2e:real OPFS quota"
|
||||
],
|
||||
@@ -87,11 +112,15 @@
|
||||
"D-current-frame-stroke-preview-main-offscreen-chromium",
|
||||
"D-editor-layer-frame-selection-context-partial",
|
||||
"D-editor-main-layer-frame-panel-partial",
|
||||
"D-single-point-revision-bound-main-translation"
|
||||
"D-single-point-revision-bound-main-translation",
|
||||
"D-viewport-point-raycast-multipoint-gizmo-transaction",
|
||||
"D-continuous-point-preview-single-main-commit",
|
||||
"D-bounded-drawing-frame-dope-navigation",
|
||||
"D-worker-restart-save-reopen"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"C-material-modifier-full-semantics",
|
||||
"D-full-2d-canvas-multipoint-dope-gizmo-restart",
|
||||
"D-full-2d-canvas-marquee-dope-editor",
|
||||
"E-desktop-browser-golden-export-opfs"
|
||||
],
|
||||
"acceptance": [
|
||||
@@ -112,16 +141,20 @@
|
||||
"A-stroke-hit-weight-schema-budget-partial",
|
||||
"A-three-raycast-source-face-barycentric-uv",
|
||||
"A-bounded-cpu-candidate-falloff",
|
||||
"A-uniform-grid-candidate-depth-visibility-gate",
|
||||
"A-selection-mask-identity-gated-brush-patch",
|
||||
"B-main-vertex-color-partial",
|
||||
"B-main-vertex-weight-normalize-partial",
|
||||
"B-selected-vertex-color-weight-ui-transaction-partial",
|
||||
"B-selection-masked-color-weight-main-transaction",
|
||||
"B-blender52-vertex-group-summary-save-reopen",
|
||||
"C-udim-memory-range-patch-hash-boundary"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A-real-pbvh-depth-occlusion-desktop-falloff",
|
||||
"B-clean-mirror-desktop-brush",
|
||||
"C-blender-packed-udim-dirty-atomic-save",
|
||||
"D-E-mask-selection-gpu-quota-golden-ui"
|
||||
"D-E-face-mask-gpu-quota-desktop-golden"
|
||||
],
|
||||
"acceptance": [
|
||||
"web:test:paint-roundtrip",
|
||||
@@ -143,7 +176,10 @@
|
||||
"B-cloth-softbody-collision-settings-sha256-save-reopen",
|
||||
"C-exact-frame-selection-gate",
|
||||
"C-content-addressed-frame-range-read-hash-gate",
|
||||
"C-browser-transform-frame-binary-decoder"
|
||||
"C-browser-transform-frame-binary-decoder",
|
||||
"C-browser-transform-sceneir-preview",
|
||||
"C-browser-transform-cancellable-playback-session",
|
||||
"C-browser-transform-storage-restart-playback"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A-B-full-family-settings-effectors-cache-binding",
|
||||
@@ -169,15 +205,21 @@
|
||||
"A-camera-light-world-scene-reader-partial",
|
||||
"A-main-camera-dof-properties-partial",
|
||||
"A-main-light-world-properties-partial",
|
||||
"A-white-balance-integrity-gate",
|
||||
"B-three-exposure-shadow-mapping-partial",
|
||||
"A-white-balance-integrity-gate"
|
||||
"B-bounded-kelvin-linear-light-color",
|
||||
"B-world-scene-render-delta-roundtrip",
|
||||
"B-volume-material-manifest-boundary",
|
||||
"B-C-nanovdb-float32-wgsl-bounded-ray-integration"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
"B",
|
||||
"C",
|
||||
"D",
|
||||
"E"
|
||||
"E",
|
||||
"B-C-nanovdb-production-viewport-paging-advanced-material",
|
||||
"E-volume-desktop-chromium-pixel-golden"
|
||||
],
|
||||
"acceptance": [
|
||||
"web:test:lighting-roundtrip",
|
||||
@@ -195,8 +237,11 @@
|
||||
"completedSlices": [
|
||||
"A-graph-resource-cycle-schema",
|
||||
"A-main-graph-structure-reader-partial",
|
||||
"A-main-exposure-default-invert-parameter-reader",
|
||||
"B-bounded-cpu-executor-partial",
|
||||
"B-real-main-exposure-invert-cpu-chain",
|
||||
"C-image-operation-budget-cancel-partial",
|
||||
"C-content-addressed-frame-lru-cache",
|
||||
"D-unsupported-node-preservation-gate"
|
||||
],
|
||||
"blockedSlices": [
|
||||
@@ -224,6 +269,9 @@
|
||||
"A-main-strip-timeline-reader-partial",
|
||||
"B-deterministic-move-trim-split-partial",
|
||||
"B-source-frame-seek",
|
||||
"B-active-frame-dependency-resolution",
|
||||
"B-cross-transition-progress-input-resolution",
|
||||
"B-real-main-cross-still-frame-resolution",
|
||||
"C-runtime-codec-probe-gate"
|
||||
],
|
||||
"blockedSlices": [
|
||||
@@ -251,7 +299,10 @@
|
||||
"A-main-mask-layer-spline-point-reader",
|
||||
"B-revision-marker-mask-edit-partial",
|
||||
"B-source-hash-binding-validation",
|
||||
"C-browser-probe-solve-gate"
|
||||
"C-browser-probe-solve-gate",
|
||||
"D-mask-bezier-stable-identity-raycast",
|
||||
"D-mask-stable-identity-marquee-selection",
|
||||
"D-real-main-locked-editable-raycast-marquee"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
@@ -276,20 +327,29 @@
|
||||
"completedSlices": [
|
||||
"A-catalog-asset-license-source-schema",
|
||||
"A-content-addressed-opfs-capability",
|
||||
"A-preview-content-signature-dimension-verification",
|
||||
"A-vdb-external-resource-license-sha-catalog",
|
||||
"B-library-dependency-order-partial",
|
||||
"B-main-library-inventory-reader",
|
||||
"C-glb-export-usd-analysis-gates",
|
||||
"E-archive-path-ratio-budget"
|
||||
"E-archive-path-ratio-budget",
|
||||
"E-archive-path-conflict-compressed-budget-range-plan",
|
||||
"E-nanovdb-http206-range-hash-streaming-boundary",
|
||||
"E-nanovdb-http-retry-if-range-body-resume",
|
||||
"E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru",
|
||||
"E-nanovdb-opfs-tamper-rollback-quota-recovery"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
"B",
|
||||
"C",
|
||||
"D",
|
||||
"E"
|
||||
"E",
|
||||
"E-nanovdb-gpu-resident-page-cache-large-bundle"
|
||||
],
|
||||
"acceptance": [
|
||||
"web:test:library-main-reader",
|
||||
"web:test:vdb-faults",
|
||||
"web:e2e:N-023 asset"
|
||||
],
|
||||
"dependencies": [
|
||||
@@ -306,7 +366,10 @@
|
||||
"B-read-only-editor-manifest-partial",
|
||||
"B-main-workspace-area-region-reader",
|
||||
"C-selection-sync-revision-partial",
|
||||
"D-keymap-layout-budget-gates"
|
||||
"C-executable-context-filtered-operator-search",
|
||||
"D-keymap-layout-budget-gates",
|
||||
"D-normalized-key-chord-conflict-resolution",
|
||||
"D-context-scoped-keymap-resolution"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
@@ -333,8 +396,10 @@
|
||||
"A-main-text-source-inventory-reader",
|
||||
"B-signed-manifest-permission-budget",
|
||||
"B-approved-key-still-sandbox-blocked-audit",
|
||||
"B-request-decision-audit-receipt",
|
||||
"C-server-source-hash-job-gate",
|
||||
"D-platform-capability-report"
|
||||
"D-platform-capability-report",
|
||||
"E-bounded-replay-resistant-audit-hash-chain"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
@@ -361,11 +426,19 @@
|
||||
"A-machine-readable-parity-manifest",
|
||||
"A-dependency-status-validation",
|
||||
"A-command-hash-evidence-binding",
|
||||
"A-known-enabled-field-artifact-binding",
|
||||
"B-chromium-runtime-evidence-gate",
|
||||
"B-chromium-full-suite-evidence",
|
||||
"C-performance-fault-provenance-gate",
|
||||
"C-performance-1M-malicious-input-partial",
|
||||
"C-performance-4k-texture-upload-render",
|
||||
"C-performance-8k-texture-upload-render",
|
||||
"C-simulation-cache-opfs-playback-performance",
|
||||
"C-network-interruption-main-save-reopen",
|
||||
"C-main-thread-webgl-device-loss-recovery",
|
||||
"C-zip-bomb-ratio-rejection",
|
||||
"C-vdb-resource-converter-provenance-partial",
|
||||
"C-vdb-network-opfs-quota-tamper-device-loss-partial",
|
||||
"C-release-package-notices-partial",
|
||||
"C-spdx-2.3-lockfile-sbom",
|
||||
"D-deterministic-manifest-serialization",
|
||||
@@ -376,7 +449,8 @@
|
||||
"B",
|
||||
"C",
|
||||
"D",
|
||||
"E"
|
||||
"E",
|
||||
"C-vdb-server-webgpu-save-reopen-golden-evidence"
|
||||
],
|
||||
"acceptance": [
|
||||
"web:e2e:N-026 release",
|
||||
@@ -414,15 +488,15 @@
|
||||
"performance": {
|
||||
"geometry1M": true,
|
||||
"geometry10M": false,
|
||||
"texture4K": false,
|
||||
"texture8K": false,
|
||||
"texture4K": true,
|
||||
"texture8K": true,
|
||||
"longMedia": false,
|
||||
"simulationCache": false
|
||||
"simulationCache": true
|
||||
},
|
||||
"faults": {
|
||||
"oom": false,
|
||||
"deviceLoss": false,
|
||||
"networkInterrupt": false,
|
||||
"deviceLoss": true,
|
||||
"networkInterrupt": true,
|
||||
"malformedBlend": true,
|
||||
"zipBomb": true
|
||||
},
|
||||
@@ -441,7 +515,7 @@
|
||||
],
|
||||
"command": "npm --prefix web run release:sbom",
|
||||
"exitCode": 0,
|
||||
"durationMs": 361,
|
||||
"durationMs": 372,
|
||||
"output": "> blender-web-editor@0.1.0 release:sbom\n> node ../tools/web/generate-sbom.mjs\n\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30",
|
||||
"artifactSha256": [
|
||||
"8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30",
|
||||
@@ -449,6 +523,21 @@
|
||||
"3c65ff96cc15c9072d2517555484ccfd0009a2814d96faadcc5bd7b2e3458503"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vdb-boundary",
|
||||
"fields": [],
|
||||
"command": "npm --prefix web run test:vdb-availability && npm --prefix web run test:vdb-native && npm --prefix web run test:vdb",
|
||||
"exitCode": 0,
|
||||
"durationMs": 5823,
|
||||
"output": "> blender-web-editor@0.1.0 test:vdb-availability\n> node ../tools/web/check-vdb-availability.mjs\n\nvdb-availability-ok core=READY release=BLOCKED browser-openvdb=disabled desktop=ready server=ready opfs=ready webgpu-core=ready main-roundtrip=ready viewport=blocked advanced-material=blocked resources=9\n\n> blender-web-editor@0.1.0 test:vdb-native\n> node ../tools/web/check-vdb-native-pipeline.mjs\n\nvdb-native-pipeline-ok resources=14 converter=openvdb13-nanovdb32 conversion-deterministic=1 semantic-deterministic=1 official-deterministic=1 malformed=blocked browser-openvdb=off\n\n> blender-web-editor@0.1.0 test:vdb\n> playwright test --config playwright.config.ts -g \"VDB conversion boundary\"\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/smoke.spec.ts:1156:1 › validates the VDB conversion boundary and NanoVDB streaming contract (1.5s)\n\n 1 passed (3.3s)\n\n[WebServer] (node:1987436) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1987453) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"885edcc156f87abdbddb0e70fde5566130acfc2770a0b6764d66d12c344973a6",
|
||||
"7b2d576a613dff314f4b40177f10efa3c01e160b7aeb10bf95a69f6553f8f73b",
|
||||
"a4c57345a4ea7302b9e2a7e0f8b0ed48f8f27c3ac70d41e02f6d92475a751298",
|
||||
"179868fde557873b4c74c48e2f0d3199784efb6309ed00dd17310b494b975483",
|
||||
"a13cf2747dacfbf4c0e6b50dd341db3adac32c7c3c9c07814349a90aa4436a3b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "chromium",
|
||||
"fields": [
|
||||
@@ -459,10 +548,10 @@
|
||||
],
|
||||
"command": "npm --prefix web run test:e2e -- --workers=1 && npm --prefix web run test:browser",
|
||||
"exitCode": 0,
|
||||
"durationMs": 147877,
|
||||
"output": "and LOD profiles at the protocol boundary (1.1s)\n ✓ 73 tests/e2e/smoke.spec.ts:1866:1 › normalizes skin influences and rejects shape-key loss explicitly (1.1s)\n ✓ 74 tests/e2e/smoke.spec.ts:1891:1 › remaps skin weights and shape keys through the native Collapse worker path (1.4s)\n ✓ 75 tests/e2e/smoke.spec.ts:1947:1 › reports GLB export blockers before any binary export (1.1s)\n ✓ 76 tests/e2e/smoke.spec.ts:1959:1 › blocks Shader graphs that cannot be mapped to glTF PBR (1.0s)\n ✓ 77 tests/e2e/smoke.spec.ts:1986:1 › maps bounded RGB and Value Shader constants to glTF PBR factors (1.0s)\n ✓ 78 tests/e2e/smoke.spec.ts:2019:1 › exports a local SceneIR mesh as a standards-shaped GLB (1.0s)\n ✓ 79 tests/e2e/smoke.spec.ts:2052:1 › keeps per-vertex UV and color attributes in GLB output (1.0s)\n ✓ 80 tests/e2e/smoke.spec.ts:2079:1 › evaluates modifier dependency order and blocks unevaluated or cyclic stacks (1.1s)\n ✓ 81 tests/e2e/smoke.spec.ts:2094:1 › embeds local textures and exports glTF skin and animation records (1.1s)\n ✓ 82 tests/e2e/smoke.spec.ts:2144:1 › reports lightweight budget violations without altering usage (1.0s)\n ✓ 83 tests/e2e/smoke.spec.ts:2162:1 › aggregates project, collection, object and LOD budgets without double counting LOD (1.0s)\n ✓ 84 tests/e2e/smoke.spec.ts:2188:1 › round-trips LOD geometry through the local binary mesh cache container (1.0s)\n ✓ 85 tests/e2e/smoke.spec.ts:2212:1 › blocks ImageIR paths outside the project asset sandbox (1.3s)\n ✓ 86 tests/e2e/smoke.spec.ts:2255:1 › extracts Blender packed image bytes through the local asset request API (1.3s)\n ✓ 87 tests/e2e/smoke.spec.ts:2300:1 › matches Blender Depsgraph deformation golden within the declared error budget (1.4s)\n ✓ 88 tests/e2e/smoke.spec.ts:2339:1 › evaluates the full Blender Depsgraph or reports its safe capability gate (1.4s)\n ✓ 89 tests/e2e/smoke.spec.ts:2399:1 › exports layered Action keyframes through SceneIR (1.3s)\n ✓ 90 tests/e2e/smoke.spec.ts:2440:1 › patches changed mesh buffer ranges without replacing stable topology (1.0s)\n ✓ 91 tests/e2e/smoke.spec.ts:2464:1 › renders through the capability-gated OffscreenCanvas worker (1.3s)\n ✓ 92 tests/e2e/smoke.spec.ts:2477:1 › coalesces linked mesh objects into a raycastable instance group (1.9s)\n ✓ 93 tests/e2e/smoke.spec.ts:2485:1 › returns structured gates for the undeclared capability protocols (1.2s)\n ✓ 94 tests/e2e/smoke.spec.ts:2544:1 › exposes PBR-007 to PBR-012 renderer security gates (1.1s)\n ✓ 95 tests/e2e/smoke.spec.ts:2578:1 › transfers packed raster assets into the PBR viewport with an explicit status (2.0s)\n ✓ 96 tests/e2e/smoke.spec.ts:2587:1 › uses the same packed texture payload in the OffscreenCanvas renderer (1.9s)\n\n 96 passed (2.3m)\n\n> blender-web-editor@0.1.0 test:browser\n> playwright test --config playwright.release.config.ts\n\n\nRunning 3 tests using 1 worker\n\n ✓ 1 [chromium] › tests/e2e/cross-browser.spec.ts:6:1 › boots the offline engine, renders SceneIR and performs a Main edit (2.8s)\n ✓ 2 [chromium] › tests/e2e/cross-browser.spec.ts:32:1 › keeps content-addressed asset recovery available in Chromium (1.2s)\n ✓ 3 [chromium] › tests/e2e/cross-browser.spec.ts:51:1 › keeps the committed project after quota failure and Worker restart in Chromium (1.1s)\n\n 3 passed (6.7s)\n\n[WebServer] (node:1350053) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1350065) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1355845) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1355857) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"durationMs": 219085,
|
||||
"output": " (1.4s)\n ✓ 95 tests/e2e/smoke.spec.ts:2607:1 › reports GLB export blockers before any binary export (1.1s)\n ✓ 96 tests/e2e/smoke.spec.ts:2619:1 › blocks Shader graphs that cannot be mapped to glTF PBR (1.0s)\n ✓ 97 tests/e2e/smoke.spec.ts:2646:1 › maps bounded RGB and Value Shader constants to glTF PBR factors (1.0s)\n ✓ 98 tests/e2e/smoke.spec.ts:2679:1 › exports a local SceneIR mesh as a standards-shaped GLB (1.0s)\n ✓ 99 tests/e2e/smoke.spec.ts:2712:1 › keeps per-vertex UV and color attributes in GLB output (1.1s)\n ✓ 100 tests/e2e/smoke.spec.ts:2739:1 › evaluates modifier dependency order and blocks unevaluated or cyclic stacks (1.1s)\n ✓ 101 tests/e2e/smoke.spec.ts:2754:1 › embeds local textures and exports glTF skin and animation records (1.1s)\n ✓ 102 tests/e2e/smoke.spec.ts:2804:1 › reports lightweight budget violations without altering usage (1.1s)\n ✓ 103 tests/e2e/smoke.spec.ts:2822:1 › aggregates project, collection, object and LOD budgets without double counting LOD (1.0s)\n ✓ 104 tests/e2e/smoke.spec.ts:2848:1 › round-trips LOD geometry through the local binary mesh cache container (1.0s)\n ✓ 105 tests/e2e/smoke.spec.ts:2872:1 › blocks ImageIR paths outside the project asset sandbox (1.3s)\n ✓ 106 tests/e2e/smoke.spec.ts:2915:1 › extracts Blender packed image bytes through the local asset request API (1.4s)\n ✓ 107 tests/e2e/smoke.spec.ts:2960:1 › matches Blender Depsgraph deformation golden within the declared error budget (1.4s)\n ✓ 108 tests/e2e/smoke.spec.ts:2999:1 › evaluates the full Blender Depsgraph or reports its safe capability gate (1.4s)\n ✓ 109 tests/e2e/smoke.spec.ts:3059:1 › exports layered Action keyframes through SceneIR (1.3s)\n ✓ 110 tests/e2e/smoke.spec.ts:3100:1 › patches changed mesh buffer ranges without replacing stable topology (1.1s)\n ✓ 111 tests/e2e/smoke.spec.ts:3124:1 › renders through the capability-gated OffscreenCanvas worker (1.4s)\n ✓ 112 tests/e2e/smoke.spec.ts:3137:1 › coalesces linked mesh objects into a raycastable instance group (1.9s)\n ✓ 113 tests/e2e/smoke.spec.ts:3145:1 › returns structured gates for the undeclared capability protocols (1.2s)\n ✓ 114 tests/e2e/smoke.spec.ts:3204:1 › exposes PBR-007 to PBR-012 renderer security gates (1.1s)\n ✓ 115 tests/e2e/smoke.spec.ts:3238:1 › transfers packed raster assets into the PBR viewport with an explicit status (1.7s)\n ✓ 116 tests/e2e/smoke.spec.ts:3247:1 › uses the same packed texture payload in the OffscreenCanvas renderer (1.8s)\n ✓ 117 tests/e2e/texture-4k-performance.spec.ts:3:1 › decodes, uploads and renders a validated 4K texture in Chromium (1.8s)\n ✓ 118 tests/e2e/texture-8k-performance.spec.ts:3:1 › decodes, uploads and renders a validated 8K texture in Chromium (4.2s)\n\n 118 passed (3.5m)\n\n> blender-web-editor@0.1.0 test:browser\n> playwright test --config playwright.release.config.ts\n\n\nRunning 3 tests using 1 worker\n\n ✓ 1 [chromium] › tests/e2e/cross-browser.spec.ts:6:1 › boots the offline engine, renders SceneIR and performs a Main edit (2.8s)\n ✓ 2 [chromium] › tests/e2e/cross-browser.spec.ts:32:1 › keeps content-addressed asset recovery available in Chromium (1.0s)\n ✓ 3 [chromium] › tests/e2e/cross-browser.spec.ts:51:1 › keeps the committed project after quota failure and Worker restart in Chromium (1.1s)\n\n 3 passed (6.6s)\n\n[WebServer] (node:1987737) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1987749) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1993877) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1993889) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"c726ef40a81b39b479a955a1fb1932ceaef4a87cefc6443f9e4c0c96de1b814c"
|
||||
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -472,10 +561,25 @@
|
||||
],
|
||||
"command": "npm --prefix web run test:release-performance",
|
||||
"exitCode": 0,
|
||||
"durationMs": 89206,
|
||||
"output": "> blender-web-editor@0.1.0 test:release-performance\n> node ../tools/web/check-release-performance.mjs\n\nrelease-performance-ok [{\"target\":100000,\"ratio\":0.9,\"outputTriangles\":89999,\"elapsedMs\":88134,\"heapBytes\":67108864},{\"target\":1000000,\"ratio\":1,\"outputTriangles\":1000000,\"elapsedMs\":535,\"heapBytes\":346554368}]\n\nHeap resize call from 67108864 to 80543744 took 0.2166599999909522 msecs. Success: true\nHeap resize call from 80543744 to 96665600 took 0.10756300001230557 msecs. Success: true\nHeap resize call from 96665600 to 115998720 took 0.04437800000596326 msecs. Success: true\nHeap resize call from 115998720 to 139198464 took 1.4113389999984065 msecs. Success: true\nHeap resize call from 139198464 to 167051264 took 1.4725370000087423 msecs. Success: true\nHeap resize call from 167051264 to 200474624 took 1.4998959999938961 msecs. Success: true\nHeap resize call from 200474624 to 240582656 took 1.49847900000168 msecs. Success: true\nHeap resize call from 240582656 to 288751616 took 1.4405399999959627 msecs. Success: true\nHeap resize call from 288751616 to 346554368 took 1.4891829999978654 msecs. Success: true",
|
||||
"durationMs": 93399,
|
||||
"output": "> blender-web-editor@0.1.0 test:release-performance\n> node ../tools/web/check-release-performance.mjs\n\nrelease-performance-ok [{\"target\":100000,\"ratio\":0.9,\"outputTriangles\":89999,\"elapsedMs\":92308,\"heapBytes\":67108864},{\"target\":1000000,\"ratio\":1,\"outputTriangles\":1000000,\"elapsedMs\":540,\"heapBytes\":346554368}]\n\nHeap resize call from 67108864 to 80543744 took 0.22668800000974443 msecs. Success: true\nHeap resize call from 80543744 to 96665600 took 0.08722699999634642 msecs. Success: true\nHeap resize call from 96665600 to 115998720 took 0.04216300000553019 msecs. Success: true\nHeap resize call from 115998720 to 139198464 took 1.3969159999978729 msecs. Success: true\nHeap resize call from 139198464 to 167051264 took 1.700714999999036 msecs. Success: true\nHeap resize call from 167051264 to 200474624 took 1.4438179999997374 msecs. Success: true\nHeap resize call from 200474624 to 240582656 took 1.4305880000028992 msecs. Success: true\nHeap resize call from 240582656 to 288751616 took 1.5049569999973755 msecs. Success: true\nHeap resize call from 288751616 to 346554368 took 1.4472269999969285 msecs. Success: true",
|
||||
"artifactSha256": [
|
||||
"c726ef40a81b39b479a955a1fb1932ceaef4a87cefc6443f9e4c0c96de1b814c"
|
||||
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "simulation-cache",
|
||||
"fields": [
|
||||
"performance.simulationCache"
|
||||
],
|
||||
"command": "npm --prefix web run test:simulation-cache-performance",
|
||||
"exitCode": 0,
|
||||
"durationMs": 7549,
|
||||
"output": "> blender-web-editor@0.1.0 test:simulation-cache-performance\n> playwright test --config playwright.config.ts tests/e2e/simulation-cache-performance.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/simulation-cache-performance.spec.ts:3:1 › meets the Chromium OPFS Simulation cache playback performance gate (5.1s)\n\n 1 passed (6.7s)\n\n[WebServer] (node:1994548) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1994560) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"c8074425a4556c8d08c2382dc9fd7be8aa6078d11a45640c4b19bf6ef45aa590",
|
||||
"331d5c6a59dc80a12cc7105abbd60d25a64a113809eae9ad3d4061d81ec5f59f",
|
||||
"535285f629b981e63e423f16df47d90afea4f5f17fca2bef36d0f6a8236697b2"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -485,12 +589,68 @@
|
||||
],
|
||||
"command": "npm --prefix web run test:malicious-blends",
|
||||
"exitCode": 0,
|
||||
"durationMs": 561,
|
||||
"durationMs": 541,
|
||||
"output": "> blender-web-editor@0.1.0 test:malicious-blends\n> node ../tools/web/check-malicious-blends.mjs\n\nmalicious-blends-ok rejected=5",
|
||||
"artifactSha256": [
|
||||
"6fcc55bda74da8c95da96ba068b60339bf60ca44147ff8000fbb95d296db2a73"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "network-interruption",
|
||||
"fields": [
|
||||
"faults.networkInterrupt"
|
||||
],
|
||||
"command": "npm --prefix web run test:network-interruption",
|
||||
"exitCode": 0,
|
||||
"durationMs": 5632,
|
||||
"output": "> blender-web-editor@0.1.0 test:network-interruption\n> playwright test --config playwright.config.ts tests/e2e/network-interruption.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/network-interruption.spec.ts:6:1 › keeps Main edit and save-reopen available during a Chromium network interruption (3.1s)\n\n 1 passed (4.7s)\n\n[WebServer] (node:1994872) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1994884) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"b1c03863f44026d44691042536ff1d1095617a35c8d767cc70372e5cbdc70db5",
|
||||
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "device-loss",
|
||||
"fields": [
|
||||
"faults.deviceLoss"
|
||||
],
|
||||
"command": "npm --prefix web run test:device-loss",
|
||||
"exitCode": 0,
|
||||
"durationMs": 5138,
|
||||
"output": "> blender-web-editor@0.1.0 test:device-loss\n> playwright test --config playwright.config.ts tests/e2e/device-loss.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/device-loss.spec.ts:6:1 › recovers the main-thread Chromium viewport after a real WebGL context loss (2.6s)\n\n 1 passed (4.2s)\n\n[WebServer] (node:1995187) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1995199) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"3b18c884f3baed68d4deb72feafbd7fe8b4af7935aaf02206ccc583ea9c527e2",
|
||||
"76d781c0f8508ee68fde09b1bb0d3f7db963e3e2be7d10d60708af2a6a582c24"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "texture-4k",
|
||||
"fields": [
|
||||
"performance.texture4K"
|
||||
],
|
||||
"command": "npm --prefix web run test:texture-4k-performance",
|
||||
"exitCode": 0,
|
||||
"durationMs": 4857,
|
||||
"output": "> blender-web-editor@0.1.0 test:texture-4k-performance\n> playwright test --config playwright.config.ts tests/e2e/texture-4k-performance.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/texture-4k-performance.spec.ts:3:1 › decodes, uploads and renders a validated 4K texture in Chromium (2.3s)\n\n 1 passed (4.0s)\n\n[WebServer] (node:1995463) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1995475) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"093588bcdf08f8b5a5aa8baceddbd7b499c43e5acda7f793b34ac54c79782490",
|
||||
"75f2f33753a160f60acc56ad850bc149cef7fa2b54a42d5e75cf22402c9ac91d"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "texture-8k",
|
||||
"fields": [
|
||||
"performance.texture8K"
|
||||
],
|
||||
"command": "npm --prefix web run test:texture-8k-performance",
|
||||
"exitCode": 0,
|
||||
"durationMs": 7112,
|
||||
"output": "> blender-web-editor@0.1.0 test:texture-8k-performance\n> playwright test --config playwright.config.ts tests/e2e/texture-8k-performance.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/texture-8k-performance.spec.ts:3:1 › decodes, uploads and renders a validated 8K texture in Chromium (4.6s)\n\n 1 passed (6.2s)\n\n[WebServer] (node:1995736) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1995748) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"093588bcdf08f8b5a5aa8baceddbd7b499c43e5acda7f793b34ac54c79782490",
|
||||
"75f2f33753a160f60acc56ad850bc149cef7fa2b54a42d5e75cf22402c9ac91d"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "zip-bomb",
|
||||
"fields": [
|
||||
@@ -498,10 +658,10 @@
|
||||
],
|
||||
"command": "WEB_TEST_PORT=5323 npm --prefix web run test:asset-library",
|
||||
"exitCode": 0,
|
||||
"durationMs": 4132,
|
||||
"output": "> blender-web-editor@0.1.0 test:asset-library\n> playwright test --config playwright.config.ts -g \"N-023 asset\"\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/smoke.spec.ts:711:1 › validates N-023 asset catalogs, library graphs, archive budgets and IO gates (1.5s)\n\n 1 passed (3.3s)\n\n[WebServer] (node:1356360) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1356372) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"durationMs": 4198,
|
||||
"output": "> blender-web-editor@0.1.0 test:asset-library\n> playwright test --config playwright.config.ts -g \"N-023 asset\"\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/smoke.spec.ts:969:1 › validates N-023 asset catalogs, library graphs, archive budgets and IO gates (1.5s)\n\n 1 passed (3.3s)\n\n[WebServer] (node:1996023) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:1996035) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
|
||||
"artifactSha256": [
|
||||
"6169748c5bf78a8e101196e964db67b8a65c2ba95bb3b4a54e052721be01a7bf"
|
||||
"5c62539db3833a2113007dfbdfd12ca06704d86e0cf0e57ad97f7fbf6acda7f4"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -509,11 +669,11 @@
|
||||
"fields": [],
|
||||
"command": "npm --prefix web run test:release-package",
|
||||
"exitCode": 0,
|
||||
"durationMs": 4871,
|
||||
"output": "> blender-web-editor@0.1.0 test:release-package\n> npm run build && npm run release:sbom && node ../tools/web/check-release-package.mjs\n\n\n> blender-web-editor@0.1.0 build\n> tsc -p tsconfig.json && vite build --config app/vite.config.ts\n\nvite v8.2.0 building client environment for production...\n\u001b[2K\rtransforming...✓ 45 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.45 kB │ gzip: 0.29 kB\ndist/assets/storage.worker-hjSYzFAQ.js 36.77 kB\ndist/assets/web-engine.worker-BpNH8d2z.js 243.09 kB\ndist/assets/viewport-render.worker-B2Y56q7a.js 555.34 kB\ndist/assets/web_engine-sUS61MK9.wasm 15,032.79 kB │ gzip: 3,557.59 kB\ndist/assets/index-C4cauSFG.css 11.20 kB │ gzip: 3.14 kB\ndist/assets/index-B3UcZYVN.js 890.91 kB │ gzip: 239.96 kB\n\n✓ built in 561ms\n\n> blender-web-editor@0.1.0 release:sbom\n> node ../tools/web/generate-sbom.mjs\n\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\nrelease-package-ok files=10 bytes=31935334\n\n[plugin rolldown:vite-resolve] Module \"module\" has been externalized for browser compatibility, imported by \"/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js\". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\n[plugin builtin:vite-reporter] \n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.",
|
||||
"durationMs": 5619,
|
||||
"output": "> blender-web-editor@0.1.0 test:release-package\n> npm run build && npm run release:sbom && node ../tools/web/check-release-package.mjs\n\n\n> blender-web-editor@0.1.0 build\n> tsc -p tsconfig.json && vite build --config app/vite.config.ts\n\nvite v8.2.0 building client environment for production...\n\u001b[2K\rtransforming...✓ 51 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.45 kB │ gzip: 0.29 kB\ndist/assets/storage.worker-hjSYzFAQ.js 36.77 kB\ndist/assets/web-engine.worker-CWkf48pG.js 245.76 kB\ndist/assets/viewport-render.worker-DXSzkSWB.js 592.78 kB\ndist/assets/web_engine-CvVHxFlQ.wasm 15,048.04 kB │ gzip: 3,562.32 kB\ndist/assets/index-QI0bg0OR.css 11.41 kB │ gzip: 3.18 kB\ndist/assets/index-Ce6I8dqP.js 951.79 kB │ gzip: 256.93 kB\n\n✓ built in 623ms\n\n> blender-web-editor@0.1.0 release:sbom\n> node ../tools/web/generate-sbom.mjs\n\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\nrelease-package-ok files=10 bytes=32067024\n\n[plugin rolldown:vite-resolve] Module \"module\" has been externalized for browser compatibility, imported by \"/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js\". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\n[plugin builtin:vite-reporter] \n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.",
|
||||
"artifactSha256": [
|
||||
"8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30",
|
||||
"c726ef40a81b39b479a955a1fb1932ceaef4a87cefc6443f9e4c0c96de1b814c"
|
||||
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -524,12 +684,12 @@
|
||||
],
|
||||
"command": "npm --prefix web run release:offline",
|
||||
"exitCode": 0,
|
||||
"durationMs": 36624,
|
||||
"output": "> blender-web-editor@0.1.0 release:offline\n> npm run build && node ../tools/web/check-offline-reproducibility.mjs\n\n\n> blender-web-editor@0.1.0 build\n> tsc -p tsconfig.json && vite build --config app/vite.config.ts\n\nvite v8.2.0 building client environment for production...\n\u001b[2K\rtransforming...✓ 45 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.45 kB │ gzip: 0.29 kB\ndist/assets/storage.worker-hjSYzFAQ.js 36.77 kB\ndist/assets/web-engine.worker-BpNH8d2z.js 243.09 kB\ndist/assets/viewport-render.worker-B2Y56q7a.js 555.34 kB\ndist/assets/web_engine-sUS61MK9.wasm 15,032.79 kB │ gzip: 3,557.59 kB\ndist/assets/index-C4cauSFG.css 11.20 kB │ gzip: 3.14 kB\ndist/assets/index-B3UcZYVN.js 890.91 kB │ gzip: 239.96 kB\n\n✓ built in 563ms\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\noffline-release-ok binary=7542083 source=205692822 sha256=2669cf265c02d463c5ade98bae4d671dfc443f1973b6a9fb77ee29613923287b\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\noffline-release-ok binary=7542083 source=205692822 sha256=2669cf265c02d463c5ade98bae4d671dfc443f1973b6a9fb77ee29613923287b\noffline-reproducibility-ok binary=2669cf265c02d463c5ade98bae4d671dfc443f1973b6a9fb77ee29613923287b source=ee2cbbe62f42abae959bd5e3d1aa4cc5bee491ae23a85fa50b7519dc6a2549b0\n\n[plugin rolldown:vite-resolve] Module \"module\" has been externalized for browser compatibility, imported by \"/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js\". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\n[plugin builtin:vite-reporter] \n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.",
|
||||
"durationMs": 41303,
|
||||
"output": "> blender-web-editor@0.1.0 release:offline\n> npm run build && node ../tools/web/check-offline-reproducibility.mjs\n\n\n> blender-web-editor@0.1.0 build\n> tsc -p tsconfig.json && vite build --config app/vite.config.ts\n\nvite v8.2.0 building client environment for production...\n\u001b[2K\rtransforming...✓ 51 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.45 kB │ gzip: 0.29 kB\ndist/assets/storage.worker-hjSYzFAQ.js 36.77 kB\ndist/assets/web-engine.worker-CWkf48pG.js 245.76 kB\ndist/assets/viewport-render.worker-DXSzkSWB.js 592.78 kB\ndist/assets/web_engine-CvVHxFlQ.wasm 15,048.04 kB │ gzip: 3,562.32 kB\ndist/assets/index-QI0bg0OR.css 11.41 kB │ gzip: 3.18 kB\ndist/assets/index-Ce6I8dqP.js 951.79 kB │ gzip: 256.93 kB\n\n✓ built in 723ms\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\noffline-release-ok binary=7575306 source=205785402 sha256=078f45513ab579800ab3688f7c5e35d31be0d9dc283db5cee1a68d77553bfb34\nsbom-ok packages=150 sha256=8b04215a993f62ba64e0adcb1ba36ac830191f8215bf8cf2681fdf7bbb63da30\noffline-release-ok binary=7575306 source=205785402 sha256=078f45513ab579800ab3688f7c5e35d31be0d9dc283db5cee1a68d77553bfb34\noffline-reproducibility-ok binary=078f45513ab579800ab3688f7c5e35d31be0d9dc283db5cee1a68d77553bfb34 source=ca97bef8cbe7943586e7af1df631775ce6ea041677c8bbb98da2fcc73baa9e1a\n\n[plugin rolldown:vite-resolve] Module \"module\" has been externalized for browser compatibility, imported by \"/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js\". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\n[plugin builtin:vite-reporter] \n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.",
|
||||
"artifactSha256": [
|
||||
"2669cf265c02d463c5ade98bae4d671dfc443f1973b6a9fb77ee29613923287b",
|
||||
"ee2cbbe62f42abae959bd5e3d1aa4cc5bee491ae23a85fa50b7519dc6a2549b0",
|
||||
"3d807f874e9703322a69318c856ff493dd7489357f06dc78f3496c7a46a30612"
|
||||
"078f45513ab579800ab3688f7c5e35d31be0d9dc283db5cee1a68d77553bfb34",
|
||||
"ca97bef8cbe7943586e7af1df631775ce6ea041677c8bbb98da2fcc73baa9e1a",
|
||||
"39c7f9be555f2727519a733237de22e66a33d33ac1b0aecfacd2ae695de10b28"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
224
docs/status/vdb-native-evidence.json
Normal file
224
docs/status/vdb-native-evidence.json
Normal file
@@ -0,0 +1,224 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"resourceLibrary": "/home/mes123456/resource-library/blender-web-vdb",
|
||||
"browserOpenVDB": false,
|
||||
"desktopOpenVDB": true,
|
||||
"serverJobConfigured": true,
|
||||
"serverIsolation": "bwrap-unshare-all+readonly-root+prlimit",
|
||||
"opfsStreamingConfigured": true,
|
||||
"webgpuRendererConfigured": true,
|
||||
"mainVolumeRoundtripConfigured": true,
|
||||
"primaryViewportVolumeIntegrated": false,
|
||||
"materialSemantics": {
|
||||
"supported": [
|
||||
"DENSITY_GRID_FLOAT32",
|
||||
"CONSTANT_COLOR",
|
||||
"CONSTANT_EMISSION",
|
||||
"ANISOTROPY",
|
||||
"NEAREST",
|
||||
"LINEAR"
|
||||
],
|
||||
"explicitLosses": [
|
||||
"COLOR_GRID",
|
||||
"TEMPERATURE_BLACKBODY",
|
||||
"EMISSION_GRID",
|
||||
"VELOCITY_MOTION"
|
||||
]
|
||||
},
|
||||
"chromiumWebGPU": {
|
||||
"renderer": "SwiftShader WebGPU",
|
||||
"densityPayloadBytes": 2563744,
|
||||
"nativeCpuGpuSamples": 5,
|
||||
"imageWidth": 96,
|
||||
"imageHeight": 96,
|
||||
"imageSha256": "7aab6639d8d173a4b22d913d16b9c61eeea4cc00cb8ccec2202edf75a1b1f978"
|
||||
},
|
||||
"releaseStatus": "BLOCKED",
|
||||
"remainingReleaseBlockers": [
|
||||
"primary-offscreen-viewport-volume-scene-integration",
|
||||
"color-temperature-emission-grid-shading",
|
||||
"three-view-desktop-chromium-pixel-goldens",
|
||||
"64MiB-512MiB-1GiB-stream-device-loss-oom-gates"
|
||||
],
|
||||
"toolchain": {
|
||||
"openVDBVersion": "13.0.0",
|
||||
"nanoVDBVersion": "32.9.0",
|
||||
"converterPath": "/home/mes123456/workinf_Blender_Wasm/build_vdb_tools/vdb_to_nanovdb",
|
||||
"converterSha256": "2c62efc12bb4b7590cec699fa7e0768f64840c0571c0b0aff917a699ac7b5450",
|
||||
"generatorPath": "/home/mes123456/workinf_Blender_Wasm/build_vdb_tools/vdb_fixture_generator",
|
||||
"generatorSha256": "fea8abfef4ef5a065584390bc5acd060babfd58097200972067a990a3efad7d5"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"id": "OpenVDB-Apache-2.0",
|
||||
"path": "licenses/OpenVDB-Apache-2.0.txt",
|
||||
"sha256": "a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9"
|
||||
},
|
||||
{
|
||||
"id": "CC-BY-4.0",
|
||||
"path": "licenses/CC-BY-4.0.txt",
|
||||
"sha256": "8d3fceb4cb62663775f02c1c551cfbf332d1c736667c17817c16c635caba21e0"
|
||||
}
|
||||
],
|
||||
"resources": [
|
||||
{
|
||||
"id": "generated-smoke",
|
||||
"kind": "SOURCE_VDB",
|
||||
"path": "generated/generated-smoke.vdb",
|
||||
"byteLength": 605604,
|
||||
"sha256": "586f7cdf4b3329fcb7ef00fc57b12a268baafdbaac0a2b3d1bfa142a22ccda33",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Generated locally by tools/vdb/vdb_fixture_generator.cc with OpenVDB 13.0.0; contains no third-party model data"
|
||||
},
|
||||
{
|
||||
"id": "generated-level-set",
|
||||
"kind": "SOURCE_VDB",
|
||||
"path": "generated/generated-level-set.vdb",
|
||||
"byteLength": 151127,
|
||||
"sha256": "ba162b5a60dd1e9684846ede1c1a427655d71fd10d5dbb8ef81c9be88a01ed69",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Generated locally by tools/vdb/vdb_fixture_generator.cc with OpenVDB 13.0.0; contains no third-party model data"
|
||||
},
|
||||
{
|
||||
"id": "generated-large-bounds-sparse",
|
||||
"kind": "SOURCE_VDB",
|
||||
"path": "generated/generated-large-bounds-sparse.vdb",
|
||||
"byteLength": 28954,
|
||||
"sha256": "643981dcf9d358b34537b93755e92b1af98d3a3ab54a62ae93dcf6d6be559972",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Generated locally by tools/vdb/vdb_fixture_generator.cc with OpenVDB 13.0.0; contains no third-party model data"
|
||||
},
|
||||
{
|
||||
"id": "generated-smoke-truncated",
|
||||
"kind": "MALFORMED_VDB",
|
||||
"path": "generated/generated-smoke-truncated.vdb",
|
||||
"byteLength": 1024,
|
||||
"sha256": "4bce5c630e84e556f55deca29fbeeb5cd6d5b50bace5e46745b6c9b61a3fb781",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Generated locally by tools/vdb/vdb_fixture_generator.cc with OpenVDB 13.0.0; contains no third-party model data",
|
||||
"expectedResult": "VDB_CONVERSION_FAILED"
|
||||
},
|
||||
{
|
||||
"id": "official-sphere",
|
||||
"kind": "SOURCE_VDB",
|
||||
"path": "official/sphere.vdb",
|
||||
"byteLength": 861072,
|
||||
"sha256": "bb884a9a38354e47191c4ece4a11d1e051594a910fde56501cfc51ff52b171ab",
|
||||
"license": "CC-BY-4.0",
|
||||
"origin": "OpenVDB official sample model repository",
|
||||
"sourcePage": "https://www.openvdb.org/download/",
|
||||
"sourceUrl": "https://media.githubusercontent.com/media/AcademySoftwareFoundation/openvdb-website/master/download/models/sphere.vdb",
|
||||
"upstreamLfsSha256": "bb884a9a38354e47191c4ece4a11d1e051594a910fde56501cfc51ff52b171ab",
|
||||
"attribution": "Academy Software Foundation OpenVDB sample models"
|
||||
},
|
||||
{
|
||||
"id": "generated-smoke-nanovdb",
|
||||
"kind": "NANOVDB_BUNDLE",
|
||||
"path": "nanovdb/generated-smoke.nvdb",
|
||||
"byteLength": 15469795,
|
||||
"sha256": "e1f341b9b21025b59c73277110f6a02c029765335016f5cc36baa5a8da002903",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Derived from generated-smoke",
|
||||
"derivedFrom": "generated-smoke"
|
||||
},
|
||||
{
|
||||
"id": "generated-level-set-nanovdb",
|
||||
"kind": "NANOVDB_BUNDLE",
|
||||
"path": "nanovdb/generated-level-set.nvdb",
|
||||
"byteLength": 2649704,
|
||||
"sha256": "fdd332afda542ee45d618ab8a0bf07fa0afd350900b9ca3238bb7ad0e0ce69ea",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Derived from generated-level-set",
|
||||
"derivedFrom": "generated-level-set"
|
||||
},
|
||||
{
|
||||
"id": "generated-large-bounds-sparse-nanovdb",
|
||||
"kind": "NANOVDB_BUNDLE",
|
||||
"path": "nanovdb/generated-large-bounds-sparse.nvdb",
|
||||
"byteLength": 917224,
|
||||
"sha256": "c096456ded740861577ee2a0ceb8d2a05e1847f0fbbdc102cbb18401b8af360e",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Derived from generated-large-bounds-sparse",
|
||||
"derivedFrom": "generated-large-bounds-sparse"
|
||||
},
|
||||
{
|
||||
"id": "official-sphere-nanovdb",
|
||||
"kind": "NANOVDB_BUNDLE",
|
||||
"path": "nanovdb/official-sphere.nvdb",
|
||||
"byteLength": 5546250,
|
||||
"sha256": "689a2ef4e2d0302a3c7657dba58568fb22bc9e9dea5528cdbdb341455c1c7194",
|
||||
"license": "CC-BY-4.0",
|
||||
"origin": "OpenVDB official sample model repository",
|
||||
"derivedFrom": "official-sphere"
|
||||
},
|
||||
{
|
||||
"id": "generated-smoke-browser-manifest",
|
||||
"kind": "NANOVDB_MANIFEST",
|
||||
"path": "manifests/generated-smoke.nanovdb.json",
|
||||
"byteLength": 7706,
|
||||
"sha256": "5226ccb3820c576205c5e624e543328c1d457138a1e301623a1d263abedbc1e0",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Derived from generated-smoke conversion report",
|
||||
"derivedFrom": "generated-smoke-nanovdb"
|
||||
},
|
||||
{
|
||||
"id": "generated-smoke-conversion-report",
|
||||
"kind": "CONVERSION_REPORT",
|
||||
"path": "reports/generated-smoke-conversion.json",
|
||||
"byteLength": 4782,
|
||||
"sha256": "e7693bdd364799780c775dd0bef5aa4c85919a7d17deb1b46e1726005a433a8f",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Native OpenVDB to NanoVDB report",
|
||||
"derivedFrom": "generated-smoke"
|
||||
},
|
||||
{
|
||||
"id": "generated-level-set-conversion-report",
|
||||
"kind": "CONVERSION_REPORT",
|
||||
"path": "reports/generated-level-set-conversion.json",
|
||||
"byteLength": 2275,
|
||||
"sha256": "6fadc9b5609307b4b8715d9476c5d26962d5d621d104eaeb2a6a4f364c3670ff",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Native OpenVDB to NanoVDB report",
|
||||
"derivedFrom": "generated-level-set"
|
||||
},
|
||||
{
|
||||
"id": "generated-large-bounds-conversion-report",
|
||||
"kind": "CONVERSION_REPORT",
|
||||
"path": "reports/generated-large-bounds-sparse-conversion.json",
|
||||
"byteLength": 1794,
|
||||
"sha256": "a55d333e14ef9e23478032d47c5f8d5e736d9198aea64c603836d7e9fc953018",
|
||||
"license": "PROJECT_GENERATED_FIXTURE",
|
||||
"origin": "Native OpenVDB to NanoVDB report",
|
||||
"derivedFrom": "generated-large-bounds-sparse"
|
||||
},
|
||||
{
|
||||
"id": "official-sphere-conversion-report",
|
||||
"kind": "CONVERSION_REPORT",
|
||||
"path": "reports/official-sphere-conversion.json",
|
||||
"byteLength": 2240,
|
||||
"sha256": "8f577982ea83948fc666bcfcbfcdc22b9b40e210c376d86db8a1f8be910b99c1",
|
||||
"license": "CC-BY-4.0",
|
||||
"origin": "OpenVDB official sample model repository",
|
||||
"derivedFrom": "official-sphere"
|
||||
}
|
||||
],
|
||||
"validations": [
|
||||
"source-byte-length-and-sha256",
|
||||
"official-git-lfs-sha256",
|
||||
"openvdb13-nanovdb32-real-conversion",
|
||||
"same-source-conversion-determinism",
|
||||
"semantic-grid-conversion-determinism",
|
||||
"official-sphere-conversion-determinism",
|
||||
"truncated-vdb-rejection",
|
||||
"browser-manifest-validation",
|
||||
"browser-openvdb-disabled",
|
||||
"native-cancel-timeout-atomic-output",
|
||||
"isolated-server-job-idempotency-signature-cancel",
|
||||
"desktop-server-bundle-hash-equality",
|
||||
"real-bundle-opfs-atomic-commit-worker-reopen-tamper-gate",
|
||||
"nanovdb-float32-native-cpu-webgpu-sample-equality",
|
||||
"chromium-webgpu-volume-integration-golden",
|
||||
"bounded-material-mapping-loss-report",
|
||||
"volume-main-undo-redo-save-reopen"
|
||||
]
|
||||
}
|
||||
@@ -15,7 +15,9 @@ move from `待验证` only after a task adds a build or browser regression test.
|
||||
| Blender `draw/gpu` viewport | 关闭首期 | Three.js is the browser renderer | W-013, W-050 |
|
||||
| Python runtime and automatic `.blend` scripts | 关闭首期 | security and package-size boundary | W-117 |
|
||||
| Cycles, CUDA/OptiX, Embree | 关闭首期 | server-side or native rendering only | roadmap non-goal |
|
||||
| OpenVDB, USD, FFmpeg | 关闭首期 | server-side or later format modules | W-021 |
|
||||
| OpenVDB | 浏览器关闭;桌面/服务端转换目标 planned | 读取 `.vdb` 并输出受校验 NanoVDB;不得链接进浏览器 WASM | N-015 VDB-010~014 |
|
||||
| NanoVDB | 浏览器仅消费格式 | 分块 range + WebGPU sparse volume;当前协议已落地,renderer 阻断 | N-015 VDB-003~034 |
|
||||
| USD, FFmpeg | 关闭首期 | server-side or later format modules | W-021 |
|
||||
| React + TypeScript | 保留 | application UI and state | W-010 |
|
||||
| Three.js (vendored) | 保留 | WebGL2 viewport and scene adapter; runtime has no CDN dependency | W-013, W-050 |
|
||||
| Emscripten runtime | 保留 | Blender C/C++ to WebAssembly | W-020~W-025 |
|
||||
|
||||
Reference in New Issue
Block a user