# Scene components (generated)

Sindri AI knowledge pack, file `04-components.md`. Every component a `.scene` or `.prefab` entity may carry: its exact `sindri.*` name, its fields with default values, what each field means, and a real use from an example project.

Start with `00-start-here.md` if you have not read it. Every fact here is copied from the Sindri repository; nothing in this file is a guess.

## Contents of this file

- `sindri.animation.sprite`: Sprite Animation
- `sindri.audio.source`: Audio Source
- `sindri.camera`: Camera
- `sindri.camera.behavior`: Camera Behavior
- `sindri.camera.orbit`: Camera Orbit
- `sindri.effect.burst`: Effect Burst
- `sindri.environment`: Environment
- `sindri.grid.navigation`: Grid Navigation
- `sindri.grid.occupant`: Grid Occupant
- `sindri.grid.placement`: Grid Placement
- `sindri.input.actions`: Input Actions
- `sindri.light`: Light
- `sindri.light2d`: Light 2D
- `sindri.light2d.occluder`: Light Occluder 2D
- `sindri.material`: Material
- `sindri.mesh`: Mesh
- `sindri.model`: Model
- `sindri.particles`: Particles
- `sindri.physics2d.character`: Character 2D
- `sindri.physics2d.collider`: Collider 2D
- `sindri.physics2d.distance_joint`: Distance Joint 2D
- `sindri.physics2d.hinge_joint`: Hinge Joint 2D
- `sindri.physics2d.material`: Physics Material 2D
- `sindri.physics2d.one_way`: One-Way Platform 2D
- `sindri.physics2d.rigid_body`: Rigid Body 2D
- `sindri.physics2d.slider_joint`: Slider Joint 2D
- `sindri.physics2d.spring_joint`: Spring Joint 2D
- `sindri.physics2d.tilemap_collider`: Tilemap Collider 2D
- `sindri.physics2d.world`: Physics 2D World
- `sindri.physics3d.character`: Character 3D
- `sindri.physics3d.collider`: Collider 3D
- `sindri.physics3d.material`: Physics Material 3D
- `sindri.physics3d.model_collider`: Static Model Collider 3D
- `sindri.physics3d.model_convex_collider`: Convex Model Collider 3D
- `sindri.physics3d.rigid_body`: Rigid Body 3D
- `sindri.physics3d.voxel_collider`: Voxel Collider 3D
- `sindri.physics3d.world`: Physics 3D World
- `sindri.sequence`: Sequence
- `sindri.shape`: Shape
- `sindri.sprite`: Sprite
- `sindri.sprite_mask`: Sprite Mask
- `sindri.tags`: Tags
- `sindri.text`: Text
- `sindri.tile_grid`: Tile Grid
- `sindri.tile_volume`: Tile Volume
- `sindri.tilemap`: Tilemap
- `sindri.ui.box`: UI Box
- `sindri.ui.button`: UI Button
- `sindri.ui.dropdown`: UI Dropdown
- `sindri.ui.grid`: UI Grid
- `sindri.ui.image`: UI Image
- `sindri.ui.layout`: UI Layout
- `sindri.ui.option`: UI Option
- `sindri.ui.scroll`: UI Scroll
- `sindri.ui.shape`: UI Shape
- `sindri.ui.slider`: UI Slider
- `sindri.ui.text`: UI Text
- `sindri.ui.text_input`: UI Text Input
- `sindri.ui.toggle`: UI Toggle
- `sindri.voxel_world`: Voxel World


Source: `docs/generated/sindri-capabilities.json`, engine 0.1.0, scene format version 10.

How to read an entry: **Fields** is the full component with every field at its default value; write it under the entity's `components` object keyed by its type name. **Meanings** says what a field is for when its shape cannot: `asset` names a file, `choice` lists the only accepted spellings, `range` bounds a number, `color` is `[r, g, b, a]` from 0 to 1, `angle` is radians, `entity` is another entity's `id`, `mask` is a 32-bit collision mask. `[]` in a path means every item of a list. A component with **no default** names an asset and must be given one.

