HeightSmith documentation

Everything the program does, in the order you are likely to meet it - followed by a reference for all 40 generators and every control they expose.

Please note: this software is provided “as is”. I built it for myself and decided to share it with others, but I cannot give any warranties whatsoever - neither that it is fit for any particular purpose, nor that it is free of faults. Use it at your own risk.

Introduction

HeightSmith builds height, normal, ambient-occlusion and curvature maps out of a stack of procedural generators. It runs on your own GPU, in your own browser, and produces maps at up to 8192 × 8192 in true 16-bit depth.

What the maps are called is not what they have to be used for. A height map is a single channel of values, and a channel can drive whatever a material asks for: the same output that displaces a surface will serve as roughness, as specular or metallic, as a blend mask between two materials, as opacity, or as the weight for scattering foliage across terrain. Curvature makes a ready-made edge-wear mask, and ambient occlusion a plausible dirt one. Build the pattern you need and take the channel where you need it.

All of it happens on your machine. The page is loaded once and then makes no network request at all - the browser is instructed to refuse every one of them - so nothing is uploaded, nothing is measured, and nothing you build here leaves your computer. There is no account, no server and no upload button. There is no telemetry setting to find and turn off, because there simply is nothing sent. We do not set any cookie and we do not track you.

If you enjoy using HeightSmith, please consider sending a small donation to paypal@xanathon.com, or visit my Ko-fi page at ko-fi.com/xanathon. It would make me very happy, and it would most likely be spent on coffee. 😊

Pressing F1 in the app opens a short usage introduction. This page is the long form: the same subjects with the reasoning left in, plus the reference.

What it needs to run

A browser with WebGL2 and floating-point render targets, which in practice means Chrome or Edge 80 and up, Firefox 113, or Safari 16.4. PNG export additionally uses the browser’s own compression. If something is missing, the app says which capability it is rather than failing silently.

The graphics card does not need to be new

Every timing on this page was measured on a GeForce GTX 1650 - a modest card from 2019 - rendering the heaviest of the built-in presets:

Resolution Height render 16-bit PNG encode File size
1024²14 ms39 ms0.3 MiB
2048²42 ms106 ms0.6 MiB
4096²119 ms330 ms1.4 MiB
8192²746 ms1137 ms3.1 MiB

A card of that age is enough because the work is a handful of full-screen passes rather than millions of draw calls: one pass per layer, whatever the layer draws. A faster card shortens those milliseconds; it does not unlock anything. On a slower one the preview still keeps up, because preview resolution is set separately from export resolution.

Memory is the real ceiling

An 8192² ambient-occlusion or curvature export allocates roughly a gigabyte of render targets, since it needs the blur scratch buffers as well; height alone needs about half. Buffers are allocated only when a path is used, so an export you never ask for costs nothing. If a card cannot manage the largest size, drop to 4096² - the maps are procedural, so the same setup renders at any resolution.

The upper limit is the GPU’s own maximum texture size, commonly 16384. The app offers up to 8192, clamps to what the card reports, and tells you when it has.

How a map is built

A height map here is a single greyscale field, black at height zero and white at full height, assembled in four steps:

Height is carried in floating point from beginning to end and is only reduced to whole numbers when a file is written. That is why a 16-bit PNG out of this program has genuinely different values in it, rather than 256 levels stretched over a wider range.

The layer stack

Each layer is one card in the sidebar and one pass over the whole image. Order matters: the stack is applied from the bottom card upwards, so the topmost card is applied last and therefore sits on top of everything below it.

Drag a card by its ⠯ handle to reorder it, click its name to expand it, and use its checkbox to switch it off without losing its settings. Only the handle starts a drag, so every slider inside the card stays usable.

The buttons on a card

Button What it does
Die Randomises within the layer's character: the pattern is reshuffled and the numbers nudged, while modes and switches are left alone. The layer still looks like itself afterwards.
Crossing arrows Draws every value from its full range. Wilder, and far more likely to land on something unusable - which is the point of having it separate from the die.
Circular arrow Back to the layer's defaults. Blend, opacity, level window and mask are left as they are, since those describe how the layer sits in the stack rather than what it draws.
⧉ Duplicates the layer, settings and all, above the original.
✕ Removes it.

Calling a layer something

Double click the name in a card header and it becomes a field: type, press Enter. Escape puts the old name back, and clicking away keeps what was typed, the same as Enter. A locked layer refuses to be renamed along with everything else it refuses.

Clearing the field is not an empty name, it is the layer going back to being called what it is. Which is also why a project file carries the property only for the layers somebody actually renamed: a stack of a dozen would otherwise hold a dozen fields saying nothing.

Coverage

A generator produces two things per pixel: a height, and a coverage - whether it is drawing there at all. Coverage is what makes the stack compose. Where a layer covers nothing it contributes nothing, and the layers beneath it show through untouched.

This is worth knowing because it explains results that otherwise look like a bug. A scatter layer set to multiply darkens where its boxes are and leaves the rest alone; the same layer set to subtract does not carve a hole in the background between its boxes. Opacity scales coverage rather than height, so a half-opacity layer blends halfway towards its own result everywhere it draws.

The padlock in a card's title row freezes that layer. Its controls go dead, it cannot be removed or dragged to a different position, and the two randomise buttons pass it by. It also stops following the global seed: a locked layer keeps the seed it had, so pressing New seed rerolls everything except the layers you have settled on. Unlocking hands it back to the global seed, which means it will change at the next reroll like any other.

Blending

Blend decides how a layer's height combines with the height already accumulated beneath it. In the table below b is what is already there and s is what this layer produces.

Mode Result Used for
normal s Replaces. The layer simply overwrites where it covers.
add b + s Accumulates. Grain and dust on top of a surface.
subtract b - s Cuts in. Grooves, scratches, drilled holes.
multiply b × s Darkens proportionally, so tall areas lose more than short ones. The usual way to lay a second, coarser pass over a finer one.
screen 1 - (1 - b)(1 - s) Brightens without clipping. The mirror image of multiply.
min min(b, s) Keeps the lower of the two. Flattens anything that pokes up.
max max(b, s) Keeps the higher. The default, and the right one for stacking raised detail: nothing already built ever gets shortened.
difference |b - s| Absolute distance. Produces hard, graphic banding.
overlay multiply below 0.5, screen above Raises contrast around the mid-height without clipping either end.

The result is clamped to the 0..1 range after every layer, so add and subtract cannot run away, but they can flatten against the ceiling or the floor. If a stack goes white in patches, that is usually add saturating rather than a generator misbehaving.

The level window

Every generator emits a clean 0..1 pattern. Level min and Level max squeeze that whole range into a window before it is blended, which is how a layer is made to contribute a faint break in a finish rather than full relief.

The window lives in the shared layer wrapper rather than in each generator, so it also works for the ones that have no level control of their own - noise, flow, veins and the circuit family included.

Invert beside it flips the pattern before the window is applied: peaks become recesses while the window keeps saying which brightnesses the layer may reach. Coverage is not inverted - where the layer drew nothing it still draws nothing, since filling the tile with everything it was not drawing would be a different pattern rather than an inverted one.

Setting Level min above Level max inverts as well, and did so before the switch existed. The difference is that the switch leaves the window free: with it, direction and range are two controls instead of one.

Masks

A mask limits where a layer applies. It multiplies the layer's coverage, so a masked-out area is not darkened or flattened - the layer simply is not there.

Range from and Range to are the window being tested, Edge softness feathers its two edges, and Invert mask swaps inside for outside.

A radial gradient is scaled to reach the corner furthest from its anchor, so its two ramp controls always span the image. A linear one is deliberately left unscaled, because rescaling a straight ramp to the image cancels the anchor out entirely - it would have no effect at all. Left as it is, the anchor decides where zero sits, which is why the ramp controls reach below zero for a linear gradient and only there. Direction belongs to the linear shape and is hidden for the radial one.

Masks are per layer, so the same generator can appear twice in a stack with two different masks and read as two different materials.

The numbered masks

The four built-in mask modes are set per layer, which means five layers that want the same distribution carry five copies of it - and those copies drift apart the moment one is adjusted. The Masks block below the layer stack solves that: a numbered mask is set up once, and any number of layers point at it.

A mask is any of the generators, with its own parameters and its own seed offset. It draws nothing itself - it only produces a field for layers to limit themselves with, and it appears in every layer’s Mask by dropdown as Mask 1, Mask 2 and so on.

Range from, Range to, Edge softness and Invert mask still belong to the layer, not to the mask. That is deliberate: two layers can read one mask at different thresholds, one landing where it is bright and the other where it is dark, which is most of the point of sharing it.

Each mask carries a Preview switch, which shows that mask on the canvas instead of the layer stack - a mask you cannot see is a mask you are setting up blind. One at a time, and it changes the preview only: an export always renders the real map, whether a preview is running or not.

Masks are not a second layer stack. They do not blend, do not stack and cannot reference one another, so there is no order to get wrong and no way to build a loop. The number is a name, nothing more - removing a mask renumbers the rest and carries every reference with it.

Only a mask some layer actually reads is rendered, so one left defined and unused costs nothing.

Placing a single object

Most generators here fill the frame with a lattice. The Object layer does the opposite: it takes one module out of that lattice and puts it where you want it. A hatch on its own, a bore in a corner, an intake set at an angle - the same shapes the grid layers are built from, at a position and size you choose.

The library holds every module that can stand alone, grouped by the layer it comes from: twelve from Tech Tiles, twelve round fittings under Discs & Hatches, the intake from Vent Louvres, the wheel from Gear Rings, a screw, and six escape pods. For the ones lifted out of a lattice there is one copy of the shape and both callers use it, so a placed bore and a bore in the grid are the same code - they cannot drift apart.

The Objects button beside Add layer opens the library. The pictures in it are rendered by the generator itself rather than drawn by hand - a picture cannot show something the shader does not - but they are drawn ahead of time and ship with the app, so the panel has them the moment it opens. A click drops that object in the middle of the canvas as a layer of its own.

What you can set

Position X and Position Y place it, Scale X and Scale Y size it - chained while their values match, so dragging either one scales evenly until the chain is opened - and Rotation turns it to any angle. The two scale axes belong to the object rather than to the image: rotate a wide object and its width turns with it.

Below those sit the controls the chosen object brings with it, and only those: detail depth and a count for the round fittings, the full set of louvre controls for the intake, the teeth and spokes for the wheel. Where a shape has nothing to count - the cap once had a socket fixed at six sides - the control is not shown rather than shown doing nothing.

The screw

One entry in the library covers the lot, because a screw is two choices rather than one shape. Head gives round, countersunk, cheese or hex; Drive gives slot, cross, a ribbed cross, a hex socket, a six-lobe recess, or none at all. Any drive sits in any head, which is how it works on the shelf. The names here describe the shapes rather than naming the brands that own the familiar words for them.

The slot runs from rim to rim. Nothing sets its length - the head's own outline cuts it off, so it ends exactly at the edge whatever the head shape is, and only its width is yours to set. The other drives have a size as well as a width, and the ones made of bars have both.

For the edge of the head there are three separate things, and they can be combined: Head chamfer on the cheese head slopes the face down to the rim, Bevel on the hex head rolls the top edge over with a quarter round while leaving the face flat, and Rim step cuts a shoulder into the edge at a depth you set. A dome and a cone run out to the rim by themselves and have neither.

Escape pods

Six entries, and between them they cover a good deal more than six shapes, because what separates one from another is usually a number. Shield is the blunt pentagon, and Fittings decides what sits on it: nothing, rails across the field, shelves following the outline, two leaves with a parting seam, a heavy boss, or a ring of bolts. Pyramid hatch runs four facets to a flat in the middle, with the size of that flat and its Centre height yours to set - drop the middle below the foot and the pyramid becomes a dish.

Plug sits in a socket with latch dogs on its corners and takes its side count from the same control the round fittings count with. Pod body is the pod itself, as a capsule, a dome or a cone, and Hex pod is the six sided one. Blast iris is a shutter, shut: flat blades all at one height, each rising across its own width to the edge that lies over its neighbour. Its hub can be switched off, and then the blades run all the way to the middle.

Corner cut runs through the family. Nothing in this group has a square corner, and the control says how far each one is taken off; where a shape has no corner to cut - a capsule, a dome - the control is not offered.

More than one of it

Array turns the single object into a row or a ring of them. Along chooses X, Y or Ring; Count says how many; Array rotation turns the layout rather than the objects, so a row can run off at an angle and a ring can start wherever you like.

A row only closes over the tile if its whole length is the width of the tile, so Close over the tile takes the distance out of your hands and sets it to one over the count. That is the same rule every lattice layer here follows: seamlessness comes out of whole numbers, not out of a repair afterwards. Switch it off and the distance is yours, with the seam wherever it falls - measured on a row of four at a free distance, the step across the seam was half a level out of 255, against nothing at all with the box ticked. The array rotation is offered only where it can work, which is on a free row or on a ring.

