Tessellation Composer (Advanced)
Escher-style tiling with every knob on the dash
- input_image
- IMAGE
The Tessellation Composer is the most feature-dense node in the orion4d/illusion_node pack - the "(Advanced)" in the name isn't marketing. You feed it one image, and it tiles that image across a grid with per-tile flipping, rotation, scaling, staggering, and even a diamond brick layout. Where the Checkerboard Composer alternates two fixed images, this one is a full transformation toy for a single tile. It's the node you use when you want a mosaic, a half-drop textile pattern, or the start of an Escher-ish repeat.
How it works
The input image is resized to tile_width × tile_height with Lanczos, then pasted across a tiles_x by tiles_y grid. Each tile can then be transformed independently:
mode-repeat(straight grid),mirror(alternate rows shift so tiles nest like a brick wall), anddiamond(rows are staggered by half a tile width, giving the classic brick/offset layout). The diamond mode is the standout - you can't fake that stagger with a plain tile node.mirror_axis-none,x,y,xy, orrandom: flips alternate tiles to create seamless mirror tiling, which is the standard trick for hiding seams.rotation_mode/scale_mode-none,by_tile, orrandom, applied aroundrotation_angleandscale_factor. Random mode pulls fromrandom_seed.offset_x/offset_y- shift applied to alternating rows/columns, for half-drop layouts.opacity(default 1, down to 0.1) - fades the composited tiles via the alpha channel.
Under the hood it's Pillow compositing on an RGBA canvas, so everything is CPU, instant, and model-free.
The inputs that matter
For a beginner, honestly, only four of these matter on day one:
input_image- the tile source.mode(repeat/mirror/diamond) - the layout.tiles_x/tiles_y(default 4 each, range 1–32) - how many across and down.tile_width/tile_height(default 128, range 8–2048).
Everything else - mirror axis, offsets, rotation, scale, opacity - is the spice you add once the basic grid works. One IMAGE output.
Install
Part of orion4d/illusion_node, "ComfyUI Illusion & Pattern Nodes", under the "illusion" category. Grab it via ComfyUI Manager (search "Illusion") or:
cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/illusion_node.git
Restart ComfyUI. The pack depends only on numpy, torch, and Pillow - already in a stock ComfyUI - so no model downloads and no dependency-hell detours.
Common issues
The biggest surprise is output size: tiles_x * tile_width by tiles_y * tile_height, and with offsets the actual bounds can exceed that, so a big grid gets big fast. Keep tiles small and count your grid before you run. Second, opacity below 1 composites tiles over a transparent base, so if you're saving to a format that drops alpha you'll get hard black where nothing was painted - composite onto a background yourself if you need a solid result. And diamond mode staggers rows, which means your columns no longer line up; if the layout looks "wrong," that's the feature, not a bug. Start with repeat, then graduate to mirror_axis, then play with diamond once you know what you're doing.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| input_image | IMAGE | — | |
| tile_width | INT | 1288–2048 | — |
| tile_height | INT | 1288–2048 | — |
| tiles_x | INT | 41–32 | — |
| tiles_y | INT | 41–32 | — |
| mode | COMBO | repeat | 3 options: repeat, mirror, diamond |
| mirror_axis | COMBO | none | 5 options: none, x, y, xy, random |
| offset_x | INT | 0-2048–2048 | — |
| offset_y | INT | 0-2048–2048 | — |
| rotation_mode | COMBO | none | 3 options: none, by_tile, random |
| rotation_angle | FLOAT | 0.000–360 | — |
| scale_mode | COMBO | none | 3 options: none, by_tile, random |
| scale_factor | FLOAT | 1.000.1–4 | — |
| opacity | FLOAT | 1.000.1–1 | — |
| random_seed | INT | 00–999999 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |