6.6 KiB
6.6 KiB
N-016 Grease Pencil
状态:BLOCKED(协议、有限 reader/Main transaction、当前帧及相邻帧 onion preview、
current-drawing marquee 和有限 2D point canvas 已落地;完整 2D stroke/segment/Dope 编辑、
modifier 语义和桌面 golden 仍阻断)
已验证切片
- N-016-A:SceneIR 中提供 Layer/Frame/Drawing/Stroke/Point/Attribute schema,校验
finite position、radius、opacity、vertex color、cyclic、material index,并以
1024 layer、100k frame、1M stroke、1M point、65,536 attribute 预算拒绝越界输入。
超预算只允许
blocked + GREASE_PENCIL_BUDGET_EXCEEDED摘要。 - N-016-A:Blender 5.2 Main reader 输出真实 Grease Pencil layer/frame/drawing/stroke
数据,稳定映射
grease-pencil:*与grease-pencil-layer:*ID;对象 dataId 不再降级 为 Empty。 - N-016-B:Main 支持有界 create/remove/reorder layer、insert/remove frame,以及整帧
setGreasePencilStrokestransaction(空 stroke 数组用于擦除)。命令要求单用户数据块, 使用既有 authoritative Main、undo/redo 和 save/reopen 流程。 - N-016-C(部分):radius、opacity、vertex color、cyclic stroke 和 material index 已读写;开启 layer onion skin 时只取最近前一帧和后一帧,使用独立色调、透明材质和关闭 depth write 的有界 preview,当前 drawing 不被替换。
- N-016-D(部分):共享 Three.js 适配器按当前 frame 选择每个可见 layer 最近的有效 drawing,渲染真实 3D stroke/闭环;Chromium 主线程与 OffscreenCanvas 均通过非空像素门。
- N-016-D(editor 部分):editor context schema 绑定 data/layer/frame、onion 开关、stroke/ point selection 和 revision,拒绝 stale/重复/超 1M selection;Properties 面板已连接真实 Main layer create/remove、当前 frame insert/remove 和整帧 clear transaction。完整 2D stroke/segment、 lasso 和 dope sheet integration 仍阻断。
- N-016-D(点编辑部分):Properties 面板可在当前 layer/frame 选择实际 stroke/point,执行
有界 X 轴平移;协议先校验 point identity、revision、有限坐标和 1M 点预算,再保留 radius、
opacity、vertex color、cyclic、material index 并合并为一个
setGreasePencilStrokesMain transaction。它是点级整帧原子写回,不等同于完整 2D 画布选择或连续 gizmo。 - N-016-D(视口点编辑部分):当前 drawing 为每条 stroke 建立独立 Three
Points代理, 主线程和 OffscreenCanvas 使用 data/layer/frame/stroke/point 五级身份 raycast;Edit Mode 可高亮、Shift/Ctrl 多选同一 drawing 的点,并由轴向 gizmo 合并为一个 revision-boundsetGreasePencilStrokesMain transaction。跨 drawing 追加会重置选择,避免错误混写。 - N-016-D(连续预览部分):轴向 gizmo 的 pointer move 从当前 SceneIR 绝对计算选中点坐标, 同时更新真实 stroke 线和隐藏 point raycast proxy;pointer cancel/commit 均恢复预览基线, pointer up 才提交一次 Main。主线程与 OffscreenCanvas 重复回归一致。
- N-016-D(时间线部分):现有 Dope Sheet 在活动 Grease Pencil 对象上显示真实 layer drawing
frame 并通过既有
setFrameMain 命令导航;不提供帧拖拽、重排或插值伪语义。 - N-016-D(重启部分):真实 Grease Pencil fixture 经首个 WebEngine Worker 点编辑和
.blend保存后,终止 Worker 并由全新 Worker 重开;data/layer/drawing identity、位置、radius、opacity 均重新解析验证。 - N-016-D(M9-06 marquee):Main reader 为 drawing、stroke 和 point 发布稳定 ID,并发布 Blender
active layer;旧文件未记录 active layer 时只读快照确定性选择首个实际 layer,不修改 Main。
纯 marquee 合同绑定 Main revision、当前 data/layer/frame/drawing、归一化矩形和 1M candidate
预算,跨 drawing、重复/伪造 ID、stale revision 和超预算均稳定失败关闭。生产 UI 只在活动、
可见且未锁定 drawing 开放框选,主线程与 OffscreenCanvas 共用同一合同;真实
.blend均选中 4 个稳定 point ID 和 1 个 stroke ID,选择不递增 Main revision。 - N-016-D(M9-07 shared selection):纯
grease-pencil-selectionschema 将当前 drawing、稳定 point ID、来源和独立 selection revision 绑定为唯一状态;2D point canvas、主线程 3D viewport 和 OffscreenCanvas Worker 的 point/marquee 事件都携带 base selection revision,迟到结果返回REVISION_CONFLICT,不修改 Main。真实 fixture 从 2D 选择 1 点后由 3D 框选 4 点,revision0 -> 1 -> 2,两条生产后端回执与画布高亮一致,Main revision 保持不变。 - N-016-D(M9-08 layer/frame reorder):纯
grease-pencil-reorderschema 将 layer 方向移动和 drawing frame 移动绑定到稳定 data/layer/drawing ID 与 Main base revision;stale revision、 边界 no-op、伪造 drawing、已占用 target frame 和正负 1,000,000 之外帧号均在 Main 前失败关闭。 生产 Properties UI 的 layer 上下移动与 frame target 移动各只提交一次 Main transaction;真实 fixture 经 undo/redo、OPFS save、close/recover 后保持 Blender 5.2 desktop golden 的 layer 顺序、 frame 12 和原 drawing identity。完整 group hierarchy、frame duplicate 与 Dope Sheet 拖拽仍阻断。
仍然阻断
- N-016-C:material datablock 事务、onion fade/range 完整语义和完整 Grease Pencil modifier reader。
- N-016-D:完整 2D canvas 的 stroke/segment 选择、套索和完整 timeline/dope 编辑仍阻断;有限 2D point canvas 与 3D 共享 selection revision、3D current-drawing point marquee、点 raycast、 多点高亮、连续 preview、单次 gizmo commit、有界 drawing frame 导航和 worker restart 已完成。
- N-016-E:desktop drawing hash、Chromium 像素 golden、GLB/USD loss report 和 OPFS。
验收
npm --prefix web run typecheck
npm --prefix web run lint
npm --prefix web run test:grease-pencil
WEB_TEST_PORT=5404 npm --prefix web run test:grease-pencil-marquee
WEB_TEST_PORT=5411 npm --prefix web run test:grease-pencil-selection
WEB_TEST_PORT=5416 npm --prefix web run test:grease-pencil-reorder
WEB_TEST_PORT=5205 npm --prefix web run test:grease-pencil-editor
WEB_TEST_PORT=5202 npm --prefix web run test:e2e -- --grep "N-016 Grease Pencil"
test:grease-pencil 使用 modifier_grease_pencil_scene.blend,覆盖 reader、layer/frame/stroke
Main transaction、undo/redo 和保存重开。它不替代桌面 drawing hash。