A ring places the copies on a circle of a radius you set. Turn with the ring has each one face outward, the way bolts sit on a bolt circle; off, they all keep the angle of the original. Where two copies overlap the taller one wins, so an array reads as one piece rather than as heights adding up.

Random rotation gives every copy an angle of its own, on top of whatever angle it already had - a ring that faces outward still does, only scattered. Rotation seed rerolls those angles and nothing else.

It still tiles

The object is placed in wrapped coordinates, so whatever leaves one edge comes back in at the other and a project stays seamless wherever the object is put. Measured on a bore pushed against the left edge: the same amount of material across the middle of the frame as when it is centred, split between the two edges, with no step at the seam.

A free angle is safe for the same reason it is not offered on the lattice layers: one object does not repeat, so there is no seam for an angle to break.

What the controls are called

The same words mean the same thing in every generator, which is what lets you move between them without relearning anything.

Because the axes are always separate, a round module on unequal axes becomes an ellipse. That is intended: a squashed grid of ellipses is usually what you want when you stretch a pattern, and forcing circles would leave gaps instead.

Seeds and randomising

One number decides every random choice in the program. Set the same Seed again and you get pixel-for-pixel the same maps.

Randomise all in the Global block runs the gentle variant on every layer at once. A few parameters are deliberately left out of both randomisers: the ones that place a feature rather than shape it, such as the centre of a radial pattern, where a random value does not give you a different look but a broken one.

Output shaping

These act on the finished field, after every layer. They are the last chance to fit the result to what your renderer expects.

Control Range What it does
Input black 0 – 1 Everything at or below this maps to zero height.
Input white 0 – 1 Everything at or above this maps to full height. Narrowing the two together raises contrast; crossing them inverts.
Gamma 0.2 – 4 Bends the midtones without moving the two ends. Below 1 lifts the low ground, above 1 pushes it down.
Output floor / ceiling 0 – 1 The range the result is finally mapped into - useful when a displacement modifier expects the surface to sit at a particular height.
Height steps 0 – 64 Quantises height into discrete plateaus. 0 is off. Very effective for machined surfaces, where continuous slopes look wrong.
Blur 0 – 32 Softens the whole field before shaping, rounding hard edges. Applied in pixels, so its effect depends on the resolution.
Invert height on / off Flips the finished field. Not the same as inverting a layer.
Normal strength 0.2 – 20 How strongly slope is translated into a normal map. Affects the normal output only, never the height.
Flip green channel on / off DirectX-style normals instead of OpenGL. Switch it on if your renderer shows the relief inside out.

Seamless tiling

Seamless tiling in the Global block is on by default. It is a property of the generators rather than a filter applied afterwards: there is no mirroring, no blending across the border, and no soft edge. The seam is exact because nothing is ever drawn across it in the first place.

Every noise and cellular function takes a period and wraps its integer cell coordinates with it, so a cell at the right edge is literally the same cell as the one at the left edge. Scatter layers are jittered within a grid rather than placed freely, for the same reason.

Why some controls are counts and not angles

Anything slanted can only tile if its direction can be expressed as a whole number of periods on both axes at once. An angle slider almost never satisfies that, so where you might expect one you will find two counts instead - a frequency across and a frequency down - which span the direction between them and are periodic by construction. Hazard Stripes and Knurling both work this way.

The three that cannot tile

Radial Rings and Frame cannot tile, and neither can Aztec Hull Panels once it is switched to polar. A radial field has no periodic edge, and a frame is an edge by definition. Each says so in its own description, and each is still useful with tiling on - as a mask, or on a surface that is not tiled.

To check a seam, use 2×2 tile check in the top bar, or the 3×3 surface in the 3D view to see it in relief, where a seam is much easier to spot than in a flat grey image.

Global scale

Global scale in the Global block drives every layer's repeat counts at once, so a stack that was built coarse can be made fine without opening a single card. At 1.00 the stack is exactly as you built it; below that, every pattern grows finer together and keeps its proportions to the others.

The slider steps rather than glides, and that is deliberate. Tiling here is built from whole numbers of cells per axis, so a scaled count has to land back on a whole number or the seam stops closing. A layer at 8 columns therefore changes on a different tick than one at 40, and you will see parts of the stack move before others. The alternative - a slider that glides and breaks the seam at almost every position - was not worth it.

It only ever shrinks. A control that also went above 1 would have to deepen the relief as well to keep a feature's shape, and the height axis is a fixed 0 to 1 range with nowhere to grow: the peaks would flatten against the ceiling while the pattern kept getting coarser. To go the other way, lower the counts on the layers themselves.

Scale height too takes each layer's relief down with its pattern, so a shape keeps its proportions instead of staying as deep as it was. It is off by default, because a finer pattern at the same depth is the more common intent and because a control called Scale flattening your whole map is a surprise. It does nothing at 1.00.

The numbered masks come along. A mask that held its own scale while the layers under it grew finer would slide out of proportion with the pattern it shapes.

A few controls are widths in absolute units rather than fractions of a cell - Greeble Panels gives its Gap and Bevel that way - and those come down with the slider as well. Left alone they would keep their width while the panels around them shrank, until the seams were wider than the plates between them.

Below roughly a quarter scale such a seam is thinner than a pixel and fades out rather than being smeared across one. That is the honest result: a height map cannot hold detail finer than its own grid, and a line drawn thinner than a pixel would alias rather than read as a line. Raise the preview or export resolution and it comes back.

The object layer scales the other way round

This is the one place where the control does the opposite of what the name on the card suggests, so it is worth knowing. Everywhere else, Scale X and Scale Y are counts - how many times the pattern repeats across the tile - and a smaller global scale raises them, because more repeats means finer detail. On the Object layer those same two labels mean the size of the one object in the tile, not a number of repeats. There the global scale multiplies them: at 0.50 an object set to 0.40 is drawn at 0.20, and it shrinks along with everything else rather than growing to fill the space the finer patterns left behind.

An array's Count is left alone on purpose. Making the pattern finer is not the same as asking for more copies, and the number of copies in a row is something you set for its own sake.

Two layers have nothing to scale at all: Fill & Gradient is a single ramp and Frame is a single border, and neither repeats. They sit still while the slider moves, which is correct.

The polar projection

Polar, in the Projection block at the top of a layer card, wraps that layer round a centre: rings and sectors instead of a square grid. A hull-plating pattern becomes a saucer, slats become spokes, knurling becomes the top of a knob. It changes only the coordinates the generator is read in - everything below it on the card still means what it says.

Thirteen layers offer it: Greeble Panels, Window Lights, Circuit Traces, Pipe Runs, Truchet Conduits, Box Scatter, Vent Louvres, City, Bars & Slats, Knurling, Hazard Stripes, Hex Grid and Tech Tiles. The rest do not, and the switch is simply absent on their cards rather than present and disabled. A round module wrapped round a centre becomes a crescent, and a continuous noise field becomes a smear; neither is worth offering. Aztec Hull Panels has its own polar mode, built into the layer, and is not part of this.

Placing the disc

Centre X and Centre Y put the middle of the disc anywhere on the image. Disc radius sets its outer edge; half the image is the largest a centred disc can be without running past the edges, which is where the slider stops. Moving the centre off the middle can still push it past one edge.

Hub radius leaves the middle blank, and its default is deliberately not zero. Towards the centre of a disc the sectors converge until a cell is narrower than a pixel, and there the edge filtering has nothing left to work with: the middle would come out as a patch of flat grey rather than as a pattern. A real saucer has a blank middle for much the same reason. If you want the pattern to run right in, raise the resolution rather than lowering the hub to zero.

What decides how many cells you get

This is the part that is not obvious from the controls, because four things combine to produce the number of cells around a ring, and two of them are on different parts of the card. Worth reading once.

A ring is much longer round than it is deep - at the default radius and hub, about eight times at the rim - so simply wrapping a square grid round a centre would give wedges at the rim and needles at the middle. The cell count is therefore not taken from Columns directly. It is built up like this:

  1. Rows, in the layer's own parameters, is the number of rings the disc is divided into. It also sets the bands the next three steps are worked out on: within one ring the count around is constant, so cells never shear.
  2. For each ring, how much longer it is than it is deep is measured - call it the shape factor. It is small near the hub and large at the rim: at the default radius and hub it runs from about 2.4 to about 8.4.
  3. Ring density multiplies that shape factor.
  4. The result is rounded to a whole number - it has to be, or the ring cannot close on itself - and that whole number is how many times Columns goes round this ring.

So the cells around one ring are Columns times a whole number, and the two controls do different jobs. Columns sets the overall fineness and multiplies every ring equally; Ring density decides how the count is distributed from hub to rim. At 16 columns there may well be 130 sectors at the rim, which is why Columns no longer reads as a literal number of cells across once the projection is on.

A consequence worth knowing before it puzzles you. Near the hub the shape factor is small - about 2.4 at the default - so the whole number in step 4 can only be 1, 2, 3, 4 or 5. The inner ring density control therefore has about five reachable settings there, and neighbouring slider positions can give exactly the same picture. This is not a rounding you can turn off; a fractional count would leave the ring unable to close.

Raising Columns does not help with this: it multiplies every count equally and leaves that whole number exactly as it was. What helps is a larger hub, because it makes the inner ring longer while making the bands shallower - the shape factor rises and the steps get finer. At a hub of 0.12 there are five settings at the innermost ring; at 0.20 there are nine, and at 0.30 twenty-one. If the inner control feels blunt, that is the dial to reach for.

Ring density

The three Ring density controls are the multiplier from step 3 above. They are three zones with hard borders: inner owns the innermost third of the radius, middle the middle third, outer the outer third, and none of them reaches into another's. Moving one changes only its own part of the disc.

At 1, 1, 1, the default, every cell keeps the proportions it has flat: square cells all the way from hub to rim. The price is that the number of cells around has to change as the rings get longer, and where it changes you may see a ring in the pattern. On a broken-up pattern like Greeble Panels those are invisible; on a strict lattice like Hex Grid they are not, which is what the next control is for.

Pulling the inner value down thins out the middle of the disc the way the paint on a real saucer section thins towards its hub - the usual reason to touch these at all.

Even ring count

Even ring count takes one count for the whole disc, measured at its middle, instead of one that follows the circumference. Nothing then varies with the radius, so there is no place at which the count could change and none of those rings can appear. The cells grow outwards instead of staying square, which reads as a domed or curved plate rather than a flat one.

This is usually what a strict lattice wants. On Hex Grid it is the difference between a disc with two visible circular breaks in it and one where the lattice runs unbroken from hub to rim.

With it on, the three zone controls collapse into a single Ring density - there are no longer three zones to tell apart - and that one slider sets the count for the whole disc.

Rows deserves a second mention here. It is the number of rings, and it is also the grid the density profile is sampled on: a disc with four rings can only change its count in four places, however the three controls are set. If a profile you have dialled in seems to be ignored, look at Rows first.

Four of the thirteen have no ring density at all - Bars & Slats, Knurling and Hazard Stripes are counted once across the whole tile rather than in rows, so there are no rings for a count to vary between. They get the plain projection, and the hub is what keeps their middle usable. On Bars this costs nothing: its Angle already decides between spokes and rings, and rings have no crowded middle.

Equal window size

Offered by Window Lights only, and only with the projection on. Everything a generator draws sits inside a cell and fills a fixed share of it, so on a disc it inherits whatever shape that cell has: pinched near the hub, stretched at the rim. For a subdivision - Greeble, Truchet, Pipe Runs - that is correct, because a panel is its cell. For a window it is not. A window on a hull is the same window wherever it sits, and here it is the flat projection that is consistent and the disc that needs correcting.

With the switch on, every window is drawn at one size over the whole disc. Measured at four radii on an even-count disc, the width of a window ran 12.2, 16.0, 22.5 and 28.3 pixels without it, and 18.3, 18.4, 18.4 and 18.5 with it.

Rings too narrow to hold a whole window are left out rather than given a squeezed one. That is not a shortcut: a squeezed window touches its neighbours, and the ring turns into a solid band - measured, 120 separate windows became three runs of a continuous line. A real hull has no windows that close to its middle either, so leaving them out is also the truthful picture. If you want them back, raise the hub radius or lower the window size until they fit.

Snap to doublings

Snap to doublings rounds the number of cells around each ring to a doubling, so that where the count changes, the coarse ring's cell edges fall exactly on the fine ring's and the two line up instead of clashing.

It starts off on twelve of the thirteen layers, because it and the ring density controls pull against each other. With the snap on, the count can only be a power of two, and most of each density slider's travel then lands in the same one: the sliders stop changing the number of cells around a ring and start moving the radius at which the count jumps instead, which is not what they are for.

Box Scatter is the exception and starts with it on. It reads its neighbouring cells to filter its edges, and without the snap the disc leaves a visible join along one radius where it closes on itself. Turn it on yourself anywhere the rings where the count changes bother you more than the loss of range.

It matters with Even ring count as well, which is less obvious: a count that never changes has no ring to line up, but what the snap does for a layer that reads its neighbours is close the join itself. Measured on Box Scatter, an even disc without the snap opened that join to more than a hundred times its surroundings, and with it the join reads as nothing at all.

