Parent epic: #543
Depends on: Slices A–I (functionally needs A, B, C, D, I minimum)
Goal
Bring Paint v2 to project conventions: CLI, MCP, breadcrumbs, tests, docs.
Scope
- CLI — new
qtmesh paint subcommand:
qtmesh paint model.fbx --layer add --name <n> --channel BaseColor -o out.fbx
qtmesh paint model.fbx --layer list [--json]
qtmesh paint model.fbx --layer merge-down --layer <n> -o out.fbx
qtmesh paint model.fbx --layer flatten -o out.fbx
qtmesh paint model.fbx --bake --engine unity --resolution 2048 -o out/
qtmesh paint model.fbx --apply-stencil <image.png> --camera "x,y,z,target" --channel BaseColor -o out.fbx
qtmesh paint --list-stamps, --list-presets, --list-palettes
- Live stroke authoring is not in CLI scope.
- MCP tools:
paint_add_layer, paint_delete_layer, paint_reorder_layer, paint_merge_down, paint_flatten
paint_set_active_layer, paint_set_active_channel, paint_set_brush_preset, paint_set_color, paint_set_gradient
paint_apply_decal, paint_apply_stencil
paint_bake_pbr with engine target
- JSON-RPC, main thread, no
BlockingQueuedConnection.
- Sentry breadcrumbs (consolidated):
paint.brush.*, paint.layer.*, paint.channel.*, paint.symmetry, paint.stabilizer, paint.projection.*, paint.decal.*, paint.derived_map.*, paint.tablet, paint.preset.apply, paint.palette.apply, paint.bake.*. ui.action for menu/toolbar clicks.
- Tests:
BrushEngine_test.cpp — gradients (Slice A), stamps (B), pressure (H).
PaintLayerStack_test.cpp — blend modes + composite (C).
PaintChannelRouter_test.cpp — channel dispatch + normal-from-height (D).
SymmetryEngine_test.cpp — axis-mirror correctness (E).
ProjectionPainter_test.cpp — projection / decal commit (F).
DerivedMaps_test.cpp — cavity / curvature / AO bake (G).
- All headless-CI safe.
- Docs:
- Replace MVP "Paint" section in
CLAUDE.md with v2 architecture: layer stack, brush engine, channel router, symmetry, projection, derived maps, bake-up.
- Add
qtmesh paint examples to the CLI block.
- Document on-disk layout (
<AppData>/paint/...).
- User-facing changelog summarising v2 features.
Acceptance Criteria
Effort
~6 days.
Parent epic: #543
Depends on: Slices A–I (functionally needs A, B, C, D, I minimum)
Goal
Bring Paint v2 to project conventions: CLI, MCP, breadcrumbs, tests, docs.
Scope
qtmesh paintsubcommand:qtmesh paint model.fbx --layer add --name <n> --channel BaseColor -o out.fbxqtmesh paint model.fbx --layer list [--json]qtmesh paint model.fbx --layer merge-down --layer <n> -o out.fbxqtmesh paint model.fbx --layer flatten -o out.fbxqtmesh paint model.fbx --bake --engine unity --resolution 2048 -o out/qtmesh paint model.fbx --apply-stencil <image.png> --camera "x,y,z,target" --channel BaseColor -o out.fbxqtmesh paint --list-stamps,--list-presets,--list-palettespaint_add_layer,paint_delete_layer,paint_reorder_layer,paint_merge_down,paint_flattenpaint_set_active_layer,paint_set_active_channel,paint_set_brush_preset,paint_set_color,paint_set_gradientpaint_apply_decal,paint_apply_stencilpaint_bake_pbrwith engine targetBlockingQueuedConnection.paint.brush.*,paint.layer.*,paint.channel.*,paint.symmetry,paint.stabilizer,paint.projection.*,paint.decal.*,paint.derived_map.*,paint.tablet,paint.preset.apply,paint.palette.apply,paint.bake.*.ui.actionfor menu/toolbar clicks.BrushEngine_test.cpp— gradients (Slice A), stamps (B), pressure (H).PaintLayerStack_test.cpp— blend modes + composite (C).PaintChannelRouter_test.cpp— channel dispatch + normal-from-height (D).SymmetryEngine_test.cpp— axis-mirror correctness (E).ProjectionPainter_test.cpp— projection / decal commit (F).DerivedMaps_test.cpp— cavity / curvature / AO bake (G).CLAUDE.mdwith v2 architecture: layer stack, brush engine, channel router, symmetry, projection, derived maps, bake-up.qtmesh paintexamples to the CLI block.<AppData>/paint/...).Acceptance Criteria
--jsonwhere applicable.CLAUDE.mdPaint section rewritten and accurate.Effort
~6 days.