feat(web): enable UV editing in web UI and use OPFS save/reopen
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

- Forward workspace and mode to the native context in ?ui=web.
- Locate the writable native UV area; enter Edit explicitly and wait for
  project recovery locks before switching mode.
- Save projects to OPFS by default; add an explicit manual .blend download.
- Add UV E2E coverage and implementation status.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-13 04:40:13 +08:00
parent a27aa46d7c
commit 7267db7cb4
5 changed files with 222 additions and 19 deletions

View File

@@ -0,0 +1,66 @@
# Web Blender 全站功能补齐与入门课程 — 实施进度
日期:2026-11-13
状态:**进行中(UV + OPFS 保存检查点完成;四块编辑器其余三块待实现)**
## 本轮铁律
- **OPFS 优先(用户指令):** 平台保存、重开、恢复、课程录制与自动测试全部使用 OPFS;
下载到本地必须由用户手动触发独立入口(顶栏“下载 .blend”、文件 → 下载 .blend 到本地)。
禁止在保存/编辑流程中自动下载。
- **桌面源码为准:** Web 侧行为先查 `blender-5.2.0/source/blender/`。UV 编辑要求
`ob->mode & OB_MODE_EDIT` 且 `sima->mode == SI_MODE_UV`(`editors/space_image/space_image.cc:407`),
`UV` 操作 poll 使用 `ED_operator_uvedit`(`image_ops.cc:1079`)。因此课程与测试显式进入 Edit,
不把“自动进入 Edit”当作验收前提。
## 已完成
### 1. UV Editing 在 `?ui=web` 可操作
- `App.tsx` 的 `dispatchUI` 在 web 模式转发 `switchWorkspace`/`setMode` 到原生上下文;
`selectNativeWorkspace` 先切 UI、再后台同步原生,等待工程恢复锁最多 30 秒。
- UV 工作区确定性定位 `UV_IMAGE:UV` 区域;自动进入 Edit(便利),失败时可用模式菜单显式进入。
- `changeNativeMode` 等待恢复/保存等工程锁与 `headerPending/nativeBusy` 后切换。
- `recoverCachedProject` 取消启动 General 模板,避免 OPFS 恢复被覆盖。
- 验证:
`DISPLAY=:1 CHROME_PATH=/usr/bin/google-chrome GPU_MODE=hardware npx playwright test --config playwright.config.ts tests/e2e/web-uv-workspace-gate.spec.ts --workers=1`
→ **2/2 PASS(35.9s)**:
- UV 工作区找到可写原生 UV 区域,全选→展开提交(revision 增长);
- 保存到 OPFS → reload → 最近项目恢复 → UV 控件与原生 UV 选择仍在。
- 测试入口:`/home/mes123456/workinf_Blender_Wasm/web/tests/e2e/web-uv-workspace-gate.spec.ts`。
- 说明:Playwright 坐标点击会被原生画布/工具栏命中拦截,测试对工作区标签与 UV 按钮使用 DOM
`click()`;产品按钮本身可见可点。
### 2. OPFS 保存与手动下载拆分
- 主保存(顶栏“保存项目”、Ctrl+S、文件 → 保存到浏览器 OPFS、教程/机器人保存)只写 OPFS,
不再自动下载。
- 新增显式手动入口:顶栏“下载 .blend”(`aria-label="下载 .blend"`)、
文件 → 下载 .blend 到本地、F3 “Download Blend File to Local”。
- 另存为写 OPFS;保存副本保留为手动下载副本。
- 未验证:既有历史 spec 中仍以“保存项目 + waitForEvent('download')”取本地 .blend 的用例需要
迁移到新的手动下载入口;本轮未批量改。
### 3. 规则落盘
- `AGENTS.md` 移植铁律已加入“OPFS 优先”条目。
## 待实现(按计划顺序)
1. **Texture Paint 最小 2D 画笔**:图像选择、颜色/大小/强度、光标、笔画、`packImage` 一次提交、
undo/redo、OPFS 保存重开;无 WASM。桌面语义参考 `editors/sculpt_paint/mesh/paint_image*.cc`。
2. **Geometry Nodes 画布**:共享图状态、React Flow 画布、位置/rename/属性、结果面板;
需要一次 WASM 重建(location/properties)。
3. **Spreadsheet 交互式只读表**:数据源/过滤/行列/列重排/CSV;原生属性值读取需 WASM。
4. **Compositor 节点画布**:协议+React Flow+执行/Viewer;原生 writer/reader 缺失,需要最大的一次
WASM 工作。
5. 其余缺口:Area 编辑器选择/⋮、Camera Perspective、Preferences、Outliner、Graph Editor。
6. 15 模块课程、15 个短视频、OPFS 保存重开流程、增量发布到 `https://49.232.250.35:58014/`。
## 已知限制 / 未验证
- 纹理绘制、Compositor 画布、GN 画布、Spreadsheet 尚未实现;课程/视频尚未开始。
- 本轮只验证 Chromium + RTX 4060;未验证其他浏览器。
- 既有保存下载型 spec 尚未迁移;在迁移完成前不要把这些旧 spec 的失败当作产品回归。
- 远端首次 wasm 加载 154–193 秒;课程录制只做本地,页面需提示首载时间。
- 不宣称整体 Blender parity 或用户验收通过。