Tiling, masks and the global scale

A disc cannot tile. It has no periodic edge, in the same way Radial Rings and Frame do not. The 2x2 tile check will show you four discs rather than one continuous surface, and that is the honest answer rather than a fault. What the projection does guarantee is that the pattern closes where it meets itself going round the middle, with no seam along any radius.

Masks are unaffected by the switch. A mask says where on the image a layer may contribute, and it stays in image coordinates - so a gradient mask still runs left to right across the picture rather than turning with the disc, which is what makes it possible to aim one at part of the disc at all.

The global scale reaches polar layers correctly and needs nothing extra: it drives the layer's own column and row counts as it does everywhere else, and the rings follow from those.

The 3D preview

A grey image is a poor guide to what a renderer will do with it. 3D in the top bar shows the height field as geometry; the same button, now reading Texture, brings the flat map back.

Drag to orbit, wheel to zoom, and Relief sets how far the height pushes the surface out. Orbiting never re-runs a layer, so it stays smooth however heavy the stack is.

It is a preview, not a render. The lighting is a single direct source with no ambient occlusion in it, and your own software will differ - particularly in how it interprets the height scale.

Expect it to look rougher than the real thing. The preview displaces a fixed mesh of 512 × 512 quads - 768 × 768 for the 3×3 surface - and samples the preview map rather than the export. Detail finer than that grid falls between vertices, so crests come out faceted and edges read as harsher and more ragged than they are.

That is the mesh, not the map. The same height field exported at 4096 or 8192 and applied to a dense mesh is smooth where the preview looks blocky. Raising Preview resolution improves what the surface samples, but the mesh stays the same size - so judge shapes and seams here, and judge fine detail from the exported map.

Export and file formats

Preview resolution and Resolution under Export are separate on purpose: the preview stays responsive while the export renders at full size, up to 8192 × 8192.

Output Format When
Height 16-bit PNG PNG, 16 bit greyscale The one to use for displacement. 65536 height steps instead of 256.
Height 8-bit PNG, 8 bit greyscale Masks, emission and anything that will be thresholded anyway. Visibly terraces a dense mesh if used for displacement.
Height 32-bit EXR OpenEXR, float When the height will be pushed through more maths downstream and every rounding step matters.
Normal map PNG, 8 bit RGB Tangent-space normals derived from the height field. Set the strength and the green channel first.
AO PNG, 8 bit greyscale Ambient occlusion, for a diffuse or mix input.
Curvature PNG, 8 bit greyscale Convex and concave edges, for edge wear masks and dirt.

Everything is rendered and encoded in the page. Nothing is sent anywhere to be converted, which is also why a very large export briefly occupies the browser rather than a queue on a server.

All of them at once

Download all as ZIP writes one archive instead of one file per button. Tick the maps you want — the list sits above the button, with All and None beside it — and every one of them is rendered at the export resolution and packed together. Only the 16-bit height is ticked to begin with.

preset.json always goes in, whatever else is ticked. It is the same file the Save .json button writes, so the archive carries the recipe next to the result and the maps can be rebuilt later at another size.

The Color entry is greyed out unless some enabled layer actually produces colour, in the same way as the Color view on the canvas. Nothing inside the archive is compressed a second time: PNG and EXR arrive compressed already, so a second pass would cost seconds at 8K and save almost nothing.

What the bar across the top means

A thin bar appears above the canvas whenever the page is busy with something that would otherwise look like a freeze: a large export, a change of preview resolution, and above all loading a project.

It runs on an estimate rather than on real progress, because the work it covers holds the main thread from start to finish and nothing can report from inside it. If the estimate falls short the bar slows down near the end and waits; it only reaches the end when the work does.

When a project is loaded the bar starts as the file dialog closes, which is often well before the page has the file: on Windows the browser can sit on a freshly downloaded file for several seconds before handing it over. That wait belongs to the browser and the operating system, not to this page, but it is the wait you actually sit through, so the bar covers it. It deliberately does not run while the dialog is still open and waiting for you.

Colour

Everything else here is a single height field. Colour is a second pass over the same stack rather than a change to that one: a generator may describe what its parts are made of as well as how tall they are, and only the generators that do take part. Motherboard is the first.

Color appears beside Height, Normal, AO and Curvature in the top bar, and as an export. It is greyed out while nothing in the stack has anything to say in colour, because a view that can only be black is worse than no view at all.

In the 3D preview the same switch shades the surface with that colour while the height goes on driving the relief - the board is lit as geometry and coloured as a board, from one pass rather than two renders that could disagree.

Colour follows a layer’s coverage and opacity, not its mask. A mask decides where a layer contributes height, and reproducing that here would need the height as it stood at that point in the stack, which the colour pass does not have.

Reproducibility and sharing

Nothing here is baked into an image you cannot get back. Given the same seed and the same settings, the program produces the same map at any resolution.

Files and links saved by older versions are meant to keep working. When a control is renamed or split in two, the old key is mapped onto the new one on load, so a link from before a change still opens the setup it described. That said: it is a promise I try hard to keep rather than one I can guarantee. If something does break, it will have been an accident, not a decision.

Layer reference

Every generator, grouped as the picker groups them, with all of its controls. The ranges and defaults below are read straight out of the program when this page is built, so they cannot drift away from what the sliders actually do.

Range is what a control accepts - the two ends of a slider, or the entries of a dropdown. Controls that only appear in certain modes are marked as such.

Sci-Fi / Hard surface 18 layers

Greeble Panels

Recursive panel subdivision with gaps and bevels. The hull-plating workhorse.

The one to reach for first. A rectangle is split in two, each half is split again, and so on to Split depth, which is why the panels interlock the way plating does instead of sitting on a grid. Early stop is what keeps that from turning into a uniform tartan: it lets a panel drop out of the subdivision early and stay large while its neighbours keep dividing.

Two of these on top of each other is the standard hull. Put a coarse pass underneath, a finer one over it on multiply, and the wide seams of the coarse layer leave the fine one showing through as bright separators - no third layer needed for the second grid level. Height steps quantises the panel heights into plateaus, which reads as machined rather than moulded.

13 controls
ControlRangeDefaultNotes
Columns 1 – 32 5 Macro cells across and down, counted rather than derived, so each axis covers its whole slider independently of the other. Can be chained to Rows
Rows 1 – 32 5
Split depth 0 – 8 4
Early stop 0 – 0.6 0.15 Chance a panel stops subdividing, creating size variety
Split skew 0 – 0.45 0.2 How far off-centre a split can land
Cut corners 0 – 0.8 0 Clips corners at 45 degrees, as a share of the smaller half-side. The bevel follows the cut edge like any other
Corners cut 0 – 1 0.5 How many of the four corners are clipped. At 1 every one is, which makes octagons - half of them reads as machined plate. Hidden while it would have no effect
Panel gap 0 – 0.02 0.0025
Bevel width 0 – 0.05 0.006
Bevel depth 0 – 1 0.35 Hidden while it would have no effect
Height min 0 – 1 0.25
Height max 0 – 1 1
Height steps 0 – 32 0 0 = continuous heights

Aztec Hull Panels

Subtle starship paint panelling, as seen on a certain science-fiction show. Polar for saucer sections, cartesian for the rest of the hull - same settings, so the two match.

The faint two-tone panelling on a starship hull, where the panels are a paint scheme rather than relief. It is built for that specific job and has the controls to match, so the two settings that matter most are the ones you might otherwise leave alone: keep Contrast low - a finished hull is barely there - and use Grouping, which blends each panel toward a shared block tone. Without grouping the result is noise in rectangles; with it, the panels read as a design.

Polar (saucer) switches the same generator between concentric rings and rectangular bands, deliberately from the same settings, so a saucer and the hull sections around it match. Polar cannot tile - a radial field has no periodic edge. Repeats around is the motif count; about a dozen is what the reference workflow uses, and that repetition is a large part of why real aztecing looks designed.

This one is not a displacement map. Aztecing is a difference in finish, not in depth - the panels are the same height and catch the light differently, the way the panels of an aircraft or a ship's hull do. Use the map on roughness or specular, where it belongs, and at most faintly on colour.

So: this layer on its own, black background, exported as 8-bit. Keep Contrast low - on the real thing the pattern is barely visible until the light rakes across it, and the usual mistake is to make it obvious.

Zig-zag folds walks the panel columns sideways and back as they climb, which is how the warp pylons of the filming miniature are patterned rather than the hull. Counted in whole folds over the height, so it stays seamless.

28 controls
ControlRangeDefaultNotes
Polar (saucer) on / off off Off gives rectangular panels for hull and nacelles. On gives concentric rings for a saucer. Polar cannot tile. Left alone by both randomise buttons
Panel style flat panels · stepped / notched flat panels Flat gives rectangles of differing tone. Stepped cuts a notch out of each panel, producing the interlocking L and T shapes of a two-tone hull graphic
Notch size 0.1 – 0.85 0.45 Hidden while it would have no effect
Uncut panels 0 – 1 0.35 Fraction of panels left as full rectangles, so the notched ones read as deliberate rather than uniform. Hidden while it would have no effect
Empty panels 0 – 1 0.3 Fraction dropped to the background tone. This is what opens the gaps the shapes interlock across. Hidden while it would have no effect
Mirror symmetry on / off on Reflects the tone pattern about the centreline, as a real hull is painted. Mirrors the lookup, not the geometry, so panels keep their size
Repeats around 1 – 24 12 How many times the motif repeats around the saucer, or across the hull. Reference workflows build one mirrored wedge and duplicate it about a dozen times - that repetition is a large part of why real aztecing looks designed rather than random
Bands 2 – 80 20 Rings in polar mode, rows in cartesian
Panels per repeat 2 – 48 12 Panels inside one motif, not around the whole ring. The total is this times the repeat count. Too few here and a band runs out of distinct tones and turns into a solid ring
Density: inner 0.05 – 2 0.3 Panel count at the hub, as a multiple of the base count. Low keeps the inner rings from narrowing into needles. Hidden while it would have no effect
Density: middle 0.05 – 2 0.65 Hidden while it would have no effect
Density: outer 0.05 – 2 1 Panel count at the rim. Set all three equal for a uniform count in every ring. Hidden while it would have no effect
Centre X 0 – 1 0.5 Hidden while it would have no effect. Left alone by both randomise buttons
Centre Y 0 – 1 0.5 Hidden while it would have no effect. Left alone by both randomise buttons
Saucer radius 0.05 – 0.5 0.48 Half the image is the largest a centred disc can be without running past the edges. Moving the centre off the middle can still push it past one. Hidden while it would have no effect. Left alone by both randomise buttons
Hub radius 0 – 0.7 0.12 Leaves the middle blank, as a real saucer has. The bands then span the visible ring rather than wasting subdivisions on a few pixels at the centre. Hidden while it would have no effect. Left alone by both randomise buttons
Merge equal panels on / off on Drops the seam between neighbours that share a tone, so bands end up a mix of narrow and wide panels instead of a uniform comb. Hidden while it would have no effect
Stagger bands on / off off Offsets alternate bands by half a panel. Breaks up long straight seams, but also breaks mirror symmetry
Zig-zag folds 0 – 16 0 Walks the panel columns sideways and back as they climb, the way the warp pylons of the filming miniature are patterned rather than the hull. 0 leaves them straight. Counted in whole folds, so it stays seamless. Hidden while it would have no effect
Zig-zag width 0.1 – 6 2 How far the columns wander, in panels. Hidden while it would have no effect
Contrast 0 – 1 0.09 Keep this low for a finished hull. Raise it while dialling the pattern in, then bring it back down
Grouping 0 – 1 0.45 Blends each panel toward a shared block tone. This is what separates aztecing from noise. Hidden while it would have no effect
Regularity 0 – 1 0.35 0 draws every block tone independently. 1 steps the tones along in a repeating diagonal order, which is how a real hull is painted. Hidden while it would have no effect
Block width 1 – 16 2 Hidden while it would have no effect
Block height 1 – 16 1 Hidden while it would have no effect
Tone steps 0 – 12 6 0 is continuous. A handful of discrete tones matches how hulls are actually painted. Hidden while it would have no effect
Seam width 0 – 0.01 0.0008 Hidden while it would have no effect
Seam depth 0 – 1 0.35 Hidden while it would have no effect

City

Blocks, streets and buildings from above. Street width falls with every split, so avenues and alleys come out of one subdivision.

A city from above, and it is built out of the same recursive subdivision as Greeble - with three things that subdivision alone cannot do.

The first is street hierarchy. Every cut lays a road along the line it cuts, and each level's road is narrower than the one above it by the Street taper, so the first cuts read as avenues and the last as alleys. That is one subdivision, not layers stacked at different scales, which is why the network hangs together: the gaps of a recursive split always meet.

The second is that a block is not a building. Each one is subdivided again, by Building depth, into separate footprints with a Setback from the street. A large footprint is not allowed to stop early - Building early stop applies to small ones only - or a single slab fills the block and the plan reads as panelling.

