Part of #743 (Epic: Shaders). Final slice — parity, packaging, docs, tests. Mirrors the roadmap "Slice X — CLI/MCP parity, docs, tests" convention.
CLI / MCP parity
Packaging (real risk — audit every path)
New shader/material/texture assets must ship in every package or the preset works in dev but ships broken:
Tests
- Extend
src/MaterialPresetLibrary_test.cpp: each stylized preset applies, creates expected passes/programs, undo restores, reapply idempotent.
- Plus the Slice-A compile harness (
src/StylizedShaders_test.cpp).
- Wire any new
_test.cpp into the test target in CMakeLists.txt.
Docs
- CLAUDE.md — add stylized preset names to the examples; add a "Stylized Shaders" architecture note next to
MaterialPresetLibrary (GLSL-via-.program, the 2-pass outline, and that custom SRS was deliberately avoided).
- README / website CLI reference — update if it enumerates preset names.
- action.yml — only if the preset surface changes the documented
command/options (per CLAUDE.md rule).
Acceptance
Part of #743 (Epic: Shaders). Final slice — parity, packaging, docs, tests. Mirrors the roadmap "Slice X — CLI/MCP parity, docs, tests" convention.
CLI / MCP parity
cmdMaterial --preset/--list-presetsautomatically. If a stylized tunable is worth CLI exposure (e.g.--toon-bands,--outline-width), thread it throughcmdMaterial→applyStylizedPreset. Keep minimal; most users take defaults."ai.tool_call".--preset "Toon + Outline"and the MCP tool produce the same material as the GUI.Packaging (real risk — audit every path)
New shader/material/texture assets must ship in every package or the preset works in dev but ships broken:
cfg/resources.cfg.inregisters the new programs dir (if added)..appbundle copy step includes the newmedia/files..debpackaging includes them.Tests
src/MaterialPresetLibrary_test.cpp: each stylized preset applies, creates expected passes/programs, undo restores, reapply idempotent.src/StylizedShaders_test.cpp)._test.cppinto the test target inCMakeLists.txt.Docs
MaterialPresetLibrary(GLSL-via-.program, the 2-pass outline, and that custom SRS was deliberately avoided).command/options(per CLAUDE.md rule).Acceptance