Tools · Procedural 3D asset engine

Kiln

Kiln is a procedural 3D asset pipeline. Every asset is a declarative JSON recipe: a generator, a seed and every parameter. Kiln compiles it into a game-ready glTF 2.0 model with a JSON sidecar: a chair, a cottage, a whole market town, a rigged archer mid-draw, even the town’s music. Builds are deterministic, so the same recipe yields the same bytes every time. No hand modelling, no AI image generation: every model is computed.

An aerial view of a generated market town: timber-framed houses, a fountain square, market stalls, lanes and trees
A whole town from one JSON recipe. Streets, a market square, back lanes and gardens, and every house furnished inside.

How it works

A recipe in, an asset out

Each kind of thing has a generator, a Python module: doors, windows, trees, seating, buildings, towns, characters. Each asset is a registry entry, a JSON recipe that names its generator and pins every parameter. A new oak is a new entry; a new kind of thing is a new generator. The catalogue grows by adding entries to the registry, not by modelling.

Left: the JSON recipe for a slat chair, with its generator, seed and every dimension. Right: the chair Kiln builds from it, with its triangle count, size and SHA-256 fingerprint
The real registry entry for a slat chair, and what kiln make builds from it. Width, depth, leg count, splay, slats and wood colours are all explicit parameters; nothing falls back to a default.
  1. Define the recipe

    A JSON entry names a generator, a seed and every parameter. There are no default values anywhere: a missing parameter is an error, not a guess, so the recipe fully specifies its asset and diffs and versions like code.

  2. Build

    The generator emits geometry, materials, skeleton and animation clips as a .glb, plus a sidecar recording triangle count, bounds, node and clip names, a SHA-256 content hash and the licence.

  3. Compose by reference

    Doors, windows and wall panels are assets in their own right. Buildings reference them and towns instance the buildings. Change the door, and every house that uses it rebuilds with it.

  4. Validate in Godot

    Every asset goes through Godot’s own glTF importer and is measured: bounds, meshes, skeleton, clips. It passes only if the engine agrees with the sidecar.

  5. Render and review

    Kiln renders its own output: turntables from the game’s camera angles at on-screen size, animations sampled frame by frame, and lineups of whole sets.

  6. Deliver

    One command ships finished assets to a game’s inbox under a versioned contract (units, scale, budgets, bone and clip names), with the licence and hash of every file.

Composition

Components, then buildings, then towns

A building generator assembles walls, doors, windows, stairs and chimneys, and furnishes its rooms from the furniture generators. A town generator lays out streets, a square, back lanes and gardens, and places the buildings, wells, market stalls, lamps and trees. Shared parts are stored once: a window reused two hundred times in a town is one mesh.

Left: doors, windows, wall panels and a staircase. Middle: a timber-framed house assembled from them. Right: a town laid out from such houses, props and trees
Small things build big things. Components, a building assembled and furnished from them, and a town laid out from buildings, props and trees.
A row of generated building components: door frames, wall panels, doors, shuttered windows and a staircase
The parts. Each door, window, panel and stair is its own registry entry.

Variety

One recipe, many results

Change the seed and the same town recipe yields a different town: other streets, other houses on other plots, a new market square. Change one number and a chair becomes a stool. Variety comes from shape, size and colour, not only from a reshuffled seed.

Three different generated towns, labelled seed 2, seed 3 and seed 4
Same recipe, three seeds, three towns.

Reproducible

The same bytes, every time

All randomness comes from named, seeded streams (FNV-1a), so a recipe always produces the same bytes. Each recipe also pins the SHA-256 hash of the asset it makes. When Kiln changes, drift detection rebuilds and re-hashes every asset and names any that moved, so a week spent on the tree generator provably leaves every house unchanged.

When a generator gains a parameter, every existing recipe is retrofitted with the value that reproduces it exactly. Old assets never drift.

A terminal: Kiln builds the slat chair twice and gets the identical SHA-256 fingerprint, then a changed recipe gives a new stool
Built twice, same fingerprint. Change the recipe and you get a different, equally reproducible asset.

Buildings

Real places, inside and out

Twelve generated buildings at true scale, including a guardhouse, cottage, chapel, tower, barn, windmill, smithy, inn and a ruined house
Kinds of building, at true scale. Guardhouse, cottage, jettied house, chapel, tower, barn, mill, shop, smithy, T-house, inn and a ruin whose fallen walls still leave every room reachable.

In motion

Assets that move

Assets carry their own animation: doors open, chests open and can be left looted, lanterns flicker, the well bucket sways, chimneys smoke, fountains spray and the mill’s sails turn. Characters share one skeleton, so every motion works on every body.

The inn turning a full circle
The inn on Kiln’s turntable
A windmill with its sails turning
The mill’s sails
A stone fountain spraying water
The fountain: droplets on parabolas
A hooded archer running, the cloak flaring behind
A run cycle; the cloak swings on its own bone

Towns, wilds and the small things

Everything in its place

Between towns, a wilds generator lays out streams with fords and stepping stones, standing stones, ruins, camps and barrows. Every placeable thing carries tags for what it is for and where it may stand, and Kiln refuses to put anything where it doesn’t belong: you won’t find a signpost in a cellar.

The furniture and props get the same care as the buildings: chairs, beds, cupboards, shelves of books and jars, anvils, cauldrons, hearths, candles, tankards, chests, barrels and sacks, each from its own generator, each with its states.

Generated street props: a lamp post, a well, a spraying fountain, a signpost, a glowing waystone, a market stall, a campfire and a tent
Street and camp. Lamp post, well, fountain, signpost, waystone, market stall, campfire, tent.
Crates, barrels, chests and sacks, each shown closed and then looted
States. Each container shut, then looted: lids askew, a barrel head leaning on its side, sacks slumped.

Characters

Bodies, garments and motion

The same armoured character in eight poses: idle, run, thrust, block, cut, throw, roll and fall
One skeleton, every motion. Idle, run, thrust, block, cut, throw, roll, fall.

Sound

Music from recipes too

Kiln also composes and renders music. Instruments are JSON recipes; themes are melodies with their harmony; pieces are built from themes, with sections in different keys, development and variation. It writes long-form town music that keeps changing for eight minutes and more without repeating, and each piece can carry a combat layer that plays in step with it. Everything renders to WAV or Ogg, reproducible to the byte like the models.

Built for production

Budgets, speed and provenance

49generators
360+asset recipes
100+generated characters
50+garments and dyes
22buildings, furnished
36motions on one skeleton
16music pieces and combat layers
8days from first line to all of the above

Built with Python 3 · NumPy · glTF 2.0 · Godot 4 (validation and rendering) · Blender with MPFB · FNV-1a seeded streams · SHA-256 fingerprints · libsndfile and Ogg Vorbis. Buildings, props, trees, rocks, creatures and music are computed from scratch. Characters are built on open CC0 foundations: MakeHuman base bodies and garments, and Quaternius animation clips retargeted to Kiln’s skeleton.

Kiln is the 3D counterpart of TiGen, our 2D tile and sprite engine. Both are in-house tools and are not released.