The third is Centre height: tall in the middle, low at the edge. It still tiles, since the falloff is symmetric and both edges therefore meet at the same height, but every copy carries its own centre. Repeat the tile and you get a grid of downtowns.

Narrowest building is what keeps the plan out of slivers: a cut that would leave a piece thinner than this is moved in until it would not, and an area too narrow to hold two is not cut at all. Open blocks leaves some ground unbuilt, weighted towards blocks that are both small and compact - a long thin one left open reads as a trench through the plan rather than as a square. A footprint big enough and square enough may be built around a courtyard; the rest get a parapet and a housing from Roof detail, which is most of what separates a building from a box.

20 controls
ControlRangeDefaultNotes
Columns 1 – 24 4 Can be chained to Rows
Rows 1 – 24 4
Block depth 0 – 7 4 How often the ground may be cut into smaller blocks. Every cut is narrower than the one before it
Block early stop 0 – 0.6 0.12 Chance a block stays large instead of being cut again, so the plan is not uniformly fine
Block skew 0 – 0.45 0.28
Avenue width 0.002 – 0.06 0.018 Width of the first cuts. The later ones are narrower, by the taper below
Street taper 0.3 – 1 0.62 What each level keeps of the width above it. At 1 every street is the same and the hierarchy disappears
Building depth 0 – 6 4 How often a block is cut into separate buildings. 0 leaves the block as one slab
Building early stop 0 – 0.6 0.16 Only a small footprint may stop early. A large one keeps splitting, or a single slab fills the block
Setback 0 – 0.02 0.003 Gap between a building and the street, and between neighbours
Narrowest building 0.002 – 0.06 0.022 No split may leave a piece thinner than this, so the plan cannot fill with slivers. Raise it for fewer, fatter buildings
Open blocks 0 – 0.6 0.1 Fraction of blocks left unbuilt - squares, parks, yards. Nothing reads as a city without them
Centre height 0 – 1 0.6 Tall in the middle, low at the edge. It still tiles - the falloff is symmetric, so both edges meet at the same height - but every copy carries its own centre, which shows as a grid of downtowns when the tile is repeated
Courtyards 0 – 1 0.35 Chance a footprint big enough for one is built around a yard instead of solid
Roof detail 0 – 1 0.5 Parapet around the roof and a housing on it. What separates a building from a box
Street level 0 – 0.5 0.06
Height min 0 – 1 0.2
Height max 0 – 1 1
Height variation 0 – 1 0.55
Variation seed 0 – 999 0 Re-rolls which buildings come out tall, leaving the plan exactly as it is. Typed, with a die beside it. Hidden while it would have no effect. Left alone by both randomise buttons

Circuit Traces

Connected PCB-style routing with pads and vias. Traces agree across cell borders.

Traces that actually connect: each cell agrees with its neighbours about what crosses the border, so a run continues instead of stopping at a cell edge. Density is the fraction of the lattice edges that carry a trace, which is the control that decides whether the board reads as busy or as sparse.

Pads are placed on junctions by Pad chance, and Via hole punches through their centres. Two passes at different Columns - a coarse one on max and a finer one over it - gives the mixture of trunk routing and fine detail that a real board has.

9 controls
ControlRangeDefaultNotes
Columns 1 – 96 24 Can be chained to Rows
Rows 1 – 96 24
Density 0 – 1 0.42 Fraction of the lattice edges that carry a trace
Trace width 0.005 – 0.3 0.07
Pad size 0 – 0.5 0.18
Pad chance 0 – 1 0.35 Hidden while it would have no effect
Via hole 0 – 1 0.4 Punches a hole through the pad centre. Hidden while it would have no effect
Trace height 0 – 1 0.7
Pad height 0 – 1 1 Hidden while it would have no effect

Truchet Conduits

Interlocking arcs and straights. Reads as pipework, coolant channels or data bus.

Tiles carrying an arc or a straight, oriented so that whatever leaves one edge arrives at the next. The result is always a connected network, which is what separates it from a scatter: it reads as pipework or a data bus because it goes somewhere.

Straight mix blends between curved and straight runs - all arcs looks organic, all straights looks like a bus. Groove carves a channel down the middle of each run, turning a round conduit into a cable tray.

9 controls
ControlRangeDefaultNotes
Columns 1 – 64 12 Can be chained to Rows
Rows 1 – 64 12
Conduit width 0.01 – 0.5 0.16
Straight mix 0 – 1 0.3 Blend between curved arcs and straight runs
Density 0 – 1 1 Fraction of cells that carry a conduit
Groove 0 – 1 0 Carve a channel down the middle of each run
Height 0 – 1 0.8
Height variation 0 – 1 0.2
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect

Box Scatter

The classic JSPlacement rectangle storm - grid-jittered so it stays seamless.

The rectangle storm the predecessors were built around, with one difference: boxes are jittered within grid places rather than dropped at free positions, so the layer tiles. That is also why the count is Columns and Rows rather than a number of boxes.

A wide gap between Size min and Size max is what makes it look scattered rather than regular, and Stretch pushes boxes toward bars. Overlap wins decides which of two overlapping boxes is seen: tallest keeps the stack readable, random is messier and more organic.

12 controls
ControlRangeDefaultNotes
Columns 1 – 64 10 Can be chained to Rows
Rows 1 – 64 10
Density 0 – 1 0.6 Fraction of grid places that carry a box
Size min 0.02 – 2 0.2
Size max 0.02 – 2 0.9
Stretch 0 – 1 0.5 Anisotropy - pushes boxes toward bars
Cut corners 0 – 0.8 0 Clips corners at 45 degrees, as a share of the smaller half-side. Combines with Corner round, which softens what the cut leaves
Corners cut 0 – 1 0.5 How many of the four corners are clipped. At 1 every one is, which makes octagons - half of them reads as machined plate. Hidden while it would have no effect
Corner round 0 – 0.5 0
Height min 0 – 1 0.2
Height max 0 – 1 1
Overlap wins random · tallest tallest

Bars & Slats

Directional slats with jittered widths and dropouts. Vents, radiators, heat sinks.

Slats with jittered widths and dropouts - vents, radiators, heat sinks, or a fast way to break up a flat panel. Segmentation chops the bars into runs of separate tiles, which turns a louvre into a row of modules.

Angle snaps to 0 or 90 degrees while seamless tiling is on. A slanted bar can only tile if its slope closes a whole number of periods on both edges at once, which an angle slider almost never does. With tiling off, the angle is free.

8 controls
ControlRangeDefaultNotes
Count 2 – 256 32
Angle 0 – 180 0 Seamless mode snaps to 0 or 90 degrees
Bar width 0.02 – 0.98 0.5
Width jitter 0 – 1 0.3
Segmentation 0 – 64 0 Chop bars into runs of separate tiles. 0 = continuous
Density 0 – 1 0.85 Fraction of slat positions that carry a slat
Height min 0 – 1 0.3
Height max 0 – 1 1

Hex Grid

Hexagonal cells with gaps and per-tile height. Reactor plating, shield arrays.

Hexagonal cells with a gap and a bevel, for reactor plating and shield arrays. The two axes are counted separately, as everywhere else, which means the cells are only regular hexagons at about 0.58 rows per column - 16 columns to 9 rows, say. Away from that ratio they stretch, which is usually what you want for a panel run rather than a honeycomb.

8 controls
ControlRangeDefaultNotes
Columns 2 – 80 16 Can be chained to Rows
Rows 1 – 80 9 Regular hexagons need about 0.58 rows per column. Away from that they stretch, which is what you want for a stretched plating
Gap 0 – 0.5 0.08
Bevel 0 – 0.5 0.1
Bevel depth 0 – 1 0.3 Hidden while it would have no effect
Density 0 – 1 0.9 Fraction of grid places that carry a tile
Height min 0 – 1 0.4
Height max 0 – 1 1

Window Lights

Lit window runs for emission maps - rows and columns of panels with gaps, as on a hull. Not meant to be displaced.

Lit windows for an emission map. It is the one generator here not meant to be displaced: black background, this layer on its own, exported as 8-bit PNG, and Hard on/off edges switched on if your pipeline thresholds the map.

What sells it is that lit cells form runs - rows broken by gaps, decks stacked above one another - rather than independent random dots. Clustering goes further and puts only some blocks of hull in use at all, as panels, decks or towers; a hull reads as built when its sections repeat and as noise when every one of them differs. Stray windows stay out of the blocks that clustering switched off, since a few lights in every dark block would undo the clustering entirely.

To line the windows up with relief, build the displacement in a second pass with the same seed and the same Columns and Rows.

17 controls
ControlRangeDefaultNotes
Columns 4 – 400 64 Can be chained to Rows
Rows 4 – 400 64
Shape rectangle · circle · diamond · slit rectangle
Window size 0.05 – 1 0.55
Density 0 – 1 0.35 Fraction of cells that light up. Independent of the grid and of run length, so those change the look without changing how bright the panel reads
Run length 1 – 16 6 Windows per lit streak. Long runs read as a single deck, short ones as scattered cabins
Cluster break-up 0 – 0.95 0.35 Punches gaps into the runs. The lit amount is held constant, so the same number of windows ends up spread over a wider area instead of sitting in solid blocks
Clustering off · panels · decks · towers off Groups the windows into blocks of hull instead of spreading them evenly. Panels are independent rectangles, decks run right across, towers run top to bottom
Block width 2 – 40 7 Size of one block, in windows. Hidden while it would have no effect
Block height 2 – 40 5 Hidden while it would have no effect
Blocks occupied 0 – 1 0.55 Fraction of blocks that carry any windows at all. The rest stay dark hull. Hidden while it would have no effect
Block variation 0 – 1 0.5 How differently lit one block is from the next. Zero lights every occupied block equally. Hidden while it would have no effect
Run direction horizontal · vertical · both · blocks horizontal
Stray windows 0 – 1 0.02 Adds isolated lights outside any run - a fraction of the cells the runs left dark. Where clustering has switched a block of hull off, it stays off
Brightness steps 1 – 8 1 1 = every window equally bright, which is what an emission mask usually wants
Dimmest level 0 – 1 0.4
Hard on/off edges on / off off Strictly binary mask with no antialiased edge, which some emission workflows require

Tech Tiles

Each cell gets one of fourteen machine modules - rings, slots, crosses, stepped blocks, grilles, bolted plates, hex bosses, dishes, fans, terminals, lattices, stud arrays, hatches and capsule vents - each switchable and set to its own height.

Each cell gets one of six machine modules - ring, slots, cross, stepped block, grille or bolted plate - so a single layer fills a panel with varied hardware instead of one repeated shape. Module set narrows that to a single kind when the variety is too much.

Base plate is the height of the plate a module sits on. At 0 the modules float, which is what you want when the layer goes over plating that should stay visible between them.

53 controls
ControlRangeDefaultNotes
Columns 1 – 40 7 Can be chained to Rows
Rows 1 – 40 7
Density 0 – 1 0.75 Fraction of grid places that carry a module
Cut corners 0 – 0.8 0 Clips corners at 45 degrees, as a share of the smaller half-side. Cuts the tile the module sits on, while the detail inside it keeps its shape
Corners cut 0 – 1 0.5 How many of the four corners are clipped. At 1 every one is, which makes octagons - half of them reads as machined plate. Hidden while it would have no effect
Tile gap 0 – 0.5 0.08
Base plate 0 – 1 0.3 Height of the plate the module sits on. 0 leaves modules floating
All on / off on / off on Switches every module at once. Ticked only while all of them are on
Rings on / off on
Rings share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Rings height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Slots on / off on
Slots share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Slots height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Crosses on / off on
Crosses share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Crosses height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Stepped blocks on / off on
Stepped blocks share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Stepped blocks height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Grilles on / off on
Grilles share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Grilles height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Bolted plates on / off on
Bolted plates share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Bolted plates height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Hex bosses on / off on
Hex bosses share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Hex bosses height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Dishes on / off on
Dishes share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Dishes height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Fans on / off on
Fans share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Fans height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Terminals on / off on
Terminals share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Terminals height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Lattices on / off on
Lattices share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Lattices height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Stud arrays on / off on
Stud arrays share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Stud arrays height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Hatches on / off on
Hatches share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Hatches height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Capsule vents on / off on
Capsule vents share 0 – 100 100 How often this module is chosen, against the others. The shares are relative, so all at 100 is the same as all at 50. Hidden while it would have no effect
Capsule vents height 0 – 2 1 Height of this module. 1 spends half the range, 2 all of it, so there is room to raise one without cutting its top off or moving any other module. Hidden while it would have no effect
Random rotation on / off on
Height variation 0 – 1 0.2
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect

Vent Louvres

Framed intake modules with angled slats. Reads as cooling, exhaust or sensor apertures.

Framed intakes with angled slats inside - cooling, exhaust, sensor apertures. Unlike Bars & Slats, each module is a self-contained unit with its own frame, so it can be scattered across a hull rather than running the width of it.

Black background is the control to know. Off leaves everything outside a module untouched, so the layers below show through and the vents sit on existing plating. On drives the surroundings to black, which is what you want when the vents are the whole map.

