Machina is a node-based procedural system with a core written in Rust. Model, scatter,
fracture, erode, build roads and simulate in a graph — then run that same graph wherever
the core runs. Unity is a first-class host: the editor, and every player build.
Most procedural tooling bakes to a mesh and stops at the editor door. Machina's graph is
data, and the thing that evaluates it is a portable engine — so the graph keeps working
after you press build.
01
The graph is the product
A graph serializes, diffs and version-controls like any other asset, and loads at
runtime like any other asset. Evaluation is incremental and keyed by content rather
than by dirty flags: change a parameter and only what actually depends on it re-cooks —
and an edit that changes nothing cooks nothing at all.
02
One core, every host
One engine, one stable C interface, every host. Unity is the first host and gets the
full integration — but the same core runs inside a native application, on a server, or
in the browser, and a graph authored in one runs unchanged in the others. Geometry is
shared with the host in place, never copied across a boundary.
03
Deterministic by construction
The same graph produces the same bytes — on every machine, on every platform, on every
run. Caches can be trusted, builds are reproducible, and a simulation replays exactly
rather than approximately.
Unity — a first-class host
Two components, one file, no baking step
A .machina graph is a plain JSON file with a ScriptedImporter — it gets a GUID on
its .meta, diffs in git, and reimports when anything edits it. Drop a
MachinaController on a GameObject, point it at the graph, and the cook runs in the
editor and in play mode alike; a MachinaRenderer beside it draws the result through
the scriptable render pipeline. Nothing is baked to a mesh asset unless you ask.
Cook off the main thread
Graphs cook on a background thread, so a heavy network never stalls the editor or the
frame. Only what changed is recomputed, an unchanged result costs nothing, and edits —
undo included — are picked up the way Unity expects.
The graph editor is inside Unity
A node editor window, scene-view handles for curves, and per-node wireframe overlays that
show exactly what the renderer sees. Every node's parameters, ranges, defaults and menus
come from the engine itself, so the inspector is always right.
Inputs from the scene
MachinaInputBinding feeds named graph inputs from your scene: MeshFilters,
Textures, Materials, Transforms, and plain floats, ints, colours and strings. Meshes and
skeletons enter through UnityMeshInput and SkeletonInput.
MachinaInput turns keys and the pointer into channels, so a graph can be
interactive — a crowd that walks where you click.
Outputs into the scene
A graph declares as many outputs as it likes. MachinaLayerBinder materialises them:
world-space layers become child renderers, data layers become script-visible flows with a
changed event, and screen-space outputs draw HUD geometry. Packed instances render as
instances — RenderMeshInstanced by default, indirect with structured buffers
when you opt in.
One clock for the whole scene
MachinaTime is the playbar: one global frame drives every controller, each with its
own offset and scale, the way a DOP network offsets time. Simulations step play-every-frame
and restore from checkpoints when you scrub, with memory bounded by a horizon — a session
can run for hours.
Reload the core without restarting
An engine update swaps in while Unity stays open — no restart, no lost scene. A version
handshake means a mismatched engine is refused outright rather than running degraded.
Unity 6000.3 · Universal Render Pipeline · every player target Unity ships, WebGL included
35 example graphs ship with the package: roads with junctions and roundabouts, a valley with a railway, an island with a crowd, cloth, fracture, terrain
The library
153 node types, in thirteen families
The vocabulary is Houdini's — a technical artist is productive on day one — and every node
is described by the engine itself, so parameters, ranges, defaults and menus are always in
step with what the core does.
Generators 10
Primitives, curves, text and points to start from — or real map data.
Grid
Box
Sphere
Tube
Line
Curve
Font
ScatterPoints
OSMImport
Topology 28
Change what the mesh is — subdivide, remesh, reduce, bevel, boolean, clip, sweep, carve and resample.
Subdivide
Remesh
Reduce
PolyBevel
MeshBoolean
Clip
Sweep
Carve
Resample
Deformers 9
Move points without touching topology — bend, taper, lattice, project onto terrain, smooth, and noise.
Transform
Bend
Taper
Lattice
Smooth
Project
Mountain
Peak
Copies & pieces 8
Instance geometry onto points as packed prims, fracture it, cluster the pieces and move them as units.
CopyToPoints
VoronoiFracture
ClusterPieces
TransformPieces
Assemble
Unpack
Explode
Roads & networks 6
Curves become a road network — crossings stitched, grades limited, junctions and roundabouts built, terrain conformed, furniture deformed along the path.
IntersectionStitch
GradeLimit
JunctionPatch
PathDeform
NetworkWalk
FindShortestPath
Attributes, groups & UVs 24
The data layer — create, promote, transfer, map and visualize per-element values; build groups; lay out UVs and assign materials.
AttributeCreate
AttribTransfer
AttribPromote
AttribFromMap
Group
Measure
UVProject
Material
Visualize
Terrain 25
Heightfields as a first-class type — thermal and hydraulic erosion, masking, terracing, flattening under roads with a batter ramp, and mesh conversion.
HeightField
HeightFieldErode
HeightFieldHydraulicErode
HeightFieldTerrace
HeightFieldMaskByFeature
HeightFieldFlatten
HeightFieldToMesh
Volumes 6
Implicit surfaces and voxels — blend, boolean and voxelize signed distance fields, then mesh them back out.
ImplicitBlend
ImplicitBoolean
ImplicitVoxelize
Voxelize
ConvertToVolume
BitmapBoolean
Architecture 5
2D layout into 3D massing — split a block into lots, extrude floors, cap roofs, offset outlines.
LotSplit2D
Voronoi2D
FloorExtrude
Roof2D
PolyExpand2D
Simulation 12
Solvers, constraint sets and forces as ordinary nodes — grains, cloth, inflatables, rigid bodies and glued fracture.
ArenaSolver
ArenaConstraints
CorpusSolver
GrainProperties
ConnectAdjacentPieces
WindForce
TimeShift
Character 6
Skeletons in, posed geometry out — capture, bone deformation, rig posing, and ragdolls configured from pieces.
SkeletonInput
CaptureProximity
BoneDeform
RigPose
RagdollConfigure
SkeletonFromPieces
Faber 2
An escape hatch with no ceiling — a per-element snippet compiled to bytecode, over geometry or over volumes.
Faber
VolumeFaber
Flow & I/O 12
Graph plumbing — switches, loops, subgraphs with promoted parameters, tables, and bridges to Unity meshes and other graphs.
Switch
LoopStart
SubGraph
Input
Output
UnityMeshInput
MachinaImport
TableImport
Faber
When a node isn't enough, write the loop
Faber is Machina's wrangle: a small C-like snippet that runs once for every point, vertex
or primitive — or once for the whole geometry when you need a single answer.
A snippet compiles to a compact register-based bytecode — fixed-width instructions with
attribute access specialized down to a bank and a slot before it ever runs. That bytecode
is what every host executes, so the snippet you wrote in the editor behaves identically in
a shipped build. Above a threshold it fans out across cores; below it, the parallel
machinery would cost more than it saves, so it doesn't.
Runs over Point, Vertex, Primitive or Detail
Attribute types inferred by name, or forced with f@i@v@
Reading a missing attribute yields zero; writing one creates it
faber · run over Point
// ripple the surface, then colour by height
@P.y += sin(@P.x * 4 + @time) * 0.25;
v@Cd = vec3(1, @P.y, 0);
i@tag = @P.y > 0;
// @ptnum, @numpt, @time, @frame are always in scopef@seed = rand(@ptnum);
The compiler and the virtual machine both live in the core — a snippet compiles to the
same bytes on every host, so what you wrote in the editor is exactly what runs in the
shipped build.
Motus
Solvers are nodes. Motus is what they share
Each solver is an ordinary node that cooks. Motus is everything underneath them — the time
model, the cached state that carries forward, the forces, and the shims that keep an engine
choice from ever reaching your graph. A new solver type is a node and a shim, not a second
framework bolted alongside the first.
Arena Grains, cloth and inflatables
A position-based solver in which a material is a set of constraints — distance,
bend, pressure — rather than a framework of its own. Adding a material adds constraints,
not another engine to keep in sync with the first.
Corpus Rigid bodies and fracture
The rigid-body layer, over pieces — collision shapes from convex hull, box, sphere or
convex decomposition, plus constraint glue. Fracture a shape upstream and the solver
inherits both the pieces and the bonds between them.
Motus State that behaves like the graph
Sim state lives in cached lanes keyed to the graph above it: change a parameter upstream
and the lane drops and re-simulates from its start frame. Forces — uniform, wind, vortex,
attract, drag — are nodes, readable by any solver that sits on the framework.
Under the hood
One core, every host
A single engine, written in Rust, behind a single stable interface. Hosts integrate once;
everything the engine learns afterwards — a new node family, a new solver — reaches every host
without a second integration.
Same input, same bytes
Determinism is engineered, not assumed: every operation on a cook path is
platform-independent down to the last bit, so a result computed on a build machine, an
artist's laptop and a player's device is identical — and a cached result is a result.
Houdini as the reference
The node library follows Houdini's semantics on purpose, and every deliberate difference
is documented. Artists bring their knowledge with them; pipelines that already speak
Houdini find the same words meaning the same things.
Tested at the output
Every bundled example graph has its output frozen as a reference. An engine change that
moves a single vertex on a flagship scene fails a test before it reaches a release — so
an update is a known quantity, not a gamble.
No copies at the boundary
Geometry lives once. The host reads the engine's buffers in place — in the browser the
engine shares Unity's own memory — so a large scene is not paid for twice, every cook.
Watch
The system, actually running
Recordings of real sessions — the graph being built, cooked and changed. Nothing on this
page simulates Machina; this is the only place you see its output, and it is the output.
Recordings are being put together. They will appear here — meanwhile the
channel is at youtube.com/@binaryego.
Until then, the 35 bundled graphs are the demo: open Roads, drag a control point,
and watch the junction, the terrain cut and the guardrails follow.