Painter

Concepts

Painted Seams

How a tile actually gets painted so it joins its neighbour without a visible seam

Every tile has to continue from its neighbour. If we just painted each tile from scratch, the joins would look like a photo collage — visible cuts wherever two tiles meet. Here's how we paint a tile so the seam disappears.

1

Start with a rough sketch of what should run through.

A short painted strip shows the path, river, or corridor that needs to cross from the neighbour into this tile, in roughly the right art style. Think of it as a colour-and-shape note, not a finished tile.

2

Mark which pixels are allowed to change.

A "freedom map" grades how much each pixel can be repainted — locked at the seam, gradually freer toward the centre. It's a soft fade, not an on/off line, which is what keeps the join from showing.

→ The freedom map in detail
3

Paste the neighbour just outside the tile.

The neighbour's edge sits in a margin around the canvas, so the painter can see what's coming in but doesn't have to repaint it. The tile area itself is empty and ready to be filled.

4

Paint inward.

The painter fills the tile, allowed to vary by exactly how much the freedom map says — pinned at the edge, free in the middle. The path continues, the grass continues, the colours flow.

5

Crop back to size.

The neighbour margin was just context — we throw it away. What's left is a tile that flows out of its neighbour seamlessly.

Flow direction (optional)

The flow tool adds a directional layer on top of presence masks. Drag strokes encode where a river or path should go — the painter records angle (R channel, 0→2π) and magnitude (G channel) per pixel as an RGBA signal alongside the grayscale mask. The backend converts this into a gradient stencil: the generation hint color peaks at the river's centerline and tapers toward the bank, giving the diffusion model a shaped target to refine rather than a flat uniform fill. Flow strokes are optional and compose on top of any existing river or path mask; tiles without flow data fall back to the existing flat stencil.

Why this works

  • The neighbour sits outside the painted area, so it can't be accidentally repainted.
  • The freedom map is a smooth fade, not an on/off mask, so the join blends instead of butting against a hard line.
  • The painter sees real neighbour pixels as context, so it knows what colour and texture to continue.
The freedom map in detail → All five inputs that go into a tile → Structure vs freedom — the two knobs → The technique stack that paints it → The pipeline behind the soft mask →
How this is built (technical)

Built on Differential Diffusion (Levin & Fried 2023) for the gradient freedom map and an exterior-anchor inpainting pattern (Sartor et al. 2024) for the neighbour margin. Style anchors are seeded from a small bank of reference VTT maps so each biome stays internally consistent across a run.