Skip to main content

Scene Format

A scene is a JSON file inside the scenes/ directory.
It describes a hierarchy of nodes — cameras, lights, model references, probes, skydomes, and logical groups.

Scenes are reference-only: they contain no geometry, texture, or material data. All of that lives in model descriptors (see Model Descriptors). A scene node is a transform + a pointer to a descriptor.


Top-level structure

{
"version": "1.0",
"description": "Optional human-readable description",

"settings": {
"ambient": [r, g, b]
},

"nodes": [ ... ]
}
FieldTypeDescription
versionstringSchema version ("1.0")
descriptionstringOptional scene description
settings.ambient[r, g, b]Scene-wide ambient light colour (0–1 each channel)
nodesarrayRoot-level node list (see below)

Nodes

Every node shares a common base, then adds type-specific fields.

{
"name": "uniqueName",
"type": "<node type>",
"transform": { ... },
"properties": { ... },
"children": [ ... ]
}
FieldRequiredDescription
nameyesUnique identifier within the scene
typeyesNode type — see Node Types for the full reference
transformnoPosition / orientation (see Transform)
propertiesnoType-agnostic flags (e.g. cast_shadow, mobility)
childrennoNested child nodes — same format as the root nodes array

Nodes can be nested to any depth. Children inherit their parent's transform (applied top-down). This is useful for grouping an entire level under a single anchor so it can be repositioned with one transform change.


Transform

"transform": {
"translate": [x, y, z],
"rotate": [pitch_deg, yaw_deg, roll_deg],
"scale": [x, y, z]
}

All fields are optional. Omitted fields default to identity (zero translation, zero rotation, unit scale). Children accumulate their parent's transform.


Properties

"properties": {
"mobility": "static",
"cast_shadow": true,
"receive_shadow": true,
"visible": true
}

All are optional and default to sensible engine defaults. mobility defaults to "dynamic". Shape, material, and texture overrides do not belong here — put them in the model descriptor.

mobilityMeaning
"static"Never moves — eligible for static batching and baked shadows
"dynamic"May move every frame — updated in the render loop (default)
"kinematic"Driven by animation or script, not free physics (reserved)