Two things an entity carries are not components here: its transform (the entity's `transform_3d`, see `05-projects-scenes-prefabs.md`) and its script (`sindri.script`, see `03-scripting-guide.md`).

Registry note, verbatim:

> Every component this engine build registers. `fields` is what the component has; `default_payload` is what a fresh one is, and is null for a type with no honest blank — one naming an asset the engine cannot invent. `addable` says whether a tool can add one without being given anything else. `meanings` says what a field is *for* where the shape alone cannot: which asset kind it names, which spellings it accepts, that it is a color, an angle, a bounded number, a collision mask, or another entity. A path is dotted, and `[]` descends into a list, so `pieces[].friction` describes every piece. A choice that also carries `variants` decides the shape of what holds it: each spelling names the fields the object has when the tag says that word, and writing the word without them is a payload the engine refuses. `apply` says when a tool should apply an edit, by path, the empty path being the whole component and the closest path winning: `instant` as it is made (anything not listed), `settled` once the person stops typing or dragging, `manual` only when they ask, because applying it is a rebuild.


## Components not in the registry

The example projects also use these. They are read by their own systems rather than the registry, so they have no generated field list; the real use below is the pattern, and the named file explains them.


### `sindri.script`, from `examples/model-collision/assets/prefabs/prop.prefab`

```json
{
  "source": "walker.decay",
  "script": "Prop"
}
```

### `weave.style`, from `examples/input/assets/input.scene`

```json
{
  "classes": ["top"]
}
```

`sindri.script` is explained in `03-scripting-guide.md`; `weave.style` in `08-weave-ui.md`.


## `sindri.animation.sprite`: Sprite Animation

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.animation.sprite`

```json
{
  "clips": {},
  "playing": null,
  "speed": 1.0
}
```

### Meanings of `sindri.animation.sprite` fields

- `speed`: range (min: 0.0)

No default: `sindri.animation.sprite` must name what it uses.

## `sindri.audio.source`: Audio Source

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.audio.source`

```json
{
  "autoplay": false,
  "bus": "",
  "clip": "",
  "looping": false,
  "volume": 1.0
}
```

### Meanings of `sindri.audio.source` fields

- `clip`: asset (asset: "audio")
- `volume`: range (max: 1.0, min: 0.0)

No default: `sindri.audio.source` must name what it uses.

### A real `sindri.audio.source`, from `examples/audio/assets/mixer.scene`

```json
{
  "clip": "audio/theme.wav",
  "autoplay": true,
  "looping": true,
  "volume": 0.6
}
```

## `sindri.camera`: Camera

Can be added with no extra data.

### Fields of `sindri.camera`

```json
{
  "far": 100.0,
  "near": 0.10000000149011612,
  "projection": "perspective",
  "vertical_fov_degrees": 60.0
}
```

### Meanings of `sindri.camera` fields

- `fit`: choice (options: ["height", "shorter"])
- `projection`: choice (options: ["perspective", "orthographic"])
  - when `orthographic`, the object also has: `{"far": 100.0, "fit": "height", "near": 0.10000000149011612, "vertical_size": 6.0}`
  - when `perspective`, the object also has: `{"far": 100.0, "near": 0.10000000149011612, "vertical_fov_degrees": 60.0}`

### A real `sindri.camera`, from `examples/transform/assets/transform.scene`

```json
{
  "projection": "perspective",
  "vertical_fov_degrees": 50,
  "near": 0.1,
  "far": 100
}
```

## `sindri.camera.behavior`: Camera Behavior

Can be added with no extra data.

### Fields of `sindri.camera.behavior`

```json
{
  "confine": null,
  "follow": null,
  "shake": {
    "decay": 2.8,
    "frequency": 57.0,
    "phase": 0.0,
    "strength": 0.12,
    "trauma": 0.0
  }
}
```

### Meanings of `sindri.camera.behavior` fields

- `follow.max_speed`: range (min: 0.0)
- `follow.smoothing`: range (min: 0.0)
- `follow.target`: entity
- `shake.decay`: range (min: 0.0)
- `shake.frequency`: range (min: 0.0)
- `shake.strength`: range (min: 0.0)
- `shake.trauma`: range (max: 1.0, min: 0.0)

### A real `sindri.camera.behavior`, from `examples/physics/assets/playground.scene`

```json
{
  "confine": null,
  "follow": null,
  "shake": {
    "decay": 2.4,
    "frequency": 40.0,
    "phase": 0.0,
    "strength": 0.6,
    "trauma": 0.0
  }
}
```

## `sindri.camera.orbit`: Camera Orbit

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.camera.orbit`

```json
{
  "collision_mask": 4294967295,
  "collision_padding": 0.2,
  "distance": 6.0,
  "offset": [0.0, 0.0, 0.0],
  "pitch": 0.35,
  "smoothing": 8.0,
  "target": "target",
  "yaw": 0.0
}
```

### Meanings of `sindri.camera.orbit` fields

- `collision_mask`: range (max: 4294967295.0, min: 0.0)
- `collision_padding`: range (min: 0.0)
- `distance`: range (min: 0.0)
- `pitch`: angle
- `smoothing`: range (min: 0.0)
- `target`: entity
- `yaw`: angle

No default: `sindri.camera.orbit` must name what it uses.

## `sindri.effect.burst`: Effect Burst

Can be added with no extra data.

### Fields of `sindri.effect.burst`

```json
{
  "count": 12,
  "drag": 0.25,
  "fade": true,
  "layer": 0,
  "lifetime": 0.5,
  "size": 0.1,
  "speed": 4.0,
  "spread": 0.5,
  "texture": "procedural:checkerboard",
  "tint": [1.0, 1.0, 1.0, 1.0]
}
```

### Meanings of `sindri.effect.burst` fields

- `texture`: asset (asset: "texture")
- `tint`: color

### A real `sindri.effect.burst`, from `examples/physics/assets/playground.scene`

```json
{
  "count": 14,
  "drag": 1.2,
  "fade": true,
  "layer": 57,
  "lifetime": 0.8,
  "size": 0.22,
  "speed": 5.0,
  "spread": 3.1416,
  "texture": "textures/spark.png",
  "tint": [1.0, 0.85, 0.4, 1.0]
}
```

## `sindri.environment`: Environment

Can be added with no extra data.

### Fields of `sindri.environment`

```json
{
  "ambient_color": [1.0, 1.0, 1.0],
  "ambient_intensity": 1.0,
  "ambient_occlusion": {
    "enabled": true,
    "strength": 0.65
  },
  "background": [0.035, 0.045, 0.065, 1.0],
  "bloom": {
    "enabled": false,
    "intensity": 0.45,
    "knee": 0.2,
    "passes": 3,
    "threshold": 0.65
  },
  "fog": {
    "color": [0.55, 0.65, 0.75],
    "density": 0.0,
    "distance": 64.0,
    "enabled": false,
    "height": 0.0,
    "height_falloff": 0.0,
    "start": 24.0
  },
  "lighting_2d": {
    "ambient": [0.25, 0.25, 0.3],
    "enabled": false
  },
  "post_process": {
    "contrast": 1.0,
    "exposure": 0.0,
    "saturation": 1.0,
    "tone_mapping": "none",
    "vignette": 0.0
  },
  "shadows": {
    "bias": 0.002,
    "distance": 48.0,
    "enabled": true,
    "map_size": 1024
  }
}
```

### Meanings of `sindri.environment` fields

- `ambient_color`: color
- `ambient_intensity`: range (min: 0.0)
- `ambient_occlusion.strength`: range (max: 1.0, min: 0.0)
- `background`: color
- `bloom.intensity`: range (min: 0.0)
- `bloom.knee`: range (max: 1.0, min: 0.0001)
- `bloom.passes`: range (max: 8.0, min: 1.0)
- `bloom.threshold`: range (min: 0.0)
- `fog.color`: color
- `fog.density`: range (max: 1.0, min: 0.0)
- `fog.distance`: range (min: 0.01)
- `fog.height_falloff`: range (max: 1.0, min: 0.0)
- `fog.start`: range (min: 0.0)
- `lighting_2d.ambient`: color
- `post_process.contrast`: range (max: 4.0, min: 0.0)
- `post_process.exposure`: range (max: 8.0, min: -8.0)
- `post_process.saturation`: range (max: 4.0, min: 0.0)
- `post_process.tone_mapping`: choice (options: ["none", "reinhard", "aces"])
- `post_process.vignette`: range (max: 1.0, min: 0.0)
- `shadows.bias`: range (max: 0.05, min: 0.0)
- `shadows.distance`: range (min: 1.0)
- `shadows.map_size`: one_of (options: [256, 512, 1024, 2048])

### A real `sindri.environment`, from `examples/input/assets/input.scene`

```json
{
  "background": [0.004, 0.009, 0.018, 1.0]
}
```

## `sindri.grid.navigation`: Grid Navigation

Can be added with no extra data.

### Fields of `sindri.grid.navigation`

```json
{
  "max_step": 1.0,
  "walls": []
}
```

## `sindri.grid.occupant`: Grid Occupant

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.grid.occupant`

```json
{
  "footprint": [
    [0, 0]
  ],
  "grid": ""
}
```

### Meanings of `sindri.grid.occupant` fields

- `grid`: entity

No default: `sindri.grid.occupant` must name what it uses.

## `sindri.grid.placement`: Grid Placement

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.grid.placement`

```json
{
  "cell": [0, 0],
  "footprint": [
    [0, 0]
  ],
  "grid": "",
  "offset": [0.0, 0.0]
}
```

No default: `sindri.grid.placement` must name what it uses.

## `sindri.input.actions`: Input Actions

Can be added with no extra data.

### Fields of `sindri.input.actions`

```json
{
  "actions": []
}
```

### A real `sindri.input.actions`, from `examples/input/assets/input.scene`

```json
{
  "actions": [
    {
      "name": "move",
      "kind": "vector",
      "bindings": [
        {
          "vector": {
            "up": "key.W",
            "down": "key.S",
            "left": "key.A",
            "right": "key.D"
          }
        },
        {
          "vector": {
            "up": "key.ArrowUp",
            "down": "key.ArrowDown",
            "left": "key.ArrowLeft",
            "right": "key.ArrowRight"
          }
        },
        {
          "vector": {
            "up": "gamepad.dpad_up",
            "down": "gamepad.dpad_down",
            "left": "gamepad.dpad_left",
            "right": "gamepad.dpad_right"
          }
        }
      ]
    },
    {
      "name": "boost",
      "kind": "button",
      "bindings": ["key.Space", "gamepad.south"]
    }
  ]
}
```

## `sindri.light`: Light

Can be added with no extra data.

### Fields of `sindri.light`

```json
{
  "color": [1.0, 0.949999988079071, 0.8600000143051147],
  "enabled": true,
  "inner_angle": 0.3490658402442932,
  "intensity": 1.0,
  "kind": "directional",
  "outer_angle": 0.5235987901687622,
  "range": 8.0
}
```

### Meanings of `sindri.light` fields

- `color`: color
- `inner_angle`: angle
- `intensity`: range (min: 0.0)
- `kind`: choice (options: ["directional", "point", "spot"])
- `outer_angle`: angle
- `range`: range (min: 0.001)

### A real `sindri.light`, from `examples/daynight/assets/daynight.scene`

```json
{
  "kind": "directional",
  "intensity": 0,
  "enabled": false
}
```

## `sindri.light2d`: Light 2D

Can be added with no extra data.

### Fields of `sindri.light2d`

```json
{
  "color": [1.0, 0.8500000238418579, 0.6000000238418579, 1.0],
  "enabled": true,
  "falloff": 1.5,
  "height": 1.0,
  "intensity": 1.0,
  "radius": 4.0,
  "shadow_reach": 0.10000000149011612,
  "shadow_source_radius": 0.0,
  "shadows": false
}
```

### Meanings of `sindri.light2d` fields

- `color`: color
- `falloff`: range (min: 0.01)
- `height`: range (min: 0.0)
- `intensity`: range (min: 0.0)
- `radius`: range (min: 0.01)
- `shadow_reach`: range (min: 0.0)
- `shadow_source_radius`: range (min: 0.0)

## `sindri.light2d.occluder`: Light Occluder 2D

Can be added with no extra data.

### Fields of `sindri.light2d.occluder`

```json
{
  "enabled": true,
  "points": [],
  "shape": "box",
  "size": [1.0, 1.0]
}
```

### Meanings of `sindri.light2d.occluder` fields

- `shape`: choice (options: ["box", "polygon", "tilemap"])
- `size`: range (min: 0.01)

## `sindri.material`: Material

Can be added with no extra data.

### Fields of `sindri.material`

```json
{
  "base_color": [1.0, 1.0, 1.0, 1.0],
  "emissive": [0.0, 0.0, 0.0],
  "metallic": 0.0,
  "override_factors": false,
  "override_sidedness": false,
  "profile": "",
  "roughness": 1.0,
  "sidedness": "inherit"
}
```

### Meanings of `sindri.material` fields

- `base_color`: color
- `profile`: asset (asset: "profile")
- `sidedness`: choice (options: ["inherit", "single", "double"])

### A real `sindri.material`, from `examples/lighting3d/assets/lighting.scene`

```json
{
  "profile": "materials/orange.profile"
}
```

## `sindri.mesh`: Mesh

Can be added with no extra data.

### Fields of `sindri.mesh`

```json
{
  "layer": 0,
  "primitive": "cube",
  "surface": null,
  "texture": "procedural:checkerboard"
}
```

### Meanings of `sindri.mesh` fields

- `texture`: asset (asset: "texture")

### A real `sindri.mesh`, from `examples/transform/assets/transform.scene`

```json
{
  "primitive": "cube",
  "texture": "textures/goal.png"
}
```

## `sindri.model`: Model

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.model`

```json
{
  "asset": "models/model.glb",
  "layer": 0,
  "occluded_color": null
}
```

### Meanings of `sindri.model` fields

- `asset`: asset (asset: "model")

No default: `sindri.model` must name what it uses.

### A real `sindri.model`, from `examples/lighting3d/assets/lighting.scene`

```json
{
  "asset": "models/prop.glb"
}
```

## `sindri.particles`: Particles

Can be added with no extra data.

### Fields of `sindri.particles`

```json
{
  "colors": [
    [1.0, 1.0, 1.0, 1.0],
    [1.0, 1.0, 1.0, 0.0]
  ],
  "direction": 90.0,
  "drag": 0.0,
  "gravity": [0.0, 0.0],
  "layer": 0,
  "lifetime": 1.0,
  "lifetime_spread": 0.20000000298023224,
  "max": 200,
  "offset": [0.0, 0.0],
  "playing": true,
  "random_rotation": false,
  "rate": 10.0,
  "shape": "point",
  "shape_size": [1.0, 1.0],
  "size": 0.10000000149011612,
  "size_end": 0.10000000149011612,
  "space": "world",
  "speed": 2.0,
  "speed_spread": 0.30000001192092896,
  "spin": 0.0,
  "spread": 30.0,
  "texture": "procedural:checkerboard"
}
```

### Meanings of `sindri.particles` fields

- `drag`: range (min: 0.0)
- `lifetime`: range (min: 0.01)
- `rate`: range (min: 0.0)
- `shape`: choice (options: ["point", "circle", "box", "ring"])
- `size`: range (min: 0.0)
- `size_end`: range (min: 0.0)
- `space`: choice (options: ["world", "local"])
- `speed`: range (min: 0.0)
- `texture`: asset (asset: "texture")

## `sindri.physics2d.character`: Character 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.character`

```json
{
  "carry_platforms": true,
  "max_iterations": 8,
  "max_slope_angle": 0.7853981852531433,
  "skin": 0.01,
  "snap_distance": 0.0,
  "step_height": 0.0,
  "up": [0.0, 1.0]
}
```

### Meanings of `sindri.physics2d.character` fields

- `max_slope_angle`: angle

### A real `sindri.physics2d.character`, from `examples/physics/assets/playground.scene`

```json
{
  "skin": 0.01,
  "max_iterations": 8,
  "up": [0.0, 1.0],
  "max_slope_angle": 0.8,
  "snap_distance": 0.25,
  "step_height": 0.3,
  "carry_platforms": true
}
```

## `sindri.physics2d.collider`: Collider 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.collider`

```json
{
  "pieces": [
    {
      "friction": 0.5,
      "layers": {
        "filter": 4294967295,
        "memberships": 4294967295
      },
      "offset": [0.0, 0.0],
      "restitution": 0.0,
      "rotation": 0.0,
      "sensor": false,
      "shape": {
        "half_extents": [0.5, 0.5],
        "shape": "box"
      }
    }
  ]
}
```

### Meanings of `sindri.physics2d.collider` fields

- `pieces[].layers.filter`: mask
- `pieces[].layers.memberships`: mask
- `pieces[].restitution`: range (max: 1.0, min: 0.0)
- `pieces[].rotation`: angle
- `pieces[].shape.shape`: choice (options: ["box", "circle", "capsule"])
  - when `box`, the object also has: `{"half_extents": [0.5, 0.5]}`
  - when `capsule`, the object also has: `{"half_height": 0.5, "radius": 0.25}`
  - when `circle`, the object also has: `{"radius": 0.5}`

### A real `sindri.physics2d.collider`, from `games/flappy/assets/flappy.scene`

```json
{
  "shape": {
    "shape": "circle",
    "radius": 0.36
  },
  "offset": [0, 0],
  "rotation": 0.0,
  "sensor": true,
  "layers": {
    "memberships": 1,
    "filter": 2
  },
  "friction": 0.0,
  "restitution": 0.0
}
```

## `sindri.physics2d.distance_joint`: Distance Joint 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.distance_joint`

```json
{
  "enabled": true,
  "first": "",
  "max_distance": 1.0,
  "second": ""
}
```

### Meanings of `sindri.physics2d.distance_joint` fields

- `first`: entity
- `second`: entity

### A real `sindri.physics2d.distance_joint`, from `examples/physics/assets/playground.scene`

```json
{
  "first": "anvil-hook",
  "second": "anvil",
  "max_distance": 3.0
}
```

## `sindri.physics2d.hinge_joint`: Hinge Joint 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.hinge_joint`

```json
{
  "enabled": true,
  "first": "",
  "first_anchor": [0.0, 0.0],
  "limits_enabled": false,
  "lower_angle": 0.0,
  "motor_damping": 0.0,
  "motor_enabled": false,
  "motor_max_torque": 0.0,
  "motor_mode": "velocity",
  "motor_stiffness": 0.0,
  "motor_target_angle": 0.0,
  "motor_velocity": 0.0,
  "second": "",
  "second_anchor": [0.0, 0.0],
  "upper_angle": 0.0
}
```

### Meanings of `sindri.physics2d.hinge_joint` fields

- `first`: entity
- `lower_angle`: angle
- `motor_mode`: choice (options: ["velocity", "position"])
- `motor_target_angle`: angle
- `second`: entity
- `upper_angle`: angle

### A real `sindri.physics2d.hinge_joint`, from `examples/physics/assets/playground.scene`

```json
{
  "first": "wreck-pivot",
  "second": "wreck-arm",
  "first_anchor": [0.0, 0.0],
  "second_anchor": [0.0, 7.0],
  "limits_enabled": false,
  "lower_angle": 0.0,
  "upper_angle": 0.0,
  "motor_enabled": false,
  "motor_mode": "velocity",
  "motor_velocity": 0.0,
  "motor_max_torque": 0.0,
  "motor_target_angle": 0.0,
  "motor_stiffness": 0.0,
  "motor_damping": 0.0
}
```

## `sindri.physics2d.material`: Physics Material 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.material`

```json
{
  "friction": 0.5,
  "override_friction": false,
  "override_restitution": false,
  "profile": "",
  "restitution": 0.0
}
```

### Meanings of `sindri.physics2d.material` fields

- `profile`: asset (asset: "profile")

### A real `sindri.physics2d.material`, from `examples/physics/assets/playground.scene`

```json
{
  "profile": "materials/ice.profile",
  "override_friction": false,
  "friction": 0.5,
  "override_restitution": false,
  "restitution": 0.0
}
```

## `sindri.physics2d.one_way`: One-Way Platform 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.one_way`

```json
{
  "angle": 0.7853981852531433,
  "normal": [0.0, 1.0]
}
```

### Meanings of `sindri.physics2d.one_way` fields

- `angle`: angle

### A real `sindri.physics2d.one_way`, from `examples/physics/assets/playground.scene`

```json
{
  "normal": [0.0, 1.0],
  "angle": 0.7853982
}
```

## `sindri.physics2d.rigid_body`: Rigid Body 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.rigid_body`

```json
{
  "angular_damping": 0.0,
  "angular_velocity": 0.0,
  "continuous_collision": false,
  "gravity_scale": 1.0,
  "kind": "dynamic",
  "linear_damping": 0.0,
  "linear_velocity": [0.0, 0.0],
  "lock_rotation": false,
  "pose": {
    "position": [0.0, 0.0],
    "rotation": 0.0
  }
}
```

### Meanings of `sindri.physics2d.rigid_body` fields

- `kind`: choice (options: ["static", "dynamic", "kinematic_position", "kinematic_velocity"])
- `pose.rotation`: angle

### A real `sindri.physics2d.rigid_body`, from `games/flappy/assets/flappy.scene`

```json
{
  "kind": "dynamic",
  "pose": {
    "position": [-1.5, 0.5],
    "rotation": 0.0
  },
  "linear_velocity": [0, 0],
  "angular_velocity": 0.0,
  "gravity_scale": 1.0,
  "linear_damping": 0.0,
  "angular_damping": 0.0,
  "lock_rotation": true
}
```

## `sindri.physics2d.slider_joint`: Slider Joint 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.slider_joint`

```json
{
  "enabled": true,
  "first": "",
  "first_anchor": [0.0, 0.0],
  "first_axis": [1.0, 0.0],
  "limits_enabled": false,
  "lower_distance": 0.0,
  "motor_damping": 0.0,
  "motor_enabled": false,
  "motor_max_force": 0.0,
  "motor_mode": "velocity",
  "motor_stiffness": 0.0,
  "motor_target_distance": 0.0,
  "motor_velocity": 0.0,
  "second": "",
  "second_anchor": [0.0, 0.0],
  "second_axis": [1.0, 0.0],
  "upper_distance": 0.0
}
```

### Meanings of `sindri.physics2d.slider_joint` fields

- `first`: entity
- `motor_mode`: choice (options: ["velocity", "position"])
- `second`: entity

### A real `sindri.physics2d.slider_joint`, from `examples/physics/assets/playground.scene`

```json
{
  "first": "button-socket",
  "second": "button-cap",
  "first_anchor": [0, 0.54],
  "second_anchor": [0, 0],
  "first_axis": [0, 1],
  "second_axis": [0, 1],
  "limits_enabled": true,
  "lower_distance": -0.36,
  "upper_distance": 0.0,
  "motor_enabled": false,
  "motor_mode": "velocity",
  "motor_velocity": 0.0,
  "motor_max_force": 0.0,
  "motor_target_distance": 0.0,
  "motor_stiffness": 0.0,
  "motor_damping": 0.0
}
```

## `sindri.physics2d.spring_joint`: Spring Joint 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.spring_joint`

```json
{
  "damping": 1.0,
  "enabled": true,
  "first": "",
  "first_anchor": [0.0, 0.0],
  "rest_length": 1.0,
  "second": "",
  "second_anchor": [0.0, 0.0],
  "stiffness": 10.0
}
```

### Meanings of `sindri.physics2d.spring_joint` fields

- `first`: entity
- `second`: entity

### A real `sindri.physics2d.spring_joint`, from `examples/physics/assets/playground.scene`

```json
{
  "first": "crane-trolley",
  "second": "crane-hook",
  "first_anchor": [0.0, -0.25],
  "second_anchor": [0.0, 0.12],
  "rest_length": 1.4,
  "stiffness": 90.0,
  "damping": 6.0
}
```

## `sindri.physics2d.tilemap_collider`: Tilemap Collider 2D

Can be added with no extra data.

### Fields of `sindri.physics2d.tilemap_collider`

```json
{
  "friction": 0.5,
  "layers": {
    "filter": 4294967295,
    "memberships": 4294967295
  },
  "passable": [],
  "restitution": 0.0
}
```

### Meanings of `sindri.physics2d.tilemap_collider` fields

- `layers.filter`: mask
- `layers.memberships`: mask
- `restitution`: range (max: 1.0, min: 0.0)

## `sindri.physics2d.world`: Physics 2D World

Can be added with no extra data.

### Fields of `sindri.physics2d.world`

```json
{
  "gravity": [0.0, -9.81],
  "layers": []
}
```

### A real `sindri.physics2d.world`, from `games/flappy/assets/flappy.scene`

```json
{
  "gravity": [0.0, -18.0]
}
```

## `sindri.physics3d.character`: Character 3D

Can be added with no extra data.

### Fields of `sindri.physics3d.character`

```json
{
  "carry_platforms": true,
  "max_slope_angle": 0.7853981852531433,
  "min_slide_angle": 0.7853981852531433,
  "skin": 0.009999999776482582,
  "slide": true,
  "snap_distance": 0.0,
  "step_dynamic_bodies": false,
  "step_height": 0.0,
  "step_min_width": 0.10000000149011612,
  "up": [0.0, 1.0, 0.0]
}
```

### Meanings of `sindri.physics3d.character` fields

- `max_slope_angle`: angle
- `min_slide_angle`: angle

### A real `sindri.physics3d.character`, from `examples/character3d/assets/character.scene`

```json
{
  "snap_distance": 0.15
}
```

## `sindri.physics3d.collider`: Collider 3D

Can be added with no extra data.

### Fields of `sindri.physics3d.collider`

```json
{
  "pieces": [
    {
      "friction": 0.5,
      "layers": {
        "filter": 4294967295,
        "memberships": 4294967295
      },
      "offset": [0.0, 0.0, 0.0],
      "restitution": 0.0,
      "rotation": [0.0, 0.0, 0.0, 1.0],
      "sensor": false,
      "shape": {
        "half_extents": [0.5, 0.5, 0.5],
        "shape": "box"
      }
    }
  ]
}
```

### A real `sindri.physics3d.collider`, from `examples/orbit/assets/orbit.scene`

```json
{
  "shape": {
    "shape": "box",
    "half_extents": [0.5, 0.5, 0.5]
  },
  "offset": [0, 0, 0],
  "rotation": [0, 0, 0, 1],
  "sensor": false,
  "layers": {
    "memberships": 1,
    "filter": 4294967295
  },
  "friction": 0.5,
  "restitution": 0
}
```

## `sindri.physics3d.material`: Physics Material 3D

Can be added with no extra data.

### Fields of `sindri.physics3d.material`

```json
{
  "friction": 0.5,
  "override_friction": false,
  "override_restitution": false,
  "profile": "",
  "restitution": 0.0
}
```

### Meanings of `sindri.physics3d.material` fields

- `profile`: asset (asset: "profile")

### A real `sindri.physics3d.material`, from `examples/model-collision/assets/level.scene`

```json
{
  "profile": "materials/slide.profile",
  "override_restitution": true,
  "restitution": 0.0
}
```

## `sindri.physics3d.model_collider`: Static Model Collider 3D

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.physics3d.model_collider`

```json
{
  "asset": "models/collision.glb",
  "friction": 0.5,
  "layers": {
    "filter": 4294967295,
    "memberships": 4294967295
  },
  "restitution": 0.0,
  "sensor": false
}
```

### Meanings of `sindri.physics3d.model_collider` fields

- `asset`: asset (asset: "model")

No default: `sindri.physics3d.model_collider` must name what it uses.

### A real `sindri.physics3d.model_collider`, from `examples/model-collision/assets/level.scene`

```json
{
  "asset": "models/level.glb"
}
```

## `sindri.physics3d.model_convex_collider`: Convex Model Collider 3D

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.physics3d.model_convex_collider`

```json
{
  "asset": "models/collision.glb",
  "friction": 0.5,
  "layers": {
    "filter": 4294967295,
    "memberships": 4294967295
  },
  "restitution": 0.0,
  "sensor": false
}
```

### Meanings of `sindri.physics3d.model_convex_collider` fields

- `asset`: asset (asset: "model")

No default: `sindri.physics3d.model_convex_collider` must name what it uses.

### A real `sindri.physics3d.model_convex_collider`, from `examples/model-collision/assets/prefabs/prop.prefab`

```json
{
  "asset": "models/prop.glb",
  "friction": 0.5
}
```

## `sindri.physics3d.rigid_body`: Rigid Body 3D

Can be added with no extra data.

### Fields of `sindri.physics3d.rigid_body`

```json
{
  "angular_damping": 0.0,
  "angular_velocity": [0.0, 0.0, 0.0],
  "gravity_scale": 1.0,
  "kind": "dynamic",
  "linear_damping": 0.0,
  "linear_velocity": [0.0, 0.0, 0.0],
  "lock_rotation": false,
  "position": [0.0, 0.0, 0.0],
  "rotation": [0.0, 0.0, 0.0, 1.0]
}
```

### Meanings of `sindri.physics3d.rigid_body` fields

- `kind`: choice (options: ["static", "dynamic", "kinematic_position", "kinematic_velocity"])

### A real `sindri.physics3d.rigid_body`, from `examples/model-collision/assets/prefabs/prop.prefab`

```json
{
  "kind": "dynamic",
  "position": [0, 0, 0],
  "rotation": [0, 0, 0, 1],
  "linear_velocity": [0, 0, 0],
  "angular_velocity": [0, 0, 0],
  "gravity_scale": 1,
  "linear_damping": 0,
  "angular_damping": 0,
  "lock_rotation": true
}
```

## `sindri.physics3d.voxel_collider`: Voxel Collider 3D

Can be added with no extra data.

### Fields of `sindri.physics3d.voxel_collider`

```json
{
  "friction": 0.5,
  "layers": {
    "filter": 4294967295,
    "memberships": 4294967295
  },
  "margin": 2.0,
  "restitution": 0.0
}
```

### A real `sindri.physics3d.voxel_collider`, from `examples/physics/assets/quarry.scene`

```json
{
  "friction": 0.8,
  "layers": {
    "filter": 4294967295,
    "memberships": 4294967295
  },
  "margin": 2.0,
  "restitution": 0.0
}
```

## `sindri.physics3d.world`: Physics 3D World

Can be added with no extra data.

### Fields of `sindri.physics3d.world`

```json
{
  "gravity": [0.0, -9.81, 0.0],
  "layers": []
}
```

### A real `sindri.physics3d.world`, from `examples/model-collision/assets/level.scene`

```json
{
  "gravity": [0, -9.81, 0]
}
```

## `sindri.sequence`: Sequence

Can be added with no extra data.

### Fields of `sindri.sequence`

```json
{
  "playing": null,
  "sequences": {
    "intro": {
      "cues": [],
      "duration": 2.0,
      "looping": false,
      "tracks": []
    }
  },
  "speed": 1.0
}
```

### A real `sindri.sequence`, from `examples/sequence/assets/sequence.scene`

```json
{
  "sequences": {
    "intro": {
      "duration": 2.4,
      "looping": false,
      "tracks": [
        {
          "target": "/camera",
          "property": "sindri.camera/vertical_size",
          "keys": [
            {
              "time": 0.0,
              "value": 4.0,
              "ease": "ease-in-out"
            },
            {
              "time": 1.4,
              "value": 8.0,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Ship",
          "property": "position.x",
          "keys": [
            {
              "time": 0,
              "value": -7,
              "ease": "ease-out"
            },
            {
              "time": 1.2,
              "value": 0,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Ship",
          "property": "rotation",
          "keys": [
            {
              "time": 0,
              "value": -90,
              "ease": "ease-out"
            },
            {
              "time": 1.2,
              "value": 0,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Ring",
          "property": "scale",
          "keys": [
            {
              "time": 1.2,
              "value": 0.0,
              "ease": "ease-out"
            },
            {
              "time": 1.6,
              "value": 2.6,
              "ease": "ease-in-out"
            },
            {
              "time": 2.0,
              "value": 2.2,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Ring",
          "property": "sindri.shape/stroke.3",
          "keys": [
            {
              "time": 1.2,
              "value": 1.0,
              "ease": "linear"
            },
            {
              "time": 2.0,
              "value": 0.35,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Title",
          "property": "sindri.ui.text/color.3",
          "keys": [
            {
              "time": 0.6,
              "value": 0.0,
              "ease": "ease-in"
            },
            {
              "time": 1.4,
              "value": 1.0,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Title",
          "property": "position.y",
          "keys": [
            {
              "time": 0.6,
              "value": 0.95,
              "ease": "ease-out"
            },
            {
              "time": 1.4,
              "value": 0.85,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Hint",
          "property": "sindri.ui.text/color.3",
          "keys": [
            {
              "time": 2.0,
              "value": 0.0,
              "ease": "linear"
            },
            {
              "time": 2.4,
              "value": 0.8,
              "ease": "linear"
            }
          ]
        }
      ],
      "cues": [
        {
          "time": 0.0,
          "name": "launch",
          "sound": {
            "clip": "audio/shot.wav",
            "volume": 0.6
          }
        },
        {
          "time": 1.2,
          "name": "landed",
          "sound": {
            "clip": "audio/click.wav",
            "volume": 0.9
          }
        },
        {
          "time": 2.4,
          "name": "ready"
        }
      ]
    },
    "idle": {
      "duration": 2.0,
      "looping": true,
      "tracks": [
        {
          "target": "Ship",
          "property": "position.y",
          "keys": [
            {
              "time": 0,
              "value": 0,
              "ease": "ease-in-out"
            },
            {
              "time": 1.0,
              "value": 0.25,
              "ease": "ease-in-out"
            },
            {
              "time": 2.0,
              "value": 0,
              "ease": "linear"
            }
          ]
        },
        {
          "target": "Ring",
          "property": "scale",
          "keys": [
            {
              "time": 0,
              "value": 2.2,
              "ease": "ease-in-out"
            },
            {
              "time": 1.0,
              "value": 2.4,
              "ease": "ease-in-out"
            },
            {
              "time": 2.0,
              "value": 2.2,
              "ease": "linear"
            }
          ]
        }
      ],
      "cues": [
        {
          "time": 0.0,
          "name": "beat"
        }
      ]
    }
  },
  "playing": "intro",
  "speed": 1.0
}
```

## `sindri.shape`: Shape

Can be added with no extra data.

### Fields of `sindri.shape`

```json
{
  "blend": "over",
  "corner_radius": 0.0,
  "count": 6.0,
  "dash_duty": 0.5,
  "dashes": 0.0,
  "fill": [0.0, 0.0, 0.0, 0.0],
  "kind": "rect",
  "layer": 0,
  "stroke": [0.49, 1.0, 0.77, 1.0],
  "stroke_width": 0.06,
  "sweep_start": 0.0,
  "sweep_turns": 1.0
}
```

### Meanings of `sindri.shape` fields

- `blend`: choice (options: ["over", "add"])
- `fill`: color
- `kind`: choice (options: ["rect", "ellipse", "polygon", "grid"])
- `stroke`: color
- `sweep_start`: angle

### A real `sindri.shape`, from `examples/spatial/assets/spatial.scene`

```json
{
  "kind": "ellipse",
  "fill": [0.2, 0.9, 1, 1],
  "layer": 5
}
```

## `sindri.sprite`: Sprite

Can be added with no extra data.

### Fields of `sindri.sprite`

```json
{
  "billboard": false,
  "border_scale": 0.0625,
  "color_transform": {
    "multiply": [1.0, 1.0, 1.0, 1.0],
    "offset": [0.0, 0.0, 0.0, 0.0]
  },
  "draw": "simple",
  "layer": 0,
  "mask": "none",
  "mask_name": "",
  "normal_map": "",
  "shader": "",
  "shader_params": [0.0, 0.0, 0.0, 0.0],
  "texture": "procedural:checkerboard",
  "tint": [1.0, 1.0, 1.0, 1.0],
  "unlit": false
}
```

### Meanings of `sindri.sprite` fields

- `draw`: choice (options: ["simple", "sliced"])
- `mask`: choice (options: ["none", "inside", "outside"])
- `normal_map`: asset (asset: "texture")
- `shader`: asset (asset: "shader")
- `texture`: asset (asset: "texture")
- `tint`: color

### A real `sindri.sprite`, from `examples/sprite-masks/assets/sprite-masks.scene`

```json
{
  "texture": "textures/meadow.png",
  "layer": 0
}
```

## `sindri.sprite_mask`: Sprite Mask

Can be added with no extra data.

### Fields of `sindri.sprite_mask`

```json
{
  "name": "",
  "texture": "procedural:checkerboard"
}
```

### Meanings of `sindri.sprite_mask` fields

- `texture`: asset (asset: "texture")

### A real `sindri.sprite_mask`, from `examples/sprite-masks/assets/sprite-masks.scene`

```json
{
  "texture": "textures/keyhole.png",
  "name": "keyhole"
}
```

## `sindri.tags`: Tags

Can be added with no extra data.

### Fields of `sindri.tags`

```json
{
  "tags": []
}
```

### A real `sindri.tags`, from `examples/spatial/assets/spatial.scene`

```json
{
  "tags": ["ally"]
}
```

## `sindri.text`: Text

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.text`

```json
{
  "anchor": "center",
  "auto_size": {
    "enabled": false,
    "min": 0.1
  },
  "bold": false,
  "bounds": [0.0, 0.0],
  "case": "as_written",
  "color": [1.0, 1.0, 1.0, 1.0],
  "follow_rotation": false,
  "font": "",
  "font_size": 0.5,
  "italic": false,
  "layer": 0,
  "letter_spacing": 0.0,
  "line_align": "follow",
  "line_height": 0.6,
  "outline": {
    "color": [0.0, 0.0, 0.0, 1.0],
    "width": 0.0
  },
  "rich": false,
  "shadow": {
    "color": [0.0, 0.0, 0.0, 1.0],
    "offset": [0.0, 0.0],
    "softness": 0.0
  },
  "text": "Text",
  "values": [],
  "visible": -1.0,
  "wrap": "none"
}
```

### Meanings of `sindri.text` fields

- `anchor`: choice (options: ["center", "top", "bottom", "left", "right", "top_left", "top_right", "bottom_left", "bottom_right"])
- `case`: choice (options: ["as_written", "upper", "lower"])
- `color`: color
- `font`: asset (asset: "font")
- `line_align`: choice (options: ["follow", "left", "center", "right", "justify"])
- `outline.color`: color
- `shadow.color`: color
- `wrap`: choice (options: ["none", "word", "glyph"])

No default: `sindri.text` must name what it uses.

## `sindri.tile_grid`: Tile Grid

Can be added with no extra data.

### Fields of `sindri.tile_grid`

```json
{
  "cell_height": 1.0,
  "cell_size": [1.0, 1.0],
  "columns": 1,
  "depth_step": 0.0,
  "level_step": [0.0, 0.5],
  "projection": "orthogonal",
  "rows": 1,
  "space": "projected"
}
```

### Meanings of `sindri.tile_grid` fields

- `projection`: choice (options: ["orthogonal", "isometric"])

## `sindri.tile_volume`: Tile Volume

Can be added with no extra data.

### Fields of `sindri.tile_volume`

```json
{
  "cells": [],
  "layer": 0,
  "tileset": "",
  "variant_seed": 0
}
```

### Meanings of `sindri.tile_volume` fields

- `tileset`: asset (asset: "tile_set")

## `sindri.tilemap`: Tilemap

Can be added with no extra data.

### Fields of `sindri.tilemap`

```json
{
  "columns": 1,
  "layer": 0,
  "normal_map": "",
  "palette": [],
  "projection": "orthogonal",
  "rows": 1,
  "texture": "procedural:checkerboard",
  "tile_overhang": 0.0,
  "tile_size": [1.0, 1.0],
  "tiles": [null],
  "tint": [1.0, 1.0, 1.0, 1.0]
}
```

### Meanings of `sindri.tilemap` fields

- `normal_map`: asset (asset: "texture")
- `projection`: choice (options: ["orthogonal", "isometric"])
- `texture`: asset (asset: "texture")
- `tint`: color

## `sindri.ui.box`: UI Box

Can be added with no extra data.

### Fields of `sindri.ui.box`

```json
{
  "absolute": false,
  "align_self": "auto",
  "basis": -1.0,
  "fit_content": [false, false],
  "grid_column": [0, 0],
  "grid_row": [0, 0],
  "grow": 0.0,
  "margin": [0.0, 0.0, 0.0, 0.0],
  "max_size": [0.0, 0.0],
  "min_size": [0.0, 0.0],
  "order": 0,
  "padding": [0.0, 0.0, 0.0, 0.0],
  "shrink": 1.0
}
```

### Meanings of `sindri.ui.box` fields

- `align_self`: choice (options: ["auto", "start", "center", "end", "stretch"])

## `sindri.ui.button`: UI Button

Can be added with no extra data.

### Fields of `sindri.ui.button`

```json
{
  "autofocus": false,
  "disabled": false,
  "label": ""
}
```

### A real `sindri.ui.button`, from `examples/camera/assets/demo.scene`

```json
{
  "label": "UP"
}
```

## `sindri.ui.dropdown`: UI Dropdown

Can be added with no extra data.

### Fields of `sindri.ui.dropdown`

```json
{
  "autofocus": false,
  "disabled": false,
  "label": "",
  "open": false,
  "selected": 0
}
```

### A real `sindri.ui.dropdown`, from `examples/ui/assets/widgets.scene`

```json
{
  "label": "Sector",
  "selected": 0
}
```

## `sindri.ui.grid`: UI Grid

Can be added with no extra data.

### Fields of `sindri.ui.grid`

```json
{
  "align_items": "stretch",
  "columns": ["1fr", "1fr"],
  "fit_content": [false, false],
  "gap": [0.05, 0.05],
  "justify_items": "stretch",
  "rows": []
}
```

### Meanings of `sindri.ui.grid` fields

- `align_items`: choice (options: ["start", "center", "end", "stretch"])
- `justify_items`: choice (options: ["start", "center", "end", "stretch"])

## `sindri.ui.image`: UI Image

Can be added with no extra data.

### Fields of `sindri.ui.image`

```json
{
  "anchor": "center",
  "border_scale": 0.002777777777777778,
  "draw": "simple",
  "fill": {
    "amount": 1.0,
    "from": "left"
  },
  "layer": 0,
  "texture": "procedural:checkerboard",
  "tint": [1.0, 1.0, 1.0, 1.0]
}
```

### Meanings of `sindri.ui.image` fields

- `anchor`: choice (options: ["center", "top", "bottom", "left", "right", "top_left", "top_right", "bottom_left", "bottom_right"])
- `draw`: choice (options: ["simple", "sliced"])
- `texture`: asset (asset: "texture")
- `tint`: color

### A real `sindri.ui.image`, from `examples/audio/assets/mixer.scene`

```json
{
  "texture": "textures/white.png",
  "anchor": "center",
  "layer": 12,
  "tint": [0.37, 0.89, 0.81, 0.85],
  "fill": {
    "amount": 1.0,
    "from": "left"
  }
}
```

## `sindri.ui.layout`: UI Layout

Can be added with no extra data.

### Fields of `sindri.ui.layout`

```json
{
  "align": "center",
  "direction": "column",
  "fit_content": [false, false],
  "justify": "center",
  "spacing": 0.25,
  "wrap": false
}
```

### Meanings of `sindri.ui.layout` fields

- `align`: choice (options: ["start", "center", "end", "stretch"])
- `direction`: choice (options: ["column", "row"])
- `justify`: choice (options: ["start", "center", "end", "space_between", "space_around", "space_evenly"])

### A real `sindri.ui.layout`, from `examples/physics/assets/playground.scene`

```json
{
  "direction": "row",
  "spacing": 0.02,
  "justify": "end",
  "align": "center"
}
```

## `sindri.ui.option`: UI Option

Can be added with no extra data.

### Fields of `sindri.ui.option`

```json
{
  "checked": false,
  "disabled": false,
  "label": ""
}
```

### A real `sindri.ui.option`, from `examples/ui/assets/widgets.scene`

```json
{
  "label": "Ember Belt"
}
```

## `sindri.ui.scroll`: UI Scroll

Can be added with no extra data.

### Fields of `sindri.ui.scroll`

```json
{
  "content_height": 2.0,
  "disabled": false,
  "label": "",
  "offset": 0.0
}
```

### A real `sindri.ui.scroll`, from `examples/ui/assets/widgets.scene`

```json
{
  "label": "Module archive",
  "content_height": 0.0,
  "offset": 0.0
}
```

## `sindri.ui.shape`: UI Shape

Can be added with no extra data.

### Fields of `sindri.ui.shape`

```json
{
  "anchor": "center",
  "blend": "over",
  "corner_radius": 0.0,
  "count": 6.0,
  "dash_duty": 0.5,
  "dashes": 0.0,
  "fill": [0.0, 0.0, 0.0, 0.0],
  "kind": "rect",
  "layer": 0,
  "shadow": {
    "blur": 0.0,
    "color": [0.0, 0.0, 0.0, 0.0],
    "offset": [0.0, 0.0],
    "spread": 0.0
  },
  "stroke": [0.49, 1.0, 0.77, 1.0],
  "stroke_width": 0.04,
  "sweep_start": 0.0,
  "sweep_turns": 1.0
}
```

### Meanings of `sindri.ui.shape` fields

- `anchor`: choice (options: ["center", "top", "bottom", "left", "right", "top_left", "top_right", "bottom_left", "bottom_right"])
- `blend`: choice (options: ["over", "add"])
- `fill`: color
- `kind`: choice (options: ["rect", "ellipse", "polygon", "grid"])
- `shadow.color`: color
- `stroke`: color
- `sweep_start`: angle

### A real `sindri.ui.shape`, from `examples/tween/assets/tween.scene`

```json
{
  "kind": "rect",
  "fill": [0.15, 0.23, 0.33, 1],
  "anchor": "center",
  "layer": 10
}
```

## `sindri.ui.slider`: UI Slider

Can be added with no extra data.

### Fields of `sindri.ui.slider`

```json
{
  "autofocus": false,
  "disabled": false,
  "label": "",
  "max": 1.0,
  "min": 0.0,
  "orientation": "horizontal",
  "step": 0.0,
  "value": 0.0
}
```

### Meanings of `sindri.ui.slider` fields

- `orientation`: choice (options: ["horizontal", "vertical"])

### A real `sindri.ui.slider`, from `examples/audio/assets/mixer.scene`

```json
{
  "label": "Master volume",
  "min": 0.0,
  "max": 1.0,
  "step": 0.05,
  "value": 1.0,
  "disabled": false,
  "autofocus": true
}
```

## `sindri.ui.text`: UI Text

Needs data the engine cannot invent (usually an asset); copy a real use rather than the defaults.

### Fields of `sindri.ui.text`

```json
{
  "anchor": "center",
  "auto_size": {
    "enabled": false,
    "min": 0.02
  },
  "bold": false,
  "bounds": [0.0, 0.0],
  "case": "as_written",
  "color": [1.0, 1.0, 1.0, 1.0],
  "font": "",
  "font_size": 0.0667,
  "italic": false,
  "layer": 0,
  "letter_spacing": 0.0,
  "line_align": "follow",
  "line_height": 0.0833,
  "outline": {
    "color": [0.0, 0.0, 0.0, 1.0],
    "width": 0.0
  },
  "rich": false,
  "shadow": {
    "color": [0.0, 0.0, 0.0, 1.0],
    "offset": [0.0, 0.0],
    "softness": 0.0
  },
  "text": "Text",
  "values": [],
  "visible": -1.0,
  "wrap": "none"
}
```

### Meanings of `sindri.ui.text` fields

- `anchor`: choice (options: ["center", "top", "bottom", "left", "right", "top_left", "top_right", "bottom_left", "bottom_right"])
- `case`: choice (options: ["as_written", "upper", "lower"])
- `color`: color
- `font`: asset (asset: "font")
- `line_align`: choice (options: ["follow", "left", "center", "right", "justify"])
- `outline.color`: color
- `shadow.color`: color
- `wrap`: choice (options: ["none", "word", "glyph"])

No default: `sindri.ui.text` must name what it uses.

### A real `sindri.ui.text`, from `examples/spatial/assets/spatial.scene`

```json
{
  "text": "A",
  "font": "fonts/ChakraPetch-Regular.ttf",
  "font_size": 0.05,
  "bounds": [0.15, 0.08],
  "anchor": "center",
  "layer": 20
}
```

## `sindri.ui.text_input`: UI Text Input

Can be added with no extra data.

### Fields of `sindri.ui.text_input`

```json
{
  "autofocus": false,
  "disabled": false,
  "label": "",
  "max_length": 128,
  "placeholder": "",
  "value": ""
}
```

### A real `sindri.ui.text_input`, from `examples/ui/assets/widgets.scene`

```json
{
  "label": "Callsign",
  "value": "",
  "placeholder": "Your callsign",
  "max_length": 18
}
```

## `sindri.ui.toggle`: UI Toggle

Can be added with no extra data.

### Fields of `sindri.ui.toggle`

```json
{
  "autofocus": false,
  "checked": false,
  "disabled": false,
  "group": "",
  "label": ""
}
```

### A real `sindri.ui.toggle`, from `examples/ui/assets/widgets.scene`

```json
{
  "label": "Ace",
  "checked": false,
  "group": "difficulty"
}
```

## `sindri.voxel_world`: Voxel World

Can be added with no extra data.

### Fields of `sindri.voxel_world`

```json
{
  "blocks": "builtin:blocks",
  "edits": [],
  "focus": [0, 0, 0],
  "follow_camera": false,
  "generator": {
    "beach_voxel": "sand",
    "biomes": [
      {
        "moisture": 0.4000000059604645,
        "name": "Grassland",
        "relief": 0.800000011920929,
        "subsurface_depth": 3,
        "subsurface_voxel": "dirt",
        "surface_voxel": "grass",
        "temperature": 0.550000011920929,
        "terraces": 0,
        "trees": 0.05999999865889549
      },
      {
        "moisture": 0.7200000286102295,
        "name": "Forest",
        "relief": 1.0,
        "subsurface_depth": 3,
        "subsurface_voxel": "dirt",
        "surface_voxel": "grass",
        "temperature": 0.550000011920929,
        "terraces": 0,
        "trees": 0.550000011920929
      },
      {
        "moisture": 0.9200000166893005,
        "name": "Swamp",
        "relief": 0.30000001192092896,
        "subsurface_depth": 3,
        "subsurface_voxel": "mud",
        "surface_voxel": "mud",
        "temperature": 0.75,
        "terraces": 0,
        "trees": 0.20000000298023224
      },
      {
        "moisture": 0.11999999731779099,
        "name": "Desert",
        "relief": 0.6000000238418579,
        "subsurface_depth": 5,
        "subsurface_voxel": "sand",
        "surface_voxel": "sand",
        "temperature": 0.9200000166893005,
        "terraces": 0,
        "trees": 0.0
      },
      {
        "moisture": 0.3499999940395355,
        "name": "Badlands",
        "relief": 1.399999976158142,
        "subsurface_depth": 6,
        "subsurface_voxel": "clay",
        "surface_voxel": "clay",
        "temperature": 0.8500000238418579,
        "terraces": 3,
        "trees": 0.0
      },
      {
        "moisture": 0.6499999761581421,
        "name": "Taiga",
        "relief": 1.100000023841858,
        "subsurface_depth": 3,
        "subsurface_voxel": "dirt",
        "surface_voxel": "moss",
        "temperature": 0.2800000011920929,
        "terraces": 0,
        "trees": 0.44999998807907104
      },
      {
        "moisture": 0.30000001192092896,
        "name": "Tundra",
        "relief": 0.699999988079071,
        "subsurface_depth": 2,
        "subsurface_voxel": "dirt",
        "surface_voxel": "snow",
        "temperature": 0.10000000149011612,
        "terraces": 0,
        "trees": 0.029999999329447746
      }
    ],
    "caves": true,
    "cliff_voxel": "rock",
    "feature_size": 64,
    "ice_voxel": "ice",
    "kind": "natural_terrain",
    "leaves_voxel": "leaves",
    "relief": 40,
    "rivers": true,
    "sea_bed_voxel": "gravel",
    "sea_level": 0,
    "seed": 0,
    "snow_line": 30,
    "snow_voxel": "snow",
    "stone_voxel": "stone",
    "tree_line": 22,
    "trunk_voxel": "log",
    "water_voxel": "water"
  },
  "layer": 0,
  "map_flood": null,
  "materials": [
    {
      "bottom": "procedural:checkerboard",
      "side": "procedural:checkerboard",
      "top": "procedural:checkerboard",
      "voxel": 1
    },
    {
      "bottom": "procedural:checkerboard",
      "side": "procedural:checkerboard",
      "top": "procedural:checkerboard",
      "voxel": 2
    },
    {
      "bottom": "procedural:checkerboard",
      "side": "procedural:checkerboard",
      "top": "procedural:checkerboard",
      "voxel": 3
    }
  ],
  "normal_maps": {},
  "render_radius": 2,
  "variant_seed": 0,
  "vertical_radius": 1,
  "view": "blocks"
}
```

### Meanings of `sindri.voxel_world` fields

- `blocks`: asset (asset: "tile_set")
- `generator.beach_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.biomes[].moisture`: range (max: 1.0, min: 0.0)
- `generator.biomes[].relief`: range (max: 4.0, min: 0.0)
- `generator.biomes[].subsurface_depth`: range (max: 256.0, min: 0.0)
- `generator.biomes[].subsurface_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.biomes[].surface_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.biomes[].temperature`: range (max: 1.0, min: 0.0)
- `generator.biomes[].terraces`: range (max: 64.0, min: 0.0)
- `generator.biomes[].trees`: range (max: 1.0, min: 0.0)
- `generator.cliff_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.deep_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.feature_size`: range (max: 4096.0, min: 8.0)
- `generator.height_variation`: range (max: 4096.0, min: 0.0)
- `generator.ice_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.kind`: choice (options: ["layered_terrain", "natural_terrain"])
  - when `layered_terrain`, the object also has: `{"base_height": 3, "deep_voxel": 3, "height_variation": 6, "seed": 0, "subsurface_depth": 3, "subsurface_voxel": 2, "surface_voxel": 1}`
  - when `natural_terrain`, the object also has: `{"beach_voxel": null, "biomes": [{"moisture": 0.5, "name": "Grassland", "relief": 1.0, "subsurface_depth": 3, "subsurface_voxel": 2, "surface_voxel": 1, "temperature": 0.5, "terraces": 0, "trees": 0.0}], "caves": true, "cliff_voxel": null, "feature_size": 64, "ice_voxel": null, "leaves_voxel": null, "relief": 40, "rivers": true, "sea_bed_voxel": null, "sea_level": 0, "seed": 0, "snow_line": 30, "snow_voxel": null, "stone_voxel": 3, "tree_line": 22, "trunk_voxel": null, "water_voxel": null}`
- `generator.leaves_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.relief`: range (max: 1024.0, min: 1.0)
- `generator.sea_bed_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.seed`: range (min: 0.0)
- `generator.snow_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.stone_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.subsurface_depth`: range (min: 0.0)
- `generator.subsurface_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.surface_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.trunk_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `generator.water_voxel`: block (key_of: "materials[].voxel", set: "blocks")
- `materials[].bottom`: asset (asset: "texture")
- `materials[].side`: asset (asset: "texture")
- `materials[].top`: asset (asset: "texture")
- `materials[].voxel`: key
- `render_radius`: range (max: 8.0, min: 0.0)
- `vertical_radius`: range (max: 8.0, min: 0.0)
- `view`: choice (options: ["blocks", "map"])

### A real `sindri.voxel_world`, from `examples/physics/assets/quarry.scene`

```json
{
  "blocks": "quarry.tileset",
  "generator": {
    "kind": "layered_terrain",
    "base_height": 6,
    "height_variation": 0,
    "surface_voxel": "grass",
    "subsurface_voxel": "dirt",
    "deep_voxel": "stone",
    "subsurface_depth": 3
  },
  "render_radius": 2,
  "vertical_radius": 1,
  "focus": [0, 0, 0],
  "edits": [
    {
      "at": [-9, 7, -9],
      "block": "stone"
    },
    {
      "at": [-9, 8, -9],
      "block": "stone"
    },
    {
      "at": [-9, 9, -9],
      "block": "stone"
    },
    {
      "at": [-9, 10, -9],
      "block": "stone"
    },
    {
      "at": [-9, 7, -8],
      "block": "stone"
    },
    {
      "at": [-9, 8, -8],
      "block": "stone"
    },
    {
      "at": [-9, 9, -8],
      "block": "stone"
    },
    {
      "at": [-9, 7, -7],
      "block": "stone"
    },
    {
      "at": [-9, 8, -7],
      "block": "stone"
    },
    {
      "at": [-9, 7, -6],
      "block": "stone"
    },
    {
      "at": [-8, 7, -9],
      "block": "stone"
    },
    {
      "at": [-8, 8, -9],
      "block": "stone"
    },
    {
      "at": [-8, 9, -9],
      "block": "stone"
    },
    {
      "at": [-8, 10, -9],
      "block": "stone"
    },
    {
      "at": [-8, 7, -8],
      "block": "stone"
    },
    {
      "at": [-8, 8, -8],
      "block": "stone"
    },
    {
      "at": [-8, 9, -8],
      "block": "stone"
    },
    {
      "at": [-8, 7, -7],
      "block": "stone"
    },
    {
      "at": [-8, 8, -7],
      "block": "stone"
    },
    {
      "at": [-8, 7, -6],
      "block": "stone"
    },
    {
      "at": [-7, 7, -9],
      "block": "stone"
    },
    {
      "at": [-7, 8, -9],
      "block": "stone"
    },
    {
      "at": [-7, 9, -9],
      "block": "stone"
    },
    {
      "at": [-7, 10, -9],
      "block": "stone"
    },
    {
      "at": [-7, 7, -8],
      "block": "stone"
    },
    {
      "at": [-7, 8, -8],
      "block": "stone"
    },
    {
      "at": [-7, 9, -8],
      "block": "stone"
    },
    {
      "at": [-7, 7, -7],
      "block": "stone"
    },
    {
      "at": [-7, 8, -7],
      "block": "stone"
    },
    {
      "at": [-7, 7, -6],
      "block": "stone"
    },
    {
      "at": [-6, 7, -9],
      "block": "stone"
    },
    {
      "at": [-6, 8, -9],
      "block": "stone"
    },
    {
      "at": [-6, 9, -9],
      "block": "stone"
    },
    {
      "at": [-6, 10, -9],
      "block": "stone"
    },
    {
      "at": [-6, 7, -8],
      "block": "stone"
    },
    {
      "at": [-6, 8, -8],
      "block": "stone"
    },
    {
      "at": [-6, 9, -8],
      "block": "stone"
    },
    {
      "at": [-6, 7, -7],
      "block": "stone"
    },
    {
      "at": [-6, 8, -7],
      "block": "stone"
    },
    {
      "at": [-6, 7, -6],
      "block": "stone"
    },
    {
      "at": [-5, 7, -9],
      "block": "stone"
    },
    {
      "at": [-5, 8, -9],
      "block": "stone"
    },
    {
      "at": [-5, 9, -9],
      "block": "stone"
    },
    {
      "at": [-5, 10, -9],
      "block": "stone"
    },
    {
      "at": [-5, 7, -8],
      "block": "stone"
    },
    {
      "at": [-5, 8, -8],
      "block": "stone"
    },
    {
      "at": [-5, 9, -8],
      "block": "stone"
    },
    {
      "at": [-5, 7, -7],
      "block": "stone"
    },
    {
      "at": [-5, 8, -7],
      "block": "stone"
    },
    {
      "at": [-5, 7, -6],
      "block": "stone"
    },
    {
      "at": [-4, 7, -9],
      "block": "stone"
    },
    {
      "at": [-4, 8, -9],
      "block": "stone"
    },
    {
      "at": [-4, 9, -9],
      "block": "stone"
    },
    {
      "at": [-4, 10, -9],
      "block": "stone"
    },
    {
      "at": [-4, 7, -8],
      "block": "stone"
    },
    {
      "at": [-4, 8, -8],
      "block": "stone"
    },
    {
      "at": [-4, 9, -8],
      "block": "stone"
    },
    {
      "at": [-4, 7, -7],
      "block": "stone"
    },
    {
      "at": [-4, 8, -7],
      "block": "stone"
    },
    {
      "at": [-4, 7, -6],
      "block": "stone"
    },
    {
      "at": [-3, 7, -9],
      "block": "stone"
    },
    {
      "at": [-3, 8, -9],
      "block": "stone"
    },
    {
      "at": [-3, 9, -9],
      "block": "stone"
    },
    {
      "at": [-3, 10, -9],
      "block": "stone"
    },
    {
      "at": [-3, 7, -8],
      "block": "stone"
    },
    {
      "at": [-3, 8, -8],
      "block": "stone"
    },
    {
      "at": [-3, 9, -8],
      "block": "stone"
    },
    {
      "at": [-3, 7, -7],
      "block": "stone"
    },
    {
      "at": [-3, 8, -7],
      "block": "stone"
    },
    {
      "at": [-3, 7, -6],
      "block": "stone"
    },
    {
      "at": [-2, 7, -9],
      "block": "stone"
    },
    {
      "at": [-2, 8, -9],
      "block": "stone"
    },
    {
      "at": [-2, 9, -9],
      "block": "stone"
    },
    {
      "at": [-2, 10, -9],
      "block": "stone"
    },
    {
      "at": [-2, 7, -8],
      "block": "stone"
    },
    {
      "at": [-2, 8, -8],
      "block": "stone"
    },
    {
      "at": [-2, 9, -8],
      "block": "stone"
    },
    {
      "at": [-2, 7, -7],
      "block": "stone"
    },
    {
      "at": [-2, 8, -7],
      "block": "stone"
    },
    {
      "at": [-2, 7, -6],
      "block": "stone"
    },
    {
      "at": [-1, 7, -9],
      "block": "stone"
    },
    {
      "at": [-1, 8, -9],
      "block": "stone"
    },
    {
      "at": [-1, 9, -9],
      "block": "stone"
    },
    {
      "at": [-1, 10, -9],
      "block": "stone"
    },
    {
      "at": [-1, 7, -8],
      "block": "stone"
    },
    {
      "at": [-1, 8, -8],
      "block": "stone"
    },
    {
      "at": [-1, 9, -8],
      "block": "stone"
    },
    {
      "at": [-1, 7, -7],
      "block": "stone"
    },
    {
      "at": [-1, 8, -7],
      "block": "stone"
    },
    {
      "at": [-1, 7, -6],
      "block": "stone"
    },
    {
      "at": [0, 7, -9],
      "block": "stone"
    },
    {
      "at": [0, 8, -9],
      "block": "stone"
    },
    {
      "at": [0, 9, -9],
      "block": "stone"
    },
    {
      "at": [0, 10, -9],
      "block": "stone"
    },
    {
      "at": [0, 7, -8],
      "block": "stone"
    },
    {
      "at": [0, 8, -8],
      "block": "stone"
    },
    {
      "at": [0, 9, -8],
      "block": "stone"
    },
    {
      "at": [0, 7, -7],
      "block": "stone"
    },
    {
      "at": [0, 8, -7],
      "block": "stone"
    },
    {
      "at": [0, 7, -6],
      "block": "stone"
    },
    {
      "at": [1, 7, -9],
      "block": "stone"
    },
    {
      "at": [1, 8, -9],
      "block": "stone"
    },
    {
      "at": [1, 9, -9],
      "block": "stone"
    },
    {
      "at": [1, 10, -9],
      "block": "stone"
    },
    {
      "at": [1, 7, -8],
      "block": "stone"
    },
    {
      "at": [1, 8, -8],
      "block": "stone"
    },
    {
      "at": [1, 9, -8],
      "block": "stone"
    },
    {
      "at": [1, 7, -7],
      "block": "stone"
    },
    {
      "at": [1, 8, -7],
      "block": "stone"
    },
    {
      "at": [1, 7, -6],
      "block": "stone"
    },
    {
      "at": [2, 7, -9],
      "block": "stone"
    },
    {
      "at": [2, 8, -9],
      "block": "stone"
    },
    {
      "at": [2, 9, -9],
      "block": "stone"
    },
    {
      "at": [2, 10, -9],
      "block": "stone"
    },
    {
      "at": [2, 7, -8],
      "block": "stone"
    },
    {
      "at": [2, 8, -8],
      "block": "stone"
    },
    {
      "at": [2, 9, -8],
      "block": "stone"
    },
    {
      "at": [2, 7, -7],
      "block": "stone"
    },
    {
      "at": [2, 8, -7],
      "block": "stone"
    },
    {
      "at": [2, 7, -6],
      "block": "stone"
    },
    {
      "at": [3, 7, -9],
      "block": "stone"
    },
    {
      "at": [3, 8, -9],
      "block": "stone"
    },
    {
      "at": [3, 9, -9],
      "block": "stone"
    },
    {
      "at": [3, 10, -9],
      "block": "stone"
    },
    {
      "at": [3, 7, -8],
      "block": "stone"
    },
    {
      "at": [3, 8, -8],
      "block": "stone"
    },
    {
      "at": [3, 9, -8],
      "block": "stone"
    },
    {
      "at": [3, 7, -7],
      "block": "stone"
    },
    {
      "at": [3, 8, -7],
      "block": "stone"
    },
    {
      "at": [3, 7, -6],
      "block": "stone"
    },
    {
      "at": [4, 7, -9],
      "block": "stone"
    },
    {
      "at": [4, 8, -9],
      "block": "stone"
    },
    {
      "at": [4, 9, -9],
      "block": "stone"
    },
    {
      "at": [4, 10, -9],
      "block": "stone"
    },
    {
      "at": [4, 7, -8],
      "block": "stone"
    },
    {
      "at": [4, 8, -8],
      "block": "stone"
    },
    {
      "at": [4, 9, -8],
      "block": "stone"
    },
    {
      "at": [4, 7, -7],
      "block": "stone"
    },
    {
      "at": [4, 8, -7],
      "block": "stone"
    },
    {
      "at": [4, 7, -6],
      "block": "stone"
    },
    {
      "at": [5, 7, -9],
      "block": "stone"
    },
    {
      "at": [5, 8, -9],
      "block": "stone"
    },
    {
      "at": [5, 9, -9],
      "block": "stone"
    },
    {
      "at": [5, 10, -9],
      "block": "stone"
    },
    {
      "at": [5, 7, -8],
      "block": "stone"
    },
    {
      "at": [5, 8, -8],
      "block": "stone"
    },
    {
      "at": [5, 9, -8],
      "block": "stone"
    },
    {
      "at": [5, 7, -7],
      "block": "stone"
    },
    {
      "at": [5, 8, -7],
      "block": "stone"
    },
    {
      "at": [5, 7, -6],
      "block": "stone"
    },
    {
      "at": [6, 7, -9],
      "block": "stone"
    },
    {
      "at": [6, 8, -9],
      "block": "stone"
    },
    {
      "at": [6, 9, -9],
      "block": "stone"
    },
    {
      "at": [6, 10, -9],
      "block": "stone"
    },
    {
      "at": [6, 7, -8],
      "block": "stone"
    },
    {
      "at": [6, 8, -8],
      "block": "stone"
    },
    {
      "at": [6, 9, -8],
      "block": "stone"
    },
    {
      "at": [6, 7, -7],
      "block": "stone"
    },
    {
      "at": [6, 8, -7],
      "block": "stone"
    },
    {
      "at": [6, 7, -6],
      "block": "stone"
    },
    {
      "at": [7, 7, -9],
      "block": "stone"
    },
    {
      "at": [7, 8, -9],
      "block": "stone"
    },
    {
      "at": [7, 9, -9],
      "block": "stone"
    },
    {
      "at": [7, 10, -9],
      "block": "stone"
    },
    {
      "at": [7, 7, -8],
      "block": "stone"
    },
    {
      "at": [7, 8, -8],
      "block": "stone"
    },
    {
      "at": [7, 9, -8],
      "block": "stone"
    },
    {
      "at": [7, 7, -7],
      "block": "stone"
    },
    {
      "at": [7, 8, -7],
      "block": "stone"
    },
    {
      "at": [7, 7, -6],
      "block": "stone"
    },
    {
      "at": [8, 7, -9],
      "block": "stone"
    },
    {
      "at": [8, 8, -9],
      "block": "stone"
    },
    {
      "at": [8, 9, -9],
      "block": "stone"
    },
    {
      "at": [8, 10, -9],
      "block": "stone"
    },
    {
      "at": [8, 7, -8],
      "block": "stone"
    },
    {
      "at": [8, 8, -8],
      "block": "stone"
    },
    {
      "at": [8, 9, -8],
      "block": "stone"
    },
    {
      "at": [8, 7, -7],
      "block": "stone"
    },
    {
      "at": [8, 8, -7],
      "block": "stone"
    },
    {
      "at": [8, 7, -6],
      "block": "stone"
    },
    {
      "at": [9, 7, -9],
      "block": "stone"
    },
    {
      "at": [9, 8, -9],
      "block": "stone"
    },
    {
      "at": [9, 9, -9],
      "block": "stone"
    },
    {
      "at": [9, 10, -9],
      "block": "stone"
    },
    {
      "at": [9, 7, -8],
      "block": "stone"
    },
    {
      "at": [9, 8, -8],
      "block": "stone"
    },
    {
      "at": [9, 9, -8],
      "block": "stone"
    },
    {
      "at": [9, 7, -7],
      "block": "stone"
    },
    {
      "at": [9, 8, -7],
      "block": "stone"
    },
    {
      "at": [9, 7, -6],
      "block": "stone"
    },
    {
      "at": [6, 7, -5],
      "block": "stone"
    },
    {
      "at": [7, 7, -5],
      "block": "stone"
    },
    {
      "at": [7, 8, -5],
      "block": "stone"
    },
    {
      "at": [8, 7, -5],
      "block": "stone"
    },
    {
      "at": [8, 8, -5],
      "block": "stone"
    },
    {
      "at": [8, 9, -5],
      "block": "stone"
    },
    {
      "at": [9, 7, -5],
      "block": "stone"
    },
    {
      "at": [9, 8, -5],
      "block": "stone"
    },
    {
      "at": [9, 9, -5],
      "block": "stone"
    },
    {
      "at": [9, 10, -5],
      "block": "stone"
    },
    {
      "at": [6, 7, -4],
      "block": "stone"
    },
    {
      "at": [7, 7, -4],
      "block": "stone"
    },
    {
      "at": [7, 8, -4],
      "block": "stone"
    },
    {
      "at": [8, 7, -4],
      "block": "stone"
    },
    {
      "at": [8, 8, -4],
      "block": "stone"
    },
    {
      "at": [8, 9, -4],
      "block": "stone"
    },
    {
      "at": [9, 7, -4],
      "block": "stone"
    },
    {
      "at": [9, 8, -4],
      "block": "stone"
    },
    {
      "at": [9, 9, -4],
      "block": "stone"
    },
    {
      "at": [9, 10, -4],
      "block": "stone"
    },
    {
      "at": [6, 7, -3],
      "block": "stone"
    },
    {
      "at": [7, 7, -3],
      "block": "stone"
    },
    {
      "at": [7, 8, -3],
      "block": "stone"
    },
    {
      "at": [8, 7, -3],
      "block": "stone"
    },
    {
      "at": [8, 8, -3],
      "block": "stone"
    },
    {
      "at": [8, 9, -3],
      "block": "stone"
    },
    {
      "at": [9, 7, -3],
      "block": "stone"
    },
    {
      "at": [9, 8, -3],
      "block": "stone"
    },
    {
      "at": [9, 9, -3],
      "block": "stone"
    },
    {
      "at": [9, 10, -3],
      "block": "stone"
    },
    {
      "at": [6, 7, -2],
      "block": "stone"
    },
    {
      "at": [7, 7, -2],
      "block": "stone"
    },
    {
      "at": [7, 8, -2],
      "block": "stone"
    },
    {
      "at": [8, 7, -2],
      "block": "stone"
    },
    {
      "at": [8, 8, -2],
      "block": "stone"
    },
    {
      "at": [8, 9, -2],
      "block": "stone"
    },
    {
      "at": [9, 7, -2],
      "block": "stone"
    },
    {
      "at": [9, 8, -2],
      "block": "stone"
    },
    {
      "at": [9, 9, -2],
      "block": "stone"
    },
    {
      "at": [9, 10, -2],
      "block": "stone"
    },
    {
      "at": [6, 7, -1],
      "block": "stone"
    },
    {
      "at": [7, 7, -1],
      "block": "stone"
    },
    {
      "at": [7, 8, -1],
      "block": "stone"
    },
    {
      "at": [8, 7, -1],
      "block": "stone"
    },
    {
      "at": [8, 8, -1],
      "block": "stone"
    },
    {
      "at": [8, 9, -1],
      "block": "stone"
    },
    {
      "at": [9, 7, -1],
      "block": "stone"
    },
    {
      "at": [9, 8, -1],
      "block": "stone"
    },
    {
      "at": [9, 9, -1],
      "block": "stone"
    },
    {
      "at": [9, 10, -1],
      "block": "stone"
    },
    {
      "at": [6, 7, 0],
      "block": "stone"
    },
    {
      "at": [7, 7, 0],
      "block": "stone"
    },
    {
      "at": [7, 8, 0],
      "block": "stone"
    },
    {
      "at": [8, 7, 0],
      "block": "stone"
    },
    {
      "at": [8, 8, 0],
      "block": "stone"
    },
    {
      "at": [8, 9, 0],
      "block": "stone"
    },
    {
      "at": [9, 7, 0],
      "block": "stone"
    },
    {
      "at": [9, 8, 0],
      "block": "stone"
    },
    {
      "at": [9, 9, 0],
      "block": "stone"
    },
    {
      "at": [9, 10, 0],
      "block": "stone"
    },
    {
      "at": [6, 7, 1],
      "block": "stone"
    },
    {
      "at": [7, 7, 1],
      "block": "stone"
    },
    {
      "at": [7, 8, 1],
      "block": "stone"
    },
    {
      "at": [8, 7, 1],
      "block": "stone"
    },
    {
      "at": [8, 8, 1],
      "block": "stone"
    },
    {
      "at": [8, 9, 1],
      "block": "stone"
    },
    {
      "at": [9, 7, 1],
      "block": "stone"
    },
    {
      "at": [9, 8, 1],
      "block": "stone"
    },
    {
      "at": [9, 9, 1],
      "block": "stone"
    },
    {
      "at": [9, 10, 1],
      "block": "stone"
    },
    {
      "at": [6, 7, 2],
      "block": "stone"
    },
    {
      "at": [7, 7, 2],
      "block": "stone"
    },
    {
      "at": [7, 8, 2],
      "block": "stone"
    },
    {
      "at": [8, 7, 2],
      "block": "stone"
    },
    {
      "at": [8, 8, 2],
      "block": "stone"
    },
    {
      "at": [8, 9, 2],
      "block": "stone"
    },
    {
      "at": [9, 7, 2],
      "block": "stone"
    },
    {
      "at": [9, 8, 2],
      "block": "stone"
    },
    {
      "at": [9, 9, 2],
      "block": "stone"
    },
    {
      "at": [9, 10, 2],
      "block": "stone"
    },
    {
      "at": [6, 7, 3],
      "block": "stone"
    },
    {
      "at": [7, 7, 3],
      "block": "stone"
    },
    {
      "at": [7, 8, 3],
      "block": "stone"
    },
    {
      "at": [8, 7, 3],
      "block": "stone"
    },
    {
      "at": [8, 8, 3],
      "block": "stone"
    },
    {
      "at": [8, 9, 3],
      "block": "stone"
    },
    {
      "at": [9, 7, 3],
      "block": "stone"
    },
    {
      "at": [9, 8, 3],
      "block": "stone"
    },
    {
      "at": [9, 9, 3],
      "block": "stone"
    },
    {
      "at": [9, 10, 3],
      "block": "stone"
    },
    {
      "at": [6, 7, 4],
      "block": "stone"
    },
    {
      "at": [7, 7, 4],
      "block": "stone"
    },
    {
      "at": [7, 8, 4],
      "block": "stone"
    },
    {
      "at": [8, 7, 4],
      "block": "stone"
    },
    {
      "at": [8, 8, 4],
      "block": "stone"
    },
    {
      "at": [8, 9, 4],
      "block": "stone"
    },
    {
      "at": [9, 7, 4],
      "block": "stone"
    },
    {
      "at": [9, 8, 4],
      "block": "stone"
    },
    {
      "at": [9, 9, 4],
      "block": "stone"
    },
    {
      "at": [9, 10, 4],
      "block": "stone"
    },
    {
      "at": [6, 7, 5],
      "block": "stone"
    },
    {
      "at": [7, 7, 5],
      "block": "stone"
    },
    {
      "at": [7, 8, 5],
      "block": "stone"
    },
    {
      "at": [8, 7, 5],
      "block": "stone"
    },
    {
      "at": [8, 8, 5],
      "block": "stone"
    },
    {
      "at": [8, 9, 5],
      "block": "stone"
    },
    {
      "at": [9, 7, 5],
      "block": "stone"
    },
    {
      "at": [9, 8, 5],
      "block": "stone"
    },
    {
      "at": [9, 9, 5],
      "block": "stone"
    },
    {
      "at": [9, 10, 5],
      "block": "stone"
    },
    {
      "at": [6, 7, 6],
      "block": "stone"
    },
    {
      "at": [7, 7, 6],
      "block": "stone"
    },
    {
      "at": [7, 8, 6],
      "block": "stone"
    },
    {
      "at": [8, 7, 6],
      "block": "stone"
    },
    {
      "at": [8, 8, 6],
      "block": "stone"
    },
    {
      "at": [8, 9, 6],
      "block": "stone"
    },
    {
      "at": [9, 7, 6],
      "block": "stone"
    },
    {
      "at": [9, 8, 6],
      "block": "stone"
    },
    {
      "at": [9, 9, 6],
      "block": "stone"
    },
    {
      "at": [9, 10, 6],
      "block": "stone"
    },
    {
      "at": [6, 7, 7],
      "block": "stone"
    },
    {
      "at": [7, 7, 7],
      "block": "stone"
    },
    {
      "at": [7, 8, 7],
      "block": "stone"
    },
    {
      "at": [8, 7, 7],
      "block": "stone"
    },
    {
      "at": [8, 8, 7],
      "block": "stone"
    },
    {
      "at": [8, 9, 7],
      "block": "stone"
    },
    {
      "at": [9, 7, 7],
      "block": "stone"
    },
    {
      "at": [9, 8, 7],
      "block": "stone"
    },
    {
      "at": [9, 9, 7],
      "block": "stone"
    },
    {
      "at": [9, 10, 7],
      "block": "stone"
    },
    {
      "at": [6, 7, 8],
      "block": "stone"
    },
    {
      "at": [7, 7, 8],
      "block": "stone"
    },
    {
      "at": [7, 8, 8],
      "block": "stone"
    },
    {
      "at": [8, 7, 8],
      "block": "stone"
    },
    {
      "at": [8, 8, 8],
      "block": "stone"
    },
    {
      "at": [8, 9, 8],
      "block": "stone"
    },
    {
      "at": [9, 7, 8],
      "block": "stone"
    },
    {
      "at": [9, 8, 8],
      "block": "stone"
    },
    {
      "at": [9, 9, 8],
      "block": "stone"
    },
    {
      "at": [9, 10, 8],
      "block": "stone"
    },
    {
      "at": [6, 7, 9],
      "block": "stone"
    },
    {
      "at": [7, 7, 9],
      "block": "stone"
    },
    {
      "at": [7, 8, 9],
      "block": "stone"
    },
    {
      "at": [8, 7, 9],
      "block": "stone"
    },
    {
      "at": [8, 8, 9],
      "block": "stone"
    },
    {
      "at": [8, 9, 9],
      "block": "stone"
    },
    {
      "at": [9, 7, 9],
      "block": "stone"
    },
    {
      "at": [9, 8, 9],
      "block": "stone"
    },
    {
      "at": [9, 9, 9],
      "block": "stone"
    },
    {
      "at": [9, 10, 9],
      "block": "stone"
    },
    {
      "at": [-8, 6, 4],
      "block": "sand"
    },
    {
      "at": [-8, 6, 5],
      "block": "sand"
    },
    {
      "at": [-8, 6, 6],
      "block": "sand"
    },
    {
      "at": [-8, 6, 7],
      "block": "sand"
    },
    {
      "at": [-7, 6, 4],
      "block": "sand"
    },
    {
      "at": [-7, 6, 5],
      "block": "sand"
    },
    {
      "at": [-7, 6, 6],
      "block": "sand"
    },
    {
      "at": [-7, 6, 7],
      "block": "sand"
    },
    {
      "at": [-6, 6, 4],
      "block": "sand"
    },
    {
      "at": [-6, 6, 5],
      "block": "sand"
    },
    {
      "at": [-6, 6, 6],
      "block": "sand"
    },
    {
      "at": [-6, 6, 7],
      "block": "sand"
    },
    {
      "at": [-5, 6, 4],
      "block": "sand"
    },
    {
      "at": [-5, 6, 5],
      "block": "sand"
    },
    {
      "at": [-5, 6, 6],
      "block": "sand"
    },
    {
      "at": [-5, 6, 7],
      "block": "sand"
    }
  ]
}
```
