Nodes/ComfyUI Illusion & Pattern Nodes/Tessellation Composer (Advanced)
ComfyUI Node

Tessellation Composer (Advanced)

Escher-style tiling with every knob on the dash

By orion4d·Created about a year ago·Updated about a year ago· 3
Tessellation Composer (Advanced)
  • input_image
  • IMAGE
tile_width128
tile_height128
tiles_x4
tiles_y4
moderepeat
mirror_axisnone
offset_x0
offset_y0
rotation_modenone
rotation_angle0.00
scale_modenone
scale_factor1.00
opacity1.00
random_seed0

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), and diamond (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, or random: flips alternate tiles to create seamless mirror tiling, which is the standard trick for hiding seams.
  • rotation_mode / scale_mode - none, by_tile, or random, applied around rotation_angle and scale_factor. Random mode pulls from random_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.

Categoryillusion

Inputs (15)

NameTypeDefaultDescription
input_imageIMAGE
tile_widthINT1288–2048
tile_heightINT1288–2048
tiles_xINT41–32
tiles_yINT41–32
modeCOMBOrepeat3 options: repeat, mirror, diamond
mirror_axisCOMBOnone5 options: none, x, y, xy, random
offset_xINT0-2048–2048
offset_yINT0-2048–2048
rotation_modeCOMBOnone3 options: none, by_tile, random
rotation_angleFLOAT0.000–360
scale_modeCOMBOnone3 options: none, by_tile, random
scale_factorFLOAT1.000.1–4
opacityFLOAT1.000.1–1
random_seedINT00–999999

Outputs (1)

NameTypeDescription
IMAGEIMAGE