AI tools: The Forge, sculpting and painting

Making models: the Forge, sculpt, paint, bake, import. 72 tools. You see every step your AI takes and can undo any of them.

apply_look

Set the whole photographic mood in one step, the way a lighting artist would: sun height and strength, sky, haze and color grade together. Presets: cinematic (default), golden_hour, overcast, noir, night, war_torn, neutral, stylized, retro. Stylized defaults to 3 bands, softness 0.08, rim 0.2 and a hard highlight. Fine-tune afterwards with edit_entity on Camera_Look.

ArgumentTypeWhat it does
preset requiredbodycam / cinematic / forest_day / golden_hour / neutral / night / noir / overcast …
sun_azimuthnumberOptional compass direction for the sun, degrees (0 north, 90 east).
sun_elevationnumberOptional sun height above the horizon, degrees (overrides the preset's).

bake_lights

Baked lamp light (light_volume): a room's still lamps marked point_light baked are worked out once, with real ray-traced shadows, into the light_volume's grid; while the camera is in or near it, those lamps leave the lit pass and the shadow atlas (a room of many lamps runs like one of few). Reports each volume's grid, the lamps it holds and whether it is ready; rebake: true bakes them all again (after moving walls or furniture: lamp changes rebake by themselves). Measure with frame_profile before and after.

ArgumentTypeWhat it does
rebakebooleanBake every volume again now.

bake_weapon_aim

Bake a weapon pose set so a character holds a gun in play (locomotion, aiming, recoil, reloads) with Pose & Grip's hold: the full hold is solved at the ready and aiming (shouldered for long guns; held out for a pistol) at aim pitches -60...60° and saved as Assets/Motion/Poses/<name>.weaponaim.json. The character's animator upper becomes "Weapon/<name>" and the gun is attached to its right hand: in play the trunk turns to the aim, the gun rides the chest with its kick, and both hands stay locked on it (never stretched). In first person (character view "first_person") the gun is held for the eyes instead, with the same grip: drawn as view model, sights on the screen's centre when aiming (check_sights). Reports each hand's worst distance from its seat over the pitches.

ArgumentTypeWhat it does
aimshouldered / extended / noneAiming down the sights (default shouldered for a long gun, none for a pistol).
entity requiredstringThe character (name or #id).
namestringThe set's name (default <entity>_<prop>).
prop requiredstringThe gun object.
readylow_ready / extended / shoulderedAt the ready (default low_ready for a long gun, extended for a pistol).

bake_world_map

Bake the scene's open-world map picture (top down, north up): sea shaded by depth, land by height with hill shading and sandy shores, every road of the road network by class (freeway/ramp amber, avenue light, street grey, trail brown, runway). Writes Assets/Map/<scene>_map.png and <scene>_map.json (bounds [min x, min z, max x, max z] in metres, for a minimap widget's image and bounds). size: pixels on the long side (default 4096); bounds: the area (default: all the land plus a margin).

ArgumentTypeWhat it does
boundslist of number[min x, min z, max x, max z] in metres; default the land's extent plus 300 m.
namestringFile name stem (default <scene>_map).
sizenumberPixels along the long side (512...8192, default 4096).

blockout_to_buildings

Turn blockout boxes into buildings: every object drawn as builtin:cube in a group whose name starts with `group_prefix` (default "Blockout") becomes a `building` standing where the box stood (its footprint the box's x and z size, its height the box's height, its yaw kept), styled by its KIND (the object's name without a leading M and number: M12house is "house") through `styles` {kind: style}. Kinds not in `styles` are left as boxes. Then run rebuild_buildings. One undo step.

ArgumentTypeWhat it does
group_prefixstring
nearlist of number[x, z, radius]: only boxes within this circle.
styles requiredobjectKind to style, e.g. {"house": "house", "tower": "downtown_tower", "t": "terrace"}.

build_from_spec

Build an object that works from a mechanical spec (.mech.json: parts with shapes and sizes in mm, joints with pivots, axes and limits, couplings, interactions, checks): every part's mesh (box, cylinder, tube, torus, disc, wedge, panel, sweep, lathe) with its material, the parts as objects riding on their parents, hinged doors/hood/trunk that open through actions (E, game.act, cutscene act events), wheels that turn and steer when it's driven (three or more wheels on the ground make it a vehicle), couplings (a steering wheel to the front wheels, a crank to the rear wheel by the selected gear). Runs the spec's checks against what was built and reports PASS/FAIL with numbers.

ArgumentTypeWhat it does
drivablebooleanA car a player can get into (default: when three or more wheels stand on the ground).
groupstring
namestringThe object's name (default from the spec's object, e.g. Police_Cruiser); its parts are <name>_<part id>.
path requiredstringThe .mech.json file: absolute, or relative to the project or its Assets folder.
positionlist of number
solidbooleanA box collider people and cars bump into (default true).
yawnumberHeading in degrees (its +Z front turned about Y).

building_styles

The building styles and looks this project can use: the engine's built-ins and the project's own (Assets/Buildings/<name>.style.json, based_on a style and naming only what differs; Assets/Buildings/looks.json: {name: {surface, tile, color, roughness, metallic, glow}}), what's wrong with those files, and every key a style file takes.

ArgumentTypeWhat it does
stylestringOne style to show in full.

craft

In Play: what an object (default the player) can make, at a station (an object with station tags, or the tags), with have/need for each input and why not; with "recipe" it makes it (times, all or nothing per time) as the crafting screen would. "learn": teach it a recipe that starts unknown.

ArgumentTypeWhat it does
entitystringIn Play: an object's name or id ("#7"); default the player.
learnstring
recipestring
stationstringA station object's name, or tags ("kitchen oven").
timesinteger

detail_pass

The Detail Pass on any native Forge model, without touching its recipe: the 'looks real' layer for hero objects. Shape detail at the seams, placed by rule from the model's own faces: rivets, hex bolts, nuts, screws, nails and carriage bolts round a face's border, at its corners, in a grid or along panel gaps (skipping spots another part covers); trims swept round a face's border (bead, glazing putty, gasket, angle iron, edge cap, any moulding); panel gaps (plates with grooves and their own shades); real bevels on every hard edge; repeated small parts merged. Shape-aware wear from the model's crevices, edges and hand spots: chipped coats on exposed edges, grime in gaps and round every fastener, rust bleeding from steel heads, brass tarnished in crevices and polished where touched, dust on upward faces, material recipes in the model's own colours. Writes Assets/Forge/<out>.js (f.include of the original plus one f.detailPass call) and builds it; the original stays. Runs in the background on a small, low-priority CPU pool: build returns a job id at once, status follows it, cancel stops it; a big model is painted within budget_seconds (default 600) and max_parts (default 400) and comes back marked partial if it needs more. action help lists every option.

ArgumentTypeWhat it does
actionbuild / status / cancel / helpbuild (default: starts the pass in the background and returns its job id at once), status (how a job is going, or its result), cancel (stops a job within about a second), help (the option list).
assetstringA native Forge model by name (Assets/Forge/<asset>.js), e.g. "ammo_crate".
jobstringstatus/cancel: the job id build returned (default: the latest).
optionsobjectf.detailPass options (action help lists them all), e.g. {wear: "field", merge: true, bevel: 0.003, materials: {OliveWood: "worn_painted_wood"}, tint: ["OliveWood"], tarnish: 0.5, dust: 0.4, fasteners: [{parts: "Corner", kind: "rivet", faces: ["front", "left"], pattern: "grid", size: 0.011, spacing: 0.09}], panel_gaps: [{parts: "Body", face: "front", size: [1, 0.11]}], trims: [{parts: "Glass", profile: "putty", side: "in", face: "inward"}], handled: {Handle: 0.9}}.
outstringThe new model's name (default <asset>_detail).
waitbooleanbuild: wait for the result instead of returning at once (default false; the agent link stays free either way only when false).

forge_body

Build a whole person from a full-body reference sheet (one person in an A-pose, front view and profile side by side on a plain backdrop: make one with Nano Banana in Google Flow). Apple Vision finds the joints and the person; the body is sculpted from the views' widths and depths, rigged with the engine's bone names (it plays the shared animation library) and skinned with the photos. Into Assets/Characters/<name>.glb. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
headstringOptional face reference sheet (as for forge_head): a sharper photo head replaces the body sheet's own.
heightnumberThe person's height in meters (default 1.75).
name requiredstring
sheet requiredstringImage path inside the project, e.g. Assets/References/human_body/body_man_4k.jpg.

forge_body_native

Make a rigged human body with TTR Body, the engine's own generator (no MakeHuman data, about two seconds): an anthropometric skeleton, muscles and fat as soft volumes, one fixed template mesh wrapped onto them (every body has the same vertices, so bodies blend and clothes fit), heat-diffusion skin weights, twist joints and joint correctives, a generated skin. The head is a placeholder until a face is attached at the neck ring (listed in <name>.human.json). Into Assets/Characters/<name>.glb; give the entity mesh_renderer { mesh "Characters/<name>.glb" } and animator { clip "auto" library "Characters/Mannequin.glb" }. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
agenumberYears, 16...90 (default 30).
arm_anglenumberRest-pose arm angle, degrees out from hanging (20...70, default 42).
armsnumberArm length, 0.85...1.15.
facenumberFace features 0...1 (0: a smooth, eyeless, featureless head).
face_seamnumberA vertical seam down the face, crown to chin, 0...1.
fatnumber0 very lean, 0.5 average, 1 obese.
finger_tipsround / clawclaw draws each finger tip out to a point (painted as nail with paint.nails).
fingersnumberFinger length on top of hands, 0.8...1.8.
fitbooleanWith fit_front/fit_side: false only scores the outline match (keeps the settings as given). Default true.
fit_frontstringOptional turnaround front view (one figure per image, plain backdrop); with fit_side the settings are fitted to both outlines and the match is saved in the recipe.
fit_knobslist of stringSettings the fit may move (default all): fat, muscle, legs, shoulders, hips, arms, arm_angle, forearms, hands, fingers, neck, girth.
fit_sheetstringOptional A-pose reference sheet (front + profile, e.g. Assets/References/human_body/body_man_4k.jpg): the settings are fitted to its silhouettes first.
fit_sidestringThe turnaround's side view, with fit_front.
forearmsnumberCreature proportions: forearm length on top of arms, 0.8...1.6.
gauntnumberEmaciation 0...1: ribs and intercostal hollows, sunken sternum and belly, flat pecs, thick collarbones, bony elbows, knees and knuckles, hand tendons.
girthnumberTrunk, neck and limb thickness relative to height, 0.6 gaunt ... 1.4 bulky.
handsnumberHand length on top of arms, 0.8...1.8.
heightnumberMeters (default: the average for the sex).
hipsnumberHip width, 0.8...1.2.
lab_envobjectLab: the builder's debug knobs (TTR_DBG_... names to values) for this job only, set in the forge worker.
legsnumberLeg length, 0.85...1.15 (1 average).
musclenumber0 slight, 0.5 average, 1 bodybuilder.
name requiredstring
necknumberNeck length, 0.7...1.8.
paintobjectSkin layers over the generated skin (SkinPaint), sRGB 0...1 colors: base, pattern (none|stripes|damask), pattern_scale (m), pattern_strength, line_color, flower_color, leaf_color, peel (0...1), peel_scale (m), peel_edge, flesh, stains, tide_lines, stain_color, nails, seam_color, wet, seed.
seedintegerNatural variation (small asymmetries, muscle and fat differences).
sexnumber0 female ... 1 male (in between blends).
shouldersnumberShoulder width, 0.8...1.2.
skin_tonenumber0 very fair ... 1 very dark.
stancenumberDegrees each leg angles out from the hip, 0...15 (feet apart).
texture_sizeintegerSkin map size (default 2048; 0 for a plain-colored body).

forge_cave

Carve a walkable cave out of rock: tunnels along a path (its first point is the mouth) and rounded chambers, flat-floored, walls broken by ledges and knobs, stalactites and stalagmites, meshed as one shell facing into the air. World coordinates; with `ground` (the land's heightmap) everything above the ground is cut away, so the tunnel opens from the hillside. Writes Assets/Forge/<name>.glb with its origin at the mouth. Place it there with mesh_renderer, collider { shape "mesh" } and a surface (a photo rock), open the land over the mouth with terrain_hole, light it (point lights, glowing crystals, fireflies). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
branch_radiusnumberThe branches' radius in metres (default 1.3).
brancheslist of list of list of numberMore tunnels off the main one, a maze of forks, loops and dead ends: each a list of world [x, y, z] points (start it on the main path or a chamber so they join).
cellnumberMesh detail, metres (default 0.4; smaller is finer and slower; 0.06-0.1 for close-up rock with detail).
chamberslist of objectHalls: centre [x, y, z] and size [width, height, depth] in metres.
detailnumberReal rock: fine grit, pits and cracks in metres (0.03-0.08; needs cell 0.06-0.1).
dripsintegerReal rock: thin drip stalactites, clustered round the big ones and along the ceilings (100-600).
flowstonenumberReal rock: flowstone curtains and rolls down the walls, 0...1.
fracturenumberReal rock: broken into angular blocks about this many metres across, each stepped by its own amount, with cracks along the joints (0.5-1.2; 0 none): limestone breaks sharp, not in smooth lumps.
groundstringThe land's heightmap (Terrain/<name>.ttrheight) to cut the cave off at the surface.
ground_centerlist of numberWhere the land's centre is (its entity's position; default 0, 0, 0).
irregularnumberReal rock: how far halls and tunnels wander from round shapes, 0...1 (0.5 reads natural).
mouth_rocknumberWith ground: a rough collar of rock round the mouth this many metres across (about 3 × the tunnel's radius), rising out of the land and hiding the hole's edge; 0 none.
name requiredstring
pathlist of list of numberTunnel centre line, world [x, y, z] points; the first is the mouth (put it a little below the hillside's surface), then down and in.
poolsnumberReal rock: floor dips this deep (m) in patches, where a surface's puddles stand (0.05-0.15).
radiilist of numberA radius per path point instead.
radiusnumberTunnel radius in metres (default 3.5).
roughnessnumberHow broken the walls are, metres (default 0.6).
seedinteger
split_floorbooleanWrite the floor as its own model, <name>_floor.glb at the same origin, so it wears its own surface (mud, gravel) and the walls theirs.
stalactitesintegerHow many (default 30; about half get a stalagmite under them).
stratanumberReal rock: limestone beds this many metres apart, each bed's edge a ledge (0.4-0.8 reads well; 0 none).

forge_character

One call: original pictures of a character, creature or figure → a painted, rigged model, marked by the Forge itself. Cuts each figure out (front and side, back, high view: one picture may hold several), reads depth, finds the parts with no generator (head, ears or horns, two or four arms, legs, tail), makes the panels agree, carves, paints each part from the pictures that show it, adds the fine material, and builds a skeleton and skin from the parts (humanoid bone names, so the motion library drives it; extra chains for a tail and ears). The report ends GRADE n of m pass and names what to look at. Pass it again with cloth colours from the report's 'colour families' note, or with sharp_pictures, for finer material. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
clothlist of stringColours that are cloth, #rrggbb, from the report's 'colour families' note.
furbooleanIt's a furred figure: everything not cloth, an eye or a nose grows fur when groomed (default false: skin).
gridintegerGrid cells along the longest side (default 360).
heightnumberThe figure's height in meters (default 1.8).
name requiredstring
pictures requiredlist of stringThe original pictures in reading order: a picture may hold front and side together, then back (and a high view). A real back view makes the back real, not a mirror.
rigbooleanBuild the skeleton and skin (default true).
sharp_pictureslist of objectSharp redraws of crops of the sheet: {path, box: [x0, y0, x1, y1]} (box: where on the sheet the crop came from).

forge_creator_kit

Make the in-game character creator's kit from a forged person (make one first with forge_person; an in-between build reads best, e.g. sex 0.5): TTR Body rebuilt at each body slider's ends (build, age, height, weight, muscle, shoulders, hips, legs, arms, neck) and carried onto the whole person (welded head, eyes, teeth, brows, hands) with the joints' moves; face sliders round their own features (head size, face width, jaw, chin, cheekbones, brow, eye size and spacing, nose size and width, lips, ears); hair styles grown as card meshes; irises on a grey map so the eye colour tints only the iris; the scalp painted as skin; an outfit (default t-shirt and jeans). Kit making is Mac-only for now; the kits it makes work on every platform. Into Assets/Characters/<name>.glb with <name>.glb.creator.json; players' looks (CharacterLook) are built from it at load. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
base requiredstringThe forged person, e.g. Characters/Kit_Person.glb (its .human.json recipe says which body it was built on).
compactbooleanThe shipping size (default true): maps at most 2K (eyes 1K) as JPEG where opaque, lean body shapes, lighter hair cards: about 50 MB with four hair styles (the body normal map stays lossless; each hair style adds ~5 MB). false keeps everything at full size (over 100 MB).
hairlist of stringHair styles to grow (default crop, fade, slick, waves; also messy, afro).
namestringKit file name (default TTR_CreatorKit, the one looks use unless they name another).
outfitlist of objectWhat everyone made from the kit wears, as forge_look garments ({type t_shirt|shirt|hoodie|trousers|jeans|shorts|..., fabric, color [r,g,b]}); default a t-shirt and jeans; [] none.
texture_sizeintegerThe largest map in pixels (default 2048).

forge_creature core

Make a cartoon creature (built by the engine itself, no Blender, in about a second): a soft sculpted body with a big head, long ears, a fluffy tail, mitten hands and big glossy eyes, painted fur/belly/inner ears, rigged, with its own generated idle, walk, jog, sprint and jump cycles. Into Assets/Characters/<name>.glb. Use mesh_renderer { mesh "Characters/<name>.glb" } and animator { clip "auto" library "" } (it plays its own cycles); set the character's height to about its size. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
bellylist of numberBelly, muzzle, hands, feet and tail tip (default cream).
bodycritter / toon / tiger / lion / wolf / slime / hog / horse …critter: a cartoon biped hero (default). toon: Toon Forge, any cartoon figure from a recipe (see toon; face mouth "jaw" gives it a real mouth with teeth and Talk_Loop, Roar, Jaw_Open). tiger: a realistic big cat (anatomical body, striped coat, walk/trot/gallop). lion: the big cat with a lion's coat; give it real fur with groom { preset "lion" }. wolf: a grey wolf (walk/trot/gallop) whose mouth opens on a jaw bone, with teeth, gums and a tongue. Animal bodies with a jaw also get Bite, Snarl_Loop, Howl and Pant_Loop. ram: a canyon ram (a bighorn; size 1.7 is taller than a horse): a shaggy brown woollen coat, pale muzzle and rump, a Roman nose, heavy ridged stone-grey horns curling round the ears with the tips flaring past the cheeks, cloven hooves; walk/trot/gallop (its charge) and Headbutt. dragon: a four-legged winged dragon on the quadruped's bones (size 1: 1.3 m at the shoulder, 7 m across the wings; Cindermaw at 3.2): a long neck, two pairs of swept horns, a jaw with fangs and a glowing mouth, a spine row to the tail tip, clawed feet, bat-built wings (arm, forearm, thumb, four fingers, membrane swept between them); walk/trot/gallop, the mouth clips, Wings_Spread, Fly_Loop, Fire_Breath, Tail_Swipe (the wings held folded in the rest); lava veins it. horse: a horse (dark bay, black points, long mane and tail; walk/trot/gallop). hog: a thorn hog (wild boar: tusks that show shut, a crest of thorn spines, walk/trot/charge gallop; a jaw like the wolf's). slime: a moss slime, see-through jelly (real glass) with bubbles inside, a moss cap with flowers, a soft squash-and-spread rig (Idle_Loop, Walk_Loop / Jog_Loop hops, Slam, Hit, Death). mite: a stone mite, a giant pill bug of nine cracked granite plates with moss in the cracks, fourteen legs walking in waves; it curls into a ball and rolls (Curl, Ball_Loop, Roll_Loop, Uncurl, Bite, Hit, Death on its back). rootling: a walking tree stump on six root legs (spider tripod gait), one big glowing eye that looks about, branch arms with twig fingers, a crown of gnarled branches and a lit iron lantern (amber glass) swinging from a branch (Walk_Loop, Jog_Loop, Idle_Loop, Swipe, Hit, Death). cactus: a boulder-sized cactus crawler (a ribbed barrel cactus, sixteen ribs with dark grooves, rows of areoles each with three long pale spines, three pink flowers and two buds on its crown, no face) walking on six gnarled wooden roots in tripods: Walk_Loop, Jog_Loop, Idle_Loop, Spray (rears on its back roots and shudders: fire the spines from a script then), Hit, Death (rolls onto its side). root_bulb: the cactus's frame as a person-sized Root Bulb (nine smooth onion layers, tan over dusky purple, a pointed top under curled leaves, eight long root tentacles; the same walk and clips). scorpion: a horse-sized sand scorpion (glossy amber-brown armour, paler underneath; a carapace with its eyes on a ridge, seven overlapping back plates on three bones, a five-segment tail curled over its back to a glowing orange venom bulb and a curved sting, two heavy pincers whose moving fingers open, toothed inside, eight jointed legs): Walk_Loop/Jog_Loop (alternating tetrapods), Idle_Loop, Pinch, Sting (over its head), Rear, Hit, Death. clockwork_spider: the scorpion's frame as a Clockwork Spider (a round stone abdomen bound in brass with two glowing teal gears, a brass head with teal eyes, palps and fangs, eight brass legs; no tail or pincers drawn), the same clips, Rear for its threat. lizard: a crocodile-sized frill lizard (rust-red, mottled, a pale belly, spines down the back and tail, rough scales, sprawling legs with five clawed toes, a jaw with small teeth and a tongue) whose frill is eleven rods on their own bones with the skin swept between them: folded back at rest, spread round the head in Display: Walk_Loop/Jog_Loop (sprawling diagonal pairs), Sprint_Loop (on its hind legs), Idle_Loop (head bobs), Display (frill open, mouth wide, hiss), Bite, Hit, Death. ray: an aurora ray, a 3 m manta that swims through the night air (a flat diamond body, wings on four bones each, curled head fins, a whip tail on six bones; night blue with glowing teal and violet aurora bands, glowing wing rims and star-points, pale beneath): Fly_Loop, Glide_Loop, Idle_Loop, Bank_L, Bank_R, Hit, Death. slug: a cow-sized magma slug (a heap of dark lava crust plates on a molten glowing body, a glowing foot on six bones and a soft head, two eye stalks with glossy eyes, two feelers, lava drips; lava sets the molten colour): Walk_Loop/Jog_Loop (a wave along the foot), Idle_Loop, Spit (rear and throw: fire builtin:lavaglob from a script then), Hit, Death. bat: an eagle-sized fire bat (a sooty furry body, big ears, glowing eyes, fangs; bat wings of an arm, forearm, clawed thumb and four finger bones each, the glowing membrane swept between neighbouring fingers and back to the leg so it stretches and folds with them; lava sets the membrane colour): Fly_Loop, Glide_Loop, Hang_Loop, Hit, Death. drone: a Rune Drone (a floating carved stone orb with a glowing eye slit, two rune-cut metal rings on their own bones tumbling round it; lava sets the rune colour): Idle_Loop, Fly_Loop, Fire, Hit, Death. mimic_chest: a Treasure Mimic (an iron-bound wooden chest whose lid is a toothed jaw on its own bone, a maw, a five-bone tongue, four stubby claws): Idle_Loop (shut), Open_Loop, Bite, Lunge, Hit, Death. heart: the Hollow Heart final boss (an anatomical heart with its chambers on bones so it beats, arteries in an arch, violet glowing veins, black brambles draped round it): Beat_Loop, Idle_Loop, Pulse, Hit, Death. crow: a big blue-black field crow, pale glowing eyes, a beak that opens, real flight feathers (primaries, secondaries, coverts, a tail fan) that fold along its side on the ground (Idle_Loop, Walk_Loop, Hop_Loop, Peck, Caw, Fly_Loop, Glide_Loop, TakeOff, Land, Death). owl: the crow's frame and clips as a pale ghost owl (round head, white facial disc in a ruff, big glowing eyes with tear streaks, short hooked beak, feathered legs, two toes forward and two back, short tail). vulture: the crow's frame and clips as a rideable Giant Vulture (size 5: 5.75 m wingspan): ragged brown flight feathers, paler coverts, a bald pink head and neck out of a pale ruff, a heavy hooked ivory beak, grey legs, a leather saddle (pommel, cantle, side flaps) on a girth strap. heron: the crow's frame and clips as a Marsh Heron (size 1.6: 1.4 m tall): slate grey, the body lifted onto long bare legs with the knee half way down, an S-curved neck, a slim head with a yellow dagger bill and dark crest plumes, long thin toes, a short tail; its Peck is the spearing strike. bear: a big brown moss bear (shoulder hump, flat five-clawed feet, a jaw with canines and molars), a living moss mat over its back and head with ferns, grass and mushrooms; walk/trot/gallop and the animal mouth clips. beetle: a dog-sized thorn beetle (glossy iron shell, bronze thorns, a curved horn, six spined legs in tripods, wing cases that open over membrane wings: Idle_Loop, Walk_Loop, Jog_Loop, Charge, Display, Fly_Loop, Hit, Death). stag: the Thorn Stag boss on the beetle's frame (size 2.2: horse-sized): great jagged mandibles on their own bones, black armour with glowing teal cracks cut into it, black bramble draped over its back; adds Pinch and Rear. thornback: Thornback, the Warden of Whisperwood (the Hollow Tree's boss, size 3.5) on the beetle's frame: a great curved rhino horn and two horns on its shield, mossy armour with mushrooms growing on it, black bramble wound over its back, glowing eyes, wings under the cases; the beetle's clips (Charge, Display, Fly_Loop) plus Emerge to burst up out of the arena floor. forge_beetle: the Forge Beetle of Cindermaw on the beetle's frame (size 3.2: ox-sized): a blacksmith's iron anvil grown into its back (base, waist, face with a hardy hole, horn, heel; metal), its wing cases fused under it, iron-dark armour with molten orange cracks and a molten seam where the anvil meets the shell; the beetle's horn, legs and clips. puffcap: a knee-high living mushroom (a freckled cap over real cut gills, a chubby stem with a sleepy lidded face, nub arms, stubby feet): Idle_Loop, Walk_Loop (waddle), Run_Loop, Puff (the cap pressed down and sprung up: blow spores from a script), Hit, Death. snapvine: a man-tall carnivorous plant (an S-stalk on six bones from a mound of eight thorned tentacle vines, a five-petal flower-mouth ringed with thorn-teeth, petals on their own bones): Idle_Loop, Close, Bud_Loop, Open, Strike, Hit, Death. moth: an eagle-sized lantern moth (four patterned membrane wings with ringed eye spots and pale bands, a furry thorax, plume antennae, a banded abdomen that glows): Fly_Loop, Glide_Loop, Rest (wings tented), TakeOff, Hit, Death. Hang a light on its abdomen bone. golem: a 2.8 m bark golem (limbs of twisted wooden strands, knotted joints, glowing eyes in deep sockets, a jaw, moss and glowing mushrooms on its shoulders, root fingers and toes, branches from its back) on biped bones: the biped walks and idles at its size, the mouth clips, plus Slam and Swipe. clay_golem: a squat 2.4 m golem of sun-baked red clay blocks (one round glowing orange eye in a socket, a block jaw, block fists with knuckle grooves, dried cracks cut into the blocks) on the golem's bones and clips. stone_golem: the canyon Stone Golem boss (size 3.6: about 10 m): rock slabs tipped against each other, a stern stone face with teal eyes, teal rune cracks glowing across the chest, arms and thighs, moss on the tops, hanging vines, two fluted temple pillars standing from the shoulders (one broken), the golem's bones and clips. clockwork_sentinel: the Under-Plateau's boss on the stone golem's frame (size 3.4): stone plates bound in brass bands studded with rivets, one great brass-rimmed glowing eye in the chest, a chimney stack on its back, no ruins or moss. eel: a 3 m glow eel (glossy silver, glowing side lines, back and belly fins that ripple, needle teeth, a jaw). serpent: the sea serpent boss (16 m, dark green over a pale belly, a dragon head with fanged jaws, spined frills, a back frill); both swim on a spine of bones: Swim_Loop, Idle_Loop, Bite, Rear, Hit, Death. strider: a horse-sized water strider standing on the water (short grasping front legs, very long rowing middle legs and steering hind legs, a beak): Idle_Loop, Walk_Loop/Jog_Loop (skating strokes), Strike, Hit, Death (sinks). toad: a pig-sized giant toad (warts, blotches, golden eyes, a jaw, a throat pouch, webbed hind feet, a tongue of six bones that shoots out 2 m): Idle_Loop, Walk_Loop/Jog_Loop (hops), Tongue, Croak, Hit, Death. turtle: a cow-sized snapping turtle (a scute-grooved shell with three spiked keels and moss, a hooked beak on a jaw, thick clawed legs, a spiked tail) on quadruped bones: slow walk/trot and the animal mouth clips.
colorsobjectToon colors by region name: skin, hair, eye, brow, lips, trim, or any costume piece.
earsnumberEar length (1 default; 0.4 short round, 1.6 bunny).
eyesnumberEye size (1 default).
fit_carvebooleanCarve the surface to the sheet's outlines after fitting the proportions (default true).
fit_sheetstringSheet Sculptor (body toon): a turnaround picture under the project (figures side by side on a plain studio backdrop). The recipe's proportions are fitted to it by outline overlap, then the surface is carved so its outline matches each view, and the figure is painted from the sheet's views. The overlay goes to Characters/<name>_fit.png; the scores are in the log.
fit_viewslist of stringThe sheet's figures left to right: front, side (facing left), side_right, back, three_quarter (its turn is measured). Default [front, side, back, three_quarter].
furlist of numberRGB 0...1 (default orange).
garmentslist of objectTailored cloth for the figure (as forge_human's garments: {type t_shirt|shirt|hoodie|dress|a_line_skirt|circle_skirt|trousers|jeans|shorts|coat|cape|coverall, name, fabric, color, length, fit, flare, sleeve, neckline, collar, hood, print_image (a picture under the project tiled as the fabric), trim_color}). Drafted from the body's measurements, sewn and draped on its skin; loose ones (skirts, capes, coat tails) swing with animator { cloth [names] }. With toon { layered true } the gear (boots, belt, bracers, gloves, satchel) is its own layer over the cloth.
headnumberHead size relative to the body (1.25 default; 1.5 very cartoony).
head_detailnumberToon figures: the head's own finer grid, meters per step at size 1 (0.002 default: lids, nose, lips and the drawn face lines hold their shape; 0 the body's grid).
inner_earlist of number
irislist of number
name requiredstringFile name, e.g. Pip.
noselist of number
paintbooleanPainted textures for a toon figure (default true; false keeps flat region colours).
paint_from_sheetbooleanPaint the figure from the sheet's views (default true with fit_sheet).
resolutionnumberSurface detail, meters per grid step at size 1 (0.011 default; 0.008 finer).
sizenumber1 is about a meter to the ear tips.
tailnumberTail fluff (1 default).
toonobjectToon Forge recipe (body toon): species_hint crocodile|duck|rabbit|bear|fox|cat|dog enables animal defaults; muzzle none|short_round|long_snout|beak, muzzle_length, head_shape round|wide|tall, tail none|croc|fluffy|puff|stub, belly_patch and back_spikes booleans, animal_hands paws|mittens|wings, animal_feet paws|webbed; face ears also accepts round_animal|long_upright|pointed_tall. Set colors.skin and colors.belly_patch or top-level fur and belly. proportions {height m, head, legs, torso, neck, shoulders, hips, arms, arm_angle (degrees out from the side), limbs, hands, feet, belly, chest}; face {eyes {size, spacing, height}, brows {thickness, angle, style bar|soft|none}, nose button|long|round|snout|none, nose_size, mouth small|smile|frown|open|grin|shut, ears round|pointed|long|none, ear_size, freckles, blush, tusks, rest, rig}. Animals get a real mouth on a jaw bone (a croc's grin on two rows of triangle teeth seated in the gum, a duck's bill, a bear's open smile, a bunny's buck teeth) and a face that acts: lids and lash lines, sculpted brows, the mouth's corners and cheeks as ARKit-named shapes, each eye on its own bone, so face_perform, say and look_at drive it. face.rest is the expression it rests in (determined, grin, happy, smile, angry, sad, surprised, sleepy, combined: "determined grin", a croc's default); rig false keeps a still face; hair {style messy|spiky|short|long|ponytail|bob|mohawk|bald, volume}; outfit [pieces or {piece, color, length, flare, sleeve, height, hood, fingerless}: tunic, shirt, vest, robe, dress, skirt, trousers, shorts, boots, shoes, gloves, bracers, belt, satchel, cloak, scarf, cap, wizard_hat, helmet, chest_plate, pauldrons]; extras [{shape cone {a, b, ra, rb} | blob {center, radii}, anchor head|chest|hips|feet, bone, region, color}]; colors {region: [r, g, b]}. Default: a Zelda-proportioned hero, about six heads tall.

forge_edit

Edit a forged model by hand at the picked spot (forge_pick), written into its recipe so every rebuild keeps it, then rebuilt in place. op: round or chamfer (the edge nearest the spot, or edge: its number from forge_pick; radius_mm), raise (size_mm [w, h], height_mm, falloff soft or hard), pocket (size_mm [w, h] or [d], depth_mm, shape rect | round | slot, rim_mm for a raised lip), fastener (kind rivet | hex_screw | slot_screw | cross_screw | torx_screw | roll_pin | qd_socket | nut | nail | carriage_bolt, size_mm, count with to [x, y, z] world for a row, or pattern ring with radius_mm), stamp (kind knurl | serrations | stipple over size_mm [w, h], pitch_mm; kind text: text engraved depth_mm deep, letters size_mm [h] tall, raised: true stands them proud), boss (a rounded housing standing proud: kind capsule | teardrop, size_mm [length, width], height_mm, along [x, y, z] world direction). Undo with forge_edit_undo. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
alonglist of number
countinteger
depth_mmnumber
edgeintegerWhich edge from forge_pick (1 = nearest).
entity requiredstringThe forged model's object (name or #id).
falloffsoft / hard
height_mmnumber
kindstring
notestring
op requiredround / chamfer / raise / pocket / fastener / stamp / boss
patternsingle / line / ring
pitch_mmnumber
radius_mmnumber
raisedboolean
rim_mmnumber
shaperect / round / slot
size_mmlist of number
textstringstamp text: the words (A-Z, 0-9, space, . - /).
tolist of number

forge_edit_bake

Keep a forged model light: its fine stamped detail (knurl and serration edits) becomes baked stipple in the surface's normal detail instead of geometry (the recipe needs f.detailPass), then it rebuilds. Housings, pockets, raised regions, rounded edges and fasteners stay geometry. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
entity requiredstringThe forged model's object (name or #id).

forge_edit_list

The hand edits in a forged model's recipe (its edit layer), in order, with their ids, parts and settings.

ArgumentTypeWhat it does
entity requiredstringThe forged model's object (name or #id).

forge_edit_undo

Remove a hand edit from a forged model's recipe (the last one, or id) and rebuild it without it. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
entity requiredstringThe forged model's object (name or #id).
idstring

forge_from_reference

Make a detailed, realistic made object (furniture, doors, cushions, cars) from a reference sheet: views of one object on a plain backdrop (2 × 2: front, side facing left, top with the front down, three-quarter; make one with Nano Banana in Google Flow). The family's part grammar is fitted to the sheet, then refined by rendering the model from each view and comparing outlines and inner lines until it matches; colours are read off the views; materials are procedural (wood grown from tree rings per board, car paint, brass, chrome, glass, rubber tread, woven fabric with stitched seams) with edge wear, dust in crevices and scratches. Writes Assets/Forge/<name>.glb, <name>_LOD1/_LOD2.glb and <name>.recipe.json (variants: same recipe, new seed). Reports per-view silhouette match before and after fitting. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
budgetintegerMost model renders the refinement may use (default 300).
dimensionstringOne real size, e.g. "height 0.76 m", "width 180 cm", "length 4.6 m" (cars: length). Without it a typical size for the family is assumed.
dustnumber0 clean ... 1 dusty (default 0.3).
familystringcabinet / dresser / chest / nightstand (drawers, legs, handles), dressing_table (with a mirror on posts, knee hole), door (frame-and-panel door in its casing: panels, glass lites, lever or knob, hinges), pillow (knife-edge, sewn and inflated), cushion (boxed with a gusset and piping), car (lofted body, wheels, glass, lamps, seams, interior).
materialsbooleanBake the procedural materials (default true; false is plain colours, much faster).
name requiredstring
paramsobjectFamily numbers to hold instead of fitting (e.g. {"rows": 4, "handle_style": 1}); see the recipe file for every name.
recipestringInstead of a sheet: rebuild an earlier result's recipe (Assets/Forge/<name>.recipe.json) with the given seed, params and vary.
refinebooleanRefine by render-and-compare (default true).
seedintegerVariant: other boards and knots in the wood, other wheel spoke angle (default 1).
sheetstringThe reference sheet image, relative to the project (e.g. Assets/References/dresser/sheet.png).
varynumberWith recipe: nudge each fitted size by up to this share (0.05 = ±5%) for a sibling, not a copy.
viewslist of front / side / back / top / three_quarterWhat the sheet's object views show in reading order (default front, side, top, three_quarter).
wearnumber0 new ... 1 well used (default 0.4).

forge_from_views

Good for one-piece organic or sculpted shapes (a creature, a statue, a rock, a toy figure). Weak for vehicles and other hard objects made of separate parts: it makes one carved lump with the sheet's paint projected on (no wheels, seat or bumper of their own), so for those, try forge_model per part from an exploded-parts sheet, stickers, then assemble_vehicle. Carve a solid model of any object from a sheet of views on a plain backdrop: 2 × 2 (front, side facing left, top with the front down, three-quarter; a Nano Banana sheet on magenta) or a row (front, side, back, other side, e.g. on grey). Every straight-on outline carves a signed distance field, the three-quarter view's camera angle is solved from its outline and carves too, and without a top view the cross-sections are rounded; Surface Nets makes one closed, manifold, outward-facing mesh. With `normals` (the same sheet as a camera-space normal render, pixel-aligned: in Flow, edit the sheet with "convert this into a surface normal map render, same framing, same layout, background 128,128,255") the concave detail outlines can't see (a canopy recess, intakes, dents) is integrated from the normals and carved in. Writes Assets/Forge/<name>.glb, <name>.views.json (size, per-view silhouette IoU, solved three-quarter camera) and <name>.views.png (per view: sheet | carved model | outlines, white both, red sheet only, blue model only). Shape only: one plain material, no UVs yet. Recipes: f.from_views(name, sheet, {dimension, views, layout, grid, normals}). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
albedostringOptional flat-lit relight of the same sheet (pixel-aligned) to take the colours from instead, so baked-in shading isn't painted on.
colorlist of numberBase colour [r, g, b] 0-1 (default clay grey).
depthstringOptional depth picture of the same sheet (same layout, pixel-aligned, white near, black far: a Nano Banana edit "convert this into a depth map, same framing", or Forge Eye's depth). Fitted per view to the carved hull (scale and offset) and carved in: eye sockets, folds, the gaps between arms and body that outlines can't see. Runs before normals; relief_views and relief_max_depth apply (default depth limit 20% of the longest side).
dimensionstringOne real size, e.g. "length 6.4 m", "height 0.5 m" (without it the longest side is 1 m).
fineobjectWith a part carve: the fine material. {scale (default 4), fur (bool: everything not cloth, eye or nose is fur), cloth: ["#rrggbb"...] (the colours that are cloth: read them off the 'colour families' note of an earlier forge), pictures: [{path, box: [x0, y0, x1, y1]}...] (sharp redraws of crops of the sheet, box = where on the sheet the crop came from: their fine detail goes on, the atlas keeps the broad colour)}. Without pictures the materials' detail is only what the sheet itself holds.
front-z / +zWhich way the model's front faces (default -z, the player and vehicle heading 0; +z is the forge recipe convention).
gridintegerField samples along the longest side (48-640, default 320): higher is finer and slower.
layoutauto / grid / rowgrid (2 × 2 quadrants), row (views side by side) or auto (by the sheet's shape).
limbsbooleanParts the front view shows reaching out of the body on their own (A-pose arms, hands, legs apart, horns) carve as round tubes as thick as they are wide, instead of as deep as the body behind them in the side view (default: on when there's no top view; feet are left to the side view).
name requiredstring
normal_rangenumberHow far a fully sideways normal moves the colour from flat (default 0.5, the standard encoding).
normalsstringOptional normal render of the same sheet (same layout, pixel-aligned; x right = red, y up = green, toward the camera = blue, flat = 128,128,255).
paintbooleanPaint the model with the views' colours (default true): each surface from the view that sees it most squarely, side views also colouring the far flank.
partsstring"auto" (from the outlines and the depth picture, no generator: needs depth) or a part map of the same sheet (same layout, pixel-aligned; a Nano Banana edit): flat colours per body part: head 255,0,0; ears 255,120,200; torso and hips 255,255,0; right arm 0,0,255; left arm 0,255,255; right leg 0,255,0; left leg 0,110,0; tail 255,140,0; backdrop magenta. Each part is built and painted only from its own pixels and they melt together, clipped to every outline: separate feet, clean armpits, a round tail, no paint on the wrong part.
reconcilebooleanDrawn views never agree exactly; give material back to outline pixels whose whole ray the other views carved away, at the depth they object to least, so every view keeps its outline (default true).
reconcile_limitnumberHow far outside the other views that material may be, as a share of the longest side (0-0.2; default: chosen per sheet so the worst view matches best).
relief_max_depthnumberDeepest the normal relief may carve below the outline hull, meters (default 6% of the longest side; deeper means the integration drifted).
relief_viewslist of stringWhich views' normals to carve with (default all).
rigbooleanWith a part carve: give the model a skeleton and skin weights from its parts: humanoid bone names (Hips, Spine, LeftUpLeg...), so the motion library drives it, joints where each limb's middle line bends (a digitigrade leg gets its hock), extra chains for a tail and ears.
roundbooleanRound cross-sections between the front and side spans (default: only when there is no top view).
roundnessnumberSuperellipse exponent for rounding: 2 an ellipse, higher squarer (default 2.2).
sharpnumberKeep creases sharp (degrees, e.g. 30): where the surface folds by more than this, vertices sit on the crease (dual contouring) and the model's normals split there, for blade edges, armour plates, horns, panel lines. Use with smooth 0. Default off (smooth Surface Nets).
sheet requiredstringThe sheet image, relative to the project (e.g. Assets/References/racer/sheet.png) or absolute.
smoothnumberSmooth the carved shape before meshing (Gaussian, in grid cells; 0 off, about 1.5 removes the ridges views leave along a flank).
three_quarterbooleanSolve the three-quarter view's camera and carve with it (default true).
viewslist of front / back / side / side_right / top / three_quarter / skipWhat each panel shows in reading order (default: front, side, top, three_quarter for a 2 × 2 sheet; front, side, back, side_right for a row of four). side faces left (front to the left), side_right faces right, top has the front at the bottom; skip ignores a panel.

forge_garment

Dress a person made with forge_human in clothes the engine tailors for their body: sewing patterns drafted from the body's measurements, sewn round it and draped as real cloth, with fabric maps (weave, seams, topstitching, hems, buttons). Rebuilds Characters/<name>.glb from its recipe with the garments added (live in the editor). Loose garments (skirts, dresses, coats, capes) swing as cloth with animator { cloth ["<garment name>"] }. Only forge_human people: characters from other generators (forge_body_native, forge_scan_human, creatures...) are refused unchanged, since rebuilding them would make a different person. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
garments requiredlist of objectClothes tailored to this body from sewing patterns: [{type, fabric, color, length, fit, flare, sleeve, neckline, print, print_color, print_scale, print_image, hood, hood_up, pockets, collar, lapels, open, cuffs, cargo, designs, trims, name}]. type: a_line_skirt, circle_skirt, dress, t_shirt, hoodie, shirt, trousers, jeans, shorts, coat, cape, coverall. fabric: cotton, denim, chino, wool, gabardine, leather, silk, satin, knit, jersey, fleece, rib, linen, ripstop, cordura. color [r,g,b] 0...1 sRGB. length meters (skirts/dresses from the waist, tops/coats from the neck, trousers the inseam). fit 0 tight ... 1 oversized. flare 0 straight ... 1 full (a circle skirt's 1 is a full circle). sleeve 0 sleeveless ... 1 full length. neckline crew, scoop, v, boat. print solid, stripes, check, heather. open false closes a coat's front (a closed jacket that hangs to the hip: hoodie with hood false); cuffs "band" ribbed cuffs; cargo true side pockets on trousers. designs: pictures on the cloth, [{kind embroidery|print|applique|tooling, motif (a PNG under the project, magenta keyed, e.g. a hi-vis tape strip), panels [front, back, sleeve, front_l...], at [u, v] 0...1 from the panel's lower left as cut, size meters wide, angle degrees, mirror, color, metal}]; trims: a strip motif along edges [{kind, motif, edges openings|hems|both, panels, offset, width, color}]. Worn in layers automatically (a coat over a shirt).
name requiredstringThe person (Characters/<name>.human.json from forge_human).
replacebooleantrue: these garments instead of the ones made before; false (default): added to them.

forge_head

Build a realistic head from a reference sheet (a front view and a side profile of one person side by side on a plain background: make one with Nano Banana in Google Flow). No base mesh: the head is shaped row by row from the views (Apple Vision finds the face's landmarks, sizes from the pupils), with eye sockets and eyeballs, and the photos projected on as skin. Into Assets/Characters/<name>.glb. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
name requiredstring
normalsstringOptional normal render of the sheet (a Flow edit, pixel-aligned). Found automatically as <sheet>_normal_4k.jpg.
sheet requiredstringImage path inside the project, e.g. Assets/References/human_face/ref_sheet_1_4k.jpg.
texture_sizeintegerSkin texture size (default 2048).

forge_human

Make a realistic, rigged, clothed person (built by the engine itself from the CC0 MakeHuman body kit, in seconds) from a description, into Assets/Characters/<name>.glb. It plays the shared animation library: give the entity mesh_renderer { mesh "Characters/<name>.glb" } and animator { clip "auto" library "Characters/Mannequin.glb" } (upper "pistol" to aim). Hold things with attach { bone "hand_r" }. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
bodyobject0...1 values: gender (0 female, 1 male), age (0.5 about 25, 1 about 90), muscle, weight, height, proportions; race {caucasian, african, asian} weights.
buildernative / blendernative (default): the engine builds it itself in seconds. blender: the old MPFB path.
clothlist of stringClothes that will be simulated as real cloth (skirts, dresses, coats): their names or parts of them, e.g. ["elegantsuit"]. Keeps the skin under them so legs don't show holes when the cloth swings; turn the simulation on with animator { cloth ["elegantsuit"] }.
clotheslist of stringe.g. namuhekam_male_polo_shirt, male_worksuit01, male_casualsuit03, cortu_cargo_pants, toigo_wool_pants, culturalibre_male_boots, toigo_ankle_boots_male, toigo_gloves_short, fedora01.
eyebrowsstring
eyesstringEye color: brown, blue, bluegreen, brownlight, deepblue, green, grey, lightblue...
garmentslist of objectClothes tailored to this body from sewing patterns: [{type, fabric, color, length, fit, flare, sleeve, neckline, print, print_color, print_scale, print_image, hood, hood_up, pockets, collar, lapels, open, cuffs, cargo, designs, trims, name}]. type: a_line_skirt, circle_skirt, dress, t_shirt, hoodie, shirt, trousers, jeans, shorts, coat, cape, coverall. fabric: cotton, denim, chino, wool, gabardine, leather, silk, satin, knit, jersey, fleece, rib, linen, ripstop, cordura. color [r,g,b] 0...1 sRGB. length meters (skirts/dresses from the waist, tops/coats from the neck, trousers the inseam). fit 0 tight ... 1 oversized. flare 0 straight ... 1 full (a circle skirt's 1 is a full circle). sleeve 0 sleeveless ... 1 full length. neckline crew, scoop, v, boat. print solid, stripes, check, heather. open false closes a coat's front (a closed jacket that hangs to the hip: hoodie with hood false); cuffs "band" ribbed cuffs; cargo true side pockets on trousers. designs: pictures on the cloth, [{kind embroidery|print|applique|tooling, motif (a PNG under the project, magenta keyed, e.g. a hi-vis tape strip), panels [front, back, sleeve, front_l...], at [u, v] 0...1 from the panel's lower left as cut, size meters wide, angle degrees, mirror, color, metal}]; trims: a strip motif along edges [{kind, motif, edges openings|hems|both, panels, offset, width, color}]. Worn in layers automatically (a coat over a shirt).
hairstringHair the engine grows: crop, fade, waves, afro, messy, slick. Or a MakeHuman hair piece (short02, short04, cortu_short_messy_hair...); empty for none.
name requiredstring
skinstringe.g. middleage_caucasian_male, young_african_male, old_asian_male, toigo_light_skin_male_freckles.
skin_detailboolean or objectfalse for the plain skin texture, or settings for the baked skin: {pores 0...1, oiliness 0...1, blemishes 0...1, redness 0...1, seed (a different person's skin), size (head map side)}.
texture_sizeintegerTexture budget (default 2048): clothes, eyes and the body's skin maps at most this; the head's skin maps twice it (4K by default), for close-ups.

forge_litter

Generate forest-floor pieces as real textured geometry from our photo materials (never downloaded), several variants per call into Assets/Forge/Nature/Litter (+ _LOD1), listed in LITTER.json: needle_clump (fallen pine needles, a low dome 0.3-1 m), leaf_patch (single photo leaves, curled), twig, stick, branch (a fallen broadleaf limb 1.2-4 m forked into twigs, snapped ends, moss on top, sometimes dead leaves still on it, settled resting on its forks; length, radius), pine_cone, stones (sculpted rock 3-40 cm, a third sunk, moss on top of big ones), bark_chunk, moss_pad, stump_cut, stump_broken, log (2-6 m, moss along its top, broken stubs, sawn or snapped ends), root_flare, outcrop (bedrock breaking out of the ground 1.5-12 m across: limestone beds as ledges, broken blocks, moss on top, its base growing out of the land's own ground; size, height, rock). Place the small ones as ground cover (add_ground_cover kind mesh) and the big ones with scatter. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
countintegerVariants to make (default 6, at most 16).
heightnumberOutcrops: metres above the ground.
kind requiredneedle_clump / leaf_patch / twig / stick / branch / pine_cone / stones / bark_chunk …
lengthnumberLogs and branches: length in metres.
radiusnumberLogs, branches (at the base) and root flares: radius in metres.
rockstringStones: a rock material from material_library (rock_granite, rock_mossy_boulder, rock_river_stone...).
seedinteger
sizenumberStones: size in metres (default: a spread from 3 to 40 cm). Outcrops: metres across (default 2.5-7).
speciesstringBark for sticks, logs, stumps, chunks and roots: a tree species (pine, oak, birch, beech...).

forge_look

Rebuild a character from its look recipe (Assets/Characters/<name>.look.json: a TTR Body, tailored garments, worn parts such as a Forge-made visor, materials matched to a reference sheet, tears, wet/blood states) into Characters/<name>.glb and <name>_crowd.glb, and reload it in the open scene. Built in the forge worker: edit the recipe (or a worn part's Forge recipe, then forge_model) and call this again; no engine build. The face head is cached while its face sheet is unchanged. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
name requiredstringThe character, e.g. Zombie_Alpha (reads Assets/Characters/<name>.look.json).
recipestringAnother recipe file under the project, e.g. Assets/Characters/Zombie_Alpha_B.look.json (its own name decides the output file).

forge_model core

Good for hard-surface props and every part of a multi-part object (a vehicle, a machine), one recipe per part from an exploded-parts sheet; for cartoon parts use lofts with square 2-2.6 (soft, pillowy), boxes only for real flat plates. Weak for organic one-piece shapes (forge_from_views or forge_creature). Make a model from a recipe: native JavaScript built inside the engine in about a second (or Python run by headless Blender), exported to Assets/Forge/<name>.glb with the recipe saved beside it. Returns size, triangles and a studio preview so you can check and refine. Rebuilding the same name updates it everywhere in the scene. Native recipes stream partial geometry at at (or an existing instance/camera pivot); f.step(text) names the current work. The viewport card can Stop or Resume; live_forge status/stop/resume controls the same session. This tool builds an asset; place it separately. For guns, props, furniture, signs, vehicles parts. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
atlist of numberDestination [x,y,z] for the live build preview; defaults to an existing instance or camera pivot.
engineblender / nativenative: the recipe is JavaScript with the same f.* functions (keyword arguments as a trailing {options} object) and builds inside the engine in about a second, no Blender. Native only: f.loft(name, [{y, width, height | top, bottom, z, square | square_top, square_bottom}...], {sides, steps, at}) a smooth body through cross-sections along Y (zero size closes to a point; square 2 round, higher boxier) for fuselages, canopies, pods, hulls; f.wing(name, {root: [x,y,z] leading edge, root_chord, tip, tip_chord, thickness, twist}) a real airfoil surface (wings, tails, fins, blades); f.finish(parts, "worn_painted_wood", {resolution: 1024, budget_mb: 64}) bakes material recipes into padded shared atlas pages per material, scales texels by part surface area, auto-lowers resolution to fit a default 64 MiB per-model raw texture budget (max page 4096), and reports pages and reductions in the result; texel: m per texel (e.g. 0.00015 for a hero gun) sizes every part from its own area at one density across all groups instead of resolution; stipple + stipple_size draw on a finish too; hand `touch` burnishes hard coats (enamel, anodizing) and wears paint through; f.detail(obj, {wear, scratches, grime, dust, rust, grain, weave, panels, rivets, panel_size, top_color: [r,g,b] sRGB paint on upper surfaces, material: painted_steel | galvanised | chrome | rubber | glass | weathered_wood | car_paint | a material recipe, streak_length, rust_reach, resolution}; rust grows from edges, seams, cavities and the splash zone and streaks down); f.detailPass({wear, materials, tint, merge, bevel, chamfer, texel, tarnish, dust, dirt, fasteners, trims, panel_gaps, handled, touch, hands, scuffs, skip}) the Detail Pass over the whole model in one call (detail_pass tool, action help, lists every option); f.material(name, color, metallic, roughness, transmission, emissive, {clearcoat, clearcoat_roughness, sheen, sheen_roughness, depth, depth_mix, image}) for varnish, leather, marble; image: a PNG/JPEG beside the recipe laid once, upright, across each part's largest face (a screen's interface, a printed sign; with emissive the screen glows with it; keep that part out of the detail pass); materials named canopy/glass/window/visor render as glass. glass: f.glass(name, {tint: [1,1,1], clarity: 0.97 (share of light let through), roughness, ior: 1.5, thickness: metres (0 thin pane, 0.004 bottle wall, 0.05+ lens: bends and magnifies what's behind), absorption: [r,g,b] colour after absorptionDistance m (green bottle glass)}); Real objects: every forged model gets collision boxes that follow its parts (Forge/<name>.glb.collision.json; place it with collider { shape "parts" }), each box carrying what its part is made of, which bullets (holes, debris, going through), impact sounds and footsteps use: f.wood, f.glass, f.metal, f.steel and f.polymer say it themselves; say it on other materials with kind: f.material("Velvet", {color, roughness, kind: "fabric"}) (wood, fabric, glass, metal, ceramic, plaster, plastic, stone, concrete, dirt, foliage, flesh), else it is read off the material's name and the part's detail (rust: metal, grain: wood, weave: fabric). Architecture (walls, floors, ceilings, anything over 2.5 m) is never baked: forge it one material per model with quality "raw" and cover it in the scene with a tiling surface (surface { name "damask_wallpaper" tile_size 0.85 }, a scanned floor like "wood_floor"; material_library lists them), sharp at any distance; baked atlases are for props. f.material's 5th number is transmission (how much light passes: clear glass ~0.9, never a small number), and it takes the same ior/thickness/absorption options. Hollow vessels: f.lathe(name, [[radius,z], ...], {shell: 0.004, material: glass}) uses an exterior from flat bottom to open rim and adds the inner wall, rim and base; omit shell for solid profiles. A transmissive rim-to-axis closure warns about the inner cone. Rain, frost, smudges on glass: the scene's glass component. FORGE PRO KIT (hero props that look like modern game assets, not boxes). Blender axes: X right, Y back (front is -Y), Z up, metres. Curved armour, helmets, visors, hulls, shields: f.shell(name, rows, {thickness, levels: 2, wrap, sharp_rows, sharp_columns, rim, inner_material, material}) a smooth subdivided skin through rows of [x,y,z] points (every row the same count) with a real wall; wrap: true closes each row round (a helmet's rings); an end row of identical points is a pole (the crown); rim: radius adds a rolled edge (<name>Rim); cut eye slots with f.cut. Rows from f.ellipse(center, rx, ry, count, {plane: "xy"|"xz"|"yz", from, to}). Example: const rows = [0, 0.3, 0.6, 0.85, 1].map(t => f.ellipse([0, 0, 0.32 - 0.17 * t * t], 0.11 * Math.sin(t * 1.57), 0.13 * Math.sin(t * 1.57), 16)); f.shell("Helmet", rows, {thickness: 0.003, wrap: true, rim: 0.004, material: bronze}). f.mirror(part, {name, axis: "x"}) makes the other side (pauldrons, gauntlets). Measured or scanned surfaces (a car panel from its scan, a height field): f.mesh(name, {vertices: [x,y,z, x,y,z, ...], faces: [a,b,c, ...] or [[a,b,c,d], ...], smooth: 40, material}) builds exactly those faces (counter-clockwise from outside). Car bodies and other taut hard surfaces: f.subd(name, {points: [[x,y,z]...], faces: [[a,b,c,d]...] (counter-clockwise from outside; holes and 3/5-edge points allowed), creases: [[a, b, sharpness]...] (1-4 steps sharp, fractional blends), corners: [[v, s]...], levels: 3, mirror: true (model the +x half), through: true (the surface passes through the points), panels: ["Body", "Hood", "Door_L"...], face_panels: [panel index per face], materials: [per panel], gap: 0.0035, radius: 0.002, cavity: dark}) smooths the WHOLE cage as one surface, then cuts each panel out along its shut lines (set back, rolled under, flush by construction), one part per panel. Design lines: f.curve(name, {points: [[x,y,z]...] (a few control points), through: false, closed: false}) returns {points, control, curvature} (a fair cubic B-spline; <model>.curves.json feeds the curvature combs). Hinged parts: f.hinge(part or "part name", {axis: [[x,y,z], [x,y,z]], open: 65, kind: "door"|"hood"|"trunk"}) (<model>.hinges.json feeds the hinge preview). Fibres (horsehair crests, fur trim, tassels, brush bristles, grass tufts): f.strands(name, {along: path | roots: [[x,y,z]...] | at: [x,y,z] | on: part, face, count, length: [min, max], direction: [x,y,z] | "up" | "out", bend: "back" | [x,y,z], bend_amount, gravity, curl, clump, spread, radius, tip, segments, shades, max_triangles, material}); e.g. f.strands("Crest", {along: ridge, count: 900, length: [0.16, 0.26], direction: "up", bend: "back", bend_amount: 0.5, gravity: 0.3, clump: 0.6, spread: 0.01, radius: 0.0009, material: horsehair}). Rope and cable: f.rope(name, path, {radius, plies: 3 (2...8; one strand is f.tube), twist: turns per m, closed: true joins the ends into a loop}). Hard surface (sci-fi walls, doors, consoles, machinery): f.greeble(part, {face: "front", count: 30, kinds: ["plate", "box", "vent", "pipe", "light", "conduit", "hatch", "bolt"], depth, size: [min, max], region: [[u0,v0],[u1,v1]], light_material, pipe_material}) bolted plates, vents, pipe runs with brackets, glowing light strips; then f.detailPass({panel_gaps: [{parts, face, size}], fasteners: [...], materials: {...}}) for panel lines and rivets. Held props: f.grip("grip", {at, palm: [x,y,z], along: [x,y,z] (where the fingers point round it / the barrel), hand: "right" | "left", grip: "pistol_grip" | "fore_grip" | "wrap"}) writes <name>.sockets.json for prop_grips; also f.point("muzzle"), f.point("butt"). Materials with real maps (detail passes): aged_bronze, worn_plate_steel, worn_leather, scifi_panel_paint, old_oak_planks, cast_iron, aged_brass, brushed_steel, polymer_glass_filled, steel_parkerized, rubber_black, linen_fabric: f.detailPass({materials: {Bronze: "aged_bronze"}, tint: [...]}); glow: f.material(name, color, 0, 0.3, 0, 8) (emissive 8 × colour) for crystals, screens and lights. Quality: f.refine({target: 85}) on the last line scores the model (sharp boxes, default grey, no recipe, no detail, plain flat faces) and fixes what it can round by round (bevels, Detail Pass, recipes by material name, panel lines); forge_model quality "auto" does it for recipes with no detail of their own. Group moves: f.transform("all" | a part | a part's name | [parts or names], {at, rotate, scale}) moves any kind of part (put a helmet recipe on a head), f.count() and f.since(n) (the parts made since). CONNECTED: every part must touch or attach to another (or stand on the model's floor); a floating part fails the build with its name. Mount it (f.mount / f.attach) or f.fit({snap: true}); f.hanging(part) for one that hangs free on purpose (a lamp on its cord); f.output({loose: true}) for a set of separate pieces (a kit placed part by part). REPEATED PROPS (shelf products, fixtures placed by the hundred): f.output({merge: true, atlas: 512, lods: true}) writes one mesh, one atlas and levels of detail (<name>_LOD1.glb, _LOD2.glb) the engine switches to at a distance. CHARACTER RECIPE (a fully dressed, animated hero in five calls): (1) the body: an entity with mesh_renderer { mesh "Characters/Mannequin.glb" } (or forge_body_native for another build) and animator { clip "auto" library "Characters/Mannequin.glb" }; (2) forge_model the whole kit on that skeleton's bind pose (T pose, metres, Blender axes; the Mannequin's head is at z 1.57-1.84, shoulders x ±0.19 z 1.44, hands x ±0.74-0.92): helmet and crest (f.shell + f.cut + f.strands, then f.transform onto the head), cuirass, fauld lames, pauldrons and gauntlets (wrapped f.shell rings round each limb with rim, rivets with f.snap, f.mirror for the right side), cape (open f.shell hanging from the shoulders), the weapon placed in the hand, f.detailPass with materials, and f.wear({skeleton: "Characters/Mannequin.glb"}) last: every part is split onto its nearest bone; (3) wear_model {person, model}: each piece rides its bone, so idle, run and attack clips move the armour with the body; (4) animator clip for the attack (a melee swing) or "auto" for idle/run; (5) camera_look { style "stylized" } for cel bands and ink outlines (League-style), then screenshot. Default: native for JavaScript recipes. blender: Python recipe run by headless Blender (still used by forge_human).
idle_timeout_secondsnumberNative idle limit: the most seconds a stage may go without progress (default 120; a larger value also lifts the building stages). Every part built and every painted row band renews it, and a busy machine stretches it (up to 4x by load per core); a stop says what to retry with. The overall 1800-second safety limit remains.
name requiredstringFile name: letters, digits, _ or -.
previewbooleanRender a studio picture (default true; Blender engine only).
qualityauto / hero / rawNative only. auto (default): a recipe that adds no surface detail of its own gets the refine loop (f.refine: sharp boxes bevelled, the Detail Pass, a material recipe per material from its named material, panel lines on big plates, scored round by round; in a toon style only soft bevels). hero: the refine loop on any recipe, aiming higher. raw: exactly what the recipe says (no bevels, no detail: the choice when every shape and colour is already as wanted).
recipe requiredstringJavaScript (native, the default; see engine for every call and the FORGE PRO KIT for hero props: f.shell, f.strands, f.greeble, f.grip, f.refine) or Python using `import ttr_forge as f`. Meters; Blender axes: X width, Y length (front is -Y), Z up. Helpers: f.box(name, size=(x,y,z), at=, rotate=(deg), bevel=, material=), f.cylinder(name, radius, depth, at=, rotate=, sides=), f.sphere, f.torus(name, radius, tube, {at, rotate, sides, segments, material}) a ring lying round Z (tyres, steering-wheel rims, hoops; native only), f.profile(name, [(y,z)...], thickness, at=) extrudes an outline along X, f.cut(target, *cutters), f.join(target, *parts), f.intersect(target, *shapers) keeps only what they share (a side outline pushed across ∩ a top outline pushed down: depth both ways), f.repeat(obj, count, step), f.smooth(obj). Materials: f.metal(name, shade, roughness), f.steel, f.polymer, f.wood, f.material(name, color, metallic, roughness). Colours are linear (0...1); a colour from a picture or a picker is sRGB: f.srgb(r, g, b) (0...1 or 0...255) or "#rrggbb" as the colour turns it linear (else orange comes out pale yellow, red pink). Toon paint wants roughness about 0.75-0.85 (glossier paint glares white in the sun).
retained_stage_jobsintegerNative Forge completed stage histories to retain (default 3). Older stage GLBs are pruned; final models, recipes and logs remain.
styletoon / realisticNative only: how the refine loop finishes the model. toon keeps clean flat paint (soft bevels only: no wear, dirt, dust, panel lines or scanned materials) and its score doesn't count plain colours against it. Default: toon when the Game Plan style is stylized or toy or a camera_look in the scene is stylized, else realistic.

forge_person

Make a new person. Describe them (describe: "a tired 50-year-old man", or sex/age/ancestry/weight/tired/beard) and the Face Forger mixes the scanned people of the reference sheets (rigged template faces, 52 face shapes, photo skin, strand hair), ages, fills out or tires the face as asked, welds it onto a TTR Body built for them (with close-up hands and nails), with strand lashes and a strand groom (<name>.groom beside the model). Skin carries cavity, estimated anatomical thickness, pore and oil maps for two-lobe highlights and shadowed thin-skin transmission. The first use of a library person builds it from its sheet (a few minutes, then cached). Without a description: the older photo-head blend, mix (sheet → weight) or seed. Into Assets/Characters/<name>.glb. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
agenumberYears.
ancestrystringe.g. "East Asian", "African", "European", "South Asian", "Latino", "Middle Eastern".
beardnumber0 clean-shaven ... 1 full beard.
bodyobjectTTR Body knobs over the ones the words give: neck (thickness, 1), shoulders (1), girth (1), muscle, fat (0...1), height (m), arm_angle (degrees).
describestringPlain words: sex, age ("50-year-old", "in her sixties", young/old), ancestry, build (slim/heavy), tired, bearded/clean-shaven.
hairstringThe scalp hair's style: buzz, crop, fade, short, slick, messy, wavy, curly, coily, afro, straight, long, waves (or say it in describe: "a buzz cut"). Omitted: an identity keeps its own photo-grown hair; anyone else gets one picked for them.
handsanyClose-up hands and real nails (default on): false keeps the body's plain hands; an object passes the hands' options ({"wear": 0...1, "hair": 0...2, "texture": 2048}).
identitystringA named character's own face (an identity sheet in References/faces/identities, e.g. "hero"): exactly that person, with their skin, hair and expression calibration.
mixobjectLibrary people to weights, e.g. {"Scan8": 0.7, "Scan1": 0.3}. Or, with no describe, sex or age, reference sheet file names (in Assets/References/human_face) to weights, e.g. {"ref_sheet_1_4k.jpg": 0.6, "ref_sheet_3_4k.jpg": 0.4}.
name requiredstring
pushnumberHow far the shape is pushed away from the library's average (default 0: it also magnifies fitting errors).
seedintegerEach seed a different person (with describe: another face for the same words; without: a random mix of all the sheets).
sexnumber0 female ... 1 male (overrides describe).
tirednumber0 rested ... 1 exhausted (under-eyes).
varietynumberHow far from the nearest library people the face may wander, 0...1 (default 0.5).
weightnumber0 lean ... 1 heavy.
weldobjectHow the head joins the body (tune a neck with no rebuild): cut_above (m over the body's neck ring the head is cut, default 0.015), band_rows (5), weight_blend (0.04 m), color_band (0.06 m), even_above (0.1 m), adams_apple (m), nape_smooth (rounds, 24), neck_match (m of the head's neck reshaped to the body's, 0.06), neck_profile_smooth (m, 0.005), neck_relax (rounds, 80), head_pivot (bool).

forge_pick

Pick a spot on a forged model: point [x, y, z] (world; the camera's line through it finds the surface), or screen [x, y] (0...1 across the viewport). Returns the point, the way the surface faces, the part it's on, the flat face round it and the sharp edges near it; the spot shows highlighted in the viewport. on: true lets the person click spots on this model instead (their pick then shows in the activity feed and comes back here); on: false stops that. With nothing else, returns the spot picked last.

ArgumentTypeWhat it does
entity requiredstringThe forged model's object (name or #id).
onboolean
pointlist of number
screenlist of number
stillbooleanReturn a picture of the viewport (default true).

forge_prepare_sheet

Original pictures → a clean sheet and depth picture for forge_from_views, all on this machine. Each picture may hold several figures (front and side, back and high): each is cut out with Apple Vision's subject mask (keeps white fur on a white backdrop, tail tips, fingers; no floor shadows), then all panels go side by side on magenta at one figure height. Depth Anything V2 reads each panel for a 16-bit depth picture beside the sheet (<sheet>_depth.png). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
depthbooleanAlso write the depth picture (default true).
out requiredstringThe sheet to write, e.g. Assets/References/fox/sheet.png.
pictures requiredlist of stringThe original pictures in reading order, relative to the project or absolute.

forge_scan_human

Face v2: a whole rigged person whose face is fitted from a reference sheet (front + profile of one person, as for forge_head). Instead of a one-off head, the shared template head (MakeHuman topology: eyelids, inner lips, mouth, teeth, tongue, 52 face shapes) is fitted to the sheet's 3D scan, so expressions, blinks and speech work and every person made this way can be blended. Photos become the skin; body, clothes and hair as for forge_human. Into Assets/Characters/<name>.glb (a few minutes). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
albedostringOptional flat-lit relight of the sheet for skin color (found automatically as <sheet>_albedo_4k.jpg).
bodyobjectAs for forge_human: gender, age, muscle, weight, height, proportions (0...1).
clotheslist of string
hairstring
name requiredstring
normalsstringOptional normal render of the sheet (found automatically as <sheet>_normal_4k.jpg).
sheet requiredstringImage path inside the project, e.g. Assets/References/human_face/ref_sheet_7_4k.jpg.
skinstringBody skin texture (tinted to the face's tone), as for forge_human.
texture_sizeintegerTexture budget (default 2048; the head's maps twice it).

forge_toon_tree

Forge a storybook tree for painted worlds: a trunk and limbs with a crown of lumpy leaf clumps, one closed mesh wearing a painted leaf-scallop texture (no leaf cards), a few thousand triangles, with two coarser levels. Forms: round (oak-like dome), cone (fir tiers), tall (poplar flame), bush (low mound). Writes Assets/Forge/Nature/<name>.glb + _LOD1 + _LOD2; plant it with a forest object or mesh_renderer. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
bark_colorlist of numbersRGB 0...1.
clumpsintegerLeaf clumps (or fir tiers) in the crown (default 9).
formround / cone / tall / bush
heightnumberMetres (default 18; stylized worlds read best at 1.5-2.5 × real).
leaf_colorlist of numbersRGB 0...1.
name requiredstring
seedinteger
widthnumberCrown width, times the form's own (default 1).

forge_tree

Grow a tree natively (no downloads, no Blender): trunk flaring into roots, forking tapering limbs, procedural bark and cut-out leaf clusters, from a species recipe. Into Assets/Forge/<name>.glb; place it with mesh_renderer { mesh "Forge/<name>.glb" } and a collider for the trunk. Same species + another seed = another tree of that kind. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
bark_colorlist of number
foliagenumberLeaf density 0 (bare) to 1.5 (lush); default 1.
heightnumberMeters (default 7).
leaf_colorlist of number
name requiredstring
seedintegerWhich tree of the kind (default 1).
speciesacacia / baobab / oak / coconut / date / fan / royal / shrub …acacia (flat umbrella crown, savanna), baobab (bottle trunk), oak (round crown), shrub (garden bush: dense leaves from the ground, 0.6-2 m); palms: coconut (curving trunk, drooping fronds, coconuts), date (rough trunk, stiff fronds), fan (round fan leaves), royal (smooth grey column, green crownshaft), christmas (Christmas palm: slim grey ringed trunk, short crownshaft, compact crown, red fruit; for narrow sidewalks), foxtail (bottlebrush fronds on a slim grey trunk, compact crown).
stemsintegerPalms: trunks from one base, 1-3 (a Christmas palm planted as a double); default 1.

forge_views_proof

Check shape-from-views against ground truth: a known object (the built-in 6.4 m test racer with a canopy recess and side intakes, or a model from the project) is drawn as a 2 × 2 colour sheet and a pixel-aligned normal sheet, carved back from those pictures alone (forge_from_views), and measured: silhouette IoU per view, depth error per view in cm (outlines alone and with the normal relief), and how much of each known concavity came back. Writes Assets/Forge/<name>_truth.glb, <name>_carved.glb, <name>_relief.glb, <name>_sheet.png, <name>_normals.png, <name>_views.png and <name>_relief.png. Use it to see how well a kind of object can be recovered before relying on forge_from_views. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
gridintegerField samples along the longest side (64-640, default 400).
meshstringOptional model to use as the truth (e.g. Forge/hb_racer.glb); default the built-in object.
name requiredstring
objectracer / statueBuilt-in known object when no mesh is given: racer (6.4 m, canopy recess and side intakes) or statue (2.2 m hooded figure on a plinth, hood opening and robe folds). Default racer.
panelintegerSheet panel size in pixels (256-2048, default 1024).

import_asset

Download a Poly Haven model or surface into the project, with its license and source recorded. Models: use the returned mesh path in mesh_renderer. Surfaces: use surface { name "id" }. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
id requiredstring
kind requiredmodel / surface
resolution1k / 2k / 4kTexture size. 1k for props and testing, 2k for hero objects and walls. Default 1k.

import_files

Import files, folders or .zip asset packs from this computer into the project: 3D models (glTF/GLB, FBX, OBJ, USD/USDA/USDZ), pictures (PNG, JPG, TGA, BMP, PSD, GIF, HDR, EXR, WebP/TIFF on Mac), texture sets (albedo/normal/roughness/metal/AO by name → a surface), sounds (WAV, FLAC; MP3/OGG/M4A/AIFF on Mac → WAV), fonts (TTF/OTF → Fonts/<Family>), sprite sheets (Aseprite .ase, PNG + JSON), video (MP4/MOV/WebM). Units and up-axis are fixed, LODs and a fitted collision shape are made for models. Returns the import report: what came in (with mesh refs to place), what was fixed, what failed and why.

ArgumentTypeWhat it does
collisionbooleanFit a collision shape placed copies get (default true).
lodsbooleanMake levels of detail for models of 2,000+ triangles (default true).
paths requiredlist of stringAbsolute paths of files, folders or .zip packs.
replacebooleanOverwrite same-named imports instead of adding _2 (default false).
scalenumberForce the unit factor to metres (0.01 for centimetres). Default: from the file, or a size guess.
up_axisauto / y / z

import_sprites

Turn a 2D pack's sprites into sheets the sprite component plays: a TextureAtlas XML (Kenney, Starling), a TexturePacker JSON (hash or array, trimmed or rotated frames) or a folder of PNG frames. Frames are grouped by name into characters and clips ("alienBeige_walk1, _walk2" → sheet alienBeige, clip walk; single pictures share a sheet called loose), laid out as an even grid bottom-centred (feet stay put) and saved in Assets/Sprites/<name>/. Answers the exact sprite { image, frame_width, frame_height, clips } for each sheet; entity puts it on an object. as: "tileset" makes level tiles into a ttr.tileset instead. The pack's files are only read.

ArgumentTypeWhat it does
assheets / tilesettileset: the pictures are level tiles: one atlas + a ttr.tileset in Assets/Tiles/ (terrains from pieces named top_left, top, fill, left... as Kenney names them; other tiles get their own characters, physics guessed from names).
entitystringGive this object the first sheet's sprite (or `sheet`'s).
fpsintegerClip speed, frames a second (default 10).
namestringThe folder under Assets/Sprites (default: from the source's name).
sheetstringWith entity: which sheet (a character's name, or loose).
source requiredstringAbsolute path of the atlas .xml / .json, or of a folder of .png frames.

import_web_game

Import a web game into this project: a three.js game (a folder with its index.html, anywhere on this Mac) is opened in a hidden browser inside the editor, left to build its world for `wait` seconds, and its 3D world is read out of the running page: every visible mesh at its world position (instanced ones expanded), its material (colour, roughness, metalness, emissive, vertex colours, opacity, its colour picture), lights, fog, background and camera. Writes Assets/Imported/<name>/<name>.glb (one model) and Scenes/<name>_Imported.ttrscene (the model, the lights as lamps, a look from the page's fog and exposure), and copies the game's code to Assets/Imported/<name>/web/ with PORTING.md: the world comes across by itself; the game logic is ported to Arcwright scripts by the agent. macOS editor only. Then upgrade it: real lighting, characters, materials, sound. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
folder requiredstringThe web game's folder (absolute path, or ~/...): it must hold index.html.
namestringThe import's name (letters, digits, _ and -; default: the folder's name).
waitnumberSeconds to let the page build its world before reading it (default 8, 2...60).

live_forge

Make an object while the person watches it happen in the viewport: reference picture → shape fitted to it → blockout → parts snapping on → rounded edges → unwrapping → paint → use-driven wear → a check against the picture → placed in the scene. Every stage is one undoable step (Undo walks back through them); a failed stage says why in plain words and keeps the last good one. Give request (plain words: a recipe in Assets/Forge whose name matches is used), recipe (forge_model JavaScript; f.param(name, default, [min, max]) marks sizes a picture may change) or recipe_file. Recipes stream partial geometry while running; f.step(text) supplies plain progress words. action start returns at once with a session id; action status reports the stages so far; stop cancels and clears the marker; resume replays the saved recipe while retaining the previous checkpoint. Safety limits are reported with a Resume option.

ArgumentTypeWhat it does
actionstart / status / stop / resumeDefault start.
atlist of numberBuild and place at [x,y,z]. Defaults to an existing Forge/<name>.glb instance, then the camera pivot, then the origin. Temporary studio lights and a reflection capture follow the build and disappear when it ends.
fit_budgetintegerTries the shape fit may make (default 160; 0 keeps the recipe's sizes).
idle_timeout_secondsnumberPainting and ageing idle limit (default 120 seconds). Completed row bands renew it; a progressing bake may take longer. The overall 1800-second safety limit remains.
namestringPublished as Forge/<name>.glb (letters, digits, _ or -).
optionsobjectKit choices (f.option): words or colours, e.g. {"body": "pickup", "paint_color": [0.05, 0.1, 0.35]}.
paramsobjectRecipe sizes to hold instead of fitting, e.g. {"back": 0.95}.
publishbooleanDefault true.
readingobjectWhat the picture shows (look at it first): {object: "a 1950s diner chair", kit: "chair_kit" (a parts kit in Assets/Forge), options: {frame: "tube", seat: "cushion", back: "pad"} (the kit's part choices), materials: [{name: "seat", looks_like: "red vinyl", at: [0.5, 0.3]}] (a point 0...1 across and down where it shows: its colour is sampled there), parts: ["padded seat with piping", ...]}. The model is composed from those parts, then fitted to the picture.
recipestringThe recipe's JavaScript (as forge_model's native engine).
recipe_filestringA recipe in Assets/Forge, e.g. kitchen_chair.js.
referencestringA picture of the object on a plain backdrop, relative to the project (e.g. Assets/References/x/front.png).
reference_viewfront / side / back / top / three_quarterWhich view the picture shows (default front).
referenceslist of objectMore pictures of the same object, fitted all at once: [{path, view: front|side|back|top|three_quarter|auto (found by matching), generated: true for views made from another picture, not real}]. A reading's material can name the clearest picture (picture: index, 0 = reference).
refine_passesintegerRefining passes over traced lines (options trace_stations, trace_top, trace_plan): each moves them toward the pictures' outlines and is its own undo step (default 12, 0 off).
requeststringWhat to make, in plain words (picks a matching recipe).
retained_stage_jobsintegerCompleted jobs to retain for stage Undo (default 3, 0...50). Older stage GLBs are pruned; published models, recipes and logs remain.
seedinteger
sessionstringstatus/stop/resume: the session id (default: the latest, including a native forge_model build).
wearobjectWear sliders as in set_wear (wear, age_years, chip_size, grime, fade, scratches).

make_cover_atlas

Make a ground-cover atlas of the game's own from Nano Banana sheets: each sheet is four plant clumps (dry scrub, desert grass, alpine flowers...) in 2 x 2 cells on a plain background (pure white, flat light, nothing touching the cell edges). The background is keyed out (its colour read from the sheet's border; the tint taken back out of the edge pixels) into Assets/Library/cover_atlas/<name>_<n>.png, and the project's library (Assets/Library/CATALOG.json) gets the entry, so add_ground_cover {atlas: "<name>"} grows it and the game ships it. Reports each cell's coverage (a near-empty or overfull cell means a bad sheet: make it again). Two or three sheets of one plant give variety.

ArgumentTypeWhat it does
biomeslist of stringWhere, e.g. ["desert", "arid"].
name requiredstringThe atlas name, e.g. cover_desert_scrub (letters, digits, _).
scale_mnumberMetres one cell's clump spans (default 0.6).
sheets requiredlist of stringThe sheet pictures (PNG or JPG): paths inside the project, or absolute.
specieslist of stringWhat grows, e.g. ["creosote", "saltbush", "dry_grass"].
tolerancenumberHow far from the background colour still counts as background, 0.02...0.3 (default 0.08; raise it for a grey-white sheet, lower it for pale straw).

make_material

Material Maker: realistic surfaces from a recipe instead of photos. list shows the engine's and the project's materials (worn painted wood, oak floor, floral wallpaper, plaster, tile, linoleum, metals, cloth...) and the recipe format; create saves a new recipe (Assets/Materials/<name>.material.json: a base like wood, plaster, wallpaper, tile or metal, an optional coat like paint or varnish, ageing, and wear from each object's shape: chipped edges, grime in crevices and corners, scuffs near the floor, dust on top, drawn rounded edges on boxes) and makes its maps; show describes one. Both return a swatch picture; apply_to puts it on objects as their surface (one undoable step).

ArgumentTypeWhat it does
actionlist / create / show
apply_tolist of stringObjects to cover with it (their surface component).
namestringshow: a material's name.
recipeobjectcreate: the recipe (list shows the keys and an example).
swatchbooleanReturn a swatch picture (default true).
tile_sizenumberWith apply_to: meters per repeat (default the recipe's).

material_library

The engine's own photo materials (made from our Nano Banana photos, never downloads): barks by tree species, ground layers by biome (forest soil, leaf litter, moss, trail dirt...), rock, leaf atlases. Search by words, category (bark, ground, rock, leaf_atlas) or biome. grow_plant picks a species' bark and leaves from here by default; paint_terrain and terrain layers take the ground names.

ArgumentTypeWhat it does
biomestringe.g. temperate_forest: its ground layers in painting order.
categorybark / ground / rock / leaf_atlas / frond_atlas / cover_atlas
searchstringWords to match (name, species, biome, use).

model_sheet

Draw models alone in neutral studio light from four sides (front three-quarter, side, back three-quarter, other side; each scaled to fit and stood on the ground), a row per model, into one PNG, to judge them side by side against their reference pictures and the builder guide's QUALITY BAR (nothing in the player's reach may look like a placeholder or a toy-block game). meshes: model paths ("Forge/mg_bumper_cars.glb"), or folder: every model in an Assets folder (prefix narrows it: "mg_"). Writes Renders/model_sheets/<name>.png (or out) and lists each row with its size. Doesn't touch the scene.

ArgumentTypeWhat it does
folderstringAn Assets folder, e.g. "Forge".
limitintegerMost models in one sheet (default 24).
mesheslist of string
namestringThe sheet's file name (default sheet).
outstringAbsolute path for the PNG instead.
prefixstringWith folder: only models whose names start so.
sizeintegerEach picture's side in pixels (default 384, 128...1024).

paint_art2d

2D code art (free, always available): paints an Art2D recipe (format ttr.art2d: a sprite sheet of posed frames, an auto-tiling terrain tileset, or a parallax backdrop) into PNG (and tileset JSON) in Assets. Recipes live in the project (Art2D/...); see kit_playbook 2d-platformer.

ArgumentTypeWhat it does
out requiredstringOutput base inside Assets, without extension ("2D/mygame/hero").
recipe requiredstringThe recipe inside the project ("Art2D/mygame/hero.ttrart.json").

paint_asset

Paint an asset's own albedo, roughness, metal, tangent normal and AO as editable layers. Preserves its original textures and Detail Pass. points are model-local meters (omit for whole selected materials); masks multiply: all, curvature (convex edge wear), cavity, up, height, ao, world gradient, filtered noise, contact paths, 15 cm kick scuffs, gravity streaks, floor traffic lanes, boundary dirt and separate rust blooms. Bakes off the UI thread, saves <asset>.paint.json and shows the result; paint_layers undo restores it. Unique non-overlapping 0...1 UVs required. Select object to capture its transform for world masks. Human controls: Inspector > Paint. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
assetstringA .glb/.gltf under Assets with unique 0...1 UVs.
channels requiredobjectOnly channels supplied change: {color:[r,g,b] (sRGB),colorMode:mix|multiply,roughness:0...1,metallic:0...1,normal:[x,y,z] (unit tangent perturbation),ao:0...1}. Existing normal detail is composed, not replaced.
facingnumberMinimum cosine against normal, default 0.15 when normal is supplied.
falloffnumber
layerstring
masksarray[{kind:all|curvature|cavity|up|height|ao|gradient|noise|contact|kick|streak|traffic|boundary|rust, invert:false, lower:0, upper:1, direction:[0,1,0],origin:[0,0,0],scale:1,seed:1,path:[[x,y,z],...],width:0.1,length:0.6}]. Paths are model-local meters: contact is a 3D capsule; traffic/boundary project onto model XZ; streak path contains origins and direction is local gravity; rust points are separate bloom centers, never connected. kick scale is physical height above the model bottom (default0.15). Masks multiply; up uses transformed normals; cavity includes nearby disconnected surfaces and original AO. Noise filters unresolved frequencies.
materialslist of string
minimum_resolutionintegerOptional 32...2048 minimum longest side for painted maps, before the first layer. Use 2048 for close-up placement masks. Source images and unpainted normal detail remain intact; existing pixel/work budgets still apply.
model_to_worldlist of number
normallist of numberOptional model-local receiving direction to keep brush paint off a thin asset's backside.
objectstringA scene object showing that asset (all its instances share the painted texture set).
pointsarrayOne [x,y,z] or [[x,y,z],...] stroke centres, model-local meters; empty/omitted paints the mask over the whole material.
radiusnumber
resolutioninteger32...2048 for untextured channels, before the first layer; existing maps retain their resolution.
strengthnumber

paint_bake

Bake editable paint layers to final texture maps and a new GLB under Assets/Painted/<output>, preserving the original asset/layers. GLB baking retains the original geometry, skeleton, animations and extensions. Sculpted or .gltf sources export maps plus a manifest; bake the sculpt to GLB first for combined GLB export. Existing output folders are never replaced; choose another output. PNGs remain ordinary PBR textures with no extra per-frame paint shader cost. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
assetstringA .glb/.gltf under Assets with unique 0...1 UVs.
minimum_resolutionintegerOptional 32...2048 minimum longest side for painted maps, before the first layer. Use 2048 for close-up placement masks. Source images and unpainted normal detail remain intact; existing pixel/work budgets still apply.
objectstringA scene object showing that asset (all its instances share the painted texture set).
outputstringNew output name, letters/digits/_/-, default <source>_painted.
resolutioninteger32...2048 for untextured channels, before the first layer; existing maps retain their resolution.

paint_decal

Place a lit box-projected decal: image/label/sticker/sign/poster or built-in grime/dust/chipped_paint/crack/scorch. Defaults to hard surfaces (standard materials and glass: fridge-door smudges, window cracks); receivers:all also paints skin, eyes, hair and foliage. Projects along local -Z; rotation [-90,0,0] paints a floor. Color, tangent-normal and roughness maps share uv_rect [u,v,width,height] into a label atlas. Angle fade avoids stretched side walls, pixel/edge feather cleans curved cans and bottles; higher layer draws last. One undoable scene edit, saved with the scene. Normal/roughness-only decals use color_weight:0.

ArgumentTypeWhat it does
angle_fade_endnumber
angle_fade_startnumber
colorlist of number
color_weightnumber
depthnumber
edge_feathernumber
imagestring
kindstring
layernumber
name requiredstring
normal_imagestring
normal_strengthnumber
opacitynumber
position requiredlist of number
receiversstandard / allstandard paints hard surfaces (standard materials and glass) and leaves skin, eyes, hair and foliage alone; all paints them too.
rotationlist of number
roughnessnumber
roughness_imagestring
seednumber
size requiredlist of number
uv_rectlist of number[u,v,width,height] inside 0...1; width and height must cover at least one pixel of the 512-pixel atlas.

paint_ground_cover

Paint a ground-cover layer like a brush: strokes [{x, z, radius, density 0...1}] set how thick it grows (0 erases softly), {..., erase: true} clears a circle, {..., trample: true} presses a worn path (blades flattened and browned). `path` [[x,z],...] with `radius` paints along a line (a footpath). One undoable change; reports the plants it expects in the strokes.

ArgumentTypeWhat it does
cellnumberPaint resolution, meters (default 0.5).
densitynumber
eraseboolean
name requiredstringThe ground-cover object.
pathlist of list of number
radiusnumber
strokeslist of object
trampleboolean

paint_layers

List or edit an asset's saved paint layers: add/select/remove/visible/opacity/move/rename, undo or redo. Each edit saves and updates the texture set. Scriptable action replace accepts a complete AssetPaintDocument JSON (source,resolution,layers), validates and bakes it as one undo step; use list's structured document as a template. Painting comes after Detail Pass and sculpt/heal; neither source is overwritten. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
actionlist / add / select / remove / visible / opacity / move / rename …
assetstringA .glb/.gltf under Assets with unique 0...1 UVs.
documentobject
minimum_resolutionintegerOptional 32...2048 minimum longest side for painted maps, before the first layer. Use 2048 for close-up placement masks. Source images and unpainted normal detail remain intact; existing pixel/work budgets still apply.
namestring
new_namestring
objectstringA scene object showing that asset (all its instances share the painted texture set).
positioninteger
resolutioninteger32...2048 for untextured channels, before the first layer; existing maps retain their resolution.
valuenumber

paint_preset

Give an asset a non-destructive lived-in paint layer: dusty, scuffed_floor, worn_painted_metal, greasy, grimy_wall, rain_wet or sun_faded_label. Wear lands only where it really collects, in soft patches: chipped flakes of dull primer/steel on convex corners (never chrome), shiny hand grease at contact paths, a dirt line and shoe scuffs at the base of walls (grimy_wall), traffic lanes that wear any floor finish toward scuffed satin (polish goes duller, concrete gets a sheen) with dirt at the boundaries and in grout, irregular drips. intensity light, medium (default) or heavy-grimy. Supply paths in local meters or author paint_contact/handle_grip, paint_traffic, paint_boundary, paint_drip and paint_rust model points. Contact/traffic/boundary are paths; dripSources and rustSources are independent locations. No contact path means no guessed handle grease, no rustSources means no guessed screw rust. Empty traffic/boundary use asset center/perimeter. strength 0...1, deterministic; minimum_resolution 2048 gives close-up mask detail. materials can restrict it (a vest without the skin). The original GLB stays intact; paint_layers can hide, reduce, reorder or undo the layer. For one-off marks on a repeated module (a stained ceiling tile, a lane across many floor modules) use paint_decal instead: a painted texture repeats with every instance. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
assetstringA .glb/.gltf under Assets with unique 0...1 UVs.
intensitylight / medium / heavy-grimylight, medium or heavy-grimy. Optional (medium). strength still scales the chosen intensity, and zero is unchanged.
materialslist of string
minimum_resolutionintegerOptional 32...2048 minimum longest side for painted maps, before the first layer. Use 2048 for close-up placement masks. Source images and unpainted normal detail remain intact; existing pixel/work budgets still apply.
objectstringA scene object showing that asset (all its instances share the painted texture set).
placementobjectOptional {contacts:[[x,y,z],...],contactRadius:0.11,traffic:[[x,y,z],...],trafficRadius:0.27,boundaries:[[x,y,z],...],boundaryWidth:0.07,dripSources:[[x,y,z],...],dripLength:0.6,rustSources:[[x,y,z],...],rustRadius:0.045}. Contact/traffic/boundary points form continuous polylines; dripSources and rustSources are separate centers at actual lips, screws and feet. rust_sources/rust_radius aliases are accepted, but do not send both forms. Model-local meters, max64points/path; 0.0001...1000m radii/length. Captured object transform rotates world gravity into local streak direction.
preset requireddusty / scuffed_floor / worn_painted_metal / greasy / grimy_wall / rain_wet / sun_faded_label
resolutioninteger32...2048 for untextured channels, before the first layer; existing maps retain their resolution.
seedinteger
strengthnumber

paint_terrain

Paint a ground layer onto land: forest_soil, leaf_litter, moss_ground, trail_dirt (photo materials from material_library) or any surface. Up to 8 layers sit over the land's slope-and-height base and blend by height, so dirt fills low spots first. Every layer is anti-tiled and varied over large areas. Modes: brush (strokes [{x, z, radius, strength}]), path ([[x, z], ...] with radius: a strip with a ragged edge), fill (all of the land), patches (`share` 0...1: natural patches over the whole land, with their own noise per layer), erase (brush or path that clears every layer), clear (remove the layer). One undoable change.

ArgumentTypeWhat it does
layer requiredstringSurface to paint, e.g. leaf_litter. Added to the terrain's layers if new.
modebrush / path / fill / patches / erase / clearDefault brush (or path when `path` is given).
pathlist of list of number[[x, z], ...] to paint along.
radiusnumberMetres, for path and default stroke radius. Default 3.
raggednumberHow much the edge wanders, 0 round ... 1 very ragged. Default 0.35.
sharenumberpatches: how much of the land the layer covers, 0...1.
softnessnumberShare of the radius that fades out, 0...1. Default 0.5.
strengthnumber0...1, default 1.
strokeslist of objectBrush: [{x, z, radius, strength}] (world metres; strength 0...1, default 1).
terrainstringTerrain object name. Default: the first terrain.
tilenumberMetres per texture repeat for this layer (default: the material's real size).

paint_wear_mask

The wear brush for agents: more (amount up to 1) or less (down to -1, the eraser) of the object's natural use-driven wear in places, e.g. less on the backrest and more on the seat's front edge. Each stroke names a part (from set_wear explain), covering it, or gives at: [x, y, z] in the object's own frame (meters, Y up) with a radius; hardness 0 soft ... 1 hard. Or describe how it's USED and the places are found for you: uses [{action: hold|stand|sit|scrape|kick|grind|bump|clean, part, where: top|bottom|front|back|left|right|nose|tail|ends|edges|all, amount}] ("ollies scrape the tail" = {action: scrape, part: Deck, where: tail}; "grinds scratch the hangers" = {action: grind, part: Hanger}). The wear still follows the real edges and grain (it's a weight, not a decal). One undoable step; clear: true drops earlier strokes first. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
clearboolean
entity requiredstring
strokeslist of object[{part: "TopRail", amount: -0.7}, {at: [0, 0.45, 0.2], radius: 0.12, amount: 0.6, hardness: 0.3}]
useslist of object[{action: "scrape", part: "Deck", where: "tail"}, {action: "stand", part: "Deck"}]

photo_surface

Turn a reference photo in the project's Assets (a Nano Banana texture picture: flat, straight-on) into a seamless PBR surface, Assets/Surfaces/<name>/ (color, normal, roughness, occlusion), with the engine's photo-material pipeline (lighting flattened, quilted to tile with no seam, height from the photo's features, normals, occlusion, roughness). height: the photo's own depth picture (an aligned Nano Banana depth map of the same sheet: light = high), cropped and quilted in register with the photo, so stones, joints and cracks keep their real shapes instead of a height guessed from the colour (a dark stain isn't a dip). crop [x, y, w, h] (0...1) takes part of the picture (and of height); upright keeps its direction (wood grain, bark: only mirrored, never turned); size 1024/2048/4096; normal (relief strength, default 5), feature (the broadest bumps as a share of the tile: 0.05 default, ~0.015 for wood grain), roughness (the mean, default 0.75), gloss (0...1: how much smoother the high, sealed surface is than its pores and cracks). Then use it in a material recipe: make_material {recipe: {"name": ..., "surface": {"name": "<name>"}, "finish": ..., "age": ..., "wear": ...}}. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
croplist of number
featurenumber
glossnumber
heightstringOptional depth picture under Assets aligned with photo (same framing; light = high), e.g. References/ground/sheet_depth.jpg.
keep_lightbooleanKeep the photo's own broad light and dark (crushed velvet's bands, satin's sheen) instead of flattening the lighting.
name requiredstringThe surface's name (letters, digits, _ and -).
normalnumber
occlusionnumberHow much darker the low spots are (default 1.6; 0: none).
photo requiredstringPicture under Assets, e.g. References/ashgrove-foyer/door_wood_4k.jpg.
printedbooleanA pattern printed on a flat sheet (wallpaper, printed fabric, a poster): the ink's dark lines aren't grooves, so no occlusion and only the sheet's fine fibre as relief.
roughnessnumber
sizeinteger
smoothintegerThe finest relief kept, in texels (default 1; 3-6 for metal, leather, slate and cloth so colour mottling doesn't become hairy ridges).
uprightboolean

product_forge

Build a reusable catalog of parametric retail packaging: glass_bottle, pet_bottle, soda_bottle, can, carton, chip_bag, box, cup_noodles, drink_shot, jar, tube, sachet, bread_loaf (a sliced loaf in a clear bag with a printed band and twist tie), bun_pack (six rolls in a clear clamshell). Creates K variants per family, or exactly label_count products from one supplied PNG label sheet. Each label maps once to an editable Forge recipe and glTF model with clean wrap/front UVs. Defaults to generated fictional labels. Models share one label image on disk and use the GPU texture cache (shared when color space and residency cap match); shelf_fill reuses mesh references for instancing. Optional parameters by family set dimensions, proportions, closure, material, seed and detail. action list reads an existing catalog. Builds publish only after all products read back; existing catalogs are never overwritten. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
actionbuild / list
cell_heightintegerGenerated label height; default 256 up to 72 labels, 192 up to 144, then 128.
cell_widthintegerGenerated label width; default 384 up to 72 labels, 256 up to 144, then 192 to bound memory.
columnsintegerSheet grid columns, default 8 (or product count when smaller).
condensationnumberDefault condensation for glass/PET variants when shelf_fill places them; cold fill adds subtle condensation automatically.
familieslist of glass_bottle / pet_bottle / soda_bottle / can / carton / chip_bag / box / cup_noodles …
label_countintegerExact number of labels/products. For imported sheets with explicit columns and rows, defaults to their product; otherwise families × variants_per_family. Families cycle in catalog order.
label_sheetstringOptional existing Assets-relative PNG, row-major labels. Omit to generate fictional labels.
name requiredstring
padding_pixelsintegerAdded edge-extruded gutter around each imported cell, default 4 pixels; original label pixels are preserved.
parametersobjectOptions keyed by selected family name, e.g. {can:{size:[0.066,0.122,0.066]}}.
rowsintegerImported sheet grid rows; defaults to enough rows for label_count.
variants_per_familyintegerDefault 6. Total products are bounded at 256.

rebuild_buildings

Build the scene's buildings (objects with a `building` component: style, width, depth, height, floors, seed, front) into their models: one object per look and 64 m chunk ("bldg:<look>@<x>_<z>", near, middle and far levels) and a box collider on each building. Reads the project's Assets/Buildings style and look files again. One undo step. Reports triangles per level and anything wrong with the style files.

No arguments.

reference_pack

The research behind a model, kept with it (Assets/References/<subject>/pack.json): hard facts (official dimensions, measured feature stations, materials, performance) and every source with license and whether it may ship. Give a target to check the model's real scale and feature positions against the facts (separate from compare_reference's shape match). Add facts, sources or materials to grow it. Quick level for ordinary props (a few views, one size); deep for things that must be authentic (drawings, several measurements, close-ups, performance, sound).

ArgumentTypeWhat it does
factslist of object{name, value, unit, axis: length|width|height, or model_point + station, tolerance, source, confidence}
materialslist of object
meshstring
sourceslist of object{id, url or file, organization, type, accessed, license, usage: reference-only|shippable, confidence}
subject requiredstring
targetstringObject whose model to check.

reference_planes

Blueprint planes: stand a model's reference orthos (side, front, rear, top) around it at true scale, the way car studios model against their drawings. Each picture's subject is found (Vision foreground or a plain background), cut out and scaled so one real size fixes every view (side and top by the length, front and rear by the height); it reports where the pictures disagree. Each view is a glowing quad that shows from its own side only (never covers the model), one object per view in group Blueprints. Re-run with only the settings to tune live (opacity, brightness, cutout, outline, placement, gap), show/hide views, remove the set, or look along a view with a long lens.

ArgumentTypeWhat it does
brightnessnumberGlow of the planes (default 1; the studio's walls glow 0.55, softboxes 6).
centerlist of number[x, y, z]: the model's centre on the ground (default: from the object).
cutoutbooleanOnly the subject shows, its background cut away (default true).
fliplist of stringViews whose picture to mirror (the nose points right).
gapnumberMetres between the model's box and the outside planes (default 0.25).
hidelist of stringTake these views out (their pictures stay).
imagesobject{side, front, rear, top}: pictures relative to Assets/References, or full paths. Side and top with the nose on the left (else flip).
litnumberShare drawn as a lit print instead of glowing, 0...1 (default 0).
lookside / front / rear / top / resetPoint the camera along this view from far away with a long lens (nearly orthographic), clipping walls in between; reset restores the normal lens.
namestringThe set's name (objects <name>_side ..., pictures in Assets/References/Blueprints/<name>/). Default: from the object.
objectanyThe model the planes frame: a name, a list of names, or a prefix ending in * (e.g. SC01_*). Its box gives the centre, ground and (without size) the length.
opacitynumberHow strongly the picture shows over neutral grey, 0.05...1 (default 0.9).
outlinebooleanDraw the subject's outline in cyan (default true).
placementoutside / centeroutside (default): beyond the model by gap; center: through its middle (no parallax for long-lens checks).
removebooleanTake the whole set out of the scene.
showlist of stringExactly these views stand in the scene.
sizeobject{length, width, height} in metres. Length fixes the scale (default: the object's length); height and width default to what the pictures give.
yawnumberDegrees the set turns about Y (0: nose toward +Z).

reset_wear

Put a forged object's wear back to how it was forged (its sliders and brush strokes cleared). One undoable step. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
entity requiredstring

sculpt_bake

Bake a sculpt's fine detail into maps so the model stays light in game: a normal map and a displacement map (PNG, beside the model), from the full sculpt onto the base model plus the layers before from_layer (the big forms). Also writes <model>_baked.glb: the light model wearing the normal map (not for rigged characters yet).

ArgumentTypeWhat it does
assetstring
from_layerstringThis layer and the ones after it are baked; earlier ones stay in the geometry (default: bake everything).
objectstring
sizeintegerMap size in pixels, 64…4096 (default 2048).
write_modelbooleanAlso write <model>_baked.glb (default true).

sculpt_edit

Precise, named shape edits for a TTR Body or creature, anchored to regions so they survive rebuilds: move (mm [x, y, z]; +x the model's left, +y up, +z forward), scale (factor about the region's centre), inflate (mm along the surface, negative deflates), crease (deepen, or raise if negative, along a line of landmarks, width mm) and widen (total mm at a cross-section height). Each fades out smoothly over falloffMM. Saved in the character's recipe and replayed on every rebuild; inspect_bench suggests them. action preview reports what would move without saving; clear removes all edits. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
actionapply / preview / clear
character requiredstring
opslist of object{op: move|scale|inflate|crease|widen, region | landmark (+radiusMM), mm, amountMM, factor, falloffMM, curve: [landmarks], widthMM, heightMM, axis: x|z}
regionsjoints / joints+face / joints+creature / box

sculpt_layer

A model's sculpt layers: list them (with the model's regions and size), add a layer, select the one strokes go into, set a layer's strength (0 none … 1 as sculpted … 4), show or hide one, delete, rename, move, undo or redo the last sculpt change. Layers apply in order on top of the base model, so a rebuilt base keeps the sculpt and a layer can be dialled down later.

ArgumentTypeWhat it does
actionlist / add / select / strength / show / hide / delete / rename …
assetstring
namestring
new_namestring
objectstring
positioninteger
strengthnumber

sculpt_new

Start a sculpt from clay: a model of even triangles (sphere or plane, size meters across) saved as Assets/Sculpts/<name>.glb and placed in the scene, ready for sculpt_stroke and sculpt_stamp.

ArgumentTypeWhat it does
name requiredstring
placeboolean
positionlist of number
replacebooleanStart over if it exists (its sculpt file is removed).
shapesphere / plane
sizenumber

sculpt_snapshot

Close-up pictures of a model being sculpted, from named angles (front, back, left, right, top, bottom, three_quarter, three_quarter_right), clay-shaded so the form reads: framed on a point (focus + radius, meters) or a region (tinted red), with the wireframe (to see added detail) or side by side with the model before sculpting (before: true).

ArgumentTypeWhat it does
assetstring
beforeboolean
focuslist of number
highlightbooleanTint the region (default true).
objectstring
radiusnumberMeters around the focus to frame.
regionstring
sizeintegerPixels per view, 128…1024 (default 448).
texturedbooleanShow the model's colour maps instead of clay.
viewslist of string
wireframeboolean

sculpt_stamp

Press a height pattern (an alpha) into a model's surface at each point: carvings and ornament (rosette, scroll, leaf, rope, beads, rings, dome, scales, knurl) or skin and stone detail (pores, wrinkles, stone), or a greyscale image under Assets (white raises). radius = half the stamp's width (meters), depth = meters of the alpha's full height (negative carves in); angle turns it, up sets which way is up on the surface, aspect stretches it. Adds the detail it needs (default edges radius/32; set detail). Mirror with symmetry "x". Saved as a sculpt layer beside the model.

ArgumentTypeWhat it does
alpha requiredstringrosette, scroll, leaf, rope, beads, rings, dome, scales, knurl, pores, wrinkles, stone, or an image path under Assets.
anglenumberDegrees, turning the stamp on the surface.
aspectnumberWidth over height (default 1).
assetstring
at requiredlist of list of numberWhere to stamp: [[x, y, z], …] (meters, model frame; snapped onto the surface).
connectedboolean
depth requirednumber
detailnumber
falloffsmooth / constantsmooth (default) softens the stamp's edge; constant keeps it hard.
front_onlybooleanOnly move surface facing the brush (default true).
layerstring
mirror_atnumber
objectstring
radius requirednumber
regionstring
symmetryx / none
targetstringKeep the stroke to one group (where it lands and what it moves), e.g. material:Human.head.
uplist of number
viewanyPut each point on the first surface seen from this view (front, left, right, three_quarter… or a direction [x, y, z] from the eye): never a surface hidden behind (a neck inside a head).

sculpt_stroke

Sculpt a model like Blender's sculpt mode, by numbers: a brush stroke along points (meters, the model's own frame: +x its left, +y up, +z forward). Brushes: draw (push out along the surface, negative pulls in; strength = meters at the centre, a stroke of 0.002 raises exactly 2 mm), inflate (swell along each normal), smooth / flatten / pinch (strength 0…1 per dab), crease (a sharp groove, strength = depth in meters; negative = a sharp ridge), grab (move by delta [x, y, z]). Mirror with symmetry "x"; keep it to a region ("nose.bridge", "cheek_l", "calf.left", "head", "material:Skin", "a+b", "-eye_l"); add detail where it goes with detail = the longest edge wanted (meters, e.g. 0.0005). Saved as a layer in <model>.sculpt.json beside the model (re-applied whenever the model loads or is rebuilt; rigged characters keep their bones and face shapes). Undo with sculpt_layer.

ArgumentTypeWhat it does
assetstringA .glb under Assets (e.g. Characters/Head_Ref1.glb, Sculpts/Statue.glb).
brush requireddraw / inflate / smooth / flatten / crease / pinch / grab
connectedbooleanStay on the piece of surface the stroke starts on (default true: brushing a face leaves the eyeballs alone).
deltalist of number
detailnumberSubdivide where the stroke reaches until edges are at most this long (meters). 0/absent: no new vertices.
falloffsmooth / sphere / sharp / linear / constant
front_onlybooleanOnly move surface facing the brush (default true).
layerstringThe layer to sculpt into (made if new; default the active one).
mirror_atnumber
objectstringOr a scene object showing the model.
pinchnumbercrease: how much the sides gather, 0…1 (default 0.35).
points requiredlist of list of numberPath [[x, y, z], …] in meters (snapped onto the surface). One point = one dab. grab: where to grab.
radius requirednumberBrush radius, meters (0.005 = 5 mm).
regionstringKeep the brush to a region (see sculpt_layer list for the model's regions).
snapboolean
spacingnumberDab spacing as a share of the radius (default 0.2).
strength requirednumberdraw/inflate/crease: meters at the centre; smooth/flatten/pinch: 0…1.
symmetryx / nonex: mirrored across x = mirror_at (default 0), exactly.
targetstringKeep the stroke to one group (where it lands and what it moves), e.g. material:Human.head.
viewanyPut each point on the first surface seen from this view (front, left, right, three_quarter… or a direction [x, y, z] from the eye): never a surface hidden behind (a neck inside a head).

sculpt_terrain

Shape land with a brush: raise, lower, flatten (toward a height), smooth, or level (flat pad for a building). Give one point, or a path of points to sculpt along it (roads, rivers, trenches). Coordinates are world x, z.

ArgumentTypeWhat it does
atlist of number[x, z]
opraise / lower / flatten / smooth / level
pathlist of list of number[[x, z], ...]: brush along it (every half radius).
radiusnumberMeters. Default 6.
strengthnumber0...1. Default 0.5.
targetnumberHeight for flatten/level, world meters. Default: the ground at the first point.
terrainstringThe terrain object's name. Default: the first terrain.

shelf_fill

Stock a shelf, fridge or rack from a product_forge catalog. Set width/depth in metres, shelf levels, facings per SKU, rows behind each facing, gaps, small seeded position/yaw variation and front or pushed-back alignment. All products keep shared mesh references for GPU instancing and shared label textures. Optional price_strip and price_tags use the existing image decals; price_every spaces tags without repeating products. Returns actual count, unique SKUs and capacity. One undo step; existing objects are preserved. dry_run validates and reports the fit without placing anything.

ArgumentTypeWhat it does
atlist of number
catalog requiredstring
coldboolean
countinteger
depthnumber
dry_runboolean
facingsinteger
familieslist of string
gapnumber
jitternumber
levelslist of number
name requiredstring
price_everyintegerPlace one price tag per this many facing groups; default1. Product variety and placement stay the same.
price_offsetnumberPrice-label plane offset from stock front, metres towards the viewer; default 0. Use the actual shelf rail position.
price_stripstringAssets-relative PNG for the full front shelf strip (one decal per level).
price_tagslist of stringOne Assets-relative price-tag PNG per selected SKU, in catalog order; paths may repeat. The scene is limited to 32 unique decal image paths and 384 decals. Images are resampled to 512 pixels.
pushed_backboolean
row_gapnumber
rowsinteger
seedinteger
sold_throughnumberShare of facing columns shoppers have bought from (default 0, fully faced): those lose some front products, so the rest sit recessed behind the shelf edge. 0.15-0.3 reads as a lived-in store.
widthnumber
yawnumber
yaw_jitternumber

texture_from_views

Good for painting one model from pictures of that same object. Weak for stickers and logos on separate parts of a stylised model (the paint smears across part joins): for those, try an f.material image on a thin plate, or paint_decal. Texture any model from reference pictures: the model gets automatic UVs (our own unwrap: charts by surface direction, flattened as-rigid-as-possible, packed into one 0-1 atlas) and each view of the sheet is projected onto it with its camera found from the outline, visibility tested, blended by how squarely each view sees the surface, exposures harmonised between views, unseen parts inpainted, seams dilated. Sheets: sheet_2x2 (front, side, top, three-quarter: the Nano Banana layout), grid (columns × rows of named views: front, back, side, top, bottom, three_quarter, skip) or turnaround (equal steps around). Writes Assets/Forge/<name>.glb (the painted model), <name>_basecolor.png and <name>.viewpaint.json; returns per-view colour error (ΔE under neutral light), the seam score at 4 angles (DetailCritic seam gate) and pictures: each sheet view beside the painted model from the same camera, and the four test angles. hold_out leaves a view out of painting and measures it (the honest check). Use the delit (albedo) version of a sheet when there is one. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.

ArgumentTypeWhat it does
backdroplist of numberBackdrop colour 0...1 (default: read from each panel's border).
chart_anglenumber
columnsinteger
detail_regionsbooleanFine detail per region from one view, no ghosting (default true).
facing_powernumber
frontlist of numberWhich way the model's front faces (default: found from the outlines).
hold_outstringA view name to leave out and measure.
layoutsheet_2x2 / grid / turnaroundsheet_2x2 (default): front, side, top, three-quarter.
metallicnumber
model requiredstringThe model to paint (.glb): Assets path, project path or repository path.
namestringOutput name (letters, digits, _): Assets/Forge/<name>.glb. Default: <model>_painted.
oblique_trustnumber
paddingnumber
perspectivebooleanAlso try perspective cameras (field of view search) for three-quarter views; kept only when the outline fits clearly better (default true).
roughnessnumber
rowsinteger
sheet requiredstringThe reference sheet image (plain backdrop, e.g. magenta).
size512 / 1024 / 2048 / 4096Atlas size (default 2048).
symmetricbooleanMirror the side view onto the other flank (default true).
two_bandintegerTwo-band blending radius in pixels (0 off, default): try 10 when views disagree with the shape (seams show).
uplist of number
viewslist of front / back / side / top / bottom / three_quarter / skipgrid: the views in reading order.

texture_heal

Heal a model's textures: remove something baked into them (a photo's outline left on the cheek, a logo, a watermark, a stain, a seam) and refill it from the surface around it: the broad colour is filled in smoothly from the patch's edge so it matches, and the fine grain (pores, weave, scratches) is copied from nearby (or from around `source`), on the colour, roughness and normal maps together. Where: points (meters, the model's frame) with a radius, and/or a region. Saved as a heal in a sculpt layer beside the model (undo, layer strength). Returns a before/after close-up.

ArgumentTypeWhat it does
assetstring
feathernumberSoft edge as a share of the radius (default 0.35).
layerstring
mapslist of color / roughness / normal
objectstring
pointslist of list of numberCentres of the patch [[x, y, z], …] (meters, model frame).
radius requirednumberMeters around each point.
regionstringOr only within a region (cheek_l, nose.wing_l…).
snapshotboolean
sourcelist of number
strengthnumber0…1 (default 1).
viewstringView for the close-up (front, three_quarter, left, right…).

type_forge

Make a real TrueType font from pictures of letters (Type Forge). Each sheet is a picture of black letters on white (a Nano Banana specimen sheet works best: ask for exact rows, even spacing, nothing touching, no guides) and the characters it shows, row by row. The engine cuts the letters out, reads each row's baseline and capital height, traces the outlines (corners kept sharp, curves fitted within the tolerance), checks every letter against its drawing and writes Assets/Fonts/<Name>/<Name>-Regular.ttf with a specimen.png and the source sheets. Give several sheets for one font (capitals, lowercase, numbers and marks); lowercase it lacks uses the capitals. Use the font in ui_theme / game.ui.json fonts ({"file": "Fonts/<Name>/<Name>-Regular.ttf"}).

ArgumentTypeWhat it does
capitals_for_lowercasebooleanLowercase the sheets don't draw uses the capitals (default true: an all-caps display face).
name requiredstringThe font's family name ("Moonglow Circus"); its folder and file drop the spaces.
samplestringA line for the specimen (default the font's name).
sheets requiredlist of object
side_bearingnumberSpace each side of a letter, a fraction of the capital height (default 0.06; tighter for script, looser for heavy display).
space_widthnumberThe space's width as a fraction of the em (default 0.28).
tolerancenumberHow far a traced curve may stray from the drawing's edge, in sheet pixels (default 0.6).

vertex_snap

Move an object so one of its corners (vertices) sits exactly on a corner of another: wall to wall, track piece to track piece, a pipe onto its joint, with no gap or overlap. Its corner nearest `near` (default: nearest the other object) goes onto the other's corner nearest it; the other stays put. One undo step. The editor's Vertex snap (⌥V, or hold V while moving) does the same by hand.

ArgumentTypeWhat it does
nearlist of numberA world point picking which corner of the moved object to use (the one nearest it).
object requiredstringThe object to move (name or #id).
onto requiredstringThe object it meets, which stays put.

wear_model

Dress a character in forged gear: a forge_model recipe with f.wear({skeleton: "Characters/Mannequin.glb"}) (armour, helmet, gauntlets, a cape's plates authored on that skeleton's bind pose) is split by bone at build; this puts every piece on the person, each riding its bone (attach { bone } turn true), so the gear follows idle, run and attack clips. One undoable step; run it again after rebuilding the gear.

ArgumentTypeWhat it does
model requiredstringThe forged gear's name (Assets/Forge/<model>.wear.json).
person requiredstringThe character entity (its mesh is rigged with the same bone names as the gear's skeleton).
Arcwright Beta 2 (0.4.0) · generated from the engine source (25e375c86)Something wrong or missing? Tell us
Download Arcwright free