12 controls
ControlRangeDefaultNotes
Columns 1 – 40 6 Can be chained to Rows
Rows 1 – 40 6
Density 0 – 1 0.4 Fraction of grid places that carry an intake
Module margin 0 – 0.45 0.12
Slats per module 2 – 24 7
Slat width 0.05 – 0.95 0.55
Frame width 0 – 0.25 0.06
Frame height 0 – 1 0.9
Slat height 0 – 1 0.55
Recess 0 – 1 0.15
Random rotation on / off on
Black background on / off off Off leaves everything outside a module untouched, so layers below show through. On drives it to black, which is what you want when the vents are the whole map

Hazard Stripes

Industrial warning banding, straight or chevron. Integer frequencies keep diagonals seamless.

Industrial warning banding, straight or folded into chevrons. Chevron folds at 0 leaves plain diagonal stripes; raise it for arrows.

There is no angle control here, and that is deliberate. The direction comes from Frequency X and Frequency Y together - two whole numbers of periods, which close on both edges by construction. That is what lets a diagonal stripe tile at all.

9 controls
ControlRangeDefaultNotes
Frequency X 0 – 64 10 Can be chained to Frequency Y
Frequency Y 0 – 64 10
Stripe width 0.05 – 0.95 0.5
Bevel 0 – 0.05 0.004
Bevel depth 0 – 1 0.3
Chevron folds 0 – 16 0 Folds the stripes into arrows. 0 is straight banding
Chevron depth 0 – 8 2
Phase 0 – 1 0
Edge wear 0 – 1 0

Pipe Runs

Connected conduit with a rounded profile and periodic collars. Heavier and rounder than circuit traces.

Conduit run along grid edges with a rounded profile, heavier and rounder than Circuit Traces and meant to read as plumbing rather than routing. Roundness takes it from a flat strap at 0 to a full semicircular pipe at 1.

The collars are what make it look installed rather than drawn: Collar position places them along the run and Elbow boss thickens the corners where a run turns.

9 controls
ControlRangeDefaultNotes
Columns 2 – 48 10 Can be chained to Rows
Rows 2 – 48 10
Density 0 – 1 0.35 Fraction of grid edges that carry a run of pipe
Pipe diameter 0.02 – 0.9 0.22
Roundness 0 – 1 0.7 0 is a flat strap, 1 is a full semicircular pipe
Collar size 0 – 1 0.4
Collar position 0.05 – 0.5 0.36
Collar width 0.01 – 0.3 0.07
Elbow boss 0 – 1 0.5

Knurling

Crossed machine grooves - the diamond grip on a tool handle, a knob, a hatch lever. Also does straight and square knurls.

The crossed grip cut into a tool handle, a knob or a hatch lever. Pattern chooses whether both sets of grooves are cut (diamond), only one (straight), or the two cross at a right angle (square).

Teeth across and Slant are two counts rather than a count and an angle: the first is how many grooves cross the tile, the second how far one climbs over its height. Together they are the helix angle, and equal values give the classic 45 degrees - expressed this way so the pattern still tiles. Wear takes the height off the teeth unevenly, the way a handled tool loses it; at 0 the knurl is straight off the machine.

8 controls
ControlRangeDefaultNotes
Pattern diamond · straight · square diamond Diamond crosses two sets at opposing angles, straight leaves one, square crosses them at a right angle
Teeth across 2 – 128 28 Grooves from left to right, over the whole tile
Slant 0 – 128 14 How far a groove climbs over the height of the tile. Together with the teeth count this is the helix angle - equal values give the classic 45 degrees. Hidden while it would have no effect
Tip sharpness 0.3 – 5 1.6 Low leaves rolled, rounded teeth; high cuts them to points
Flat tops 0 – 0.9 0.12 Cuts the tips off flat, as a worn or a lightly rolled knurl is
Groove floor 0 – 0.9 0 Raises the bottom of the grooves, for a shallower cut
Wear 0 – 1 0.15 Takes the height off the teeth unevenly, the way a handled tool loses it. Zero is straight off the machine
Wear patch size 1 – 24 5 Hidden while it would have no effect

Motherboard

A populated circuit board: chips, slots, sockets, capacitors and heat sinks on areas of unequal size, with bare substrate between them.

A populated board, and the reason it exists is the reason Circuit Traces is not one: an even lattice reads as even, because every cell is the same size and carries the same amount. Here the layout comes from recursive subdivision instead, so a few areas end up large and many end up small, and each is given a role - chip, slot, socket, capacitors, heat sink, or nothing at all.

Split depth and Early stop are what produce that spread of sizes; without the early stop the board comes out uniformly fine again. Density decides how much of it stays bare substrate, which matters as much as the components: a board covered edge to edge reads as a texture rather than as a board.

An area's shape decides what it can be - a long thin one becomes a slot, a squat one a chip or a socket - so the roll only chooses between the plausible. Module set forces one kind everywhere. Underneath it all runs the fine routing, so no part of the board is truly empty, and Mounting holes cut through whatever sits over them.

Routing style changes how a run turns: right angles is the schematic look, rounded the older etched one, diagonal the 45 degree mitre a board is actually routed with. Traces is different in kind rather than in degree - it allows no junctions at all. A cell keeps at most two of its four edges, so a run passes through or ends on a via, and two runs can never meet or cross. That is what a single copper layer is. Routing lanes then sets how far a run holds its direction before it has to bend, and so how long the runs get.

Every kind has a switch, a share and a height of its own, and All on / off carries the lot. A share decides how often a kind is picked against the others; a height moves that one kind against the global Component height. Up to 1 the height scales it directly, above 1 it walks the rest of the way to the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height happens to be. Routing scale sizes the wiring grid on its own, without touching Columns and Rows.

42 controls
ControlRangeDefaultNotes
Columns 1 – 16 3 Can be chained to Rows
Rows 1 – 16 3
Split depth 0 – 6 3 How often an area may be halved. This is what produces components of wildly different size from one control
Early stop 0 – 0.6 0.22 Chance an area stops subdividing and stays large, so the board is not uniformly fine
Split skew 0 – 0.45 0.3
Density 0 – 1 0.7 Fraction of areas that carry a component. The rest stay bare board - just as important to the look as the components
All on / off on / off on Switches every kind below at once. Ticked only while all of them are on
Chips on / off on Bevelled slabs with a pin fringe and an orientation mark
Slots on / off on Contact fingers in a recessed channel - the long, thin areas favour these
Sockets on / off on A raised wall around a square-pitched pin field
Capacitors on / off on Cans on a spacing that keeps them from touching
SMD parts on / off on Little two-pad resistors and capacitors, gathered in clusters rather than spread evenly - the small change that fills the gaps between the big parts
Heat sinks on / off on Rows of parallel fins on a solid base, the way a heat sink sits over the part it cools
Routing on / off on The wiring across the whole board, underneath the components
Chips share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
Chips height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
Slots share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
Slots height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
Sockets share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
Sockets height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
Capacitors share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
Capacitors height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
SMD share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
SMD parts height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
Heat sinks share 0 – 100 100 How often this kind is chosen, relative to the others. The shape of an area still decides what is plausible on it. Hidden while it would have no effect
Heat sinks height 0 – 4 1 Height of this kind against the others. 1 is the Component height, below shrinks it, above raises it towards the top of the range, which 4 reaches exactly - so the whole travel does something whatever the global height is set to. Hidden while it would have no effect
Centre chips on / off off Draws the large parts toward the middle and leaves the smaller ones and the bare stretches to the edges, the way a board is laid out around its processor rather than evenly
Component margin 0 – 0.45 0.16
Substrate height 0 – 1 0.2 Height of the bare board everything sits on
Component height 0 – 1 0.75
Pin pitch 3 – 40 21 Pin steps across the whole board, not per component - every package shares one pitch, as a real board does. Higher is finer
Pin relief 0 – 1 0.5
SMD size 0.2 – 3 1 Size of the small two-pad parts. Their own control, because a resistor does not change size when a package changes its pin pitch
Routing density 0 – 1 0.5 The fine wiring under everything, so no part of the board is truly empty. Hidden while it would have no effect
Pad size 1 – 8 2.6 Size of the vias and end pads, as a multiple of the routing width. They sit where three runs meet and where a run ends. Hidden while it would have no effect
Routing lanes 0 – 1 0.7 Gathers the runs into rows and columns instead of spreading them evenly. High gives few long paths with clear board between them, 0 the even mesh. Hidden while it would have no effect
Routing style right angles · rounded · diagonal · traces right angles How a run turns. Right angles is the schematic look, diagonal is how a board is actually routed, rounded is the older etched style. Traces goes further and allows no junctions at all, so runs stay separate and end on a via - the way a single copper layer really looks. Hidden while it would have no effect
Routing scale 0.25 – 4 1 Size of the routing grid across the whole board, independent of how much of it is filled. Rounded to whole cells per axis, without which it could not tile. Hidden while it would have no effect
Routing width 0.005 – 0.2 0.05 Hidden while it would have no effect
Routing height 0 – 1 0.3 Hidden while it would have no effect
Height variation 0 – 1 0.25
Variation seed 0 – 999 0 Re-rolls which components come out tall, leaving the layout exactly as it is. Typed, with a die beside it. Hidden while it would have no effect. Left alone by both randomise buttons

Object

One module from the library, placed on its own. The same shapes the grid layers are built from - a hatch, a bore, an intake - but at a position and size you choose rather than on a lattice.

Every other generator here fills the frame with a lattice. This one takes a single module out of that lattice and puts it where you want it: a hatch on its own, a bore in a corner, an intake set at an angle.

The shapes are not copies. The modules were lifted out of Tech Tiles, Discs & Hatches, Vent Louvres and Gear Rings into one library that both the grid layers and this one call, so a placed bore and a bore in the grid are the same code and cannot drift apart. Alongside them stand shapes that belong to no lattice: a screw, and six escape pods. The pictures in the Objects panel are rendered by that same library rather than drawn by hand, which is why they always show what you are actually about to place; they are drawn ahead of time and ship with the app, so the panel has them the moment it opens.

Scale X and Scale Y are chained while their values match, so they behave as one size control until the chain is opened. They belong to the object rather than to the image: rotate a wide object and its width turns with it. Only the controls the chosen object can use are shown - a count for the fittings that count something, the louvre set for the intake, teeth and spokes for the wheel.

Because they are a size and not a count, Global scale treats them the other way round to everywhere else. On a lattice layer, Scale X is a number of repeats and a smaller global scale raises it. Here it is the fraction of the tile the object fills, so a smaller global scale lowers it: at 0.50 an object set to 0.40 is drawn at 0.20, and it shrinks with the rest of the stack instead of growing into the space the finer patterns leave behind. An array's Count is not touched - a finer pattern is not the same request as more copies.

The screw is one entry rather than a dozen, because a screw is two choices and not one shape: any drive sits in any head. Its slot is cut off by the head's own outline rather than given a length, which is why it reaches the rim on a hex head just as it does on a round one.

It tiles. The object is placed in wrapped coordinates, so what leaves one edge returns at the other and a seamless project stays seamless wherever it is put. That is also why a free angle is safe here while the lattice layers do not offer one: a single object does not repeat, so there is no seam for the angle to break.

