Add Tile swap, a video effect built from the source images
Tile swap lays tiles cut from the photographs over the canvas as Tiles does, in a grid, in bricks or scattered, and swaps each one for another cut at a moment of its own, so the mosaic keeps changing piece by piece. The layout stays put for the whole clip; what a tile shows depends only on the tile and how many times it has swapped, counted round the clip, so it holds still between swaps and the clip loops without a jump. On the command line it is -e tileswap with --tileswap-rate and the rest. VideoEffect learns a second kind: an effect that answers needsSources() writes compose() instead of animate(), and the base then takes no crop, only the one seed, so it sees the photographs when it leads the chain and the stage before it otherwise. Transforms render exactly as before. The tile cutting and painting move out of tiles.cpp into tile_plan.hpp for both effects to share; Tiles renders byte for byte as before. Version 0.8.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -195,7 +195,7 @@ the Add effect menu, with the video section insensitive in a still, a
|
||||
still skips it. The CLI groups `--help` the same way and warns when it skips one.
|
||||
|
||||
A video effect subclasses `VideoEffect` (`src/effects/video_effect.hpp`), not
|
||||
`Effect`, and writes only `animate(input, values, const Moment& at)`. The base
|
||||
`Effect`, and a transform writes only `animate(input, values, const Moment& at)`. The base
|
||||
keeps the rules. It takes the input crop and exactly one value from the shared
|
||||
rng, the same on every frame, and hands out randomness through the `Moment`:
|
||||
`at.steady()` gives the same draws every frame (phases, directions),
|
||||
@@ -204,6 +204,14 @@ rng, the same on every frame, and hands out randomness through the `Moment`:
|
||||
the clip loops without a jump. `TrackingEffect` (`src/effects/tracking.cpp`,
|
||||
"VHS tracking") is the reference: copy its layout (params, a `Settings` struct,
|
||||
steady draws, time, fresh draws, one parallel pixel pass) for the next one.
|
||||
A video effect that builds its frames out of the sources rather than
|
||||
transforming a crop answers `needsSources()` and writes `compose(sources,
|
||||
width, height, values, at)` instead of `animate`: the base then takes no crop,
|
||||
only the seed, and like an image effect it sees the photographs when it leads
|
||||
the chain and the stage before it otherwise. `TileSwapEffect`
|
||||
(`src/effects/tileswap.cpp`, "Tile swap") is the reference for that kind; it
|
||||
shares `Tile`/`planSpans`/`paintTiles` with the tiles effect through
|
||||
`src/effects/tile_plan.hpp`.
|
||||
Registering it is the same one line in `registry.cpp`, after the comment that
|
||||
starts the video effects. There is no per-param video flag: motion is a video
|
||||
effect of its own, never extra params on an image effect.
|
||||
|
||||
Reference in New Issue
Block a user