Skip to main content

Node Types

All nodes share the same base structure. Type-specific data lives in a matching named object. See Scene Format for the full scene format and transform/ properties reference.

{
"name": "uniqueName",
"type": "<node type>",
"transform": { ... },
"properties": { ... },
"children": [ ... ]
}

Quick reference

TypeCategoryImplementedDescription
groupStructureInvisible container, groups children under a shared transform
srcStructureImports an external node-collection file (prefab/include)
modelGeometryMesh from a model descriptor — glTF asset or engine-native primitive
skydomeGeometrySky backdrop mesh from a skydome model descriptor
cameraCameraPerspective camera
lightLightingDirectional, point, or spot light
probeLightingReflection / IBL capture probe
environmentLightingIBL environment descriptor + optional skydome blur
markerGameplayInvisible named point — spawn, attach, nav target
triggerGameplayInvisible volume that fires events on enter/exit
audioAudio🚧 planned3D positional audio source
decalRendering🚧 plannedProjects a texture onto underlying geometry
post_process_volumeRendering🚧 plannedPer-zone override for post-processing settings

Structure

group

A logical container with no geometry. Useful for organising a scene and applying a shared transform to a set of children.

{
"name": "roomA",
"type": "group",
"transform": { "translate": [10.0, 0.0, 0.0] },
"children": [ ... ]
}

src

Pulls in nodes from an external JSON file — the engine's prefab / include mechanism. The referenced file contains a plain array of nodes using the same format as the root nodes array.

{
"name": "candleRig",
"type": "src",
"src": "scenes://light_rigs/candle_rig.json",
"transform": { "translate": [2.0, 0.0, -1.0] }
}

Referenced file format (candle_rig.json):

[
{
"name": "candle_flame",
"type": "light",
"light": { "type": "point", "color": [1.0, 0.6, 0.1], "intensity": 2.0, "radius": 1.5 }
}
]
FieldRequiredDescription
srcyesscenes://-relative path to the node-collection file
transformnoPositions/orients the entire imported group
childrennoAdditional local nodes appended after the imported ones

Geometry

model