60 controls
ControlRangeDefaultNotes
Object Tech Tiles: Ring · Tech Tiles: Slots · Tech Tiles: Cross · Tech Tiles: Stepped · Tech Tiles: Grille · Tech Tiles: Bolted · Tech Tiles: Hex boss · Discs & Hatches: Recessed dish · Discs & Hatches: Fan · Tech Tiles: Terminal · Tech Tiles: Lattice · Tech Tiles: Studs · Tech Tiles: Hatch · Tech Tiles: Capsule vent · Discs & Hatches: Hatch · Discs & Hatches: Iris · Discs & Hatches: Dome · Discs & Hatches: Bore · Discs & Hatches: Machined rings · Discs & Hatches: Dish · Vent Louvres: Intake · Gear Rings: Wheel · Discs & Hatches: Turbine · Discs & Hatches: Flange · Discs & Hatches: Cap · Discs & Hatches: Ports · Screws: Screw · Escape Pods: Shield · Escape Pods: Pyramid hatch · Escape Pods: Plug · Escape Pods: Pod body · Escape Pods: Blast iris · Escape Pods: Hex pod Discs & Hatches: Bore Also picked from the library panel, which shows them grouped by where they come from. Left alone by both randomise buttons
Position X 0 – 1 0.5 Can be chained to Position Y. Left alone by both randomise buttons
Position Y 0 – 1 0.5 Left alone by both randomise buttons
Scale X 0.05 – 1.5 0.4 Can be chained to Scale Y
Scale Y 0.05 – 1.5 0.4
Rotation 0 – 360 0 Free angle. A single object does not repeat, so an angle costs nothing here - on a lattice it would break the seam
Height 0 – 1 1
Array on / off off
Along X · Y · Ring X Hidden while it would have no effect
Count 2 – 32 4 Hidden while it would have no effect
Close over the tile on / off on Sets the distance to one over the count, so the row meets itself across the seam. A row of any other length cannot repeat. Hidden while it would have no effect
Distance 0.01 – 1 0.25 Hidden while it would have no effect
Radius 0.02 – 0.7 0.25 Hidden while it would have no effect
Array rotation 0 – 360 0 Turns the layout, not the objects: a row runs off at this angle, a ring starts at it. The objects keep their own rotation. Hidden while it would have no effect
Random rotation on / off off Every copy at an angle of its own. Seed offset rerolls them; the layer rotation still turns the whole set. Hidden while it would have no effect
Rotation seed 0 – 9999 0 Rerolls the random angles on their own, without disturbing anything else about the layer. Typed, with a die beside it. Hidden while it would have no effect
Turn with the ring on / off on Each copy faces outward, the way bolts sit on a bolt circle. Off keeps them all at the angle of the original. Hidden while it would have no effect
Variation seed 0 – 9999 0 Several of the tile shapes pick their own slat or pin count from a seed. Typed, with a die beside it. Hidden while it would have no effect
Detail depth 0 – 1 0.6 Hidden while it would have no effect
Segments / bolts 3 – 24 8 Hidden while it would have no effect
Module margin 0 – 0.45 0.06 Hidden while it would have no effect
Slats 2 – 24 7 Hidden while it would have no effect
Slat width 0.05 – 0.95 0.55 Hidden while it would have no effect
Frame width 0 – 0.25 0.06 Hidden while it would have no effect
Frame height 0 – 1 0.9 Hidden while it would have no effect
Slat height 0 – 1 0.55 Hidden while it would have no effect
Recess 0 – 1 0.15 Hidden while it would have no effect
Teeth 3 – 64 18 Hidden while it would have no effect
Tooth depth 0 – 0.5 0.12 Hidden while it would have no effect
Tooth width 0.1 – 0.9 0.5 Hidden while it would have no effect
Rim thickness 0.02 – 0.6 0.16 Hidden while it would have no effect
Spokes 0 – 16 5 Hidden while it would have no effect
Spoke width 0.02 – 0.5 0.09 Hidden while it would have no effect
Hub radius 0 – 0.6 0.2 Hidden while it would have no effect
Centre bore 0 – 0.9 0.35 Hidden while it would have no effect
Rim height 0 – 1 1 Hidden while it would have no effect
Web height 0 – 1 0.35 Hidden while it would have no effect
Head Round · Countersunk · Cheese · Hex Round Hidden while it would have no effect
Drive Slot · Cross · Ribbed cross · Hex socket · Six-lobe · None Slot Hidden while it would have no effect
Drive size 0.15 – 0.9 0.55 Hidden while it would have no effect
Slot width 0.03 – 0.3 0.1 Hidden while it would have no effect
Head chamfer 0 – 0.4 0 Hidden while it would have no effect
Bevel 0 – 0.5 0 Breaks the top edge of the head, as a share of its radius. It follows the six flats, so the face itself stays flat. Hidden while it would have no effect
Rim step 0 – 0.4 0 A shoulder cut into the edge of the head, as a share of its radius. The chamfer slopes the face down to the rim; this puts a step in it. Hidden while it would have no effect
Rim step depth 0.02 – 1 0.16 Hidden while it would have no effect
Fittings Plain · Rails · Terraces · Two leaves · Boss · Bolts Rails Hidden while it would have no effect
Fittings count 1 – 8 4 Hidden while it would have no effect
Corner cut 0 – 0.18 0.1 How far each corner of the outline is cut off. It is what this family looks like: at nought the shield and the plate come out square-cornered. Hidden while it would have no effect
Frame width 0.01 – 0.15 0.05 Hidden while it would have no effect
Flat top 0.05 – 0.9 0.22 How much of the pyramid is the flat in the middle. Small makes four long facets, large makes a plug with a bevel. Hidden while it would have no effect
Centre height 0 – 1 0.9 How high the middle of the pyramid stands. The foot stays where it is, so this tilts the facets - and below the foot it becomes a dish. Hidden while it would have no effect
Collar width 0.005 – 0.12 0.045 Hidden while it would have no effect
Two leaves on / off off Hidden while it would have no effect
Latch dogs on / off on Hidden while it would have no effect
Centre boss on / off on Hidden while it would have no effect
Outline Capsule · Dome · Tapered Capsule Hidden while it would have no effect
Blades 3 – 24 8 Hidden while it would have no effect
Blade twist -1.5 – 1.5 0.55 How far a seam curves on its way in. At nought the blades are straight spokes. Hidden while it would have no effect
Hub on / off on Hidden while it would have no effect
Hub radius 0.02 – 0.3 0.075 Hidden while it would have no effect

Discs & Hatches

Round modules on a grid: hatches, iris blades, domes, bore holes, machined rings, dishes. Switch off the ones you do not want.

Six round module types behind six switches - hatch, iris, dome, bore, rings, dish. Leave several on for a mixed field of hardware, or switch all but one off when you want a specific part.

With Columns and Rows at 1 it becomes a single module, and Offset X and Offset Y slide it where you want it - the way to place one hero hatch rather than a field of them.

19 controls
ControlRangeDefaultNotes
Hatch on / off on
Iris on / off on
Dome on / off on
Bore on / off on
Rings on / off on
Dish on / off on
Columns 1 – 32 5 Can be chained to Rows
Rows 1 – 32 5
Density 0 – 1 0.6 Fraction of grid places that carry a module
Radius 0.1 – 0.5 0.4
Offset X -1 – 1 0 Slides the whole lattice sideways, in cells. With a single module this is how you place it where you want it. Can be chained to Offset Y
Offset Y -1 – 1 0
Segments / bolts 3 – 24 8 Hidden while it would have no effect
Base plate 0 – 1 0 Raises the whole disc before the module detail is added
Detail depth 0 – 1 0.6
Position jitter 0 – 1 0
Size variation 0 – 1 0.25
Height variation 0 – 1 0.15
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect

Gear Rings

Toothed rings with hubs and spokes. Turbines, bearing races, reactor collars. Set Columns and Rows to 1 for a single hero wheel.

Toothed rings with hubs and spokes: turbines, bearing races, reactor collars. Rim height and Web height are separate, so the rim can stand proud of a recessed web the way a real wheel does.

Set Columns and Rows to 1 for a single hero wheel filling the tile. Note that a wheel is round while the two axes are independent, so unequal counts give ellipses rather than circles.

14 controls
ControlRangeDefaultNotes
Columns 1 – 24 3 Can be chained to Rows
Rows 1 – 24 3
Density 0 – 1 0.8 Fraction of grid places that carry a wheel
Radius 0.1 – 0.5 0.42
Teeth 3 – 64 18
Tooth depth 0 – 0.5 0.12
Tooth width 0.1 – 0.9 0.5
Rim thickness 0.02 – 0.6 0.16
Spokes 0 – 16 5
Spoke width 0.02 – 0.5 0.09
Hub radius 0 – 0.6 0.2
Centre bore 0 – 0.9 0.35
Rim height 0 – 1 1
Web height 0 – 1 0.35

Organic 14 layers

Fractal Noise

Seven fractal characters over one machine - soft, ridged, billowed, gradient, multifractal, eroded and marbled. The base coat for rock, cloud, tissue and rust.

The base coat for almost everything organic - rock, cloud, tissue, rust - and the layer most often found at the bottom of a stack or, on add at low opacity, at the top of one as grain. Character changes what the octaves are summed into, and it changes which of the other controls apply: the erosion, band and veining settings belong to particular characters and stay hidden while they would do nothing.

Domain warp feeds the field into its own coordinates, which is what turns noise into marbling, flow or fibre. Keep Lacunarity at 2.0 while tiling: other values drift the octave periods apart and soften the seam, and the slider says so.

14 controls
ControlRangeDefaultNotes
Scale X 1 – 64 6 Can be chained to Scale Y
Scale Y 1 – 64 6
Character fBm (soft) · ridged (crests) · billow (lobes) · gradient (smoother) · multifractal (plains and peaks) · eroded (swept crests) · marble (veined bands) fBm (soft) Gradient noise has no lattice blockiness; multifractal collects detail on the high ground only; eroded sweeps the crests downhill; marble folds the field into bands
Relief bias -0.5 – 0.8 0.3 How readily an octave adds detail to what is beneath it. Low leaves broad plains, high roughens almost everywhere. Hidden while it would have no effect
Erosion - Be careful! Erosion is CPU-based! 0 – 1.5 0.6 How far each octave is dragged along the slope already accumulated. Hidden while it would have no effect
Bands across 0 – 32 6 How many times the veining folds back from left to right. With Bands down, this also sets the direction of the grain. Hidden while it would have no effect
Bands down 0 – 32 3 Hidden while it would have no effect
Veining 0 – 4 1.2 How hard the noise bends those bands. Zero leaves straight stripes. Hidden while it would have no effect
Octaves 1 – 10 6
Lacunarity 1.5 – 3.5 2 Keep at 2.0 for a perfect seam in tiling mode
Gain 0.2 – 0.85 0.5
Domain warp 0 – 3 0 Feeds noise into its own coordinates - marbling, flow, muscle fibre
Warp scale 0.1 – 4 0.5
Contrast 0 – 4 1

Basic Landscape

Terrain from fractal noise, with ridges, a sea level and a choice of edges. Islands, continents, ground planes.

Terrain rather than noise: the same fractal machinery, but with a sea level, ridged crests and a choice of edges. Ridges takes it from rolling hills at 0 to a mountain range at 1, and Peak sharpness above 1 lifts the high ground while flattening the low - which is what separates a range from a rough field.

Edges decides what the tile is. Sinking them to zero makes an island on flat ground; keeping them at height makes a piece of continuous terrain. Both tile: four all-zero edges meet each other just as exactly as four periodic ones.

16 controls
ControlRangeDefaultNotes
Edges sink to zero · keep at height keep at height Sinking the edges makes an island on a flat ground; keeping them makes a piece of continuous terrain. Both tile seamlessly - all-zero edges meet each other just as well as periodic ones
Shore width 0.02 – 0.5 0.18 How far in from the border the land climbs out of the water. Hidden while it would have no effect
Scale X 1 – 24 3 Can be chained to Scale Y
Scale Y 1 – 24 3
Detail 1 – 10 7
Roughness 0.2 – 0.75 0.5 How much each finer octave still contributes. Low is worn and rounded, high is jagged
Ridges 0 – 1 0.45 0 is rolling hills, 1 is a sharp mountain range with crests and valleys
Peak sharpness 0.4 – 3 1.3 Above 1 the high ground is lifted and the low ground flattened, which is what separates a range from plain noise
Sea level 0 – 0.8 0.15 Everything below floods to one flat plane
Drainage warp 0 – 2 0.5 Bends the field so valleys wander instead of running straight
Warp scale 0.1 – 3 0.6 Hidden while it would have no effect
Erosion 0 – 1 0 Erosion runs on the cpu, not GPU, you may experience delays
Erosion reach 8 – 90 44 How far a drop travels before it gives out. Short cuts gullies into the slopes, long carries them together into valleys that cross the whole map. Hidden while it would have no effect
Erosion inertia 0 – 0.9 0.05 How much a drop keeps its heading. Low follows the steepest way down and branches finely, high cuts the corners and leaves broader, straighter channels. Hidden while it would have no effect
Deposition 0 – 1 0.25 How readily a drop drops what it carries. High silts up the flats and softens the valley floors, low carries the material off the map. Hidden while it would have no effect
Erosion seed 0 – 999 0 Re-rolls where the rain falls, leaving the terrain under it alone. Typed, with a die beside it. Hidden while it would have no effect. Left alone by both randomise buttons

Voronoi Plating

Irregular cells with beveled seams. Turn jitter and warp down for welded hull plating, up for shell, scale or dried earth.

Cells with bevelled seams, and one of the most adjustable layers here because Irregularity covers so much ground. Turn it down, with the warp off, and it is welded hull plating; turn both up and the same layer is shell, scale or dried earth.

The seams are where the height drops, so on max it reads as plates standing proud, and on multiply as panel lines scored into whatever is beneath.

Distance changes the geometry rather than the layout. The seed points stay exactly where they are; euclidean rounds the cells, manhattan cuts them to diamonds and chebyshev to rectangles. It is the same plating in a crystalline register instead of an organic one, and it tiles in all three.

10 controls
ControlRangeDefaultNotes
Cell scale X 2 – 64 10 Can be chained to Cell scale Y
Cell scale Y 2 – 64 10
Irregularity 0 – 1 0.85
Distance euclidean · manhattan · chebyshev euclidean How the distance to a seed point is measured. Euclidean rounds the cells, manhattan cuts them to diamonds, chebyshev to rectangles - the same layout in a different geometry
Seam width 0 – 0.3 0.05
Bevel 0 – 0.4 0.1
Bevel depth 0 – 1 0.4 Hidden while it would have no effect
Height min 0 – 1 0.4
Height max 0 – 1 1
Domain warp 0 – 2 0 Bends the plate grid organically

Veins & Cracks

The boundary network of a cellular partition. Leaf veins, dried mud, capillaries.

