{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://blitz3d.com/schemas/world-v1.schema.json",
  "title": "Blitz3D+ World Source",
  "description": "Authoring schema for strict UTF-8 JSON .world version 1 sources. Runtime limits and duplicate-key rejection are additionally enforced by b3dworldc.",
  "type": "object",
  "required": [
    "format",
    "version",
    "assets",
    "entities"
  ],
  "properties": {
    "format": {
      "const": "blitz3d.world"
    },
    "version": {
      "const": 1
    },
    "id": {
      "$ref": "#/$defs/id"
    },
    "name": {
      "type": "string",
      "maxLength": 16384
    },
    "settings": {
      "$ref": "#/$defs/settings"
    },
    "assets": {
      "type": "array",
      "maxItems": 65536,
      "items": {
        "$ref": "#/$defs/asset"
      }
    },
    "entities": {
      "type": "array",
      "maxItems": 262144,
      "items": {
        "$ref": "#/$defs/entity"
      }
    },
    "metadata": {
      "$ref": "#/$defs/metadata"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "required": {
            "const": false,
            "default": false
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true,
  "$defs": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1024,
      "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
    },
    "finiteNumber": {
      "type": "number"
    },
    "color": {
      "type": "array",
      "minItems": 3,
      "maxItems": 3,
      "items": {
        "type": "integer",
        "minimum": 0,
        "maximum": 255
      }
    },
    "vec2": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
        "$ref": "#/$defs/finiteNumber"
      }
    },
    "positiveVec2": {
      "description": "Two finite positive components. Layer uvScale additionally requires equal components because version 1 maps to TerrainLayer's uniform scale.",
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
        "type": "number",
        "exclusiveMinimum": 0
      }
    },
    "vec3": {
      "type": "array",
      "minItems": 3,
      "maxItems": 3,
      "items": {
        "$ref": "#/$defs/finiteNumber"
      }
    },
    "quaternion": {
      "description": "Normalized by the runtime; component order is x,y,z,w.",
      "type": "array",
      "minItems": 4,
      "maxItems": 4,
      "items": {
        "$ref": "#/$defs/finiteNumber"
      }
    },
    "metadata": {
      "type": "object",
      "maxProperties": 4096,
      "additionalProperties": {
        "type": "string"
      }
    },
    "settings": {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string"
        },
        "ambient": {
          "$ref": "#/$defs/color"
        },
        "shadows": {
          "type": "object",
          "properties": {
            "enabled": {
              "type": "boolean",
              "default": false
            },
            "quality": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4,
              "default": 1
            },
            "distance": {
              "$ref": "#/$defs/finiteNumber"
            },
            "color": {
              "$ref": "#/$defs/color"
            },
            "strength": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            "depthBias": {
              "type": "number",
              "minimum": 0
            },
            "normalBias": {
              "type": "number",
              "minimum": 0
            }
          },
          "additionalProperties": true
        },
        "collisions": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "sourceType",
              "destinationType",
              "method",
              "response"
            ],
            "properties": {
              "sourceType": {
                "type": "integer",
                "minimum": 0,
                "maximum": 999
              },
              "destinationType": {
                "type": "integer",
                "minimum": 0,
                "maximum": 999
              },
              "method": {
                "enum": [
                  "sphere",
                  "polygon",
                  "box"
                ]
              },
              "response": {
                "enum": [
                  "stop",
                  "slide",
                  "slide-xz",
                  "grip"
                ]
              }
            },
            "additionalProperties": true
          }
        },
        "physics": {
          "type": "object",
          "properties": {
            "gravity": {
              "$ref": "#/$defs/vec3"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": true
    },
    "asset": {
      "type": "object",
      "required": [
        "id",
        "kind",
        "loading"
      ],
      "oneOf": [
        {
          "required": [
            "source"
          ],
          "not": {
            "required": [
              "inline"
            ]
          }
        },
        {
          "required": [
            "inline"
          ],
          "not": {
            "required": [
              "source"
            ]
          }
        }
      ],
      "allOf": [
        {
          "if": {
            "properties": {
              "kind": {
                "const": "terrain-definition"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "terrain-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "animset"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "animset-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "environment"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "environment-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "sound-definition"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "sound-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "audiomix"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "audiomix-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "postfx"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "postfx-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "enum": [
                  "model",
                  "texture",
                  "heightmap",
                  "sound",
                  "shader"
                ]
              }
            }
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "inline"
                  ]
                },
                {
                  "required": [
                    "expectedId"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "material"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "material-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "prefab"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "prefab-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "physics"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "physics-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "particles"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "particles-v1.schema.json"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "shader"
              }
            }
          },
          "then": {
            "properties": {
              "options": {
                "properties": {
                  "configuration": {
                    "const": ""
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "native-ui"
              }
            }
          },
          "then": {
            "properties": {
              "inline": {
                "$ref": "ui-v1.schema.json"
              }
            }
          }
        }
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "kind": {
          "enum": [
            "model",
            "texture",
            "heightmap",
            "sound",
            "shader",
            "material",
            "prefab",
            "physics",
            "particles",
            "environment",
            "postfx",
            "sound-definition",
            "audiomix",
            "animset",
            "terrain-definition",
            "native-ui"
          ]
        },
        "source": {
          "type": "string",
          "minLength": 1,
          "maxLength": 32767
        },
        "inline": {
          "$ref": "resource-v1.schema.json"
        },
        "expectedId": {
          "$ref": "#/$defs/id"
        },
        "loading": {
          "enum": [
            "required",
            "streaming",
            "manual"
          ]
        },
        "options": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "transform": {
      "type": "object",
      "properties": {
        "position": {
          "$ref": "#/$defs/vec3",
          "default": [
            0,
            0,
            0
          ]
        },
        "rotation": {
          "$ref": "#/$defs/quaternion",
          "default": [
            0,
            0,
            0,
            1
          ]
        },
        "scale": {
          "$ref": "#/$defs/vec3",
          "default": [
            1,
            1,
            1
          ]
        }
      },
      "additionalProperties": true
    },
    "modelComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "oneOf": [
        {
          "required": [
            "asset"
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "primitive"
                ]
              },
              {
                "required": [
                  "assetInput"
                ]
              }
            ]
          }
        },
        {
          "required": [
            "assetInput"
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "primitive"
                ]
              },
              {
                "required": [
                  "asset"
                ]
              }
            ]
          }
        },
        {
          "required": [
            "primitive"
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "asset"
                ]
              },
              {
                "required": [
                  "assetInput"
                ]
              }
            ]
          }
        }
      ],
      "allOf": [
        {
          "if": {
            "anyOf": [
              {
                "required": [
                  "asset"
                ]
              },
              {
                "required": [
                  "assetInput"
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "animationSet": {
                "$ref": "#/$defs/id"
              },
              "materials": {
                "items": {
                  "if": {
                    "required": [
                      "slot"
                    ],
                    "properties": {
                      "slot": {
                        "minimum": 1
                      }
                    }
                  },
                  "then": {
                    "required": [
                      "modelRevision"
                    ]
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "primitive"
            ]
          },
          "then": {
            "properties": {
              "materials": {
                "items": {
                  "not": {
                    "required": [
                      "modelRevision"
                    ]
                  }
                }
              }
            }
          }
        }
      ],
      "properties": {
        "type": {
          "const": "model"
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "assetInput": {
          "$ref": "#/$defs/id"
        },
        "primitive": {
          "enum": [
            "cube",
            "sphere",
            "cylinder",
            "cone",
            "quad",
            "infinite-plane",
            "plane"
          ],
          "description": "quad is a finite 2 x 2 surface; infinite-plane is a native CreatePlane(1). plane is a legacy alias for quad."
        },
        "castShadows": {
          "type": "boolean",
          "default": true
        },
        "receiveShadows": {
          "type": "boolean",
          "default": true
        },
        "lods": {
          "type": "array",
          "maxItems": 64,
          "items": {
            "type": "object",
            "required": [
              "asset",
              "distance"
            ],
            "properties": {
              "asset": {
                "$ref": "#/$defs/id"
              },
              "distance": {
                "type": "number",
                "exclusiveMinimum": 0
              }
            },
            "additionalProperties": true
          }
        },
        "lodTransition": {
          "type": "number",
          "minimum": 0,
          "default": 0
        },
        "cullRange": {
          "type": "number",
          "minimum": 0,
          "default": 0
        },
        "materials": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/materialBinding"
          }
        }
      },
      "additionalProperties": true
    },
    "materialBinding": {
      "description": "Slot 0 applies to the entire model. Positive slots are one-based surfaces in depth-first model/node order. Imported positive slots require a portable import revision. Native validation checks duplicate/overlapping slots, references, current import identity and LOD mapping.",
      "type": "object",
      "required": [
        "slot"
      ],
      "oneOf": [
        {
          "required": [
            "asset"
          ],
          "not": {
            "required": [
              "input"
            ]
          }
        },
        {
          "required": [
            "input"
          ],
          "not": {
            "required": [
              "asset"
            ]
          }
        }
      ],
      "properties": {
        "slot": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65536
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "input": {
          "$ref": "#/$defs/id"
        },
        "modelRevision": {
          "type": "string",
          "pattern": "^[0-9a-f]{64}$"
        },
        "overrides": {
          "$ref": "resource-v1.schema.json#/$defs/materialOverrides"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "slot": {
                "const": 0
              }
            }
          },
          "then": {
            "not": {
              "required": [
                "modelRevision"
              ]
            }
          }
        }
      ],
      "additionalProperties": true
    },
    "prefabComponent": {
      "type": "object",
      "required": [
        "type",
        "asset"
      ],
      "properties": {
        "type": {
          "const": "prefab"
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "inputs": {
          "$ref": "resource-v1.schema.json#/$defs/prefabBindings"
        },
        "overrides": {
          "$ref": "resource-v1.schema.json#/$defs/prefabOverrides"
        }
      },
      "additionalProperties": true
    },
    "terrainMaterial": {
      "oneOf": [
        {
          "$ref": "#/$defs/terrainMaterialInline"
        },
        {
          "type": "object",
          "properties": {
            "asset": {
              "$ref": "#/$defs/id"
            }
          },
          "required": [
            "asset"
          ],
          "additionalProperties": false
        }
      ]
    },
    "terrainDefinition": {
      "type": "object",
      "required": [
        "heightmap"
      ],
      "properties": {
        "heightmap": {
          "$ref": "#/$defs/id"
        },
        "detail": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100000,
          "default": 500
        },
        "morph": {
          "type": "boolean",
          "default": true
        },
        "shading": {
          "type": "boolean",
          "default": true
        },
        "lodRanges": {
          "type": "object",
          "properties": {
            "near": {
              "type": "number",
              "minimum": 0,
              "default": 0
            },
            "far": {
              "type": "number",
              "minimum": 0,
              "default": 0
            }
          },
          "additionalProperties": true
        },
        "material": {
          "$ref": "#/$defs/terrainMaterial"
        },
        "dimensions": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 3.4028234663852886e+38
          }
        },
        "scatter": {
          "type": "array",
          "maxItems": 64,
          "items": {
            "type": "object",
            "required": [
              "id",
              "model",
              "count"
            ],
            "properties": {
              "id": {
                "$ref": "#/$defs/id"
              },
              "model": {
                "$ref": "#/$defs/id"
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 16384
              },
              "seed": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2147483647
              },
              "minimumScale": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 3.4028234663852886e+38
              },
              "maximumScale": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 3.4028234663852886e+38
              },
              "maximumSlope": {
                "type": "number",
                "minimum": 0,
                "maximum": 90
              },
              "align": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        }
      },
      "additionalProperties": false
    },
    "terrainComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "terrain"
        },
        "heightmap": {
          "$ref": "#/$defs/id"
        },
        "detail": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100000,
          "default": 500
        },
        "morph": {
          "type": "boolean",
          "default": true
        },
        "shading": {
          "type": "boolean",
          "default": true
        },
        "lodRanges": {
          "type": "object",
          "properties": {
            "near": {
              "type": "number",
              "minimum": 0,
              "default": 0
            },
            "far": {
              "type": "number",
              "minimum": 0,
              "default": 0
            }
          },
          "additionalProperties": true
        },
        "material": {
          "$ref": "#/$defs/terrainMaterial"
        },
        "dimensions": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 3.4028234663852886e+38
          }
        },
        "scatter": {
          "type": "array",
          "maxItems": 64,
          "items": {
            "type": "object",
            "required": [
              "id",
              "model",
              "count"
            ],
            "properties": {
              "id": {
                "$ref": "#/$defs/id"
              },
              "model": {
                "$ref": "#/$defs/id"
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 16384
              },
              "seed": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2147483647
              },
              "minimumScale": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 3.4028234663852886e+38
              },
              "maximumScale": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 3.4028234663852886e+38
              },
              "maximumSlope": {
                "type": "number",
                "minimum": 0,
                "maximum": 90
              },
              "align": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        },
        "asset": {
          "$ref": "#/$defs/id"
        }
      },
      "additionalProperties": true,
      "oneOf": [
        {
          "required": [
            "asset"
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "heightmap"
                ]
              },
              {
                "required": [
                  "detail"
                ]
              },
              {
                "required": [
                  "morph"
                ]
              },
              {
                "required": [
                  "shading"
                ]
              },
              {
                "required": [
                  "lodRanges"
                ]
              },
              {
                "required": [
                  "material"
                ]
              },
              {
                "required": [
                  "dimensions"
                ]
              },
              {
                "required": [
                  "scatter"
                ]
              }
            ]
          }
        },
        {
          "required": [
            "heightmap"
          ],
          "not": {
            "required": [
              "asset"
            ]
          }
        }
      ]
    },
    "cameraComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "camera"
        },
        "postfx": {
          "anyOf": [
            {
              "const": ""
            },
            {
              "$ref": "#/$defs/id"
            }
          ]
        },
        "projection": {
          "enum": [
            "disabled",
            "perspective",
            "orthographic"
          ],
          "default": "perspective"
        },
        "near": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 0.1
        },
        "far": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 1000
        },
        "zoom": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 1
        },
        "clearColor": {
          "$ref": "#/$defs/color"
        },
        "clearColorEnabled": {
          "type": "boolean",
          "default": true
        },
        "clearDepthEnabled": {
          "type": "boolean",
          "default": true
        },
        "fogMode": {
          "enum": [
            "none",
            "linear"
          ],
          "default": "none"
        },
        "fogNear": {
          "type": "number",
          "minimum": 0,
          "default": 1
        },
        "fogFar": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 1000
        },
        "fogColor": {
          "$ref": "#/$defs/color"
        }
      },
      "additionalProperties": true
    },
    "lightComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "light"
        },
        "kind": {
          "enum": [
            "directional",
            "point",
            "spot"
          ],
          "default": "directional"
        },
        "color": {
          "$ref": "#/$defs/color"
        },
        "range": {
          "type": "number",
          "minimum": 0
        },
        "innerAngle": {
          "type": "number",
          "minimum": 0,
          "maximum": 180
        },
        "outerAngle": {
          "type": "number",
          "minimum": 0,
          "maximum": 180
        }
      },
      "additionalProperties": true
    },
    "listenerComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "listener"
        }
      },
      "additionalProperties": true
    },
    "collisionComponent": {
      "type": "object",
      "required": [
        "type",
        "entityType"
      ],
      "properties": {
        "type": {
          "const": "collision"
        },
        "entityType": {
          "type": "integer",
          "minimum": 0,
          "maximum": 999
        },
        "pickMode": {
          "enum": [
            "none",
            "sphere",
            "polygon",
            "box"
          ],
          "default": "none"
        },
        "obscurer": {
          "type": "boolean",
          "default": true
        },
        "radius": {
          "$ref": "#/$defs/vec2"
        },
        "box": {
          "type": "array",
          "minItems": 6,
          "maxItems": 6,
          "items": {
            "$ref": "#/$defs/finiteNumber"
          }
        }
      },
      "additionalProperties": true
    },
    "markerComponent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "enum": [
            "marker",
            "metadata-only"
          ]
        }
      },
      "additionalProperties": true
    },
    "attachmentComponent": {
      "type": "object",
      "required": [
        "type",
        "target"
      ],
      "properties": {
        "type": {
          "const": "attachment"
        },
        "target": {
          "allOf": [
            {
              "$ref": "resource-v1.schema.json#/$defs/prefabReference"
            },
            {
              "not": {
                "required": [
                  "asset"
                ]
              }
            }
          ]
        },
        "bone": {
          "type": "string",
          "maxLength": 32767,
          "pattern": "^[^\\u0000]*$"
        }
      },
      "additionalProperties": true
    },
    "soundEmitterComponent": {
      "type": "object",
      "required": [
        "type",
        "asset"
      ],
      "properties": {
        "type": {
          "const": "sound-emitter"
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "activation": {
          "enum": [
            "manual",
            "on-activate"
          ]
        }
      }
    },
    "particlesComponent": {
      "type": "object",
      "required": [
        "type",
        "asset"
      ],
      "properties": {
        "type": {
          "const": "particles"
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "seed": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2147483647
        },
        "inputs": {
          "type": "object",
          "maxProperties": 64,
          "additionalProperties": {
            "$ref": "resource-v1.schema.json#/$defs/prefabReference"
          }
        },
        "physicsInputs": {
          "type": "array",
          "maxItems": 64,
          "uniqueItems": true,
          "items": {
            "$ref": "#/$defs/id"
          }
        },
        "overrides": false
      }
    },
    "physicsComponent": {
      "type": "object",
      "required": [
        "type",
        "asset"
      ],
      "properties": {
        "type": {
          "const": "physics"
        },
        "asset": {
          "$ref": "#/$defs/id"
        },
        "targets": {
          "type": "object",
          "maxProperties": 256,
          "additionalProperties": {
            "$ref": "resource-v1.schema.json#/$defs/prefabReference"
          }
        }
      },
      "additionalProperties": true
    },
    "physicsBodyReference": {
      "type": "object",
      "required": [
        "body"
      ],
      "properties": {
        "body": {
          "$ref": "#/$defs/id"
        },
        "entity": {
          "$ref": "#/$defs/id"
        },
        "instances": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/id"
          }
        },
        "input": {
          "$ref": "#/$defs/id"
        }
      },
      "oneOf": [
        {
          "required": [
            "entity"
          ]
        },
        {
          "required": [
            "input"
          ]
        }
      ],
      "additionalProperties": false
    },
    "physicsJointComponent": {
      "type": "object",
      "required": [
        "type",
        "kind",
        "bodyA",
        "bodyB"
      ],
      "properties": {
        "type": {
          "const": "physics-joint"
        },
        "kind": {
          "enum": [
            "distance",
            "hinge",
            "ball",
            "slider",
            "fixed"
          ]
        },
        "bodyA": {
          "$ref": "#/$defs/physicsBodyReference"
        },
        "bodyB": {
          "$ref": "#/$defs/physicsBodyReference"
        },
        "anchorA": {
          "$ref": "#/$defs/vec3"
        },
        "anchorB": {
          "$ref": "#/$defs/vec3"
        },
        "axis": {
          "$ref": "#/$defs/vec3"
        },
        "length": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "limits": {
          "type": "object",
          "required": [
            "lower",
            "upper"
          ],
          "properties": {
            "lower": {
              "$ref": "#/$defs/finiteNumber"
            },
            "upper": {
              "$ref": "#/$defs/finiteNumber"
            }
          }
        },
        "motor": {
          "type": "object",
          "required": [
            "speed",
            "maximumForce"
          ],
          "properties": {
            "speed": {
              "$ref": "#/$defs/finiteNumber"
            },
            "maximumForce": {
              "type": "number",
              "minimum": 0
            }
          }
        }
      },
      "additionalProperties": true
    },
    "component": {
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "not": {
                  "const": "sound-emitter"
                }
              }
            }
          },
          "then": {
            "properties": {
              "activation": false
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "not": {
                  "const": "camera"
                }
              }
            }
          },
          "then": {
            "properties": {
              "postfx": false
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "not": {
                  "enum": [
                    "prefab",
                    "particles"
                  ]
                }
              }
            }
          },
          "then": {
            "properties": {
              "inputs": false,
              "overrides": false
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "not": {
                  "const": "model"
                }
              }
            }
          },
          "then": {
            "properties": {
              "assetInput": false
            }
          }
        }
      ],
      "oneOf": [
        {
          "$ref": "#/$defs/modelComponent"
        },
        {
          "$ref": "#/$defs/prefabComponent"
        },
        {
          "$ref": "#/$defs/terrainComponent"
        },
        {
          "$ref": "#/$defs/cameraComponent"
        },
        {
          "$ref": "#/$defs/lightComponent"
        },
        {
          "$ref": "#/$defs/listenerComponent"
        },
        {
          "$ref": "#/$defs/collisionComponent"
        },
        {
          "$ref": "#/$defs/markerComponent"
        },
        {
          "$ref": "#/$defs/attachmentComponent"
        },
        {
          "$ref": "#/$defs/particlesComponent"
        },
        {
          "$ref": "#/$defs/soundEmitterComponent"
        },
        {
          "$ref": "#/$defs/physicsComponent"
        },
        {
          "$ref": "#/$defs/physicsJointComponent"
        }
      ]
    },
    "entity": {
      "type": "object",
      "required": [
        "id",
        "components"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "name": {
          "type": "string",
          "maxLength": 16384
        },
        "parent": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/id"
            }
          ]
        },
        "enabled": {
          "type": "boolean",
          "default": true
        },
        "visible": {
          "type": "boolean",
          "default": true
        },
        "transform": {
          "$ref": "#/$defs/transform"
        },
        "components": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/component"
          }
        },
        "metadata": {
          "$ref": "#/$defs/metadata"
        }
      },
      "additionalProperties": true
    },
    "terrainMaterialInline": {
      "oneOf": [
        {
          "type": "object",
          "required": [
            "mode"
          ],
          "properties": {
            "mode": {
              "const": "legacy"
            },
            "texture": {
              "$ref": "#/$defs/id"
            },
            "textureScale": {
              "$ref": "#/$defs/positiveVec2",
              "default": [
                1,
                1
              ]
            }
          },
          "not": {
            "anyOf": [
              {
                "required": [
                  "layers"
                ]
              },
              {
                "required": [
                  "splatMap"
                ]
              },
              {
                "required": [
                  "normalMap"
                ]
              }
            ]
          },
          "additionalProperties": false
        },
        {
          "type": "object",
          "required": [
            "mode",
            "layers"
          ],
          "properties": {
            "mode": {
              "const": "layers"
            },
            "layers": {
              "type": "array",
              "minItems": 1,
              "maxItems": 4,
              "items": {
                "type": "object",
                "required": [],
                "properties": {
                  "texture": {
                    "$ref": "#/$defs/id"
                  },
                  "uvScale": {
                    "description": "Uniform layer scale; both components must match.",
                    "$ref": "#/$defs/positiveVec2",
                    "default": [
                      1,
                      1
                    ]
                  },
                  "color": {
                    "$ref": "#/$defs/color"
                  }
                },
                "additionalProperties": true
              }
            },
            "splatMap": {
              "$ref": "#/$defs/id"
            },
            "normalMap": {
              "$ref": "#/$defs/id"
            }
          },
          "not": {
            "anyOf": [
              {
                "required": []
              },
              {
                "required": [
                  "textureScale"
                ]
              }
            ]
          },
          "additionalProperties": false
        }
      ]
    }
  }
}
