Asset tools¶
The asset database, import and download, materials, textures, prefabs, audio generation and previews.
28 tools in the asset category. Badges: read-only tools never change the project; mutating tools are undoable and attributed; open-world tools reach outside the engine and MCP clients ask before running them.
| Tool | Summary |
|---|---|
asset_import_mesh |
Import a mesh (.obj, .glb, .gltf — e.g. |
asset_request |
Queue a request for generated content — kind: mesh (3D model), texture, sprite (2D), audio (sfx), music, video — with a prompt. |
asset_requests |
List generated-asset requests and their status. |
asset_complete |
Mark a request done with the generated file (project-relative). |
asset_list |
Search the project's assets (meshes, textures, materials, prefabs, scenes, audio...) by type, tag or text (matches path, description and tags; supports * globs). |
asset_info |
Everything about one asset: GUID, type, tags, description, provenance, import settings, which entities use it, and type-specific data (material fields, prefab contents). |
asset_preview |
Render an isolated preview image of a mesh, material (on a sphere), texture or prefab — look before you place it. |
asset_import |
Register a file placed in the project (e.g. |
asset_tag |
Set an asset's tags and/or description (and provenance). |
asset_move |
Rename or move an asset file (its .meta and GUID move with it) and update every reference in the open scene. |
asset_refresh |
Rescan the project folder for new or changed files (the editor also does this automatically). |
material_create |
Create a reusable material asset (*.mat.json): color, metallic, roughness, emissive (glows with bloom), albedo texture with tiling, unlit. |
material_update |
Change fields of an existing material; every entity using it updates instantly. |
texture_generate |
Procedurally generate a seamless PBR texture set — albedo, normal map and ORM (occlusion/roughness/metallic) — for realistic or stylized surfaces: bricks, planks, cobblestone, rock, rust, marble, fabric, scales, ... |
material_assign |
Use a material asset on one or more entities (sets mesh.material; empty string clears it). |
prefab_create |
Save an entity and all its children (components, behaviors, vars, tags) as a reusable prefab asset. |
prefab_instantiate |
Create a linked instance of a prefab: the scene stores only what you change on it (prefab_overrides), and editing the prefab updates every instance. |
sprite_atlas_pack |
Pack many images (a folder, a list, or globs like "sprites/hero/.png") into one atlas texture plus a .atlas.json describing every frame (trimmed of transparent borders, padded and edge-extruded so nothing bleeds). |
sprite_sheet_slice |
Describe a grid sprite sheet as an atlas (*.atlas.json) so frames get names: give the cell size (or columns/rows), optional margin/spacing, and either names or a prefix. |
audio_generate |
Create a sound effect, ambience loop or piece of music as a WAV file in the project, procedurally and deterministically (the same seed and parameters always give the same audio) - no external generator needed. |
audio_info |
Measure an audio file (wav, mp3, flac): duration, sample rate, channels, peak and RMS in dBFS, integrated loudness (LUFS), clipping, DC offset, silence ratio, whether it starts or ends abruptly (clicks), and for loops how big the jump is at the loop point. |
groom_export |
Write a groom's rest-pose strands to a file for DCC round trips: .hair (Cem Yuksel's format, read by many hair tools), .groom.json (readable) or .skygroom (compact binary). |
prefab_overrides |
How a linked prefab instance differs from its prefab: per-field overrides (with the prefab's value), removed nodes, added entities and its placement (root name/transform, never applied). |
prefab_revert |
Undo overrides so an instance matches its prefab again. |
prefab_apply |
Push an instance's overrides into its prefab file so every instance (in all scenes) gets them. |
prefab_unpack |
Make an instance local: its entities stay exactly as they are but are no longer linked to the prefab (edits to the prefab stop reaching it, and the scene saves it in full); also known as "make local". |
prefab_relink |
Link existing copies of a prefab (made before prefabs were linked, or by copying entities) back to it. |
sprite_sheet_import |
Turn rendered animation frames (a Blender/DCC render: one subfolder of numbered PNGs per clip, e.g. |
asset_import_mesh¶
Import mesh mutating
Import a mesh (.obj, .glb, .gltf — e.g. output of a 3D-generation model) and optionally assign it to an entity (its mesh becomes "asset:
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
path |
string | yes | Project-relative .obj/.glb/.gltf path | |
entity |
integer | string | Entity to assign the mesh to |
asset_request¶
Request generated asset mutating
Queue a request for generated content — kind: mesh (3D model), texture, sprite (2D), audio (sfx), music, video — with a prompt. A connected generator (image/3D/audio model) or an agent fulfills it with asset_complete; results are applied to target automatically.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
kind |
string | yes | Asset kind | mesh texture sprite audio music video |
prompt |
string | yes | What to generate, in detail | |
style |
string | Optional style guide, e.g. "low-poly pastel" | ||
target |
integer | string | Entity that should receive the result |
asset_requests¶
List asset requests read-only
List generated-asset requests and their status.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
status |
string | Filter by status | pending done failed |
asset_complete¶
Complete asset request mutating
Mark a request done with the generated file (project-relative). mesh -> imported and assigned to the target; texture -> set as the target's texture; sprite -> target becomes a camera-facing textured quad.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
id |
integer | yes | Request id | |
path |
string | Generated file path | ||
failed |
boolean | Mark as failed instead |
asset_list¶
List assets read-only
Search the project's assets (meshes, textures, materials, prefabs, scenes, audio...) by type, tag or text (matches path, description and tags; supports * globs). Each line shows path, type, tags, description and, for generated assets, the prompt that made them.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
type |
string | Filter by asset type | mesh texture material prefab scene audio video script agent animation controller sequence |
|
tag |
string | Required tag | ||
query |
string | Text or glob, e.g. "tree" or "props/*.glb" | ||
limit |
integer | Max results (default 60) |
asset_info¶
Asset details read-only
Everything about one asset: GUID, type, tags, description, provenance, import settings, which entities use it, and type-specific data (material fields, prefab contents).
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
asset |
string | yes | Path, "asset:path" or "guid:..." |
asset_preview¶
Look at an asset read-only
Render an isolated preview image of a mesh, material (on a sphere), texture or prefab — look before you place it.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
asset |
string | yes | Asset path or guid | |
size |
integer | Image size in pixels (default 384) |
asset_import¶
Import asset mutating
Register a file placed in the project (e.g. by a generator) as an asset. Meshes (.glb/.gltf/.obj/.ply/.stl) are imported — glTF / OBJ+MTL materials become material assets, PLY/OBJ vertex colors are kept — and can be placed as a new entity right away. Rigged / animated glTF characters also get an animation library (
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
path |
string | yes | Project-relative file path | |
create_entity |
string | If set, create an entity with this name using the mesh | ||
position |
number[3] | Position for the created entity | ||
description |
string | What the asset is (helps future searches) | ||
tags |
string[] | Tags | ||
normalize |
boolean | Scale meshes to fit 1 m (default true; rigged characters default to their real size); false keeps real-world units | ||
z_up |
boolean | The mesh is Z-up (CAD, scans, some exporters) — rotate to Y-up | ||
lods |
boolean | Build the automatic level-of-detail chain for meshes of 3,000+ triangles (default true). false for meshes whose edges must stay exact: voxel or terrain chunks, modular pieces that meet seamlessly |
asset_tag¶
Describe & tag asset mutating
Set an asset's tags and/or description (and provenance). Good descriptions make assets findable by other agents later.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
asset |
string | yes | Asset path or guid | |
tags |
string[] | Replace tags | ||
description |
string | One-line description | ||
source |
object | Provenance fields to merge, e.g. |
asset_move¶
Move / rename asset mutating
Rename or move an asset file (its .meta and GUID move with it) and update every reference in the open scene. The file move itself is not undoable — move it back with another asset_move.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
asset |
string | yes | Asset path or guid | |
to |
string | yes | New project-relative path (same extension) |
asset_refresh¶
Rescan assets read-only
Rescan the project folder for new or changed files (the editor also does this automatically).
Takes no arguments.
material_create¶
Create material mutating
Create a reusable material asset (*.mat.json): color, metallic, roughness, emissive (glows with bloom), albedo texture with tiling, unlit. Character models: preset skin (scatterColor, scatterRadius mm, lobeMix, microNormal), eye (irisCenter, irisRadius, irisDepth, corneaRoughness, eyeShadow), cloth (sheenColor, sheenRoughness, fuzz), hair_card (hairShift, hairSpecular, hairDirection, alphaMode dither|coverage). Assign it with material_assign. Example: {"path": "materials/face.mat.json", "preset": "skin", "texture": "textures/face.png"}.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
color |
color | Base color (multiplied with the texture) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
metallic |
number | 0 = dielectric, 1 = metal | 0 .. 1 | |
roughness |
number | 0 = mirror, 1 = matte | 0.02 .. 1 | |
emissive |
color | Emitted light; alpha is strength (glows with bloom) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
texture |
string | Albedo texture path (png/jpg), project-relative | ||
tilingU |
number | Texture repeats along U | 0.01 .. 1000 | |
tilingV |
number | Texture repeats along V | 0.01 .. 1000 | |
unlit |
boolean | Ignore lighting (flat look for 2D / UI / stylized) | ||
shading |
string | pbr = physically based, toon = cel bands + crisp highlights, unlit = flat, water = animated waves; character models: skin (subsurface scattering, dual-lobe specular, pores, transmission), eye (refracted iris, wet cornea, shadowed corners), cloth (sheen and fuzz), hair_card (anisotropic strand highlights, dithered or coverage alpha) | pbr toon unlit water skin eye cloth hair_card |
|
normalMap |
string | Normal map (png), project-relative | ||
ormMap |
string | Occlusion/roughness/metallic map (R/G/B), project-relative | ||
emissiveMap |
string | Emission map, multiplied with emissive | ||
normalStrength |
number | Normal map strength | 0 .. 4 | |
triplanar |
boolean | World-space texture projection (tiling = repeats per meter) | ||
clearcoat |
number | Glossy lacquer layer (car paint, varnish) | 0 .. 1 | |
subsurface |
number | Light bleeding through (skin, leaves, wax, snow) | 0 .. 1 | |
rim |
number | Stylized rim light | 0 .. 4 | |
outline |
number | Cartoon outline width in pixels | 0 .. 12 | |
outlineColor |
color | Outline color — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
doubleSided |
boolean | Render both faces | ||
occlusionStrength |
number | Ambient occlusion from the ORM map's red channel | 0 .. 1 | |
alphaCutoff |
number | Alpha-tested cutout threshold (foliage, sails, fences); 0 = off | 0 .. 1 | |
scatterColor |
color | skin: relative distance each color scatters under the surface (red farthest: the warm glow in shadow edges and backlit ears) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
scatterRadius |
number | skin: scattering distance of the reddest light in millimeters (1-4) | 0 .. 50 | |
lobeMix |
number | skin: weight of the second, broader specular lobe (0.1-0.2) | 0 .. 1 | |
lobeRoughness |
number[2] | skin: roughness multipliers of the two specular lobes [sharp, broad] | ||
microNormal |
number | skin: procedural pore detail strength (fades with distance) | 0 .. 2 | |
microNormalTiling |
number | skin: pore detail repeats per UV unit | 1 .. 4000 | |
transmission |
number | skin: light through thin parts (ears, nostrils, fingers), from the sun's shadow-map thickness | 0 .. 4 | |
irisCenter |
number[2] | eye: UV of the iris center in the eye texture | ||
irisCenter2 |
number[2] | eye: UV of a second iris when both eyes share one texture (each pixel uses the nearer); [-1, -1] = none | ||
irisRadius |
number | eye: UV radius of the iris | 0.001 .. 0.5 | |
irisDepth |
number | eye: parallax depth of the iris under the cornea (UV units) | 0 .. 0.3 | |
corneaRoughness |
number | eye: roughness of the wet cornea highlight | 0.01 .. 0.5 | |
eyeShadow |
number | eye: darkening toward the eye corners (lids and lashes) | 0 .. 1 | |
limbusDarkening |
number | eye: dark ring around the iris | 0 .. 1 | |
sheenColor |
color | cloth: color of the soft sheen at grazing angles (velvet, wool, cotton) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
sheenRoughness |
number | cloth: 0.3 satin .. 1 felt | 0.07 .. 1 | |
fuzz |
number | cloth: extra rim of loose fibers | 0 .. 2 | |
hairShift |
number | hair_card: primary highlight shift along the strand | -1 .. 1 | |
hairSpecular |
number | hair_card: highlight strength | 0 .. 4 | |
hairDirection |
string | hair_card: strand direction in the card's UVs (root to tip); auto = found per pixel from the strand pattern of the texture (atlases whose cards run either way) | auto v -v u -u |
|
alphaMode |
string | hair_card: dither = stochastic transparency that resolves to soft strands under TAA and stills; coverage = alpha to coverage (MSAA) | dither coverage |
|
clearcoatRoughness |
number | Roughness of the clearcoat layer (0.02 mirror lacquer .. 0.3 satin; default 0.06) | 0 .. 1 | |
flakes |
number | Metallic flakes in the base layer (car paint sparkle): share of the base reflection, 0 = none, 0.3-0.6 = metallic paint | 0 .. 1 | |
flakeSize |
number | Flake size in meters in the mesh's own space (default 0.0015; real flakes are smaller, a little larger reads better on screen) | 5e-05 .. 0.05 | |
scrollU |
number | Texture scroll along U in UV units per second (flowing lava, rivers, conveyor belts); 0 = still | -100 .. 100 | |
scrollV |
number | Texture scroll along V in UV units per second; 0 = still | -100 .. 100 | |
path |
string | yes | Project-relative path ending in .mat.json, e.g. materials/stone.mat.json | |
preset |
string | Start from a built-in material (other fields override it) | gold silver copper chrome brushed_steel iron plastic rubber ceramic car_paint glass water ice skin wax leaves snow velvet neon toon toon_metal clay eye cloth hair_card |
material_update¶
Update material mutating
Change fields of an existing material; every entity using it updates instantly.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
color |
color | Base color (multiplied with the texture) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
metallic |
number | 0 = dielectric, 1 = metal | 0 .. 1 | |
roughness |
number | 0 = mirror, 1 = matte | 0.02 .. 1 | |
emissive |
color | Emitted light; alpha is strength (glows with bloom) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
texture |
string | Albedo texture path (png/jpg), project-relative | ||
tilingU |
number | Texture repeats along U | 0.01 .. 1000 | |
tilingV |
number | Texture repeats along V | 0.01 .. 1000 | |
unlit |
boolean | Ignore lighting (flat look for 2D / UI / stylized) | ||
shading |
string | pbr = physically based, toon = cel bands + crisp highlights, unlit = flat, water = animated waves; character models: skin (subsurface scattering, dual-lobe specular, pores, transmission), eye (refracted iris, wet cornea, shadowed corners), cloth (sheen and fuzz), hair_card (anisotropic strand highlights, dithered or coverage alpha) | pbr toon unlit water skin eye cloth hair_card |
|
normalMap |
string | Normal map (png), project-relative | ||
ormMap |
string | Occlusion/roughness/metallic map (R/G/B), project-relative | ||
emissiveMap |
string | Emission map, multiplied with emissive | ||
normalStrength |
number | Normal map strength | 0 .. 4 | |
triplanar |
boolean | World-space texture projection (tiling = repeats per meter) | ||
clearcoat |
number | Glossy lacquer layer (car paint, varnish) | 0 .. 1 | |
subsurface |
number | Light bleeding through (skin, leaves, wax, snow) | 0 .. 1 | |
rim |
number | Stylized rim light | 0 .. 4 | |
outline |
number | Cartoon outline width in pixels | 0 .. 12 | |
outlineColor |
color | Outline color — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
doubleSided |
boolean | Render both faces | ||
occlusionStrength |
number | Ambient occlusion from the ORM map's red channel | 0 .. 1 | |
alphaCutoff |
number | Alpha-tested cutout threshold (foliage, sails, fences); 0 = off | 0 .. 1 | |
scatterColor |
color | skin: relative distance each color scatters under the surface (red farthest: the warm glow in shadow edges and backlit ears) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
scatterRadius |
number | skin: scattering distance of the reddest light in millimeters (1-4) | 0 .. 50 | |
lobeMix |
number | skin: weight of the second, broader specular lobe (0.1-0.2) | 0 .. 1 | |
lobeRoughness |
number[2] | skin: roughness multipliers of the two specular lobes [sharp, broad] | ||
microNormal |
number | skin: procedural pore detail strength (fades with distance) | 0 .. 2 | |
microNormalTiling |
number | skin: pore detail repeats per UV unit | 1 .. 4000 | |
transmission |
number | skin: light through thin parts (ears, nostrils, fingers), from the sun's shadow-map thickness | 0 .. 4 | |
irisCenter |
number[2] | eye: UV of the iris center in the eye texture | ||
irisCenter2 |
number[2] | eye: UV of a second iris when both eyes share one texture (each pixel uses the nearer); [-1, -1] = none | ||
irisRadius |
number | eye: UV radius of the iris | 0.001 .. 0.5 | |
irisDepth |
number | eye: parallax depth of the iris under the cornea (UV units) | 0 .. 0.3 | |
corneaRoughness |
number | eye: roughness of the wet cornea highlight | 0.01 .. 0.5 | |
eyeShadow |
number | eye: darkening toward the eye corners (lids and lashes) | 0 .. 1 | |
limbusDarkening |
number | eye: dark ring around the iris | 0 .. 1 | |
sheenColor |
color | cloth: color of the soft sheen at grazing angles (velvet, wool, cotton) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1 | ||
sheenRoughness |
number | cloth: 0.3 satin .. 1 felt | 0.07 .. 1 | |
fuzz |
number | cloth: extra rim of loose fibers | 0 .. 2 | |
hairShift |
number | hair_card: primary highlight shift along the strand | -1 .. 1 | |
hairSpecular |
number | hair_card: highlight strength | 0 .. 4 | |
hairDirection |
string | hair_card: strand direction in the card's UVs (root to tip); auto = found per pixel from the strand pattern of the texture (atlases whose cards run either way) | auto v -v u -u |
|
alphaMode |
string | hair_card: dither = stochastic transparency that resolves to soft strands under TAA and stills; coverage = alpha to coverage (MSAA) | dither coverage |
|
clearcoatRoughness |
number | Roughness of the clearcoat layer (0.02 mirror lacquer .. 0.3 satin; default 0.06) | 0 .. 1 | |
flakes |
number | Metallic flakes in the base layer (car paint sparkle): share of the base reflection, 0 = none, 0.3-0.6 = metallic paint | 0 .. 1 | |
flakeSize |
number | Flake size in meters in the mesh's own space (default 0.0015; real flakes are smaller, a little larger reads better on screen) | 5e-05 .. 0.05 | |
scrollU |
number | Texture scroll along U in UV units per second (flowing lava, rivers, conveyor belts); 0 = still | -100 .. 100 | |
scrollV |
number | Texture scroll along V in UV units per second; 0 = still | -100 .. 100 | |
path |
string | yes | Project-relative path ending in .mat.json, e.g. materials/stone.mat.json | |
preset |
string | Start from a built-in material (other fields override it) | gold silver copper chrome brushed_steel iron plastic rubber ceramic car_paint glass water ice skin wax leaves snow velvet neon toon toon_metal clay eye cloth hair_card |
texture_generate¶
Generate PBR texture mutating
Procedurally generate a seamless PBR texture set — albedo, normal map and ORM (occlusion/roughness/metallic) — for realistic or stylized surfaces: bricks, planks, cobblestone, rock, rust, marble, fabric, scales, ... With create_material it also writes a ready material (triplanar by default, so it works on scaled primitives without stretching). Colors override the kind's defaults. The soft kinds glow (radial) and curtain (vertical rays fading upward) have transparent edges and make self-lit effect materials: particles, light pools, fake reflections, auroras, light shafts, steam.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
kind |
string | yes | Pattern | noise marble wood planks bricks tiles cobblestone grass dirt sand rock metal_brushed rust fabric checker stripes hexagons scales stylized glow curtain |
name |
string | yes | Base path without extension, e.g. textures/old_bricks | |
size |
integer | Pixels, power of two 64..2048 (default 512) | ||
seed |
integer | Variation seed (default 1) | ||
scale |
number | Feature count across the tile (kind default if omitted) | ||
color1 |
string | Primary color #rrggbb | ||
color2 |
string | Secondary color #rrggbb | ||
color3 |
string | Accent color (mortar, grout, veins, rust) #rrggbb | ||
roughness |
number | Base roughness 0..1 | ||
metallic |
number | Metallic 0..1 | ||
variation |
number | Color / height variation 0..1 | ||
bump |
number | Normal strength (default 1) | ||
create_material |
boolean | Also create materials/<name>.mat.json using the maps (default true) | ||
tiling |
number | Material repeats per meter (triplanar) — default 0.5 | ||
glow |
number | Emission strength for the soft effect kinds glow / curtain (default 1.5) |
material_assign¶
Assign material mutating
Use a material asset on one or more entities (sets mesh.material; empty string clears it).
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entities |
integer | string[] | yes | Entities | |
material |
string | yes | Material path (*.mat.json) or "" |
prefab_create¶
Save prefab mutating
Save an entity and all its children (components, behaviors, vars, tags) as a reusable prefab asset. Instantiate it with prefab_instantiate, scatter, or Wander spawn("prefab:path"). By default the entity itself becomes a linked instance of the new prefab (link=false leaves it unlinked).
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | yes | Entity id (number) or exact name | |
path |
string | yes | Project-relative path ending in .prefab.json, e.g. prefabs/cottage.prefab.json | |
description |
string | What it is | ||
tags |
string[] | Tags | ||
link |
boolean | Link the entity to the new prefab (default true) |
prefab_instantiate¶
Place prefab mutating
Create a linked instance of a prefab: the scene stores only what you change on it (prefab_overrides), and editing the prefab updates every instance. Optionally drop it onto the surface below its position.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
prefab |
string | yes | Prefab path | |
position |
number[3] | World position (default origin) | ||
yaw |
number | Rotation around Y in degrees | ||
rotation |
number[3] | Full rotation in degrees (x, y, z); overrides yaw | ||
scale |
number | Uniform scale multiplier (default 1) | ||
parent |
integer | string | Parent entity | ||
name |
string | Name for the instance root | ||
on_surface |
boolean | Drop onto the geometry below (default false) |
sprite_atlas_pack¶
Pack sprite atlas mutating
Pack many images (a folder, a list, or globs like "sprites/hero/.png") into one atlas texture plus a .atlas.json describing every frame (trimmed of transparent borders, padded and edge-extruded so nothing bleeds). Frames are named after their files and keep natural order (run_2 before run_10). Sprites then use {"texture": "
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
folder |
string | Folder of images (non-recursive) | ||
inputs |
string[] | Image paths or globs (project-relative) | ||
output |
string | Atlas JSON path (default: <folder>.atlas.json) | ||
padding |
integer | Pixels between frames (default 2) | ||
trim |
boolean | Trim transparent borders (default true) | ||
extrude |
integer | Edge pixels repeated into the padding (default 1) | ||
max_size |
integer | Maximum atlas size (default 4096) | ||
power_of_two |
boolean | Power-of-two atlas size | ||
fps |
number | Frame rate for suggested clips (default 10) |
sprite_sheet_slice¶
Slice sprite sheet mutating
Describe a grid sprite sheet as an atlas (*.atlas.json) so frames get names: give the cell size (or columns/rows), optional margin/spacing, and either names or a prefix. animations turns rows (or index ranges) into sprite_anim clips, and entity applies the sprite and its animations to an entity in one step. Example: {"image": "art/knight.png", "cell": [32, 32], "animations": {"idle": {"row": 0, "fps": 6}, "run": {"row": 1, "fps": 12}, "attack": {"frames": "16-21", "fps": 14, "loop": false}}, "entity": "Knight"}
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
image |
string | yes | Sheet image (project-relative) | |
cell |
integer[] | Cell size [w, h] in pixels | ||
columns |
integer | Columns (instead of cell) | ||
rows |
integer | Rows (instead of cell) | ||
margin |
integer | Border around the grid (pixels) | ||
spacing |
integer | Gap between cells (pixels) | ||
prefix |
string | Frame name prefix (default: image name + "_") | ||
names |
string[] | Frame names in order (left->right, top->bottom) | ||
skip_empty |
boolean | Drop fully transparent cells (default true) | ||
output |
string | Atlas path (default: <image>.atlas.json) | ||
animations |
object | clip -> | ||
entity |
integer | string | Apply: sprite (atlas) + sprite_anim (clips) on this entity | ||
pixels_per_unit |
number | With entity: sprite pixelsPerUnit (default: cell height, i.e. 1 cell = 1 unit) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "sprite_sheet_slice",
"arguments": {
"image": "art/knight.png",
"cell": [
32,
32
],
"animations": {
"idle": {
"row": 0,
"fps": 6
},
"run": {
"row": 1,
"fps": 12
},
"attack": {
"frames": "16-21",
"fps": 14,
"loop": false
}
},
"entity": "Knight"
}
}
}
audio_generate¶
Generate sound or music mutating
Create a sound effect, ambience loop or piece of music as a WAV file in the project, procedurally and deterministically (the same seed and parameters always give the same audio) - no external generator needed. Presets: jump, coin, pickup, hit, explosion, laser, powerup, footstep_grass, footstep_stone, footstep_wood, door, ui_click, ui_hover, error, swoosh, shoot, wind_loop, engine_loop, rain_loop, fire_crackle_loop, ocean_waves_loop, ambient_drone, heartbeat. Names ending in _loop loop seamlessly (use them for ambience; set loop on the audio component). Use seed and variations for natural variety (footsteps!). Customize a preset with pitch (multiplier) and volume, or fully with params: layers of oscillators/noise with pitch slides, arpeggios, envelopes, filters and echo/reverb (call with list=true for the parameter reference). Music: pass music {mood: calm, happy, sad, tense, epic, mysterious, eerie, adventure, battle; tempo, key like "A minor", progression like "i VI III VII", bars, energy 0..1, reverb, and pad/bass/arp/melody/drums on/off}; it loops seamlessly. Pass entity to create or update that entity's audio component with the clip (loops, bus and spatial settings are chosen from the kind). The result includes loudness stats; check them with audio_info and audition with audio_play. Examples: {"preset":"jump","path":"audio/jump.wav"}; {"preset":"footstep_stone","variations":4}; {"music":{"mood":"epic","tempo":110,"bars":16},"path":"audio/theme.wav"}.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
preset |
string | Sound effect preset | jump coin pickup hit explosion laser powerup footstep_grass footstep_stone footstep_wood door ui_click ui_hover error swoosh shoot wind_loop engine_loop rain_loop fire_crackle_loop ocean_waves_loop ambient_drone heartbeat |
|
params |
object | Custom sound parameters (see list=true): {layers:[{wave, freq, slide, attack, decay, lowpass, ...}], echo, reverb, volume, loopSeconds}. With a preset, these replace the preset's matching fields. | ||
music |
object | Generate music instead: | ||
path |
string | Output path, e.g. audio/jump.wav (default audio/<name>_<seed>.wav) | ||
seed |
integer | Variation seed (default 1) | ||
variations |
integer | Generate N variants with seeds seed..seed+N-1 (sfx only, 1..16, default 1); files get _1, _2 ... suffixes | ||
pitch |
number | Multiplier on the pitch of the preset's tonal layers (e.g. 0.5 = an octave lower) | ||
volume |
number | Output gain 0..4 (default 1; the sound is normalized to 0.9 peak first) | ||
entity |
integer | string | Create/update this entity's audio component with the clip | ||
description |
string | What the sound is (stored with the asset) | ||
tags |
string[] | Asset tags | ||
list |
boolean | Only list presets, moods and the parameter reference; generate nothing |
audio_info¶
Analyze audio read-only
Measure an audio file (wav, mp3, flac): duration, sample rate, channels, peak and RMS in dBFS, integrated loudness (LUFS), clipping, DC offset, silence ratio, whether it starts or ends abruptly (clicks), and for loops how big the jump is at the loop point. Returns warnings (clipping, too quiet/loud, click risks, loop seam) and the asset's provenance. Use it to verify generated audio since you cannot listen: sound effects around -23 to -14 LUFS, music around -20 to -16, ambience quieter. Example: {"path":"audio/jump.wav"}.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
path |
string | yes | Project-relative audio file |
groom_export¶
Export groom strands read-only
Write a groom's rest-pose strands to a file for DCC round trips: .hair (Cem Yuksel's format, read by many hair tools), .groom.json (readable) or .skygroom (compact binary). Paths are project-relative.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | yes | Entity with a groom | |
path |
string | yes | Output file (.hair, .groom.json, .skygroom) |
prefab_overrides¶
Prefab overrides read-only
How a linked prefab instance differs from its prefab: per-field overrides (with the prefab's value), removed nodes, added entities and its placement (root name/transform, never applied). entity may be the instance root or any entity inside it. Without entity: every instance in the scene with its override count. Then use prefab_revert to undo overrides or prefab_apply to push them into the prefab file.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | An instance root or member; omit to list all instances | ||
prefab |
string | Only instances of this prefab (path) when listing |
prefab_revert¶
Revert prefab overrides mutating
Undo overrides so an instance matches its prefab again. property reverts one override of entity ("light.intensity", "name", "vars.hp", "collider" for an added/removed component); without it, all of that entity's overrides (placement kept). all: true reverts the whole instance and restores removed nodes (added entities stay). Undoable.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | yes | Instance root or member | |
property |
string | One override to revert, as listed by prefab_overrides | ||
all |
boolean | Revert the whole instance (default false) |
Minimal call with the required arguments; see the table for everything else.
prefab_apply¶
Apply overrides to prefab mutating
Push an instance's overrides into its prefab file so every instance (in all scenes) gets them. Without property: everything — overrides, removed nodes and added entities (they become prefab nodes and stay linked). With property: only that override of entity. Placement (root name/transform) is never applied. Other instances in this scene update immediately and keep their own overrides. Undo restores the scene; the file keeps the new version (re-apply or edit to change it back).
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | yes | Instance root or member | |
property |
string | Apply only this override of entity (e.g. "mesh.color") |
Minimal call with the required arguments; see the table for everything else.
prefab_unpack¶
Unpack prefab instance mutating
Make an instance local: its entities stay exactly as they are but are no longer linked to the prefab (edits to the prefab stop reaching it, and the scene saves it in full); also known as "make local". Undoable.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
entity |
integer | string | yes | Instance root or member |
Minimal call with the required arguments; see the table for everything else.
prefab_relink¶
Relink prefab copies mutating
Link existing copies of a prefab (made before prefabs were linked, or by copying entities) back to it. A candidate links when its hierarchy matches the prefab node for node (same child names in order) and it has at most max_overrides differences besides placement; values are never changed (differences become overrides). Without entities the whole scene is searched. dry_run reports without linking.
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
prefab |
string | yes | Prefab path, e.g. prefabs/tree.prefab.json | |
entities |
integer | string[] | Candidates (default: every unlinked entity) | ||
max_overrides |
integer | Most differences allowed (default 0: exact copies only) | ||
dry_run |
boolean | Only report what would be linked |
sprite_sheet_import¶
Import rendered sprite animations mutating
Turn rendered animation frames (a Blender/DCC render: one subfolder of numbered PNGs per clip, e.g. renders/heroine/run/0001.png; folders starting with _ or . are skipped) into packed sprite atlases with sprite_anim clips, plus a matching normal-map atlas (from a parallel folder of normal-pass frames) so 2D lights shade the animation. Frames are trimmed and packed; clips that do not fit one atlas spill into more (each clip then names its texture). downsample averages supersampled renders (2 = render at 2x for smooth edges). entity applies sprite (pivot, size), sprite_anim (clips) and lighting in one undoable step. Example: {"folder": "renders/heroine", "normals": "renders/heroine_normals", "output": "art/heroine/heroine", "downsample": 2, "fps": 30, "clips": {"attack1": {"loop": false, "events": {"4": "hit"}}}, "entity": "Heroine", "pivot": [0.5, 0.08], "pixels_per_unit": 150}
| Argument | Type | Required | Description | Values |
|---|---|---|---|---|
folder |
string | yes | Folder with one subfolder of numbered PNG frames per clip (project-relative) | |
normals |
string | Folder with the same clip subfolders holding normal-pass frames (optional) | ||
output |
string | yes | Output path without extension: writes <output>.png, <output>_n.png, <output>.atlas.json (and _2, _3 ... when clips spill over) | |
clips |
object | Per clip: {fps, loop, events: {"frame": "name"}, name (rename)}; clips not listed use fps and loop true | ||
only |
string[] | Import only these clip folders | ||
fps |
number | Default frames per second (default 24) | ||
downsample |
integer | Average NxN source pixels into one (1-4, default 1) | ||
max_size |
integer | Maximum atlas size in pixels (default 4096) | ||
padding |
integer | Pixels between frames (default 2) | ||
entity |
integer | string | Apply the sprite, animations and normal map to this entity | ||
pivot |
number[] | With entity: pivot in the untrimmed frame (0..1, [0.5, 0] = feet) | ||
pixels_per_unit |
number | With entity: sprite pixelsPerUnit (after downsampling) | ||
clip |
string | With entity: clip to start (default: the first) |
skywalker call sprite_sheet_import '{"folder": "renders/heroine", "normals": "renders/heroine_normals", "output": "art/heroine/heroine", "downsample": 2, "fps": 30, "clips": {"attack1": {"loop": false, "events": {"4": "hit"}}}, "entity": "Heroine", "pivot": [0.5, 0.08], "pixels_per_unit": 150}' --project my_game
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "sprite_sheet_import",
"arguments": {
"folder": "renders/heroine",
"normals": "renders/heroine_normals",
"output": "art/heroine/heroine",
"downsample": 2,
"fps": 30,
"clips": {
"attack1": {
"loop": false,
"events": {
"4": "hit"
}
}
},
"entity": "Heroine",
"pivot": [
0.5,
0.08
],
"pixels_per_unit": 150
}
}
}