The boundary network of the same cellular partition that Voronoi Plating fills - the lines rather than the plates. Leaf veins, dried mud, capillaries, crazed glaze. It is usually a subtract layer: cracks belong below the surface, not on it.

Domain warp is what stops it looking calculated; without it, the network is visibly the boundary of a regular partition. Sub-branching lays a finer network inside the coarse one, which is what real crazing does.

Distance straightens the cell edges the same way it does in Voronoi Plating, turning a crack network into a fracture pattern. Drawn from changes what is measured in the first place: cell borders is the network, distance to seed draws a disc around every point, and second nearest the overlap where two of those meet.

10 controls
ControlRangeDefaultNotes
Scale X 2 – 80 14 Can be chained to Scale Y
Scale Y 2 – 80 14
Irregularity 0 – 1 1
Distance euclidean · manhattan · chebyshev euclidean How the distance to a seed point is measured. Euclidean rounds the cells, manhattan cuts them to diamonds, chebyshev to rectangles - the same layout in a different geometry
Drawn from cell borders · distance to seed · second nearest cell borders Which measure the network is drawn from. Cell borders is the crack network; distance to seed draws rings around each point instead, and second nearest the overlap where two of those meet
Vein width 0.005 – 0.6 0.08
Softness 0 – 0.5 0.06
Domain warp 0 – 2 0.3 Breaks the mathematical regularity - the key to an organic read
Sub-branching 0 – 1 0.4 Overlays a finer vein network inside the coarse one
Height 0 – 1 1

Weave

Threads crossing over and under one another. Cloth, basketwork, carbon fibre, wire mesh.

Two sets of threads at right angles, each passing over and under the other in turn. Which one is on top at a given crossing is the entire pattern, and it is the only thing the Weave control changes: plain alternates every thread, twill steps the crossings along by one each row so the floats line up into a diagonal, and basket takes them in pairs.

Sag does more for the look than Crossing lift does. A weave reads as woven because the thread underneath is pressed down where it passes below, not merely because the one on top stands proud - with the sag at zero the same geometry reads as a grid of rods laid on each other.

Thread width is a share of the spacing, so below 1 the ground shows between the threads and the layer becomes a mesh rather than a cloth. Thread round at 1 is a true semicircle in cross section; lower flattens it to a tape, higher draws it to a ridge.

The thread counts are rounded to the repeat of the chosen weave while tiling - two threads for plain, four for the others - because a count that does not divide by the repeat meets itself out of step at the seam and one row of crossings comes out wrong.

Erosion is the one control here that does not run on the graphics card. Water carves where it flows to, and a fragment shader can only write the pixel it stands on, so the finished terrain is handed to the processor, rained on, and handed back. Expect a wait of a second or so whenever it or anything above it moves; the result is cached, so a control that has no bearing on the terrain does not set it running again.

What it does is send drops downhill in their thousands. Each picks up material while it has the speed to carry it and drops it where it slows, and what makes valleys is the paths they share. Erosion reach sets how far a drop travels: short cuts gullies into the slopes, long joins them into valleys that cross the map. Erosion inertia decides how much of its heading a drop keeps - low follows the steepest way down and branches finely, high cuts the corners and leaves broader channels. Deposition decides how readily it lets go of what it carries, which is what silts up the flats.

The field is computed at 512 whatever the render size is, and interpolated above that: the work is per cell and on the processor, so a 4096 field would stall the page for minutes. Erosion shapes are large ones, which is what makes that trade bearable. Drops leaving one edge come back in at the other, so an eroded map still tiles.

Cut corners clips corners at 45 degrees, which is the one shape the set was missing: everything else here is square or round, and the angular look of hard-surface panelling comes from the diagonal. It is not drawn on top - the rectangle is intersected with a diagonal half-plane, so the gap, the bevel and the antialiasing follow the cut edge exactly as they follow every other. Corners cut decides how many of the four are clipped. At 1 every corner is, and the result is a field of octagons that reads as honeycomb; around half is what reads as machined plate.

Cut corners clips corners at 45 degrees, which is the one shape the set was missing: everything else here is square or round, and the angular look of hard-surface panelling comes from the diagonal. It is not drawn on top - the rectangle is intersected with a diagonal half-plane, so the gap, the bevel and the antialiasing follow the cut edge exactly as they follow every other. Corners cut decides how many of the four are clipped. At 1 every corner is, and the result is a field of octagons that reads as honeycomb; around half is what reads as machined plate.

Cut corners clips corners at 45 degrees, which is the one shape the set was missing: everything else here is square or round, and the angular look of hard-surface panelling comes from the diagonal. It is not drawn on top - the rectangle is intersected with a diagonal half-plane, so the gap, the bevel and the antialiasing follow the cut edge exactly as they follow every other. Corners cut decides how many of the four are clipped. At 1 every corner is, and the result is a field of octagons that reads as honeycomb; around half is what reads as machined plate.

9 controls
ControlRangeDefaultNotes
Warp threads 2 – 96 24 Can be chained to Weft threads
Weft threads 2 – 96 24
Weave plain · twill · basket plain Plain alternates every thread, twill steps the crossings along and draws a diagonal, basket takes them in pairs
Thread width 0.2 – 1 0.86 As a share of the spacing. Below 1 the ground shows through between the threads
Thread round 0.15 – 3 1 1 is a round thread. Lower flattens it to a tape, higher draws it to a ridge
Crossing lift 0 – 1 0.35 How far the thread on top rides above the one it crosses
Sag 0 – 1 0.45 How far the thread underneath is pressed down. This, more than the lift, is what makes a weave read as woven rather than as a grid
Height variation 0 – 1 0.12
Variation seed 0 – 999 0 Re-rolls which threads come out heavier, leaving the weave itself alone. Typed, with a die beside it. Hidden while it would have no effect

Cell Bodies

Rounded blobs that fuse where they touch. Bubbles, ova, coral polyps, bone marrow.

Rounded bodies that melt together where they touch - bubbles, ova, coral polyps, marrow. Fusion is the control that matters: at 0 the blobs are separate pads, and as it rises they merge into a continuous mass with the joins still visible.

Dome falloff shapes each body, from flat pads at low values to sharp pustules at high ones.

10 controls
ControlRangeDefaultNotes
Scale X 2 – 64 10 Can be chained to Scale Y
Scale Y 2 – 64 10
Scatter 0 – 1 0.9
Radius 0.05 – 0.9 0.4
Fusion 0 – 1 0.35 How much neighbouring blobs melt into each other
Dome falloff 0.2 – 4 1 Low = flat pads, high = sharp pustules
Density 0 – 1 1 Fraction of grid places that carry a body
Height 0 – 1 1
Height variation 0 – 1 0.3
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect

Flow Fibres

Streaks advected along a curl-noise field. Muscle fibre, wood grain, brushed metal, smoke.

Streaks dragged along a swirling field - muscle fibre, wood grain, brushed metal, smoke. By default the field turns freely, which gives turbulence; Bias direction pulls it toward one angle and turns that turbulence into grain.

Advection steps is how far each streak is followed. Longer streaks cost more, and it is the one control here worth raising last.

8 controls
ControlRangeDefaultNotes
Field scale X 1 – 32 4 Can be chained to Field scale Y
Field scale Y 1 – 32 4
Fibre density 4 – 300 60
Flow strength 0 – 2 0.6
Advection steps 1 – 12 5
Contrast 0.2 – 6 1.8
Bias direction 0 – 1 0 Pulls the field toward one direction - grain instead of turbulence
Bias angle 0 – 360 0

Radial Rings

Concentric rings and spokes around a point. Iris shutters, tree rings, shockwaves. Cannot tile seamlessly - a radial field has no periodic edge.

Rings and spokes about a point: iris shutters, tree rings, shockwaves, the structural rings on a saucer. Wobble puts noise on the radius, which is the difference between a machined ring and a growth ring.

Cannot tile. A radial field has no periodic edge, and no setting changes that. It is still useful with tiling on - as a mask, as a hero element in the middle of a panel, or on a surface that is not tiled - but the seam will show if the map is repeated.

10 controls
ControlRangeDefaultNotes
Centre X 0 – 1 0.5 Left alone by both randomise buttons
Centre Y 0 – 1 0.5 Left alone by both randomise buttons
Ring count 0 – 120 18
Ring width 0.02 – 0.98 0.5
Spoke count 0 – 96 0
Spoke width 0.02 – 0.98 0.5
Wobble 0 – 1 0.1 Noise on the radius - turns machined rings into growth rings
Radial falloff 0 – 4 0
Height min 0 – 1 0.2
Height max 0 – 1 1

Scales

Overlapping shingles that lap over one another. Fish, reptile, pinecone, armour, roof tiles.

Shingles that lap over one another: fish, reptile, pinecone, armour, roof tiles. Row offset at 0.5 staggers alternate rows, which is how scales normally sit; 0 stacks them in columns, which reads as tiling rather than skin.

Taper narrows the trailing end into a teardrop instead of an ellipse, and Edge lip raises the free edge so each scale catches the light along the edge it overlaps with.

11 controls
ControlRangeDefaultNotes
Columns 2 – 80 14 Can be chained to Rows
Rows 2 – 80 18
Row offset 0 – 0.5 0.5 0.5 staggers alternate rows, as scales normally sit
Scale width 0.4 – 3 1.5
Scale length 0.4 – 4 2
Taper 0 – 1 0.35 Narrows the trailing end into a teardrop instead of an ellipse
Dome 0.2 – 4 0.8
Edge lip 0 – 1 0.3 Raises the free edge of each scale
Height variation 0 – 1 0.25
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect
Jitter 0 – 0.5 0.08

Craters

Impact bowls with raised rims and ejecta. Moons, asteroids, corroded metal, blistered paint.

Impact bowls with raised rims and ejecta - moons, asteroids, corroded metal, blistered paint. Rim frequency sets how many lobes run around the rim: low gives a lopsided bowl, high a scalloped, eroded edge.

Shy (no overlap) makes craters shrink rather than cut into each other. Rims stay intact and the sizes come out more varied, which is usually the more convincing result; switch it off when you want a surface that has been hit repeatedly in the same place.

14 controls
ControlRangeDefaultNotes
Columns 1 – 48 8 Can be chained to Rows
Rows 1 – 48 8
Density 0 – 1 0.7 Fraction of grid places that carry an impact
Radius 0.1 – 1.6 0.55
Size variation 0 – 1 0.7
Bowl depth 0 – 1 0.6
Rim height 0 – 1 0.45
Rim position 0.5 – 1 0.82
Ejecta spread 0 – 1.5 0.4
Flat floor 0 – 1 0.25 Flattens the bowl base, as larger impacts do
Rim roughness 0 – 1 0.35
Rim frequency 0.5 – 24 2.5 Lobes around the rim. Low is a lopsided bowl, high is a scalloped or eroded edge
Shy (no overlap) on / off off Craters shrink rather than intersect. Rims stay intact, sizes get more varied
Shy spacing 0 – 1 0.05 Extra clearance kept between rims when shy is on

Dunes & Ripples

Asymmetric wind ridges with a steep lee side, modulated by noise. Sand, snow drift, brushed grain.

Wind ridges with a steep lee side. Crest position is the whole point of the layer: at 0.5 the profile is a sine wave, and moving it off centre is what makes the ridge look formed by wind rather than by mathematics.

Meander bends the ridges so they wander, Amplitude variation lets them fade in and out instead of running edge to edge, and Ripple frequency lays the fine secondary ripples over the top.

9 controls
ControlRangeDefaultNotes
Frequency X 0 – 64 6 Can be chained to Frequency Y
Frequency Y 0 – 64 2
Crest position 0.05 – 0.95 0.72 Off centre is what makes a dune look wind-formed rather than sinusoidal
Meander 0 – 3 0.8
Meander scale 1 – 24 3
Amplitude variation 0 – 1 0.5 Lets ridges fade in and out instead of running edge to edge
Ripple frequency 0 – 64 0
Ripple depth 0 – 1 0.2
Crest sharpness 0.2 – 5 1

Blotches

Irregular patches from thresholded warped noise. Camouflage, lichen, rust bloom, cow hide, moss.

Patches with irregular edges - camouflage, lichen, rust bloom, moss, cow hide. As a height layer it is a raised or sunken patch; as the source for a mask it is one of the more useful things here, because the patches have the shape that weathering actually has.

Keep Warp reasonably high. Low values look like thresholded noise, which is what they are; the warp is what gives the edges their reach and turns them into growth. Inner holes punches a second threshold out of the patches, for lichen and flaking paint.

10 controls
ControlRangeDefaultNotes
Scale X 1 – 40 5 Can be chained to Scale Y
Scale Y 1 – 40 5
Density 0 – 1 0.5 Fraction of the surface the patches cover
Edge softness 0 – 0.5 0.02
Warp 0 – 3 1.2 The higher this is, the less the patches look like blurred noise
Warp scale 0.1 – 4 0.6
Detail 1 – 8 4
Inner holes 0 – 1 0 Punches a finer second threshold out of the patches
Hole scale 1 – 12 3
Bevel 0 – 1 0.3

