v1.1.4 schema

参照用の表示ページ。生ファイルは /schemas/release/v1.1.4/3DSS.schema.json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://3dsl.jp/schemas/release/v1.1.4/3DSS.schema.json",
  "$anchor": "v1.1.4",
  "type": "object",
  "properties": {
    "lines": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/line/node"
      }
    },
    "points": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/point/node"
      }
    },
    "aux": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/aux/node"
      }
    },
    "document_meta": {
      "$ref": "#/$defs/meta/document"
    }
  },
  "required": [
    "document_meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "validator": {
      "schema_uri": {
        "type": "string",
        "const": "https://3dsl.jp/schemas/release/v1.1.4/3DSS.schema.json#v1.1.4"
      },
      "uuid": {
        "type": "string",
        "pattern": "^(?:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$"
      },
      "uuid_v4": {
        "type": "string",
        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
      },
      "uri": {
        "$ref": "#/$defs/validator/uri_http_like"
      },
      "uri_http_like": {
        "type": "string",
        "pattern": "^(https?|ftp|file)://\\S+$"
      },
      "path_ref": {
        "type": "string",
        "pattern": "^[\\w./-]+$"
      },
      "tag": {
        "type": "string",
        "pattern": "^(s|m|x):[^\\s:]+$"
      },
      "language_code": {
        "type": "string",
        "enum": [
          "ja",
          "en"
        ]
      },
      "units": {
        "type": "string",
        "enum": [
          "m",
          "cm",
          "mm",
          "non_si:px"
        ]
      },
      "semver": {
        "type": "string",
        "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$"
      },
      "timestamp_utc": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"
      },
      "author": {
        "type": "string",
        "pattern": "^[a-zA-Z0-9._-]+(@[a-zA-Z0-9.-]+)?$"
      },
      "color_hex": {
        "type": "string",
        "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$"
      },
      "vec3": {
        "type": "array",
        "items": {
          "type": "number"
        },
        "minItems": 3,
        "maxItems": 3
      },
      "frames": {
        "oneOf": [
          {
            "type": "integer",
            "minimum": -9999,
            "maximum": 9999
          },
          {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": -9999,
              "maximum": 9999
            },
            "uniqueItems": true,
            "minItems": 1,
            "maxItems": 256
          }
        ]
      }
    },
    "spatial": {
      "position": {
        "$ref": "#/$defs/validator/vec3"
      },
      "orientation": {
        "$ref": "#/$defs/validator/vec3"
      },
      "scale": {
        "$ref": "#/$defs/validator/vec3"
      },
      "rotation": {
        "$ref": "#/$defs/validator/vec3"
      },
      "offset": {
        "$ref": "#/$defs/validator/vec3"
      },
      "axis_signed": {
        "type": "string",
        "enum": [
          "+x",
          "-x",
          "+y",
          "-y",
          "+z",
          "-z"
        ]
      },
      "vec3": {
        "type": "array",
        "items": {
          "type": "number"
        },
        "minItems": 3,
        "maxItems": 3,
        "description": "3D vector [x,y,z]."
      }
    },
    "geometry": {
      "line_geometry": {
        "type": "object",
        "properties": {
          "dimension": {
            "type": "integer",
            "enum": [
              2,
              3
            ]
          },
          "polyline_points": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/validator/vec3"
            }
          },
          "bezier_controls": {
            "type": "array",
            "minItems": 1,
            "maxItems": 2,
            "items": {
              "$ref": "#/$defs/validator/vec3"
            }
          },
          "arc_center": {
            "$ref": "#/$defs/validator/vec3"
          },
          "arc_radius": {
            "type": "number",
            "minimum": 0
          },
          "arc_angle_start": {
            "type": "number"
          },
          "arc_angle_end": {
            "type": "number"
          },
          "arc_clockwise": {
            "type": "boolean"
          },
          "catmullrom_points": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/validator/vec3"
            }
          },
          "catmullrom_tension": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "additionalProperties": false
      }
    },
    "extension": {
      "parametric": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "minLength": 1
          },
          "version": {
            "$ref": "#/$defs/validator/semver"
          },
          "params": {
            "type": "object",
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "boolean"
                },
                {
                  "type": "string"
                },
                {
                  "type": "array",
                  "items": {
                    "type": "number"
                  }
                }
              ]
            }
          },
          "bindings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "target": {
                  "$ref": "#/$defs/validator/path_ref"
                },
                "expression": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "target",
                "expression"
              ],
              "additionalProperties": false
            }
          },
          "seed": {
            "type": "integer"
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false
      },
      "latex": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1
          },
          "render_mode": {
            "type": "string",
            "enum": [
              "math",
              "inline",
              "block"
            ]
          },
          "font_size": {
            "type": "number"
          },
          "color": {
            "$ref": "#/$defs/validator/color_hex"
          },
          "position": {
            "$ref": "#/$defs/validator/vec3"
          },
          "pose": {
            "$ref": "#/$defs/text_pose",
            "default": {
              "front": [
                0,
                1,
                0
              ],
              "up": [
                0,
                0,
                1
              ]
            }
          }
        },
        "required": [
          "content",
          "pose"
        ],
        "additionalProperties": false
      }
    },
    "labels": {
      "localized_string": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "properties": {
              "ja": {
                "type": "string"
              },
              "en": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "caption_text_style": {
        "type": "object",
        "properties": {
          "font_size": {
            "type": "number",
            "minimum": 0.125,
            "maximum": 256,
            "default": 8
          },
          "pose": {
            "$ref": "#/$defs/text_pose",
            "default": {
              "front": [
                0,
                1,
                0
              ],
              "up": [
                0,
                0,
                1
              ]
            }
          }
        },
        "additionalProperties": false
      }
    },
    "line": {
      "relation": {
        "type": "object",
        "properties": {
          "structural": {
            "type": "string",
            "enum": [
              "association",
              "containment",
              "hierarchy"
            ]
          },
          "dynamic": {
            "type": "string",
            "enum": [
              "causal",
              "flow",
              "influence",
              "derivation",
              "transformation",
              "feedback",
              "recursion",
              "reflection"
            ]
          },
          "logical": {
            "type": "string",
            "enum": [
              "equivalence",
              "negation",
              "implication",
              "support",
              "conflict"
            ]
          },
          "temporal": {
            "type": "string",
            "enum": [
              "precedence",
              "succession"
            ]
          },
          "meta": {
            "type": "string",
            "enum": [
              "reference"
            ]
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "additionalProperties": false
      },
      "signification": {
        "type": "object",
        "properties": {
          "relation": {
            "$ref": "#/$defs/line/relation"
          },
          "sense": {
            "type": "string",
            "enum": [
              "a_to_b",
              "b_to_a",
              "bidirectional",
              "neutral"
            ],
            "default": "a_to_b"
          },
          "caption": {
            "$ref": "#/$defs/labels/localized_string",
            "default": ""
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "ref": {
                "$ref": "#/$defs/validator/uuid"
              }
            },
            "required": [
              "ref"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "coord": {
                "$ref": "#/$defs/validator/vec3"
              }
            },
            "required": [
              "coord"
            ],
            "additionalProperties": false
          }
        ]
      },
      "arrow": {
        "type": "object",
        "properties": {
          "primitive": {
            "type": "string",
            "enum": [
              "none",
              "line",
              "cone",
              "pyramid"
            ]
          },
          "length": {
            "type": "number",
            "minimum": 0.0001
          },
          "thickness": {
            "type": "number",
            "minimum": 0.0001
          },
          "radius": {
            "type": "number",
            "minimum": 0.0001
          },
          "height": {
            "type": "number",
            "minimum": 0.0001
          },
          "base": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": 0.0001
            },
            "minItems": 2,
            "maxItems": 2
          },
          "placement": {
            "type": "string",
            "enum": [
              "end_a",
              "end_b",
              "both",
              "none"
            ],
            "default": "end_b"
          },
          "auto_orient": {
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "primitive"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "line"
                }
              }
            },
            "then": {
              "properties": {
                "length": {},
                "thickness": {}
              },
              "required": [
                "length",
                "thickness"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "cone"
                }
              }
            },
            "then": {
              "properties": {
                "radius": {},
                "height": {}
              },
              "required": [
                "radius",
                "height"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "pyramid"
                }
              }
            },
            "then": {
              "properties": {
                "base": {},
                "height": {}
              },
              "required": [
                "base",
                "height"
              ]
            }
          }
        ]
      },
      "effect": {
        "type": "object",
        "properties": {
          "effect_type": {
            "type": "string",
            "enum": [
              "none",
              "pulse",
              "flow",
              "glow"
            ],
            "default": "none"
          },
          "amplitude": {
            "type": "number",
            "minimum": 0,
            "default": 1
          },
          "speed": {
            "type": "number",
            "minimum": 0,
            "default": 1
          },
          "duration": {
            "type": "number",
            "minimum": 0,
            "default": 1
          },
          "loop": {
            "type": "boolean",
            "default": true
          },
          "phase": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0
          },
          "easing": {
            "type": "string",
            "enum": [
              "linear",
              "ease-in",
              "ease-out",
              "ease-in-out"
            ],
            "default": "linear"
          },
          "width": {
            "type": "number",
            "default": 1
          }
        },
        "additionalProperties": false
      },
      "appearance": {
        "type": "object",
        "properties": {
          "end_a": {
            "$ref": "#/$defs/line/endpoint"
          },
          "end_b": {
            "$ref": "#/$defs/line/endpoint"
          },
          "line_type": {
            "type": "string",
            "enum": [
              "straight",
              "polyline",
              "catmullrom",
              "bezier",
              "arc"
            ],
            "default": "straight"
          },
          "geometry": {
            "$ref": "#/$defs/geometry/line_geometry"
          },
          "line_style": {
            "type": "string",
            "enum": [
              "solid",
              "dashed",
              "dotted",
              "double",
              "none"
            ],
            "default": "solid"
          },
          "color": {
            "$ref": "#/$defs/validator/color_hex",
            "default": "#ffffff"
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.4
          },
          "render_order": {
            "type": "number",
            "default": 0
          },
          "arrow": {
            "$ref": "#/$defs/line/arrow"
          },
          "effect": {
            "$ref": "#/$defs/line/effect"
          },
          "visible": {
            "type": "boolean"
          },
          "frames": {
            "$ref": "#/$defs/validator/frames"
          },
          "caption_text": {
            "$ref": "#/$defs/labels/caption_text_style"
          }
        },
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "line_type": {
                  "enum": [
                    "polyline",
                    "catmullrom",
                    "bezier",
                    "arc"
                  ]
                }
              },
              "required": [
                "line_type"
              ]
            },
            "then": {
              "properties": {
                "geometry": {}
              },
              "required": [
                "geometry"
              ]
            }
          }
        ]
      },
      "node": {
        "type": "object",
        "properties": {
          "signification": {
            "$ref": "#/$defs/line/signification"
          },
          "appearance": {
            "$ref": "#/$defs/line/appearance"
          },
          "meta": {
            "$ref": "#/$defs/meta/core"
          }
        },
        "required": [
          "appearance",
          "meta"
        ],
        "additionalProperties": false
      }
    },
    "point": {
      "name": {
        "allOf": [
          {
            "$ref": "#/$defs/labels/localized_string"
          }
        ],
        "default": ""
      },
      "signification": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/$defs/point/name"
          }
        },
        "additionalProperties": false
      },
      "marker_common": {
        "type": "object",
        "properties": {
          "orientation": {
            "$ref": "#/$defs/spatial/orientation",
            "default": [
              0,
              0,
              0
            ]
          },
          "scale": {
            "$ref": "#/$defs/spatial/scale",
            "default": [
              1,
              1,
              1
            ]
          },
          "color": {
            "$ref": "#/$defs/validator/color_hex",
            "default": "#ffffff"
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.4
          },
          "emissive": {
            "type": "boolean",
            "default": false
          },
          "wireframe": {
            "type": "boolean",
            "default": false
          }
        },
        "additionalProperties": false
      },
      "marker_gltf": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "default": ""
          },
          "scale": {
            "$ref": "#/$defs/spatial/scale",
            "default": [
              1,
              1,
              1
            ]
          },
          "rotation": {
            "$ref": "#/$defs/spatial/rotation",
            "default": [
              0,
              0,
              0
            ]
          },
          "offset": {
            "$ref": "#/$defs/spatial/offset",
            "default": [
              0,
              0,
              0
            ]
          }
        },
        "additionalProperties": false
      },
      "marker_text": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "default": ""
          },
          "font": {
            "type": "string",
            "default": "helvetiker_regular"
          },
          "size": {
            "type": "number",
            "default": 8
          },
          "align": {
            "type": "string",
            "enum": [
              "left&top",
              "left&middle",
              "left&baseline",
              "center&top",
              "center&middle",
              "center&baseline",
              "right&top",
              "right&middle",
              "right&baseline"
            ],
            "default": "center&middle"
          },
          "pose": {
            "$ref": "#/$defs/text_pose",
            "default": {
              "front": [
                0,
                1,
                0
              ],
              "up": [
                0,
                0,
                1
              ]
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "content",
          "pose"
        ]
      },
      "marker": {
        "type": "object",
        "properties": {
          "common": {
            "$ref": "#/$defs/point/marker_common"
          },
          "primitive": {
            "type": "string",
            "enum": [
              "sphere",
              "box",
              "cone",
              "pyramid",
              "corona",
              "none"
            ]
          },
          "radius": {
            "type": "number",
            "minimum": 0.0001
          },
          "size": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": 0.0001
            },
            "minItems": 3,
            "maxItems": 3
          },
          "height": {
            "type": "number",
            "minimum": 0.0001
          },
          "base": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": 0.0001
            },
            "minItems": 2,
            "maxItems": 2
          },
          "inner_radius": {
            "type": "number",
            "minimum": 0.0001
          },
          "outer_radius": {
            "type": "number",
            "minimum": 0.0001
          },
          "gltf": {
            "$ref": "#/$defs/point/marker_gltf"
          },
          "text": {
            "$ref": "#/$defs/point/marker_text"
          }
        },
        "required": [
          "primitive"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "sphere"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "radius": {}
              },
              "required": [
                "radius"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "box"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "size": {}
              },
              "required": [
                "size"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "cone"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "radius": {},
                "height": {}
              },
              "required": [
                "radius",
                "height"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "pyramid"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "base": {},
                "height": {}
              },
              "required": [
                "base",
                "height"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "corona"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "inner_radius": {},
                "outer_radius": {}
              },
              "required": [
                "inner_radius",
                "outer_radius"
              ]
            }
          }
        ]
      },
      "appearance": {
        "type": "object",
        "properties": {
          "position": {
            "$ref": "#/$defs/spatial/position"
          },
          "marker": {
            "$ref": "#/$defs/point/marker"
          },
          "visible": {
            "type": "boolean"
          },
          "frames": {
            "$ref": "#/$defs/validator/frames"
          }
        },
        "required": [
          "position"
        ],
        "additionalProperties": false
      },
      "node": {
        "type": "object",
        "properties": {
          "signification": {
            "$ref": "#/$defs/point/signification"
          },
          "appearance": {
            "$ref": "#/$defs/point/appearance"
          },
          "meta": {
            "$ref": "#/$defs/meta/core"
          }
        },
        "required": [
          "appearance",
          "meta"
        ],
        "additionalProperties": false
      }
    },
    "aux": {
      "module_grid": {
        "type": "object",
        "properties": {
          "grid_type": {
            "type": "string",
            "enum": [
              "cartesian",
              "polar"
            ],
            "default": "cartesian"
          },
          "subdivisions": {
            "type": "integer",
            "default": 8
          },
          "major_step": {
            "type": "number",
            "default": 4
          },
          "minor_step": {
            "type": "number",
            "default": 1
          },
          "color_major": {
            "$ref": "#/$defs/validator/color_hex",
            "default": "#666666"
          },
          "color_minor": {
            "$ref": "#/$defs/validator/color_hex",
            "default": "#333333"
          }
        },
        "additionalProperties": false
      },
      "module_axis_arrow": {
        "type": "object",
        "properties": {
          "primitive": {
            "type": "string",
            "enum": [
              "none",
              "line",
              "cone",
              "pyramid"
            ]
          },
          "length": {
            "type": "number",
            "minimum": 0.0001
          },
          "thickness": {
            "type": "number",
            "minimum": 0.0001
          },
          "radius": {
            "type": "number",
            "minimum": 0.0001
          },
          "height": {
            "type": "number",
            "minimum": 0.0001
          },
          "base": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": 0.0001
            },
            "minItems": 2,
            "maxItems": 2
          }
        },
        "required": [
          "primitive"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "line"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "length": {},
                "thickness": {}
              },
              "required": [
                "length",
                "thickness"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "cone"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "radius": {},
                "height": {}
              },
              "required": [
                "radius",
                "height"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "primitive": {
                  "const": "pyramid"
                }
              },
              "required": [
                "primitive"
              ]
            },
            "then": {
              "properties": {
                "base": {},
                "height": {}
              },
              "required": [
                "base",
                "height"
              ]
            }
          }
        ]
      },
      "module_axis": {
        "type": "object",
        "properties": {
          "length": {
            "type": "number",
            "default": 64
          },
          "labels": {
            "type": "boolean",
            "default": true
          },
          "arrow": {
            "$ref": "#/$defs/aux/module_axis_arrow"
          }
        },
        "additionalProperties": false
      },
      "module_plate": {
        "type": "object",
        "properties": {
          "plane": {
            "type": "string",
            "enum": [
              "xy",
              "yz",
              "zx"
            ],
            "default": "xy"
          },
          "position": {
            "$ref": "#/$defs/spatial/position",
            "default": [
              0,
              0,
              0
            ]
          },
          "size": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "minItems": 2,
            "maxItems": 2,
            "default": [
              32,
              32
            ]
          },
          "reflectivity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.4
          }
        },
        "additionalProperties": false
      },
      "module_shell_effect": {
        "type": "object",
        "properties": {
          "edge_intensity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "rimlight": {
            "type": "boolean",
            "default": false
          },
          "glow_color": {
            "$ref": "#/$defs/validator/color_hex",
            "default": "#ff0000"
          }
        },
        "additionalProperties": false
      },
      "module_shell": {
        "type": "object",
        "properties": {
          "shell_type": {
            "type": "string",
            "enum": [
              "sphere",
              "box",
              "hemisphere",
              "quarter_sphere",
              "eighth_sphere"
            ],
            "default": "sphere"
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.4
          },
          "reflectivity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5
          },
          "effect": {
            "$ref": "#/$defs/aux/module_shell_effect"
          }
        },
        "additionalProperties": false
      },
      "module_hud": {
        "type": "object",
        "properties": {
          "follow_camera": {
            "type": "boolean",
            "default": true
          },
          "scale_with_distance": {
            "type": "boolean",
            "default": true
          }
        },
        "additionalProperties": false
      },
      "module_extension": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "latex": {
            "$ref": "#/$defs/extension/latex"
          },
          "parametric": {
            "$ref": "#/$defs/extension/parametric"
          }
        },
        "additionalProperties": false
      },
      "module": {
        "type": "object",
        "properties": {
          "grid": {
            "$ref": "#/$defs/aux/module_grid"
          },
          "axis": {
            "$ref": "#/$defs/aux/module_axis"
          },
          "plate": {
            "$ref": "#/$defs/aux/module_plate"
          },
          "shell": {
            "$ref": "#/$defs/aux/module_shell"
          },
          "hud": {
            "$ref": "#/$defs/aux/module_hud"
          },
          "extension": {
            "$ref": "#/$defs/aux/module_extension"
          }
        },
        "additionalProperties": false
      },
      "appearance": {
        "type": "object",
        "properties": {
          "position": {
            "$ref": "#/$defs/spatial/position",
            "default": [
              0,
              0,
              0
            ]
          },
          "orientation": {
            "$ref": "#/$defs/spatial/orientation",
            "default": [
              0,
              0,
              0
            ]
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.4
          },
          "module": {
            "$ref": "#/$defs/aux/module"
          },
          "visible": {
            "type": "boolean"
          },
          "frames": {
            "$ref": "#/$defs/validator/frames"
          }
        },
        "additionalProperties": false
      },
      "node": {
        "type": "object",
        "properties": {
          "appearance": {
            "$ref": "#/$defs/aux/appearance"
          },
          "meta": {
            "$ref": "#/$defs/meta/core"
          }
        },
        "required": [
          "meta"
        ],
        "additionalProperties": false
      }
    },
    "meta": {
      "core": {
        "type": "object",
        "properties": {
          "uuid": {
            "$ref": "#/$defs/validator/uuid"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/validator/tag"
            }
          },
          "creator_memo": {
            "type": "string"
          }
        },
        "required": [
          "uuid"
        ],
        "additionalProperties": false
      },
      "document": {
        "type": "object",
        "properties": {
          "document_title": {
            "$ref": "#/$defs/labels/localized_string"
          },
          "document_summary": {
            "$ref": "#/$defs/labels/localized_string"
          },
          "document_uuid": {
            "$ref": "#/$defs/validator/uuid"
          },
          "version": {
            "allOf": [
              {
                "$ref": "#/$defs/validator/semver"
              }
            ],
            "default": "1.0.0"
          },
          "created_at": {
            "$ref": "#/$defs/validator/timestamp_utc"
          },
          "revised_at": {
            "$ref": "#/$defs/validator/timestamp_utc"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/validator/tag"
            },
            "default": []
          },
          "schema_uri": {
            "$ref": "#/$defs/validator/schema_uri"
          },
          "generator": {
            "allOf": [
              {
                "$ref": "#/$defs/validator/uri"
              }
            ],
            "default": "https://3dsl.jp/"
          },
          "reference": {
            "type": "string",
            "default": ""
          },
          "coordinate_system": {
            "type": "string",
            "const": "Z+up/freeXY"
          },
          "units": {
            "$ref": "#/$defs/validator/units",
            "default": "non_si:px"
          },
          "i18n": {
            "$ref": "#/$defs/validator/language_code",
            "default": "ja"
          },
          "author": {
            "$ref": "#/$defs/validator/author"
          },
          "creator_memo": {
            "type": "string"
          }
        },
        "required": [
          "document_title",
          "document_uuid",
          "created_at",
          "revised_at",
          "schema_uri",
          "author",
          "version"
        ],
        "additionalProperties": false
      }
    },
    "text_pose": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "front": {
          "$ref": "#/$defs/spatial/vec3"
        },
        "up": {
          "$ref": "#/$defs/spatial/vec3"
        }
      },
      "required": [
        "front",
        "up"
      ],
      "description": "Text orientation in 3D space. 'front' is the text's facing direction (normal), 'up' is the direction of the top of the text. Stored form is always vec3."
    }
  }
}