A mesh loaded from a model descriptor (models:// path). The descriptor determines the mesh source — a glTF asset or a glitter_primitive procedural shape. See Model Descriptors for the full descriptor format.

The scene node holds only the instance-specific data: transform and flags. Shape, material, and texture data live in the descriptor, which means the same descriptor can be instanced many times with different transforms.

{
"name": "sponza",
"type": "model",
"model": "models://s0001_sponza.json",
"properties": {
"mobility": "static",
"cast_shadow": true
}
}
{
"name": "pillar_A",
"type": "model",
"model": "models://pg_pillar.json",
"transform": { "translate": [-3.5, 1.75, 11.0] },
"properties": { "mobility": "static", "cast_shadow": true }
}

properties.mobility

ValueMeaning
"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)

skydome

A sky backdrop mesh. References a skydome model descriptor (models:// path to a glitter_skydome descriptor). Use together with an environment node to set up a complete sky setup.

{
"name": "sky",
"type": "skydome",
"model": "models://d001_sun_and_clouds.json"
}
FieldRequiredDescription
modelyesmodels:// path to a glitter_skydome descriptor

Camera

camera

Glitter supports both a legacy (direct FoV) and a physically-based (focal length + sensor size) camera model. See Camera System for the full reference including the sensor profile database.

Legacy — field of view:

{
"name": "mainCamera",
"type": "camera",
"camera": {
"fov_deg": 75.0,
"near": 0.1,
"far": 200.0
},
"transform": {
"translate": [1.0, 1.0, 0.0],
"look_at": [0.0, 0.5, 0.0]
}
}

Physically-based — inline sensor:

{
"name": "filmCamera",
"type": "camera",
"camera": {
"sensorSize": [36, 24],
"focalLength": 50.0,
"aperture": 2.8,
"near": 0.1,
"far": 1000.0
}
}

Physically-based — sensor database:

{
"name": "alexaCamera",
"type": "camera",
"camera": {
"sensor": "cameras://physicallybased/arri_alexa_35.json",
"sensorFormat": "4K 16:9",
"focalLength": 35.0,
"near": 0.1,
"far": 1000.0
}
}
FieldDescription
fov_degVertical field of view in degrees (legacy mode)
sensorSize[width, height] in mm — enables physical FoV calculation
focalLengthLens focal length in mm — used with sensorSize
sensorcameras:// URI to a real-world sensor profile
sensorFormatFormat name to pick from the sensor profile's formats array
aperturef-stop number (default 2.8)
focusDistanceFocus distance in metres (default 1e6)
exposureCompensationEV offset (default 0.0)
nearNear clip plane
farFar clip plane

Lighting

light

See Lighting System for the full reference including physical units, colour temperature, and the real-world light source database.

{
"name": "sun",
"type": "light",
"light": {
"type": "directional",
"direction": [-0.4, -1.0, -0.6],
"temperature": 5778.0,
"intensity": 400.0,
"unit": "lx",
"castShadow": true
}
}
{
"name": "torch",
"type": "light",
"light": {
"type": "point",
"temperature": 2700.0,
"intensity": 800.0,
"unit": "lm",
"radius": 5.0
},
"transform": { "translate": [3.0, 2.0, 0.0] }
}
{
"name": "spotlight",
"type": "light",
"light": {
"type": "spot",
"color": [1.0, 1.0, 1.0],
"intensity": 12.0,
"radius": 10.0,
"cone_inner_deg": 15.0,
"cone_outer_deg": 30.0
},
"transform": { "translate": [0.0, 4.0, 0.0], "rotate": [-90.0, 0.0, 0.0] }
}
FieldApplies toDescription
typeall"directional", "point", or "spot"
colorallRGB colour (0–1)
intensityallBrightness value (see units below)
unitallPhysical unit: "artist" (default), "lm" (lumens), "lx" (lux), "cd/m2" (nits)
directiondirectionalWorld-space direction vector
radiuspoint, spotInfluence radius / attenuation falloff
cone_inner_degspotInner (full-brightness) cone half-angle
cone_outer_degspotOuter (falloff-to-zero) cone half-angle

Physical light units

When "unit" is set, the engine converts intensity to its internal representation:

UnitMeaningConversion
"artist"Engine-scaled (no conversion)Pass-through
"lm"Lumens — luminous fluxPoint: lm / 4π → candela; Spot: adjusted for cone solid angle
"lx"Lux — illuminance (lm/m²)Pass-through (used directly for directional lights)
"cd/m2"Nits — luminancePass-through

probe

A reflection / IBL capture probe. The engine captures a cubemap from this position and uses it for local reflections and ambient light.

{
"name": "probe_south",
"type": "probe",
"probe": { "radius": 8.0 },
"transform": { "translate": [0.0, 1.5, 4.0] }
}
FieldDescription
radiusInfluence sphere radius — objects outside this radius use a different probe

environment

Loads and bakes an IBL environment (irradiance map, pre-filtered specular, etc.). Only one environment node per scene is meaningful; additional ones are ignored.

{
"name": "outdoor_ibl",
"type": "environment",
"environment": "environments://neutral.json",
"properties": {
"blur": 0.0
}
}
FieldRequiredDescription
environmentyesenvironments:// URI to an IBL environment descriptor
properties.blurnoSkydome blur amount — 0.0 = sharp panorama, 1.0 = fully blurred (default 0.0)

See Model Descriptors and the environments folder for available descriptors.


Gameplay

marker

An invisible named point in the world. Used by scripts and the engine to locate spawn points, attach points, camera anchors, waypoints, and similar logical positions.

{
"name": "spawn_player",
"type": "marker",
"transform": { "translate": [0.0, 0.1, 0.0] }
}

Markers have no visual representation at runtime. They can be children of other nodes (e.g. a weapon attach point parented to a character mesh).


trigger

An invisible volume that fires a named event when an object enters or exits it. The Lua script system will listen for these events by marker name.

{
"name": "door_proximity",
"type": "trigger",
"trigger": {
"shape": "box",
"size": [2.0, 2.5, 0.5],
"on_enter": "door_open",
"on_exit": "door_close"
},
"transform": { "translate": [0.0, 1.25, 3.0] }
}
FieldDescription
shape"box" or "sphere"
size[x,y,z] for box, or radius for sphere
on_enterEvent name broadcast when an object enters the volume
on_exitEvent name broadcast when an object exits the volume

Audio

audio

Planned

The audio node type is parsed by the scene loader but has no runtime implementation yet. The JSON format below is forward-compatible — scenes can include it without errors.

A 3D positional audio source. Attenuates with distance.

{
"name": "fireplace_crackle",
"type": "audio",
"audio": {
"src": "sounds://ambience/fireplace.ogg",
"loop": true,
"volume": 0.8,
"radius_min": 1.5,
"radius_max": 8.0
},
"transform": { "translate": [2.0, 0.5, -1.0] }
}
FieldDescription
srcsounds://-relative path to the audio file
loopLoop playback
volume0–1 gain
radius_minFull-volume distance
radius_maxSilence distance (linear falloff between min and max)

Rendering

decal

Planned

The decal node type is parsed by the scene loader but has no runtime implementation yet. The JSON format below is forward-compatible.

Projects a texture onto the geometry beneath it. Good for damage marks, dirt, wet patches, and decor without modifying base meshes.

{
"name": "blood_splat_01",
"type": "decal",
"decal": {
"material": "shaders://decal_pbr.json",
"texture": "textures://decals/blood_01.png",
"size": [0.6, 0.6, 0.2]
},
"transform": { "translate": [1.0, 0.01, 2.0], "rotate": [0.0, 45.0, 0.0] }
}
FieldDescription
materialShader/material package for the decal
textureDiffuse texture to project
size[x,y,depth] — projection box extents

post_process_volume

Planned

The post_process_volume node type is parsed by the scene loader but has no runtime implementation yet. The JSON format below is forward-compatible.

Overrides post-processing settings for objects inside its bounds. Useful for mood changes between areas — a dark cave vs. a bright exterior.

{
"name": "cave_interior",
"type": "post_process_volume",
"post_process_volume": {
"global": false,
"size": [20.0, 8.0, 30.0],
"blend_distance": 2.0,
"tonemap": {
"exposure": 0.4
},
"ssao": {
"radius": 0.3,
"bias": 0.02
}
},
"transform": { "translate": [0.0, 4.0, 0.0] }
}
FieldDescription
globaltrue → affects the whole scene regardless of position
sizeBox extents of the influence volume (ignored when global: true)
blend_distanceDistance over which settings fade in at the volume boundary
tonemap.*Overrides for tonemap settings (e.g. exposure)
ssao.*Overrides for SSAO settings

Any field omitted inside a volume block falls back to the engine config value.