{ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "definitions": { "AssetCategory": { "enum": [ "hero", "prop", "environment", "default" ], "type": "string" }, "Budgets": { "additionalProperties": false, "properties": { "default": { "default": 30000, "minimum": 0.0, "type": "integer" }, "environment": { "default": 50000, "minimum": 0.0, "type": "integer" }, "hero": { "default": 100000, "minimum": 0.0, "type": "integer" }, "prop": { "default": 20000, "minimum": 0.0, "type": "integer" } }, "type": "object" }, "ClassifierRule": { "additionalProperties": false, "properties": { "category": { "$ref": "#/definitions/AssetCategory" }, "pattern": { "type": "string" } }, "required": [ "category", "pattern" ], "type": "object" }, "FilenameClassifier": { "additionalProperties": false, "properties": { "rules": { "default": [], "items": { "$ref": "#/definitions/ClassifierRule" }, "type": "array" } }, "type": "object" }, "ReviewSettings": { "additionalProperties": false, "description": "Project-level review-system settings. User-level prefs (display name for the `author` field, panel open default) live in [`crate::preferences::ReviewPrefs`].", "properties": { "sidecar_dir": { "default": null, "description": "Override location of the `.solarxy-review.json` sidecar. `None` (default) ⇒ sibling to the model file. Relative paths are resolved against the model's parent directory (so `\".solarxy\"` produces `/.solarxy/.solarxy-review.json`). Absolute paths are used as-is.", "type": [ "string", "null" ] } }, "type": "object" }, "ValidationConfig": { "additionalProperties": false, "properties": { "allow_open_mesh": { "default": false, "type": "boolean" }, "degenerate_triangles": { "default": true, "type": "boolean" }, "flipped_normals": { "default": true, "type": "boolean" }, "index_buffer": { "default": true, "type": "boolean" }, "material_refs": { "default": true, "type": "boolean" }, "non_manifold_edges": { "default": true, "type": "boolean" }, "normal_mismatch": { "default": true, "type": "boolean" }, "triangle_budget": { "default": true, "type": "boolean" }, "uv_presence": { "default": true, "type": "boolean" } }, "type": "object" }, "ValidationThresholds": { "additionalProperties": false, "properties": { "flipped_normal_dot": { "default": -0.5, "type": "number" }, "triangle_budget_tolerance_percent": { "default": 20.0, "type": "number" } }, "type": "object" } }, "properties": { "budgets": { "allOf": [ { "$ref": "#/definitions/Budgets" } ], "default": { "default": 30000, "environment": 50000, "hero": 100000, "prop": 20000 } }, "filenames": { "allOf": [ { "$ref": "#/definitions/FilenameClassifier" } ], "default": { "rules": [] } }, "format_version": { "default": 1, "minimum": 0.0, "type": "integer" }, "review": { "allOf": [ { "$ref": "#/definitions/ReviewSettings" } ], "default": { "sidecar_dir": null } }, "thresholds": { "allOf": [ { "$ref": "#/definitions/ValidationThresholds" } ], "default": { "flipped_normal_dot": -0.5, "triangle_budget_tolerance_percent": 20.0 } }, "validation": { "allOf": [ { "$ref": "#/definitions/ValidationConfig" } ], "default": { "allow_open_mesh": false, "degenerate_triangles": true, "flipped_normals": true, "index_buffer": true, "material_refs": true, "non_manifold_edges": true, "normal_mismatch": true, "triangle_budget": true, "uv_presence": true } } }, "title": "ProjectConfig", "type": "object" }