{ "$schema": "https://json-schema.org/draft-07/schema#", "title": "BEACH Case File", "description": "Schema for preset-based BEACH case.toml files. Supports high-level spatial notation that is resolved by `beachx config render`.", "type": "object", "properties": { "schema_version": { "type": "integer", "const": 1, "default": 1, "description": "Version of the case-layer file format." }, "title": { "type": "string", "description": "Optional human-readable case title." }, "use_presets": { "type": "array", "minItems": 1, "description": "Ordered list of preset names to merge before applying override.", "items": { "$ref": "#/$defs/presetName" } }, "override": { "$ref": "#/$defs/configFragment" } }, "required": [ "use_presets" ], "additionalProperties": false, "$defs": { "presetName": { "type": "string", "pattern": "^(?!/)(?!.*\\.toml$)(?!.*(?:^|/)\\.\\.?($|/))[A-Za-z0-9_.-]+(?:/[A-Za-z0-9_.-]+)+$", "description": "Preset name such as sim/periodic2_fmm." }, "vec2": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 }, "vec3": { "$ref": "./beach.schema.json#/$defs/vec3" }, "positiveVec3": { "$ref": "./beach.schema.json#/$defs/positiveVec3" }, "anchor": { "type": "string", "enum": [ "box_center", "x_low_face_center", "x_high_face_center", "y_low_face_center", "y_high_face_center", "z_low_face_center", "z_high_face_center" ] }, "scaleFrom": { "type": "string", "enum": [ "box_x", "box_y", "box_z", "box_min_xy", "box_max_xy", "box_min_xyz", "box_max_xyz" ] }, "simFragment": { "type": "object", "additionalProperties": true, "properties": { "box_origin": { "$ref": "#/$defs/vec3" }, "box_size": { "$ref": "#/$defs/positiveVec3" } }, "allOf": [ { "not": { "required": [ "box_origin", "box_min" ] } }, { "not": { "required": [ "box_size", "box_max" ] } } ] }, "speciesFragment": { "type": "object", "additionalProperties": true, "properties": { "id": { "type": "string", "minLength": 1, "description": "Optional identifier for ID-based merge in overrides." }, "source_mode": { "type": "string", "enum": [ "volume_seed", "reservoir_face", "photo_raycast" ] }, "inject_face": { "$ref": "./beach.schema.json#/$defs/injectFace" }, "inject_region_mode": { "type": "string", "enum": [ "absolute", "face_fraction" ] }, "uv_low": { "$ref": "#/$defs/vec2" }, "uv_high": { "$ref": "#/$defs/vec2" } }, "allOf": [ { "if": { "anyOf": [ { "required": [ "inject_region_mode" ] }, { "required": [ "uv_low" ] }, { "required": [ "uv_high" ] } ] }, "then": { "properties": { "source_mode": { "enum": [ "reservoir_face", "photo_raycast" ] } }, "required": [ "source_mode" ] } } ] }, "particlesFragment": { "type": "object", "additionalProperties": true, "properties": { "species": { "type": "array", "items": { "$ref": "#/$defs/speciesFragment" } } } }, "meshGroup": { "type": "object", "additionalProperties": true, "properties": { "placement_mode": { "type": "string", "enum": [ "absolute", "box_anchor" ] }, "anchor": { "$ref": "#/$defs/anchor" }, "offset": { "$ref": "#/$defs/vec3" }, "offset_frac": { "$ref": "#/$defs/vec3" }, "scale": { "type": "number", "exclusiveMinimum": 0 }, "scale_from": { "$ref": "#/$defs/scaleFrom" }, "scale_factor": { "type": "number", "exclusiveMinimum": 0 } } }, "templateFragment": { "type": "object", "additionalProperties": true, "properties": { "id": { "type": "string", "minLength": 1, "description": "Optional identifier for ID-based merge in overrides." }, "placement_mode": { "type": "string", "enum": [ "absolute", "box_anchor" ] }, "anchor": { "$ref": "#/$defs/anchor" }, "offset": { "$ref": "#/$defs/vec3" }, "offset_frac": { "$ref": "#/$defs/vec3" }, "size_mode": { "type": "string", "enum": [ "absolute", "box_fraction" ] }, "size_frac": { "oneOf": [ { "type": "number" }, { "$ref": "#/$defs/vec2" }, { "$ref": "#/$defs/vec3" } ] }, "group": { "type": "string" }, "center_local": { "$ref": "#/$defs/vec3" } } }, "meshFragment": { "type": "object", "additionalProperties": true, "properties": { "groups": { "type": "object", "additionalProperties": { "$ref": "#/$defs/meshGroup" } }, "templates": { "type": "array", "items": { "$ref": "#/$defs/templateFragment" } } } }, "configFragment": { "type": "object", "additionalProperties": false, "properties": { "sim": { "$ref": "#/$defs/simFragment" }, "particles": { "$ref": "#/$defs/particlesFragment" }, "mesh": { "$ref": "#/$defs/meshFragment" }, "output": { "$ref": "./beach.schema.json#/$defs/output" } } } } }