Wrinkles & Folds

Creased ridges from self-warped folded noise. Skin, brain, leather, crumpled cloth, magma crust.

Creased ridges from a field folded into itself - skin, brain, leather, crumpled cloth, magma crust. Self warp is the source of that folded look, and Crease sharpness decides whether the creases are soft rolls or cut lines.

Stretch elongates the folds along one axis, which is what turns skin into grain, muscle or bark.

9 controls
ControlRangeDefaultNotes
Scale X 1 – 40 7 Can be chained to Scale Y
Scale Y 1 – 40 7
Octaves 1 – 8 5
Self warp 0 – 3 1.4 Feeds the field into its own coordinates - the source of the folded look
Crease sharpness 0.2 – 6 2.2
Stretch 0.1 – 8 1 Elongates the folds along one axis - grain, muscle, bark
Stretch angle 0 – 180 0 Hidden while it would have no effect
Groove depth 0 – 1 0.6 How far the creases cut below the surface
Fine grain 0 – 1 0.2

Surface Wear

Scratches, dust, streaks and drips. What has happened to a surface since it was made, rather than what it is made of.

What has happened to a surface since it was made, rather than what it is made of. Mark picks between scratches, dust, streaks and drips, and the rest of the controls follow that choice.

Wander deserves a word. At 0 every mark is a ruled line of constant width - which is what a machine leaves, and what a used surface almost never shows. Raising it lets the mark curve away from its path, and that alone is most of the difference between damage that reads as real and damage that reads as drawn. Runs tells the layer which way gravity points, so streaks and drips fall the right way.

16 controls
ControlRangeDefaultNotes
Mark scratches · dust · streaks · drips scratches
Columns 1 – 64 10 Can be chained to Rows
Rows 1 – 64 10
Density 0 – 1 0.5 Fraction of grid places that carry a mark
Length 0.1 – 6 1.4 In cells. A scratch or a run may cross several. Hidden while it would have no effect
Width 0.002 – 0.2 0.02 In cells
Angle 0 – 180 20 Hidden while it would have no effect
Angle spread 0 – 1 0.35 1 lets a scratch point any way at all. Hidden while it would have no effect
Runs down · across down Which way gravity points, as far as this surface is concerned. Hidden while it would have no effect
Taper 0 – 1 0.7 How much a run thins and fades as it goes. Hidden while it would have no effect
Wander 0 – 1 0.5 How far the mark curves away from a straight path. Zero is a ruled line, which is what a machine leaves and a surface almost never does. Hidden while it would have no effect
Skips 0 – 1 0.4 Interrupts the mark where the tool lifted, instead of drawing it end to end. Hidden while it would have no effect
Fineness 1 – 5 3 How many sizes of speck are mixed together. Hidden while it would have no effect
Softness 0 – 1 0.3
Depth variation 0 – 1 0.5
Variation seed 0 – 999 0 Typed, with a die beside it. Hidden while it would have no effect

Basic 8 layers

Fill & Gradient

A flat level, a linear ramp or a radial falloff. Base plates and global shaping.

A flat level, a linear ramp, a radial falloff or a box. Rarely interesting on its own, and constantly useful: as a base plate under a stack, as a global shape that makes a flat tile read as a curved panel, or on multiply to fade a layer out toward the edges.

Ease bends the ramp, so the fade need not be linear.

8 controls
ControlRangeDefaultNotes
Type flat · linear · radial · box flat
From 0 – 1 0
To 0 – 1 1
Angle 0 – 360 0 Hidden while it would have no effect
Centre X 0 – 1 0.5 Hidden while it would have no effect. Left alone by both randomise buttons
Centre Y 0 – 1 0.5 Hidden while it would have no effect. Left alone by both randomise buttons
Radius 0.01 – 1.5 0.6 Hidden while it would have no effect
Ease 0.1 – 5 1 Hidden while it would have no effect

Checker

Alternating squares. A base plate, a two-level mask, or a scale reference.

Alternating squares - a base plate, a two-level mask, or simply a scale reference while you dial in the resolution of something else. Second level is the height of the alternate squares, so the contrast between the two is yours to set rather than fixed at black and white.

8 controls
ControlRangeDefaultNotes
Columns 1 – 128 8 Counted directly rather than as a density plus a stretch factor, so the whole slider is usable whatever the other axis is set to. Can be chained to Rows
Rows 1 – 128 8
Second level 0 – 1 0 Height of the alternate squares
Gap 0 – 0.6 0
Bevel 0 – 0.5 0
Height variation 0 – 1 0
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect
Density 0 – 1 1 Fraction of grid places that are filled

Dot Grid

A regular lattice of discs, squares or diamonds. Rivets, perforations, halftone.

A regular lattice of discs, squares or diamonds: rivets, perforations, halftone. Dome takes them from flat pads to rounded studs, and Row stagger at 0.5 turns the square lattice into a staggered one.

Offset X and Offset Y slide the whole lattice in cells, which is how you line a row of rivets up with the panel edge underneath it rather than hoping the two agree.

14 controls
ControlRangeDefaultNotes
Columns 1 – 160 24 Can be chained to Rows
Rows 1 – 160 24
Shape circle · square · diamond circle
Size 0.02 – 1.4 0.5
Row stagger 0 – 0.5 0 Shifts alternate rows sideways. 0.5 gives a staggered lattice instead of a square one
Offset X -1 – 1 0 Slides the whole lattice sideways, in cells. Useful for lining a dot field up with a layer beneath it. Can be chained to Offset Y
Offset Y -1 – 1 0
Dome 0 – 4 0 0 = flat pads, higher = rounded studs
Position jitter 0 – 1 0
Size variation 0 – 1 0
Height variation 0 – 1 0
Brightness steps 2 – 16 16 How many distinct brightnesses the dots are allowed. Few steps repeat values and read as deliberate signalling; many are indistinguishable from a continuous spread. Hidden while it would have no effect
Variation seed 0 – 999 0 Re-rolls which dots come out bright, leaving their positions, sizes and dropout exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect
Density 0 – 1 1 Fraction of grid places that are filled

Tile Sampler

One shape stamped across a grid, each instance turned, sized and shifted on its own. The general case behind most scatter patterns.

The general case behind most of the scatter layers here: one shape stamped across a grid, with every instance turned, sized and shifted on its own. When no specialised layer fits what you want, this is usually the one that does.

Rotation steps is the control worth understanding. At 4 the stamps snap to quarter turns, which reads as a panel layout; at 0 they turn freely, which reads as debris. Aspect stretches the stamp itself before it is turned, so a square becomes a bar.

15 controls
ControlRangeDefaultNotes
Columns 1 – 64 10 Can be chained to Rows
Rows 1 – 64 10
Density 0 – 1 0.85 Fraction of grid places that carry a stamp
Shape circle · square · triangle · hexagon · cross · bar square
Size 0.05 – 2 0.7
Size variation 0 – 1 0.3
Aspect 0.1 – 8 1 Stretches the stamp itself, before it is turned. Above 1 makes bars out of squares
Corner round 0 – 0.5 0 Hidden while it would have no effect
Rotation 0 – 360 0 Turns every stamp by the same angle
Rotation spread 0 – 1 0 How far each stamp may turn away from that angle. 1 is a full turn
Rotation steps 0 – 12 4 Snaps the spread to this many angles. 4 gives the quarter turns of a panel layout; 0 leaves it free. Hidden while it would have no effect
Position jitter 0 – 1 0
Height min 0 – 1 0.6
Height max 0 – 1 1
Variation seed 0 – 999 0 Re-rolls the per-stamp heights, leaving the layout alone. Typed, with a die beside it

Bricks

Offset rows of rectangles with mortar joints. Masonry, cladding, panel runs.

Offset rows with mortar joints - masonry, cladding, panel runs. Row offset is the bond: 0.5 is a running bond, 0 is a stack bond, and the values between are the patterns bricklayers argue about.

9 controls
ControlRangeDefaultNotes
Columns 1 – 64 8 Can be chained to Rows
Rows 1 – 64 16
Row offset 0 – 0.5 0.5 0.5 is running bond, 0 is a stack bond
Joint width 0 – 0.05 0.004
Bevel 0 – 0.05 0.004
Bevel depth 0 – 1 0.3 Hidden while it would have no effect
Height variation 0 – 1 0.25
Variation seed 0 – 999 0 Re-rolls which cells come out bright, leaving their positions and sizes exactly as they are. The layer seed offset above changes all of those together. Typed, with a die beside it. Hidden while it would have no effect
Density 0 – 1 1 Fraction of grid places that are filled

Waves

Sine, triangle, saw or square waves. Corrugation, ripples, ridging, interference.

Sine, triangle, saw or square, in whatever combination of the two axes you set. Corrugation, ripples, ridging, interference. Cross wave mixes in the same wave rotated a quarter turn, which is where the grid and interference patterns come from.

Warp puts noise on the phase and turns machined ridges into flowing ones. The two frequencies are whole numbers because that is what keeps a diagonal wave seamless.

9 controls
ControlRangeDefaultNotes
Waveform sine · triangle · saw · square sine
Frequency X 0 – 64 8 Integer counts keep diagonal waves seamless. Can be chained to Frequency Y
Frequency Y 0 – 64 0
Phase 0 – 1 0
Square duty 0.02 – 0.98 0.5
Cross wave 0 – 1 0 Mixes in the same wave rotated 90 degrees - grids and interference
Warp 0 – 1 0 Noise on the phase - turns machined ridges into flowing ones
Warp scale 1 – 32 4
Sharpen 0.1 – 6 1

Value Mosaic

One flat random height per grid cell. Pixel terracing, panel randomisation, base noise.

One flat random height per cell. Pixel terracing, panel randomisation, or a base noise with no gradients in it at all. Interpolate smooths between the cells instead, which turns the same layer into a very coarse, very cheap noise.

6 controls
ControlRangeDefaultNotes
Columns 1 – 256 24 Can be chained to Rows
Rows 1 – 256 24
Value steps 0 – 32 0 0 = continuous. Low values give a stepped, machined read
Interpolate on / off off
Gap 0 – 0.6 0
Density 0 – 1 1 Fraction of grid places that are filled

Frame

A rectangular border or vignette measured from the edges. Cannot tile - it is an edge by definition. Best used as a mask over other layers.

A border or vignette measured in from the edges. Border width is in fractions of the image rather than in pixels, so a hairline stays a hairline at any export resolution.

Cannot tile - it is an edge by definition. It is at its most useful as a mask over other layers, keeping them away from the border or confining them to it.

5 controls
ControlRangeDefaultNotes
Inset 0 – 0.5 0.08
Softness 0 – 0.5 0 0 is a crisp edge, still antialiased rather than stair-stepped
Mode border only · inside solid · outside solid border only
Corner round 0 – 0.5 0
Border width 0.0005 – 0.5 0.02 In fractions of the image, so 0.001 is a hairline at any resolution

Under the hood

For anyone who wants to know what this is made of. None of it is needed to use the program.

What it is written in

TypeScript, compiled to ES2022 modules, in strict mode with the stricter options switched on as well - unchecked index access, unused locals and parameters, implicit overrides. Around 12,900 lines across the application, the generators and the tooling. The generators themselves are GLSL ES 3.00, carried in the TypeScript source as strings and compiled by the browser at runtime.

There are no runtime dependencies. Not a framework, not a UI library, not a maths library, not a shader helper: the shipped application contains only code written for it. Two packages are used to build it - TypeScript and Vite - and neither ends up in what you run.

The interface

Plain DOM, built and updated by hand, with CSS custom properties for the theme. Every control on the right is generated from the same declaration the shader reads its value from, which is why a new control appears in the panel, in a saved link and in the reference on this page without being wired up three times.

The graphics

WebGL2. The layer stack is drawn into 16-bit floating-point render targets, ping-ponging between two of them, which needs the EXT_color_buffer_float extension - the one hard requirement beyond WebGL2 itself. Export at 16 bits per channel is possible because the buffers were always that precise; nothing is widened after the fact. Where a half-float target is unavailable the renderer falls back, and says so.

Building it

Vite for development and for the production build, with esbuild underneath. It builds as two pages rather than one - the application and this documentation - so the documentation is a sibling of the app and can be opened, linked and deployed on its own. The reference chapters are generated by a Node script that bundles the layer registry and reads the controls straight out of it, so they cannot drift away from the program.

The whole application is about 286 kB of JavaScript, 83 kB gzipped, plus 18 kB of CSS. There is nothing to install and nothing to serve: the built folder can even be opened from disk.

Where your work is kept

A setup lives in the address bar. The whole state - layers, controls, masks, seed - is encoded into the URL fragment, which is why a link restores exactly what you had and why it never reaches a server: a fragment is not sent with a request. The only thing in local storage is the width of the control panel.

What the page is allowed to do

The shipped page carries a content security policy that permits nothing beyond itself: no outbound connections at all, no external scripts, no forms, no framing. It is not a promise in prose but a rule the browser enforces, and it is the reason the privacy note above can be as short as it is.