Impasto · Palette Knife — Style Prompt

Thick oil paint laid with a palette knife: big, flat, sharp-edged planes of colour, raked by light so every ridge of paint shows. Clarity first: value structure before texture, hard edges at the focus, calm planes everywhere else. References (grammar only): the opening titles of The Umbrellas of Cherbourg (1964) (overhead choreography read as moving colour); palette-knife street paintings (Leonid Afremov and the genre around him) (knife mosaic, vertical wet reflections, warm lights against cool shadow); Sorolla / Sargent (few, decisive strokes and strong light); Edgar Wright's music-locked editing (one action, one sound, one cut). Never copy their images, compositions, melodies or characters, and never name them in the film.

1. Essence, and what it is not

A moving oil painting made of knife strokes. Each stroke is a real object: a slanted plane of paint with a ridge where the blade pressed, a lip where it lifted off, broken streaks where the paint ran out, two colours dragged into each other. The world is repainted from its strokes every frame, but static paint never moves: only things that move in the story move. Light rakes across a height field, so the paint has body.

The look is clear and graphic (readable like a children's book at thumbnail size) but has the tactile surface of impasto at 100 % crop.

Not a Van Gogh swirl filter (strokes boiling everywhere), not a brush texture over flat vector art, not watercolour (paint is opaque), not a "painterly" photo filter (strokes are designed, not sampled from noise).

2. Materials & rendering

3. Colour logic

4. Type & subtitles

5. Motion quality

6. Camera grammar

A vocabulary, not a route. Opening and ending come from the topic.

Move What it expresses Can serve
Slow truck + push on a wide a world observed; patience a place; a routine; a crowd
Push-in through a silence inner pressure a doubt; a decision; giving up
Tilt-up from the ground or a reflection discovery from below a small character entering; a first sight
Pull-back from a close-up reaction; the world answering consequence; a reveal of who is watching
Rotating crane-out, overhead pattern emerging from many choreography; traffic; a gathering
Same wide, repeated before/after change of colour, season or time
Locked frame, light moves time and weather as the actor a day passing; a storm arriving
Macro slide along the paint surface the matter itself a texture; a crafted object; a map
Whip-pan into a new painted plate energy, a jump a list; montage; travel

Framing: keep the camera inside the painted plate (half = W/2/zoom), or the canvas shows. The subject gets the hard edges and the smallest strokes; everything else stays in big calm planes. Transitions: paint-over sweeps and scrapes, hard cuts on beats; no dissolves (two layers of knife ridges turn to mud).

7. Sound palette

8. Native moves

A menu: use the ones your story needs.

9. Pitfalls of the medium

10. Engine

Files: demo/engine/impasto.js (renderer), demo/engine/plate.js (reference → strokes).

Main calls: new Impasto(canvas,{W,H,ss}), E.begin() / E.finish(post) (raking light + grade), E.batch() → E.draw(batch,o) for static plates (cam, grey, reveal, appear), E.drawNow() for moving strokes, E.under() for the underpainting, new Strokes().push({...}) (KNIFE, BRUSH, DAB, LINE), new Ref() + paintRef() (reference illustration → coarse-to-fine strokes confined to shape groups), strokePath(). Full parameter table: DEMO.md "Engine reference".

Minimal example: a warm-orange four-point sparkle with a short cursor tail, in knife paint.

import { Impasto, Strokes, KNIFE, DAB, hex } from './engine/impasto.js';
const E = new Impasto(canvas), s = new Strokes(), c = hex('#D97757');
for (let k = 0; k < 4; k++) {                                   // four tapered knife points
  const a = k * Math.PI / 2;
  s.push({ x: 960 + Math.cos(a) * 60, y: 540 + Math.sin(a) * 60, ang: a, len: 120, wid: 46, c, c2: hex('#f0a07a'), type: KNIFE, taper: .95, seed: k });
}
s.push({ x: 960, y: 540, len: 40, wid: 40, c: hex('#f6c0a0'), type: DAB, seed: 9 });   // bright core
s.push({ x: 1060, y: 610, ang: .6, len: 90, wid: 16, c, type: KNIFE, alpha: .8, seed: 10 });   // cursor tail
E.begin(); E.drawNow(s.data(), { grey: 0, run: 0 }); E.finish();

"Only one colour" (monochrome with one exception): draw the world with grey: 1, reveal: 1e6, draw the exception with grey: 0.

11. Variation space

You decide the structure, the cast (or none), the sets, the opening, the ending, the camera path, the pacing, whether there is a voice, and where colour lives. All far from our demo:


How our demo was made (story, shots, score, end card, build): DEMO.md. Read it after your treatment exists.