Parent epic: #543
Goal
Paint with an image as the brush — per-stamp images (a leaf, a scratch, a stencil shape) and tiling source textures (wood grain, brick, fabric).
Scope
- Extend
BrushEngine's footprint from { round | square } to { round | square | stampImage | tilingSource }.
- Stamp image mode:
- PNG/TGA with alpha; greyscale = mask.
- Each stamp paints one instance scaled to brush radius, with brush colour or gradient (Slice A) modulating it.
- Rotation:
none | fixed angle | stroke direction | random jitter.
- Spacing — distance between stamps along the stroke as % of radius.
- Scatter — random perpendicular offset.
- Size jitter, opacity jitter per stamp.
- Tiling source mode:
- Tileable image sampled under the footprint in UV-space.
- Useful for wood grain, brick, fabric where the pattern is in the image, not the footprint.
- Tiling scale, rotation, offset.
- Bundled (CC0): 6 stamps (soft circle, hard circle, charcoal, spatter, scratch lines, foliage cluster); 4 tilings (wood, brick, fabric, concrete).
- Stamp library panel in brush inspector: thumbnail grid, drag-and-drop import, delete, rename. Storage in
<AppData>/paint/stamps/ and <AppData>/paint/tilings/.
- Cache: stamp images pre-rasterised once per brush-relative footprint.
Acceptance Criteria
Effort
~8 days.
Parent epic: #543
Goal
Paint with an image as the brush — per-stamp images (a leaf, a scratch, a stencil shape) and tiling source textures (wood grain, brick, fabric).
Scope
BrushEngine's footprint from{ round | square }to{ round | square | stampImage | tilingSource }.none | fixed angle | stroke direction | random jitter.<AppData>/paint/stamps/and<AppData>/paint/tilings/.Acceptance Criteria
paint.brush.stampwith stamp name + mode.Effort
~8 days.