diff --git a/Cargo.toml b/Cargo.toml index e7397fd..89cbbf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,15 @@ members = [ "examples/common/", "examples/bevy_gltf_components/basic/", - "examples/bevy_gltf_blueprints/basic/", "examples/bevy_gltf_blueprints/basic_xpbd_physics/", "examples/bevy_gltf_blueprints/animation/", "examples/bevy_gltf_blueprints/multiple_levels_multiple_blendfiles", "examples/bevy_gltf_blueprints/materials/", - "examples/bevy_gltf_save_load/basic/", - - "examples/bevy_registry_export/basic" + "examples/bevy_registry_export/basic", + + "testing/bevy_registry_export/basic" ] resolver = "2" diff --git a/examples/bevy_registry_export/basic/assets/basic.blend b/examples/bevy_registry_export/basic/assets/basic.blend index bcfe0ff..b38fad3 100644 Binary files a/examples/bevy_registry_export/basic/assets/basic.blend and b/examples/bevy_registry_export/basic/assets/basic.blend differ diff --git a/examples/bevy_registry_export/basic/assets/models/World.glb b/examples/bevy_registry_export/basic/assets/models/World.glb index 7ed6e73..04d2c2a 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/World.glb and b/examples/bevy_registry_export/basic/assets/models/World.glb differ diff --git a/examples/bevy_registry_export/basic/assets/models/library/Container.glb b/examples/bevy_registry_export/basic/assets/models/library/Container.glb index 5818d2c..630a6c0 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/library/Container.glb and b/examples/bevy_registry_export/basic/assets/models/library/Container.glb differ diff --git a/examples/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb b/examples/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb index f5d97cb..6454202 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb and b/examples/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb differ diff --git a/examples/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb b/examples/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb index 47c37cd..a66129d 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb and b/examples/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb differ diff --git a/examples/bevy_registry_export/basic/assets/models/library/Pillar.glb b/examples/bevy_registry_export/basic/assets/models/library/Pillar.glb index 9a6f3e0..08371d4 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/library/Pillar.glb and b/examples/bevy_registry_export/basic/assets/models/library/Pillar.glb differ diff --git a/examples/bevy_registry_export/basic/assets/models/library/Player.glb b/examples/bevy_registry_export/basic/assets/models/library/Player.glb index 2d749b2..81a30b8 100644 Binary files a/examples/bevy_registry_export/basic/assets/models/library/Player.glb and b/examples/bevy_registry_export/basic/assets/models/library/Player.glb differ diff --git a/testing/bevy_registry_export/basic/Cargo.toml b/testing/bevy_registry_export/basic/Cargo.toml new file mode 100644 index 0000000..da6df7f --- /dev/null +++ b/testing/bevy_registry_export/basic/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "bevy_bevy_registry_export_basic_testing" +version = "0.3.0" +edition = "2021" +license = "MIT OR Apache-2.0" + +[dependencies] +bevy="0.12" +bevy_gltf_blueprints = { path = "../../../crates/bevy_gltf_blueprints" } +bevy_registry_export = { path = "../../../crates/bevy_registry_export" } +bevy_gltf_worlflow_examples_common = { path = "../../../examples/common" } + +bevy_rapier3d = { version = "0.23.0", features = [ "serde-serialize", "debug-render-3d", "enhanced-determinism"] } +bevy_asset_loader = { version = "0.18", features = ["standard_dynamic_assets" ]} +bevy_editor_pls = { version = "0.6" } +rand = "0.8.5" diff --git a/testing/bevy_registry_export/basic/README.md b/testing/bevy_registry_export/basic/README.md new file mode 100644 index 0000000..5d2e087 --- /dev/null +++ b/testing/bevy_registry_export/basic/README.md @@ -0,0 +1,15 @@ +# Bevy registry export example/demo + +This example showcases +* the use of the bevy_registry_export crate to extract all components & types information into a json file. +* That file is then used by the [Blender addon](https://github.com/kaosat-dev/Blender_bevy_components_workflow/tree/main/tools/bevy_components) to create Uis for each component, +to be able to add & edit Bevy components easilly in Blender ! + + +## Running this example + +``` +cargo run --features bevy/dynamic_linking +``` + +Running the example also regenerates the registry.json file. diff --git a/testing/bevy_registry_export/basic/assets/assets_core.assets.ron b/testing/bevy_registry_export/basic/assets/assets_core.assets.ron new file mode 100644 index 0000000..8d0a099 --- /dev/null +++ b/testing/bevy_registry_export/basic/assets/assets_core.assets.ron @@ -0,0 +1 @@ +({}) \ No newline at end of file diff --git a/testing/bevy_registry_export/basic/assets/assets_game.assets.ron b/testing/bevy_registry_export/basic/assets/assets_game.assets.ron new file mode 100644 index 0000000..5b1e969 --- /dev/null +++ b/testing/bevy_registry_export/basic/assets/assets_game.assets.ron @@ -0,0 +1,6 @@ +({ + "world":File (path: "models/World.glb"), + "models": Folder ( + path: "models/library", + ), +}) \ No newline at end of file diff --git a/testing/bevy_registry_export/basic/assets/basic.blend b/testing/bevy_registry_export/basic/assets/basic.blend new file mode 100644 index 0000000..532628b Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/basic.blend differ diff --git a/testing/bevy_registry_export/basic/assets/models/World.glb b/testing/bevy_registry_export/basic/assets/models/World.glb new file mode 100644 index 0000000..81caa9d Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/World.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/Container.glb b/testing/bevy_registry_export/basic/assets/models/library/Container.glb new file mode 100644 index 0000000..5818d2c Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/Container.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb b/testing/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb new file mode 100644 index 0000000..f5d97cb Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/Health_Pickup.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb b/testing/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb new file mode 100644 index 0000000..47c37cd Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/MagicTeapot.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/Pillar.glb b/testing/bevy_registry_export/basic/assets/models/library/Pillar.glb new file mode 100644 index 0000000..9a6f3e0 Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/Pillar.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/Player.glb b/testing/bevy_registry_export/basic/assets/models/library/Player.glb new file mode 100644 index 0000000..2d749b2 Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/Player.glb differ diff --git a/testing/bevy_registry_export/basic/assets/models/library/Unused_in_level_test.glb b/testing/bevy_registry_export/basic/assets/models/library/Unused_in_level_test.glb new file mode 100644 index 0000000..c80b966 Binary files /dev/null and b/testing/bevy_registry_export/basic/assets/models/library/Unused_in_level_test.glb differ diff --git a/testing/bevy_registry_export/basic/assets/registry.json b/testing/bevy_registry_export/basic/assets/registry.json new file mode 100644 index 0000000..86a81b7 --- /dev/null +++ b/testing/bevy_registry_export/basic/assets/registry.json @@ -0,0 +1,10732 @@ +{ + "$defs": { + "(f32, f32)": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + }, + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "(f32, f32)", + "title": "(f32, f32)", + "type": "array", + "typeInfo": "Tuple" + }, + "alloc::borrow::Cow": { + "isComponent": false, + "isResource": false, + "short_name": "Cow", + "title": "alloc::borrow::Cow", + "type": "object", + "typeInfo": "Value" + }, + "alloc::borrow::Cow": { + "isComponent": false, + "isResource": false, + "short_name": "Cow", + "title": "alloc::borrow::Cow", + "type": "object", + "typeInfo": "Value" + }, + "alloc::string::String": { + "isComponent": false, + "isResource": false, + "short_name": "String", + "title": "alloc::string::String", + "type": "string", + "typeInfo": "Value" + }, + "alloc::vec::Vec<(f32, f32)>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/(f32, f32)" + } + }, + "short_name": "Vec<(f32, f32)>", + "title": "alloc::vec::Vec<(f32, f32)>", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::TupleVec3" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/bevy_text::text::TextSection" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "short_name": "Vec", + "title": "alloc::vec::Vec", + "type": "array", + "typeInfo": "List" + }, + "bevy_animation::AnimationClip": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "curves": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec>" + } + }, + "duration": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "paths": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap" + } + } + }, + "required": [ + "curves", + "paths", + "duration" + ], + "short_name": "AnimationClip", + "title": "bevy_animation::AnimationClip", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_animation::AnimationPlayer": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "animation": { + "type": { + "$ref": "#/$defs/bevy_animation::PlayingAnimation" + } + }, + "paused": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "paused", + "animation" + ], + "short_name": "AnimationPlayer", + "title": "bevy_animation::AnimationPlayer", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_asset::handle::Handle<()>": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId<()>" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle<()>", + "title": "bevy_asset::handle::Handle<()>", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle>": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId>" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle>", + "title": "bevy_asset::handle::Handle>", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::handle::Handle": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/std::sync::Arc" + } + } + ], + "short_name": "Strong", + "title": "Strong", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::id::AssetId" + } + } + ], + "short_name": "Weak", + "title": "Weak", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Handle", + "title": "bevy_asset::handle::Handle", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId<()>": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId<()>", + "title": "bevy_asset::id::AssetId<()>", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId>": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId>", + "title": "bevy_asset::id::AssetId>", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_asset::id::AssetId": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "index": { + "title": "index", + "type": { + "$ref": "#/$defs/bevy_asset::assets::AssetIndex" + } + } + }, + "required": [ + "index" + ], + "short_name": "Index", + "title": "Index", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "uuid": { + "title": "uuid", + "type": { + "$ref": "#/$defs/bevy_utils::Uuid" + } + } + }, + "required": [ + "uuid" + ], + "short_name": "Uuid", + "title": "Uuid", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "AssetId", + "title": "bevy_asset::id::AssetId", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_bevy_registry_export_basic_testing::test_components::AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut", + "title": "bevy_bevy_registry_export_basic_testing::test_components::AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::BasicTest": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "a": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "b": { + "type": { + "$ref": "#/$defs/u64" + } + }, + "c": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + }, + "required": [ + "a", + "b", + "c" + ], + "short_name": "BasicTest", + "title": "bevy_bevy_registry_export_basic_testing::test_components::BasicTest", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::EnumComplex": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Float", + "title": "Float", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + ], + "short_name": "Wood", + "title": "Wood", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::BasicTest" + } + } + ], + "short_name": "Vec", + "title": "Vec", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "SomeThing" + }, + { + "additionalProperties": false, + "properties": { + "a": { + "title": "a", + "type": { + "$ref": "#/$defs/f32" + } + }, + "b": { + "title": "b", + "type": { + "$ref": "#/$defs/u32" + } + }, + "c": { + "title": "c", + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + }, + "required": [ + "a", + "b", + "c" + ], + "short_name": "StructLike", + "title": "StructLike", + "type": "object", + "typeInfo": "Struct" + }, + { + "title": "None" + } + ], + "short_name": "EnumComplex", + "title": "bevy_bevy_registry_export_basic_testing::test_components::EnumComplex", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_bevy_registry_export_basic_testing::test_components::EnumTest": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Metal", + "Wood", + "Rock", + "Cloth", + "Squishy", + "None" + ], + "short_name": "EnumTest", + "title": "bevy_bevy_registry_export_basic_testing::test_components::EnumTest", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_bevy_registry_export_basic_testing::test_components::NestedTupleStuff": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + }, + { + "type": { + "$ref": "#/$defs/u64" + } + }, + { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel2" + } + } + ], + "short_name": "NestedTupleStuff", + "title": "bevy_bevy_registry_export_basic_testing::test_components::NestedTupleStuff", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel2": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "basic": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::BasicTest" + } + }, + "color": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::TupleTestColor" + } + }, + "colors_list": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::VecOfColors" + } + }, + "enable": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "enum_inner": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::EnumTest" + } + }, + "nested": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel3" + } + }, + "text": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + }, + "toggle": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::TupleTestBool" + } + } + }, + "required": [ + "text", + "enable", + "enum_inner", + "color", + "toggle", + "basic", + "nested", + "colors_list" + ], + "short_name": "NestingTestLevel2", + "title": "bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel2", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel3": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "vec": { + "type": { + "$ref": "#/$defs/bevy_bevy_registry_export_basic_testing::test_components::TupleVec3" + } + } + }, + "required": [ + "vec" + ], + "short_name": "NestingTestLevel3", + "title": "bevy_bevy_registry_export_basic_testing::test_components::NestingTestLevel3", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTest2": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + }, + { + "type": { + "$ref": "#/$defs/u64" + } + }, + { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + ], + "short_name": "TupleTest2", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTest2", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTestBool": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bool" + } + } + ], + "short_name": "TupleTestBool", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTestBool", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTestColor": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + ], + "short_name": "TupleTestColor", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTestColor", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTestF32": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "TupleTestF32", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTestF32", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTestStr": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + ], + "short_name": "TupleTestStr", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTestStr", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleTestU64": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u64" + } + } + ], + "short_name": "TupleTestU64", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleTestU64", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleVec": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "TupleVec", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleVec", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleVec2": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + ], + "short_name": "TupleVec2", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleVec2", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleVec3": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "TupleVec3", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleVec3", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::TupleVecF32F32": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec<(f32, f32)>" + } + } + ], + "short_name": "TupleVecF32F32", + "title": "bevy_bevy_registry_export_basic_testing::test_components::TupleVecF32F32", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::UnitTest": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "UnitTest", + "title": "bevy_bevy_registry_export_basic_testing::test_components::UnitTest", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::VecOfColors": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "VecOfColors", + "title": "bevy_bevy_registry_export_basic_testing::test_components::VecOfColors", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::VecOfF32s": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "VecOfF32s", + "title": "bevy_bevy_registry_export_basic_testing::test_components::VecOfF32s", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_bevy_registry_export_basic_testing::test_components::VecOfVec3s2": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "VecOfVec3s2", + "title": "bevy_bevy_registry_export_basic_testing::test_components::VecOfVec3s2", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_core::name::Name": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "hash": { + "type": { + "$ref": "#/$defs/u64" + } + }, + "name": { + "type": { + "$ref": "#/$defs/alloc::borrow::Cow" + } + } + }, + "required": [ + "hash", + "name" + ], + "short_name": "Name", + "title": "bevy_core::name::Name", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::bloom::settings::BloomCompositeMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "EnergyConserving", + "Additive" + ], + "short_name": "BloomCompositeMode", + "title": "bevy_core_pipeline::bloom::settings::BloomCompositeMode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_core_pipeline::bloom::settings::BloomPrefilterSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "threshold_softness": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "threshold", + "threshold_softness" + ], + "short_name": "BloomPrefilterSettings", + "title": "bevy_core_pipeline::bloom::settings::BloomPrefilterSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::bloom::settings::BloomSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "composite_mode": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::bloom::settings::BloomCompositeMode" + } + }, + "high_pass_frequency": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "intensity": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "low_frequency_boost": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "low_frequency_boost_curvature": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "prefilter_settings": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::bloom::settings::BloomPrefilterSettings" + } + } + }, + "required": [ + "intensity", + "low_frequency_boost", + "low_frequency_boost_curvature", + "high_pass_frequency", + "prefilter_settings", + "composite_mode" + ], + "short_name": "BloomSettings", + "title": "bevy_core_pipeline::bloom::settings::BloomSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::clear_color::ClearColor": { + "isComponent": false, + "isResource": true, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + ], + "short_name": "ClearColor", + "title": "bevy_core_pipeline::clear_color::ClearColor", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_core_pipeline::clear_color::ClearColorConfig": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Default" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + ], + "short_name": "Custom", + "title": "Custom", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "None" + } + ], + "short_name": "ClearColorConfig", + "title": "bevy_core_pipeline::clear_color::ClearColorConfig", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_core_pipeline::contrast_adaptive_sharpening::ContrastAdaptiveSharpeningSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "denoise": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "sharpening_strength": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "enabled", + "sharpening_strength", + "denoise" + ], + "short_name": "ContrastAdaptiveSharpeningSettings", + "title": "bevy_core_pipeline::contrast_adaptive_sharpening::ContrastAdaptiveSharpeningSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::core_2d::camera_2d::Camera2d": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "clear_color": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::clear_color::ClearColorConfig" + } + } + }, + "required": [ + "clear_color" + ], + "short_name": "Camera2d", + "title": "bevy_core_pipeline::core_2d::camera_2d::Camera2d", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::core_3d::camera_3d::Camera3d": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "clear_color": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::clear_color::ClearColorConfig" + } + }, + "depth_load_op": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::core_3d::camera_3d::Camera3dDepthLoadOp" + } + }, + "depth_texture_usages": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::core_3d::camera_3d::Camera3dDepthTextureUsage" + } + }, + "screen_space_specular_transmission_quality": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::core_3d::camera_3d::ScreenSpaceTransmissionQuality" + } + }, + "screen_space_specular_transmission_steps": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "clear_color", + "depth_load_op", + "depth_texture_usages", + "screen_space_specular_transmission_steps", + "screen_space_specular_transmission_quality" + ], + "short_name": "Camera3d", + "title": "bevy_core_pipeline::core_3d::camera_3d::Camera3d", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::core_3d::camera_3d::Camera3dDepthLoadOp": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Clear", + "title": "Clear", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "Load" + } + ], + "short_name": "Camera3dDepthLoadOp", + "title": "bevy_core_pipeline::core_3d::camera_3d::Camera3dDepthLoadOp", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_core_pipeline::fxaa::Fxaa": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "edge_threshold": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::fxaa::Sensitivity" + } + }, + "edge_threshold_min": { + "type": { + "$ref": "#/$defs/bevy_core_pipeline::fxaa::Sensitivity" + } + }, + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "enabled", + "edge_threshold", + "edge_threshold_min" + ], + "short_name": "Fxaa", + "title": "bevy_core_pipeline::fxaa::Fxaa", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::prepass::DepthPrepass": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "DepthPrepass", + "title": "bevy_core_pipeline::prepass::DepthPrepass", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::prepass::NormalPrepass": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "NormalPrepass", + "title": "bevy_core_pipeline::prepass::NormalPrepass", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_core_pipeline::tonemapping::DebandDither": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Disabled", + "Enabled" + ], + "short_name": "DebandDither", + "title": "bevy_core_pipeline::tonemapping::DebandDither", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_core_pipeline::tonemapping::Tonemapping": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "None", + "Reinhard", + "ReinhardLuminance", + "AcesFitted", + "AgX", + "SomewhatBoringDisplayTransform", + "TonyMcMapface", + "BlenderFilmic" + ], + "short_name": "Tonemapping", + "title": "bevy_core_pipeline::tonemapping::Tonemapping", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ecs::Entity": { + "isComponent": false, + "isResource": false, + "short_name": "Entity", + "title": "bevy_ecs::Entity", + "type": "object", + "typeInfo": "Value" + }, + "bevy_egui::EguiSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "default_open_url_target": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "scale_factor": { + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "scale_factor" + ], + "short_name": "EguiSettings", + "title": "bevy_egui::EguiSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf::GltfExtras": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "value": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + }, + "required": [ + "value" + ], + "short_name": "GltfExtras", + "title": "bevy_gltf::GltfExtras", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_blueprints::animation::Animations": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "named_animations": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>" + } + } + }, + "required": [ + "named_animations" + ], + "short_name": "Animations", + "title": "bevy_gltf_blueprints::animation::Animations", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_blueprints::materials::MaterialInfo": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "name": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + }, + "source": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + }, + "required": [ + "name", + "source" + ], + "short_name": "MaterialInfo", + "title": "bevy_gltf_blueprints::materials::MaterialInfo", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_blueprints::spawn_from_blueprints::BlueprintName": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + ], + "short_name": "BlueprintName", + "title": "bevy_gltf_blueprints::spawn_from_blueprints::BlueprintName", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_gltf_blueprints::spawn_from_blueprints::SpawnHere": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "SpawnHere", + "title": "bevy_gltf_blueprints::spawn_from_blueprints::SpawnHere", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::camera::camera_replace_proxies::SSAOSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "SSAOSettings", + "title": "bevy_gltf_worlflow_examples_common::core::camera::camera_replace_proxies::SSAOSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTrackable": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "CameraTrackable", + "title": "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTrackable", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTracking": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "offset": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "offset" + ], + "short_name": "CameraTracking", + "title": "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTracking", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTrackingOffset": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "CameraTrackingOffset", + "title": "bevy_gltf_worlflow_examples_common::core::camera::camera_tracking::CameraTrackingOffset", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_gltf_worlflow_examples_common::core::lighting::lighting_replace_proxies::AmbientLightSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "brightness": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + }, + "required": [ + "color", + "brightness" + ], + "short_name": "AmbientLightSettings", + "title": "bevy_gltf_worlflow_examples_common::core::lighting::lighting_replace_proxies::AmbientLightSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::lighting::lighting_replace_proxies::ShadowmapSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "size" + ], + "short_name": "ShadowmapSettings", + "title": "bevy_gltf_worlflow_examples_common::core::lighting::lighting_replace_proxies::ShadowmapSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::core::physics::physics_replace_proxies::AutoAABBCollider": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Cuboid", + "Ball", + "Capsule" + ], + "short_name": "AutoAABBCollider", + "title": "bevy_gltf_worlflow_examples_common::core::physics::physics_replace_proxies::AutoAABBCollider", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_gltf_worlflow_examples_common::core::physics::physics_replace_proxies::Collider": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Ball", + "title": "Ball", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "Cuboid", + "title": "Cuboid", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Capsule", + "title": "Capsule", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "Mesh" + } + ], + "short_name": "Collider", + "title": "bevy_gltf_worlflow_examples_common::core::physics::physics_replace_proxies::Collider", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_gltf_worlflow_examples_common::game::picking::Pickable": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Pickable", + "title": "bevy_gltf_worlflow_examples_common::game::picking::Pickable", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_gltf_worlflow_examples_common::game::player::Player": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Player", + "title": "bevy_gltf_worlflow_examples_common::game::player::Player", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_hierarchy::components::children::Children": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/smallvec::SmallVec<[bevy_ecs::Entity; 8]>" + } + } + ], + "short_name": "Children", + "title": "bevy_hierarchy::components::children::Children", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_hierarchy::components::parent::Parent": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + ], + "short_name": "Parent", + "title": "bevy_hierarchy::components::parent::Parent", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_input::ButtonState": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Pressed", + "Released" + ], + "short_name": "ButtonState", + "title": "bevy_input::ButtonState", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_input::gamepad::AxisSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "deadzone_lowerbound": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "deadzone_upperbound": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "livezone_lowerbound": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "livezone_upperbound": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "threshold": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "livezone_upperbound", + "deadzone_upperbound", + "deadzone_lowerbound", + "livezone_lowerbound", + "threshold" + ], + "short_name": "AxisSettings", + "title": "bevy_input::gamepad::AxisSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::ButtonAxisSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "high": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "low": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "threshold": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "high", + "low", + "threshold" + ], + "short_name": "ButtonAxisSettings", + "title": "bevy_input::gamepad::ButtonAxisSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::ButtonSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "press_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "release_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "press_threshold", + "release_threshold" + ], + "short_name": "ButtonSettings", + "title": "bevy_input::gamepad::ButtonSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::Gamepad": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "id": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "id" + ], + "short_name": "Gamepad", + "title": "bevy_input::gamepad::Gamepad", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::GamepadAxis": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "axis_type": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::GamepadAxisType" + } + }, + "gamepad": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::Gamepad" + } + } + }, + "required": [ + "gamepad", + "axis_type" + ], + "short_name": "GamepadAxis", + "title": "bevy_input::gamepad::GamepadAxis", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::GamepadAxisType": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "LeftStickX" + }, + { + "title": "LeftStickY" + }, + { + "title": "LeftZ" + }, + { + "title": "RightStickX" + }, + { + "title": "RightStickY" + }, + { + "title": "RightZ" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u8" + } + } + ], + "short_name": "Other", + "title": "Other", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "GamepadAxisType", + "title": "bevy_input::gamepad::GamepadAxisType", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_input::gamepad::GamepadButton": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "button_type": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::GamepadButtonType" + } + }, + "gamepad": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::Gamepad" + } + } + }, + "required": [ + "gamepad", + "button_type" + ], + "short_name": "GamepadButton", + "title": "bevy_input::gamepad::GamepadButton", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::GamepadButtonInput": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "button": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::GamepadButton" + } + }, + "state": { + "type": { + "$ref": "#/$defs/bevy_input::ButtonState" + } + } + }, + "required": [ + "button", + "state" + ], + "short_name": "GamepadButtonInput", + "title": "bevy_input::gamepad::GamepadButtonInput", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::gamepad::GamepadButtonType": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "South" + }, + { + "title": "East" + }, + { + "title": "North" + }, + { + "title": "West" + }, + { + "title": "C" + }, + { + "title": "Z" + }, + { + "title": "LeftTrigger" + }, + { + "title": "LeftTrigger2" + }, + { + "title": "RightTrigger" + }, + { + "title": "RightTrigger2" + }, + { + "title": "Select" + }, + { + "title": "Start" + }, + { + "title": "Mode" + }, + { + "title": "LeftThumb" + }, + { + "title": "RightThumb" + }, + { + "title": "DPadUp" + }, + { + "title": "DPadDown" + }, + { + "title": "DPadLeft" + }, + { + "title": "DPadRight" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u8" + } + } + ], + "short_name": "Other", + "title": "Other", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "GamepadButtonType", + "title": "bevy_input::gamepad::GamepadButtonType", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_input::gamepad::GamepadConnection": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::GamepadInfo" + } + } + ], + "short_name": "Connected", + "title": "Connected", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "Disconnected" + } + ], + "short_name": "GamepadConnection", + "title": "bevy_input::gamepad::GamepadConnection", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_input::gamepad::GamepadSettings": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "axis_settings": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap" + } + }, + "button_axis_settings": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap" + } + }, + "button_settings": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap" + } + }, + "default_axis_settings": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::AxisSettings" + } + }, + "default_button_axis_settings": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::ButtonAxisSettings" + } + }, + "default_button_settings": { + "type": { + "$ref": "#/$defs/bevy_input::gamepad::ButtonSettings" + } + } + }, + "required": [ + "default_button_settings", + "default_axis_settings", + "default_button_axis_settings", + "button_settings", + "axis_settings", + "button_axis_settings" + ], + "short_name": "GamepadSettings", + "title": "bevy_input::gamepad::GamepadSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::keyboard::KeyCode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Key1", + "Key2", + "Key3", + "Key4", + "Key5", + "Key6", + "Key7", + "Key8", + "Key9", + "Key0", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "Escape", + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F20", + "F21", + "F22", + "F23", + "F24", + "Snapshot", + "Scroll", + "Pause", + "Insert", + "Home", + "Delete", + "End", + "PageDown", + "PageUp", + "Left", + "Up", + "Right", + "Down", + "Back", + "Return", + "Space", + "Compose", + "Caret", + "Numlock", + "Numpad0", + "Numpad1", + "Numpad2", + "Numpad3", + "Numpad4", + "Numpad5", + "Numpad6", + "Numpad7", + "Numpad8", + "Numpad9", + "AbntC1", + "AbntC2", + "NumpadAdd", + "Apostrophe", + "Apps", + "Asterisk", + "Plus", + "At", + "Ax", + "Backslash", + "Calculator", + "Capital", + "Colon", + "Comma", + "Convert", + "NumpadDecimal", + "NumpadDivide", + "Equals", + "Grave", + "Kana", + "Kanji", + "AltLeft", + "BracketLeft", + "ControlLeft", + "ShiftLeft", + "SuperLeft", + "Mail", + "MediaSelect", + "MediaStop", + "Minus", + "NumpadMultiply", + "Mute", + "MyComputer", + "NavigateForward", + "NavigateBackward", + "NextTrack", + "NoConvert", + "NumpadComma", + "NumpadEnter", + "NumpadEquals", + "Oem102", + "Period", + "PlayPause", + "Power", + "PrevTrack", + "AltRight", + "BracketRight", + "ControlRight", + "ShiftRight", + "SuperRight", + "Semicolon", + "Slash", + "Sleep", + "Stop", + "NumpadSubtract", + "Sysrq", + "Tab", + "Underline", + "Unlabeled", + "VolumeDown", + "VolumeUp", + "Wake", + "WebBack", + "WebFavorites", + "WebForward", + "WebHome", + "WebRefresh", + "WebSearch", + "WebStop", + "Yen", + "Copy", + "Paste", + "Cut" + ], + "short_name": "KeyCode", + "title": "bevy_input::keyboard::KeyCode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_input::keyboard::KeyboardInput": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "key_code": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "scan_code": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "state": { + "type": { + "$ref": "#/$defs/bevy_input::ButtonState" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "scan_code", + "state", + "window" + ], + "short_name": "KeyboardInput", + "title": "bevy_input::keyboard::KeyboardInput", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::keyboard::ScanCode": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u32" + } + } + ], + "short_name": "ScanCode", + "title": "bevy_input::keyboard::ScanCode", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_input::mouse::MouseButton": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Left" + }, + { + "title": "Right" + }, + { + "title": "Middle" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u16" + } + } + ], + "short_name": "Other", + "title": "Other", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "MouseButton", + "title": "bevy_input::mouse::MouseButton", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_input::mouse::MouseButtonInput": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "button": { + "type": { + "$ref": "#/$defs/bevy_input::mouse::MouseButton" + } + }, + "state": { + "type": { + "$ref": "#/$defs/bevy_input::ButtonState" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "button", + "state", + "window" + ], + "short_name": "MouseButtonInput", + "title": "bevy_input::mouse::MouseButtonInput", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::mouse::MouseMotion": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "delta": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "delta" + ], + "short_name": "MouseMotion", + "title": "bevy_input::mouse::MouseMotion", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::mouse::MouseScrollUnit": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Line", + "Pixel" + ], + "short_name": "MouseScrollUnit", + "title": "bevy_input::mouse::MouseScrollUnit", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_input::mouse::MouseWheel": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "unit": { + "type": { + "$ref": "#/$defs/bevy_input::mouse::MouseScrollUnit" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + }, + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "unit", + "x", + "y", + "window" + ], + "short_name": "MouseWheel", + "title": "bevy_input::mouse::MouseWheel", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::touch::ForceTouch": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "altitude_angle": { + "title": "altitude_angle", + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "force": { + "title": "force", + "type": { + "$ref": "#/$defs/f64" + } + }, + "max_possible_force": { + "title": "max_possible_force", + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "force", + "max_possible_force" + ], + "short_name": "Calibrated", + "title": "Calibrated", + "type": "object", + "typeInfo": "Struct" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f64" + } + } + ], + "short_name": "Normalized", + "title": "Normalized", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "ForceTouch", + "title": "bevy_input::touch::ForceTouch", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_input::touch::TouchInput": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "force": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "id": { + "type": { + "$ref": "#/$defs/u64" + } + }, + "phase": { + "type": { + "$ref": "#/$defs/bevy_input::touch::TouchPhase" + } + }, + "position": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "phase", + "position", + "id" + ], + "short_name": "TouchInput", + "title": "bevy_input::touch::TouchInput", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_input::touch::TouchPhase": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Started", + "Moved", + "Ended", + "Canceled" + ], + "short_name": "TouchPhase", + "title": "bevy_input::touch::TouchPhase", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_input::touchpad::TouchpadMagnify": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "TouchpadMagnify", + "title": "bevy_input::touchpad::TouchpadMagnify", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_input::touchpad::TouchpadRotate": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "TouchpadRotate", + "title": "bevy_input::touchpad::TouchpadRotate", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_math::Rect": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "max": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "min": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "min", + "max" + ], + "short_name": "Rect", + "title": "bevy_math::Rect", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::alpha::AlphaMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Opaque" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Mask", + "title": "Mask", + "type": "array", + "typeInfo": "Tuple" + }, + { + "title": "Blend" + }, + { + "title": "Premultiplied" + }, + { + "title": "Add" + }, + { + "title": "Multiply" + } + ], + "short_name": "AlphaMode", + "title": "bevy_pbr::alpha::AlphaMode", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_pbr::bundle::CascadesVisibleEntities": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "CascadesVisibleEntities", + "title": "bevy_pbr::bundle::CascadesVisibleEntities", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::bundle::CubemapVisibleEntities": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "CubemapVisibleEntities", + "title": "bevy_pbr::bundle::CubemapVisibleEntities", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::environment_map::EnvironmentMapLight": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "diffuse_map": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + }, + "specular_map": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + } + }, + "required": [ + "diffuse_map", + "specular_map" + ], + "short_name": "EnvironmentMapLight", + "title": "bevy_pbr::environment_map::EnvironmentMapLight", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::fog::FogSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "directional_light_color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "directional_light_exponent": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "falloff": { + "type": { + "$ref": "#/$defs/bevy_pbr::fog::FogFalloff" + } + } + }, + "required": [ + "color", + "directional_light_color", + "directional_light_exponent", + "falloff" + ], + "short_name": "FogSettings", + "title": "bevy_pbr::fog::FogSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::AmbientLight": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "brightness": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + }, + "required": [ + "color", + "brightness" + ], + "short_name": "AmbientLight", + "title": "bevy_pbr::light::AmbientLight", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::Cascade": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "projection": { + "type": { + "$ref": "#/$defs/glam::Mat4" + } + }, + "texel_size": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "view_projection": { + "type": { + "$ref": "#/$defs/glam::Mat4" + } + }, + "view_transform": { + "type": { + "$ref": "#/$defs/glam::Mat4" + } + } + }, + "required": [ + "view_transform", + "projection", + "view_projection", + "texel_size" + ], + "short_name": "Cascade", + "title": "bevy_pbr::light::Cascade", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::CascadeShadowConfig": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "bounds": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "minimum_distance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "overlap_proportion": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "bounds", + "overlap_proportion", + "minimum_distance" + ], + "short_name": "CascadeShadowConfig", + "title": "bevy_pbr::light::CascadeShadowConfig", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::Cascades": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "cascades": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>" + } + } + }, + "required": [ + "cascades" + ], + "short_name": "Cascades", + "title": "bevy_pbr::light::Cascades", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::ClusterConfig": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "title": "Single" + }, + { + "additionalProperties": false, + "properties": { + "dimensions": { + "title": "dimensions", + "type": { + "$ref": "#/$defs/glam::UVec3" + } + }, + "dynamic_resizing": { + "title": "dynamic_resizing", + "type": { + "$ref": "#/$defs/bool" + } + }, + "z_config": { + "title": "z_config", + "type": { + "$ref": "#/$defs/bevy_pbr::light::ClusterZConfig" + } + } + }, + "required": [ + "dimensions", + "z_config", + "dynamic_resizing" + ], + "short_name": "XYZ", + "title": "XYZ", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "dynamic_resizing": { + "title": "dynamic_resizing", + "type": { + "$ref": "#/$defs/bool" + } + }, + "total": { + "title": "total", + "type": { + "$ref": "#/$defs/u32" + } + }, + "z_config": { + "title": "z_config", + "type": { + "$ref": "#/$defs/bevy_pbr::light::ClusterZConfig" + } + }, + "z_slices": { + "title": "z_slices", + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "total", + "z_slices", + "z_config", + "dynamic_resizing" + ], + "short_name": "FixedZ", + "title": "FixedZ", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "ClusterConfig", + "title": "bevy_pbr::light::ClusterConfig", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_pbr::light::ClusterFarZMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "MaxLightRange" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Constant", + "title": "Constant", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "ClusterFarZMode", + "title": "bevy_pbr::light::ClusterFarZMode", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_pbr::light::ClusterZConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "far_z_mode": { + "type": { + "$ref": "#/$defs/bevy_pbr::light::ClusterFarZMode" + } + }, + "first_slice_depth": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "first_slice_depth", + "far_z_mode" + ], + "short_name": "ClusterZConfig", + "title": "bevy_pbr::light::ClusterZConfig", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::DirectionalLight": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "illuminance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_depth_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_normal_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadows_enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "color", + "illuminance", + "shadows_enabled", + "shadow_depth_bias", + "shadow_normal_bias" + ], + "short_name": "DirectionalLight", + "title": "bevy_pbr::light::DirectionalLight", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::DirectionalLightShadowMap": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "size" + ], + "short_name": "DirectionalLightShadowMap", + "title": "bevy_pbr::light::DirectionalLightShadowMap", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::NotShadowCaster": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "NotShadowCaster", + "title": "bevy_pbr::light::NotShadowCaster", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::NotShadowReceiver": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "NotShadowReceiver", + "title": "bevy_pbr::light::NotShadowReceiver", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::PointLight": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "intensity": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "radius": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "range": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_depth_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_normal_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadows_enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "color", + "intensity", + "range", + "radius", + "shadows_enabled", + "shadow_depth_bias", + "shadow_normal_bias" + ], + "short_name": "PointLight", + "title": "bevy_pbr::light::PointLight", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::PointLightShadowMap": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "size" + ], + "short_name": "PointLightShadowMap", + "title": "bevy_pbr::light::PointLightShadowMap", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::light::ShadowFilteringMethod": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Hardware2x2", + "Castano13", + "Jimenez14" + ], + "short_name": "ShadowFilteringMethod", + "title": "bevy_pbr::light::ShadowFilteringMethod", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_pbr::light::SpotLight": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "inner_angle": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "intensity": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "outer_angle": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "radius": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "range": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_depth_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadow_normal_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "shadows_enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "color", + "intensity", + "range", + "radius", + "shadows_enabled", + "shadow_depth_bias", + "shadow_normal_bias", + "outer_angle", + "inner_angle" + ], + "short_name": "SpotLight", + "title": "bevy_pbr::light::SpotLight", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::material::DefaultOpaqueRendererMethod": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_pbr::material::OpaqueRendererMethod" + } + } + ], + "short_name": "DefaultOpaqueRendererMethod", + "title": "bevy_pbr::material::DefaultOpaqueRendererMethod", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_pbr::pbr_material::StandardMaterial": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "alpha_mode": { + "type": { + "$ref": "#/$defs/bevy_pbr::alpha::AlphaMode" + } + }, + "attenuation_color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "attenuation_distance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "base_color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "base_color_texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "deferred_lighting_pass_id": { + "type": { + "$ref": "#/$defs/u8" + } + }, + "depth_bias": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "depth_map": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "diffuse_transmission": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "double_sided": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "emissive": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "emissive_texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "flip_normal_map_y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "fog_enabled": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "ior": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "max_parallax_layer_count": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "metallic": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "metallic_roughness_texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "normal_map_texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "occlusion_texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "opaque_render_method": { + "type": { + "$ref": "#/$defs/bevy_pbr::material::OpaqueRendererMethod" + } + }, + "parallax_depth_scale": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "parallax_mapping_method": { + "type": { + "$ref": "#/$defs/bevy_pbr::parallax::ParallaxMappingMethod" + } + }, + "perceptual_roughness": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "reflectance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "specular_transmission": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "thickness": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "unlit": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "base_color", + "emissive", + "perceptual_roughness", + "metallic", + "reflectance", + "diffuse_transmission", + "specular_transmission", + "thickness", + "ior", + "attenuation_distance", + "attenuation_color", + "flip_normal_map_y", + "double_sided", + "unlit", + "fog_enabled", + "alpha_mode", + "depth_bias", + "parallax_depth_scale", + "parallax_mapping_method", + "max_parallax_layer_count", + "opaque_render_method", + "deferred_lighting_pass_id" + ], + "short_name": "StandardMaterial", + "title": "bevy_pbr::pbr_material::StandardMaterial", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::ssao::ScreenSpaceAmbientOcclusionSettings": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "quality_level": { + "type": { + "$ref": "#/$defs/bevy_pbr::ssao::ScreenSpaceAmbientOcclusionQualityLevel" + } + } + }, + "required": [ + "quality_level" + ], + "short_name": "ScreenSpaceAmbientOcclusionSettings", + "title": "bevy_pbr::ssao::ScreenSpaceAmbientOcclusionSettings", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::wireframe::NoWireframe": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "NoWireframe", + "title": "bevy_pbr::wireframe::NoWireframe", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::wireframe::Wireframe": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Wireframe", + "title": "bevy_pbr::wireframe::Wireframe", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_pbr::wireframe::WireframeConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "default_color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "global": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "global", + "default_color" + ], + "short_name": "WireframeConfig", + "title": "bevy_pbr::wireframe::WireframeConfig", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::AdditionalMassProperties": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Mass", + "title": "Mass", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_rapier3d::dynamics::rigid_body::MassProperties" + } + } + ], + "short_name": "MassProperties", + "title": "MassProperties", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "AdditionalMassProperties", + "title": "bevy_rapier3d::dynamics::rigid_body::AdditionalMassProperties", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_rapier3d::dynamics::rigid_body::Ccd": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "enabled" + ], + "short_name": "Ccd", + "title": "bevy_rapier3d::dynamics::rigid_body::Ccd", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::Damping": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "angular_damping": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "linear_damping": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "linear_damping", + "angular_damping" + ], + "short_name": "Damping", + "title": "bevy_rapier3d::dynamics::rigid_body::Damping", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::Dominance": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "groups": { + "type": { + "$ref": "#/$defs/i8" + } + } + }, + "required": [ + "groups" + ], + "short_name": "Dominance", + "title": "bevy_rapier3d::dynamics::rigid_body::Dominance", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::ExternalForce": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "force", + "torque" + ], + "short_name": "ExternalForce", + "title": "bevy_rapier3d::dynamics::rigid_body::ExternalForce", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::ExternalImpulse": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "impulse": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "torque_impulse": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "impulse", + "torque_impulse" + ], + "short_name": "ExternalImpulse", + "title": "bevy_rapier3d::dynamics::rigid_body::ExternalImpulse", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::GravityScale": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "GravityScale", + "title": "bevy_rapier3d::dynamics::rigid_body::GravityScale", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_rapier3d::dynamics::rigid_body::LockedAxes": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u8" + } + } + ], + "short_name": "LockedAxes", + "title": "bevy_rapier3d::dynamics::rigid_body::LockedAxes", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_rapier3d::dynamics::rigid_body::MassProperties": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "local_center_of_mass": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "mass": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "principal_inertia": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "principal_inertia_local_frame": { + "type": { + "$ref": "#/$defs/glam::Quat" + } + } + }, + "required": [ + "local_center_of_mass", + "mass", + "principal_inertia_local_frame", + "principal_inertia" + ], + "short_name": "MassProperties", + "title": "bevy_rapier3d::dynamics::rigid_body::MassProperties", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::RigidBody": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Dynamic", + "Fixed", + "KinematicPositionBased", + "KinematicVelocityBased" + ], + "short_name": "RigidBody", + "title": "bevy_rapier3d::dynamics::rigid_body::RigidBody", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_rapier3d::dynamics::rigid_body::Sleeping": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "angular_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "linear_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "sleeping": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "linear_threshold", + "angular_threshold", + "sleeping" + ], + "short_name": "Sleeping", + "title": "bevy_rapier3d::dynamics::rigid_body::Sleeping", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::dynamics::rigid_body::Velocity": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "angvel": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "linvel": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "linvel", + "angvel" + ], + "short_name": "Velocity", + "title": "bevy_rapier3d::dynamics::rigid_body::Velocity", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::geometry::collider::CollidingEntities": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_utils::HashSet" + } + } + ], + "short_name": "CollidingEntities", + "title": "bevy_rapier3d::geometry::collider::CollidingEntities", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_rapier3d::geometry::collider::CollisionGroups": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "filters": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::geometry::collider::Group" + } + }, + "memberships": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::geometry::collider::Group" + } + } + }, + "required": [ + "memberships", + "filters" + ], + "short_name": "CollisionGroups", + "title": "bevy_rapier3d::geometry::collider::CollisionGroups", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::geometry::collider::ContactForceEventThreshold": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "ContactForceEventThreshold", + "title": "bevy_rapier3d::geometry::collider::ContactForceEventThreshold", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_rapier3d::geometry::collider::Friction": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "combine_rule": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::dynamics::CoefficientCombineRule" + } + } + }, + "required": [ + "coefficient", + "combine_rule" + ], + "short_name": "Friction", + "title": "bevy_rapier3d::geometry::collider::Friction", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::geometry::collider::Group": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u32" + } + } + ], + "short_name": "Group", + "title": "bevy_rapier3d::geometry::collider::Group", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_rapier3d::geometry::collider::Restitution": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "combine_rule": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::dynamics::CoefficientCombineRule" + } + } + }, + "required": [ + "coefficient", + "combine_rule" + ], + "short_name": "Restitution", + "title": "bevy_rapier3d::geometry::collider::Restitution", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::geometry::collider::Sensor": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Sensor", + "title": "bevy_rapier3d::geometry::collider::Sensor", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::geometry::collider::SolverGroups": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "filters": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::geometry::collider::Group" + } + }, + "memberships": { + "type": { + "$ref": "#/$defs/bevy_rapier3d::geometry::collider::Group" + } + } + }, + "required": [ + "memberships", + "filters" + ], + "short_name": "SolverGroups", + "title": "bevy_rapier3d::geometry::collider::SolverGroups", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_rapier3d::render::DebugRenderContext": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "enabled" + ], + "short_name": "DebugRenderContext", + "title": "bevy_rapier3d::render::DebugRenderContext", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::camera::camera::Camera": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "hdr": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "is_active": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "msaa_writeback": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "order": { + "type": { + "$ref": "#/$defs/isize" + } + }, + "viewport": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [ + "order", + "is_active", + "hdr", + "msaa_writeback" + ], + "short_name": "Camera", + "title": "bevy_render::camera::camera::Camera", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::camera::camera::CameraRenderGraph": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::borrow::Cow" + } + } + ], + "short_name": "CameraRenderGraph", + "title": "bevy_render::camera::camera::CameraRenderGraph", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_render::camera::camera::RenderTarget": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowRef" + } + } + ], + "short_name": "Window", + "title": "Window", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + } + ], + "short_name": "Image", + "title": "Image", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::camera::manual_texture_view::ManualTextureViewHandle" + } + } + ], + "short_name": "TextureView", + "title": "TextureView", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "RenderTarget", + "title": "bevy_render::camera::camera::RenderTarget", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_render::camera::camera::Viewport": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "depth": { + "type": { + "$ref": "#/$defs/core::ops::Range" + } + }, + "physical_position": { + "type": { + "$ref": "#/$defs/glam::UVec2" + } + }, + "physical_size": { + "type": { + "$ref": "#/$defs/glam::UVec2" + } + } + }, + "required": [ + "physical_position", + "physical_size", + "depth" + ], + "short_name": "Viewport", + "title": "bevy_render::camera::camera::Viewport", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::camera::projection::OrthographicProjection": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "area": { + "type": { + "$ref": "#/$defs/bevy_math::Rect" + } + }, + "far": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "near": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "scale": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "scaling_mode": { + "type": { + "$ref": "#/$defs/bevy_render::camera::projection::ScalingMode" + } + }, + "viewport_origin": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "near", + "far", + "viewport_origin", + "scaling_mode", + "scale", + "area" + ], + "short_name": "OrthographicProjection", + "title": "bevy_render::camera::projection::OrthographicProjection", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::camera::projection::PerspectiveProjection": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "aspect_ratio": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "far": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "fov": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "near": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "fov", + "aspect_ratio", + "near", + "far" + ], + "short_name": "PerspectiveProjection", + "title": "bevy_render::camera::projection::PerspectiveProjection", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::camera::projection::Projection": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::camera::projection::PerspectiveProjection" + } + } + ], + "short_name": "Perspective", + "title": "Perspective", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::camera::projection::OrthographicProjection" + } + } + ], + "short_name": "Orthographic", + "title": "Orthographic", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Projection", + "title": "bevy_render::camera::projection::Projection", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_render::camera::projection::ScalingMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "height": { + "title": "height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "width": { + "title": "width", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "width", + "height" + ], + "short_name": "Fixed", + "title": "Fixed", + "type": "object", + "typeInfo": "Struct" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "WindowSize", + "title": "WindowSize", + "type": "array", + "typeInfo": "Tuple" + }, + { + "additionalProperties": false, + "properties": { + "min_height": { + "title": "min_height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "min_width": { + "title": "min_width", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "min_width", + "min_height" + ], + "short_name": "AutoMin", + "title": "AutoMin", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "max_height": { + "title": "max_height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "max_width": { + "title": "max_width", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "max_width", + "max_height" + ], + "short_name": "AutoMax", + "title": "AutoMax", + "type": "object", + "typeInfo": "Struct" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "FixedVertical", + "title": "FixedVertical", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "FixedHorizontal", + "title": "FixedHorizontal", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "ScalingMode", + "title": "bevy_render::camera::projection::ScalingMode", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_render::color::Color": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "alpha": { + "title": "alpha", + "type": { + "$ref": "#/$defs/f32" + } + }, + "blue": { + "title": "blue", + "type": { + "$ref": "#/$defs/f32" + } + }, + "green": { + "title": "green", + "type": { + "$ref": "#/$defs/f32" + } + }, + "red": { + "title": "red", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "red", + "green", + "blue", + "alpha" + ], + "short_name": "Rgba", + "title": "Rgba", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "alpha": { + "title": "alpha", + "type": { + "$ref": "#/$defs/f32" + } + }, + "blue": { + "title": "blue", + "type": { + "$ref": "#/$defs/f32" + } + }, + "green": { + "title": "green", + "type": { + "$ref": "#/$defs/f32" + } + }, + "red": { + "title": "red", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "red", + "green", + "blue", + "alpha" + ], + "short_name": "RgbaLinear", + "title": "RgbaLinear", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "alpha": { + "title": "alpha", + "type": { + "$ref": "#/$defs/f32" + } + }, + "hue": { + "title": "hue", + "type": { + "$ref": "#/$defs/f32" + } + }, + "lightness": { + "title": "lightness", + "type": { + "$ref": "#/$defs/f32" + } + }, + "saturation": { + "title": "saturation", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "hue", + "saturation", + "lightness", + "alpha" + ], + "short_name": "Hsla", + "title": "Hsla", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "alpha": { + "title": "alpha", + "type": { + "$ref": "#/$defs/f32" + } + }, + "chroma": { + "title": "chroma", + "type": { + "$ref": "#/$defs/f32" + } + }, + "hue": { + "title": "hue", + "type": { + "$ref": "#/$defs/f32" + } + }, + "lightness": { + "title": "lightness", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "lightness", + "chroma", + "hue", + "alpha" + ], + "short_name": "Lcha", + "title": "Lcha", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "Color", + "title": "bevy_render::color::Color", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_render::globals::GlobalsUniform": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "delta_time": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "frame_count": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "time": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "time", + "delta_time", + "frame_count" + ], + "short_name": "GlobalsUniform", + "title": "bevy_render::globals::GlobalsUniform", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::mesh::mesh::Indices": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "U16", + "title": "U16", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "U32", + "title": "U32", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Indices", + "title": "bevy_render::mesh::mesh::Indices", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_render::mesh::mesh::Mesh": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "indices": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "morph_target_names": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "morph_targets": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + } + }, + "required": [], + "short_name": "Mesh", + "title": "bevy_render::mesh::mesh::Mesh", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::mesh::mesh::skinning::SkinnedMesh": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "inverse_bindposes": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + }, + "joints": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "inverse_bindposes", + "joints" + ], + "short_name": "SkinnedMesh", + "title": "bevy_render::mesh::mesh::skinning::SkinnedMesh", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::mesh::morph::MeshMorphWeights": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "weights": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "weights" + ], + "short_name": "MeshMorphWeights", + "title": "bevy_render::mesh::morph::MeshMorphWeights", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::mesh::morph::MorphWeights": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "first_mesh": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "weights": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "weights" + ], + "short_name": "MorphWeights", + "title": "bevy_render::mesh::morph::MorphWeights", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::primitives::Aabb": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "center": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + }, + "half_extents": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + } + }, + "required": [ + "center", + "half_extents" + ], + "short_name": "Aabb", + "title": "bevy_render::primitives::Aabb", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::primitives::CascadesFrusta": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "CascadesFrusta", + "title": "bevy_render::primitives::CascadesFrusta", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::primitives::CubemapFrusta": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "CubemapFrusta", + "title": "bevy_render::primitives::CubemapFrusta", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::primitives::Frustum": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Frustum", + "title": "bevy_render::primitives::Frustum", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::texture::image::Image": { + "isComponent": false, + "isResource": false, + "short_name": "Image", + "title": "bevy_render::texture::image::Image", + "type": "object", + "typeInfo": "Value" + }, + "bevy_render::view::ColorGrading": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "exposure": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "gamma": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "post_saturation": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "pre_saturation": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "exposure", + "gamma", + "pre_saturation", + "post_saturation" + ], + "short_name": "ColorGrading", + "title": "bevy_render::view::ColorGrading", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::view::Msaa": { + "isComponent": false, + "isResource": true, + "oneOf": [ + "Off", + "Sample2", + "Sample4", + "Sample8" + ], + "short_name": "Msaa", + "title": "bevy_render::view::Msaa", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_render::view::visibility::InheritedVisibility": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bool" + } + } + ], + "short_name": "InheritedVisibility", + "title": "bevy_render::view::visibility::InheritedVisibility", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_render::view::visibility::NoFrustumCulling": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "NoFrustumCulling", + "title": "bevy_render::view::visibility::NoFrustumCulling", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::view::visibility::ViewVisibility": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bool" + } + } + ], + "short_name": "ViewVisibility", + "title": "bevy_render::view::visibility::ViewVisibility", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_render::view::visibility::Visibility": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Inherited", + "Hidden", + "Visible" + ], + "short_name": "Visibility", + "title": "bevy_render::view::visibility::Visibility", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_render::view::visibility::VisibleEntities": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "VisibleEntities", + "title": "bevy_render::view::visibility::VisibleEntities", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_render::view::visibility::render_layers::RenderLayers": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u32" + } + } + ], + "short_name": "RenderLayers", + "title": "bevy_render::view::visibility::render_layers::RenderLayers", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_sprite::mesh2d::color_material::ColorMaterial": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "texture": { + "type": { + "$ref": "#/$defs/core::option::Option>" + } + } + }, + "required": [ + "color" + ], + "short_name": "ColorMaterial", + "title": "bevy_sprite::mesh2d::color_material::ColorMaterial", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_sprite::mesh2d::mesh::Mesh2dHandle": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + } + ], + "short_name": "Mesh2dHandle", + "title": "bevy_sprite::mesh2d::mesh::Mesh2dHandle", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_sprite::sprite::Anchor": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Center" + }, + { + "title": "BottomLeft" + }, + { + "title": "BottomCenter" + }, + { + "title": "BottomRight" + }, + { + "title": "CenterLeft" + }, + { + "title": "CenterRight" + }, + { + "title": "TopLeft" + }, + { + "title": "TopCenter" + }, + { + "title": "TopRight" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + ], + "short_name": "Custom", + "title": "Custom", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Anchor", + "title": "bevy_sprite::sprite::Anchor", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_sprite::sprite::Sprite": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "anchor": { + "type": { + "$ref": "#/$defs/bevy_sprite::sprite::Anchor" + } + }, + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "custom_size": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "flip_x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "flip_y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "rect": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [ + "color", + "flip_x", + "flip_y", + "anchor" + ], + "short_name": "Sprite", + "title": "bevy_sprite::sprite::Sprite", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_sprite::texture_atlas::TextureAtlas": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "texture": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + }, + "texture_handles": { + "type": { + "$ref": "#/$defs/core::option::Option, usize, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>>" + } + }, + "textures": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "texture", + "size", + "textures" + ], + "short_name": "TextureAtlas", + "title": "bevy_sprite::texture_atlas::TextureAtlas", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_sprite::texture_atlas::TextureAtlasSprite": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "anchor": { + "type": { + "$ref": "#/$defs/bevy_sprite::sprite::Anchor" + } + }, + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "custom_size": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "flip_x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "flip_y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "index": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "color", + "index", + "flip_x", + "flip_y", + "anchor" + ], + "short_name": "TextureAtlasSprite", + "title": "bevy_sprite::texture_atlas::TextureAtlasSprite", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_text::pipeline::TextLayoutInfo": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "glyphs": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "logical_size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "glyphs", + "logical_size" + ], + "short_name": "TextLayoutInfo", + "title": "bevy_text::pipeline::TextLayoutInfo", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_text::text2d::Text2dBounds": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "size" + ], + "short_name": "Text2dBounds", + "title": "bevy_text::text2d::Text2dBounds", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_text::text::BreakLineOn": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "WordBoundary", + "AnyCharacter", + "NoWrap" + ], + "short_name": "BreakLineOn", + "title": "bevy_text::text::BreakLineOn", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_text::text::Text": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "alignment": { + "type": { + "$ref": "#/$defs/bevy_text::text::TextAlignment" + } + }, + "linebreak_behavior": { + "type": { + "$ref": "#/$defs/bevy_text::text::BreakLineOn" + } + }, + "sections": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "sections", + "alignment", + "linebreak_behavior" + ], + "short_name": "Text", + "title": "bevy_text::text::Text", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_text::text::TextAlignment": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Left", + "Center", + "Right" + ], + "short_name": "TextAlignment", + "title": "bevy_text::text::TextAlignment", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_text::text::TextSection": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "style": { + "type": { + "$ref": "#/$defs/bevy_text::text::TextStyle" + } + }, + "value": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + }, + "required": [ + "value", + "style" + ], + "short_name": "TextSection", + "title": "bevy_text::text::TextSection", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_text::text::TextStyle": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "font": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + }, + "font_size": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "font", + "font_size", + "color" + ], + "short_name": "TextStyle", + "title": "bevy_text::text::TextStyle", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::stopwatch::Stopwatch": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "elapsed": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "paused": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "elapsed", + "paused" + ], + "short_name": "Stopwatch", + "title": "bevy_time::stopwatch::Stopwatch", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::time::Time<()>": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "context": { + "type": { + "$ref": "#/$defs/()" + } + }, + "delta": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "delta_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "delta_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "elapsed_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_seconds_wrapped": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_wrapped_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_wrapped": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "wrap_period": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "context", + "wrap_period", + "delta", + "delta_seconds", + "delta_seconds_f64", + "elapsed", + "elapsed_seconds", + "elapsed_seconds_f64", + "elapsed_wrapped", + "elapsed_seconds_wrapped", + "elapsed_seconds_wrapped_f64" + ], + "short_name": "Time<()>", + "title": "bevy_time::time::Time<()>", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::time::Time": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "context": { + "type": { + "$ref": "#/$defs/bevy_time::fixed::Fixed" + } + }, + "delta": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "delta_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "delta_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "elapsed_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_seconds_wrapped": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_wrapped_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_wrapped": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "wrap_period": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "context", + "wrap_period", + "delta", + "delta_seconds", + "delta_seconds_f64", + "elapsed", + "elapsed_seconds", + "elapsed_seconds_f64", + "elapsed_wrapped", + "elapsed_seconds_wrapped", + "elapsed_seconds_wrapped_f64" + ], + "short_name": "Time", + "title": "bevy_time::time::Time", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::time::Time": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "context": { + "type": { + "$ref": "#/$defs/bevy_time::real::Real" + } + }, + "delta": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "delta_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "delta_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "elapsed_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_seconds_wrapped": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_wrapped_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_wrapped": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "wrap_period": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "context", + "wrap_period", + "delta", + "delta_seconds", + "delta_seconds_f64", + "elapsed", + "elapsed_seconds", + "elapsed_seconds_f64", + "elapsed_wrapped", + "elapsed_seconds_wrapped", + "elapsed_seconds_wrapped_f64" + ], + "short_name": "Time", + "title": "bevy_time::time::Time", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::time::Time": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "properties": { + "context": { + "type": { + "$ref": "#/$defs/bevy_time::virt::Virtual" + } + }, + "delta": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "delta_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "delta_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "elapsed_seconds": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_seconds_wrapped": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "elapsed_seconds_wrapped_f64": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "elapsed_wrapped": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "wrap_period": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "context", + "wrap_period", + "delta", + "delta_seconds", + "delta_seconds_f64", + "elapsed", + "elapsed_seconds", + "elapsed_seconds_f64", + "elapsed_wrapped", + "elapsed_seconds_wrapped", + "elapsed_seconds_wrapped_f64" + ], + "short_name": "Time", + "title": "bevy_time::time::Time", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::timer::Timer": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "duration": { + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "finished": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "mode": { + "type": { + "$ref": "#/$defs/bevy_time::timer::TimerMode" + } + }, + "stopwatch": { + "type": { + "$ref": "#/$defs/bevy_time::stopwatch::Stopwatch" + } + }, + "times_finished_this_tick": { + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "stopwatch", + "duration", + "mode", + "finished", + "times_finished_this_tick" + ], + "short_name": "Timer", + "title": "bevy_time::timer::Timer", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_transform::components::global_transform::GlobalTransform": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Affine3A" + } + } + ], + "short_name": "GlobalTransform", + "title": "bevy_transform::components::global_transform::GlobalTransform", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_transform::components::transform::Transform": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "rotation": { + "type": { + "$ref": "#/$defs/glam::Quat" + } + }, + "scale": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "translation", + "rotation", + "scale" + ], + "short_name": "Transform", + "title": "bevy_transform::components::transform::Transform", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::UiScale": { + "isComponent": false, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f64" + } + } + ], + "short_name": "UiScale", + "title": "bevy_ui::UiScale", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_ui::camera_config::UiCameraConfig": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "show_ui": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "show_ui" + ], + "short_name": "UiCameraConfig", + "title": "bevy_ui::camera_config::UiCameraConfig", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::focus::FocusPolicy": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Block", + "Pass" + ], + "short_name": "FocusPolicy", + "title": "bevy_ui::focus::FocusPolicy", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::focus::Interaction": { + "isComponent": true, + "isResource": false, + "oneOf": [ + "Pressed", + "Hovered", + "None" + ], + "short_name": "Interaction", + "title": "bevy_ui::focus::Interaction", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::focus::RelativeCursorPosition": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "normalized": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "normalized_visible_node_rect": { + "type": { + "$ref": "#/$defs/bevy_math::Rect" + } + } + }, + "required": [ + "normalized_visible_node_rect" + ], + "short_name": "RelativeCursorPosition", + "title": "bevy_ui::focus::RelativeCursorPosition", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::geometry::UiRect": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "bottom": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "left": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "right": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "top": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + } + }, + "required": [ + "left", + "right", + "top", + "bottom" + ], + "short_name": "UiRect", + "title": "bevy_ui::geometry::UiRect", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::geometry::Val": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Auto" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Px", + "title": "Px", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Percent", + "title": "Percent", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Vw", + "title": "Vw", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Vh", + "title": "Vh", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "VMin", + "title": "VMin", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "VMax", + "title": "VMax", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Val", + "title": "bevy_ui::geometry::Val", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_ui::measurement::ContentSize": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "ContentSize", + "title": "bevy_ui::measurement::ContentSize", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::AlignContent": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Default", + "Start", + "End", + "FlexStart", + "FlexEnd", + "Center", + "Stretch", + "SpaceBetween", + "SpaceEvenly", + "SpaceAround" + ], + "short_name": "AlignContent", + "title": "bevy_ui::ui_node::AlignContent", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::AlignItems": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Default", + "Start", + "End", + "FlexStart", + "FlexEnd", + "Center", + "Baseline", + "Stretch" + ], + "short_name": "AlignItems", + "title": "bevy_ui::ui_node::AlignItems", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::AlignSelf": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Auto", + "Start", + "End", + "FlexStart", + "FlexEnd", + "Center", + "Baseline", + "Stretch" + ], + "short_name": "AlignSelf", + "title": "bevy_ui::ui_node::AlignSelf", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::BackgroundColor": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + ], + "short_name": "BackgroundColor", + "title": "bevy_ui::ui_node::BackgroundColor", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_ui::ui_node::BorderColor": { + "isComponent": true, + "isResource": false, + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + } + ], + "short_name": "BorderColor", + "title": "bevy_ui::ui_node::BorderColor", + "type": "array", + "typeInfo": "TupleStruct" + }, + "bevy_ui::ui_node::CalculatedClip": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "clip": { + "type": { + "$ref": "#/$defs/bevy_math::Rect" + } + } + }, + "required": [ + "clip" + ], + "short_name": "CalculatedClip", + "title": "bevy_ui::ui_node::CalculatedClip", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::Direction": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Inherit", + "LeftToRight", + "RightToLeft" + ], + "short_name": "Direction", + "title": "bevy_ui::ui_node::Direction", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::Display": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Flex", + "Grid", + "None" + ], + "short_name": "Display", + "title": "bevy_ui::ui_node::Display", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::FlexDirection": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Row", + "Column", + "RowReverse", + "ColumnReverse" + ], + "short_name": "FlexDirection", + "title": "bevy_ui::ui_node::FlexDirection", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::FlexWrap": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "NoWrap", + "Wrap", + "WrapReverse" + ], + "short_name": "FlexWrap", + "title": "bevy_ui::ui_node::FlexWrap", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::GridAutoFlow": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Row", + "Column", + "RowDense", + "ColumnDense" + ], + "short_name": "GridAutoFlow", + "title": "bevy_ui::ui_node::GridAutoFlow", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::GridPlacement": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "end": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "span": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "start": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [], + "short_name": "GridPlacement", + "title": "bevy_ui::ui_node::GridPlacement", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::GridTrack": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "max_sizing_function": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::MaxTrackSizingFunction" + } + }, + "min_sizing_function": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::MinTrackSizingFunction" + } + } + }, + "required": [ + "min_sizing_function", + "max_sizing_function" + ], + "short_name": "GridTrack", + "title": "bevy_ui::ui_node::GridTrack", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::JustifyContent": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Default", + "Start", + "End", + "FlexStart", + "FlexEnd", + "Center", + "Stretch", + "SpaceBetween", + "SpaceEvenly", + "SpaceAround" + ], + "short_name": "JustifyContent", + "title": "bevy_ui::ui_node::JustifyContent", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::JustifyItems": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Default", + "Start", + "End", + "Center", + "Baseline", + "Stretch" + ], + "short_name": "JustifyItems", + "title": "bevy_ui::ui_node::JustifyItems", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::JustifySelf": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Auto", + "Start", + "End", + "Center", + "Baseline", + "Stretch" + ], + "short_name": "JustifySelf", + "title": "bevy_ui::ui_node::JustifySelf", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::Node": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "calculated_size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "outline_offset": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "outline_width": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "stack_index": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "unrounded_size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "stack_index", + "calculated_size", + "outline_width", + "outline_offset", + "unrounded_size" + ], + "short_name": "Node", + "title": "bevy_ui::ui_node::Node", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::Outline": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "color": { + "type": { + "$ref": "#/$defs/bevy_render::color::Color" + } + }, + "offset": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "width": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + } + }, + "required": [ + "width", + "offset", + "color" + ], + "short_name": "Outline", + "title": "bevy_ui::ui_node::Outline", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::Overflow": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::OverflowAxis" + } + }, + "y": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::OverflowAxis" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "Overflow", + "title": "bevy_ui::ui_node::Overflow", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::OverflowAxis": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Visible", + "Clip" + ], + "short_name": "OverflowAxis", + "title": "bevy_ui::ui_node::OverflowAxis", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::PositionType": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Relative", + "Absolute" + ], + "short_name": "PositionType", + "title": "bevy_ui::ui_node::PositionType", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_ui::ui_node::RepeatedGridTrack": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "repetition": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::GridTrackRepetition" + } + }, + "tracks": { + "type": { + "$ref": "#/$defs/smallvec::SmallVec<[bevy_ui::ui_node::GridTrack; 1]>" + } + } + }, + "required": [ + "repetition", + "tracks" + ], + "short_name": "RepeatedGridTrack", + "title": "bevy_ui::ui_node::RepeatedGridTrack", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::Style": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "align_content": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::AlignContent" + } + }, + "align_items": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::AlignItems" + } + }, + "align_self": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::AlignSelf" + } + }, + "aspect_ratio": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "border": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::UiRect" + } + }, + "bottom": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "column_gap": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "direction": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::Direction" + } + }, + "display": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::Display" + } + }, + "flex_basis": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "flex_direction": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::FlexDirection" + } + }, + "flex_grow": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "flex_shrink": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "flex_wrap": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::FlexWrap" + } + }, + "grid_auto_columns": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "grid_auto_flow": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::GridAutoFlow" + } + }, + "grid_auto_rows": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "grid_column": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::GridPlacement" + } + }, + "grid_row": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::GridPlacement" + } + }, + "grid_template_columns": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "grid_template_rows": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "height": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "justify_content": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::JustifyContent" + } + }, + "justify_items": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::JustifyItems" + } + }, + "justify_self": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::JustifySelf" + } + }, + "left": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "margin": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::UiRect" + } + }, + "max_height": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "max_width": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "min_height": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "min_width": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "overflow": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::Overflow" + } + }, + "padding": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::UiRect" + } + }, + "position_type": { + "type": { + "$ref": "#/$defs/bevy_ui::ui_node::PositionType" + } + }, + "right": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "row_gap": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "top": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + }, + "width": { + "type": { + "$ref": "#/$defs/bevy_ui::geometry::Val" + } + } + }, + "required": [ + "display", + "position_type", + "overflow", + "direction", + "left", + "right", + "top", + "bottom", + "width", + "height", + "min_width", + "min_height", + "max_width", + "max_height", + "align_items", + "justify_items", + "align_self", + "justify_self", + "align_content", + "justify_content", + "margin", + "padding", + "border", + "flex_direction", + "flex_wrap", + "flex_grow", + "flex_shrink", + "flex_basis", + "row_gap", + "column_gap", + "grid_auto_flow", + "grid_template_rows", + "grid_template_columns", + "grid_auto_rows", + "grid_auto_columns", + "grid_row", + "grid_column" + ], + "short_name": "Style", + "title": "bevy_ui::ui_node::Style", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::UiImage": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "flip_x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "flip_y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "texture": { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + } + }, + "required": [ + "texture", + "flip_x", + "flip_y" + ], + "short_name": "UiImage", + "title": "bevy_ui::ui_node::UiImage", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::UiTextureAtlasImage": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "flip_x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "flip_y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "index": { + "type": { + "$ref": "#/$defs/usize" + } + } + }, + "required": [ + "index", + "flip_x", + "flip_y" + ], + "short_name": "UiTextureAtlasImage", + "title": "bevy_ui::ui_node::UiTextureAtlasImage", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::ui_node::ZIndex": { + "isComponent": true, + "isResource": false, + "oneOf": [ + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/i32" + } + } + ], + "short_name": "Local", + "title": "Local", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/i32" + } + } + ], + "short_name": "Global", + "title": "Global", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "ZIndex", + "title": "bevy_ui::ui_node::ZIndex", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_ui::widget::button::Button": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Button", + "title": "bevy_ui::widget::button::Button", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::widget::image::UiImageSize": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "size": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "size" + ], + "short_name": "UiImageSize", + "title": "bevy_ui::widget::image::UiImageSize", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::widget::label::Label": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "Label", + "title": "bevy_ui::widget::label::Label", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_ui::widget::text::TextFlags": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "needs_new_measure_func": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "needs_recompute": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "needs_new_measure_func", + "needs_recompute" + ], + "short_name": "TextFlags", + "title": "bevy_ui::widget::text::TextFlags", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_utils::Duration": { + "isComponent": false, + "isResource": false, + "short_name": "Duration", + "title": "bevy_utils::Duration", + "type": "object", + "typeInfo": "Value" + }, + "bevy_utils::HashSet": { + "isComponent": false, + "isResource": false, + "short_name": "HashSet", + "title": "bevy_utils::HashSet", + "type": "object", + "typeInfo": "Value" + }, + "bevy_utils::Instant": { + "isComponent": false, + "isResource": false, + "short_name": "Instant", + "title": "bevy_utils::Instant", + "type": "object", + "typeInfo": "Value" + }, + "bevy_utils::Uuid": { + "isComponent": false, + "isResource": false, + "short_name": "Uuid", + "title": "bevy_utils::Uuid", + "type": "object", + "typeInfo": "Value" + }, + "bevy_window::cursor::CursorIcon": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Default", + "Crosshair", + "Hand", + "Arrow", + "Move", + "Text", + "Wait", + "Help", + "Progress", + "NotAllowed", + "ContextMenu", + "Cell", + "VerticalText", + "Alias", + "Copy", + "NoDrop", + "Grab", + "Grabbing", + "AllScroll", + "ZoomIn", + "ZoomOut", + "EResize", + "NResize", + "NeResize", + "NwResize", + "SResize", + "SeResize", + "SwResize", + "WResize", + "EwResize", + "NsResize", + "NeswResize", + "NwseResize", + "ColResize", + "RowResize" + ], + "short_name": "CursorIcon", + "title": "bevy_window::cursor::CursorIcon", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::event::ApplicationLifetime": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Started", + "Suspended", + "Resumed" + ], + "short_name": "ApplicationLifetime", + "title": "bevy_window::event::ApplicationLifetime", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::event::CursorEntered": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "CursorEntered", + "title": "bevy_window::event::CursorEntered", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::CursorLeft": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "CursorLeft", + "title": "bevy_window::event::CursorLeft", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::CursorMoved": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "position": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "position" + ], + "short_name": "CursorMoved", + "title": "bevy_window::event::CursorMoved", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::FileDragAndDrop": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "path_buf": { + "title": "path_buf", + "type": { + "$ref": "#/$defs/std::path::PathBuf" + } + }, + "window": { + "title": "window", + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "path_buf" + ], + "short_name": "DroppedFile", + "title": "DroppedFile", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "path_buf": { + "title": "path_buf", + "type": { + "$ref": "#/$defs/std::path::PathBuf" + } + }, + "window": { + "title": "window", + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "path_buf" + ], + "short_name": "HoveredFile", + "title": "HoveredFile", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "properties": { + "window": { + "title": "window", + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "HoveredFileCanceled", + "title": "HoveredFileCanceled", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "FileDragAndDrop", + "title": "bevy_window::event::FileDragAndDrop", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_window::event::ReceivedCharacter": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "char": { + "type": { + "$ref": "#/$defs/char" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "char" + ], + "short_name": "ReceivedCharacter", + "title": "bevy_window::event::ReceivedCharacter", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::RequestRedraw": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "RequestRedraw", + "title": "bevy_window::event::RequestRedraw", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowBackendScaleFactorChanged": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "scale_factor": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "scale_factor" + ], + "short_name": "WindowBackendScaleFactorChanged", + "title": "bevy_window::event::WindowBackendScaleFactorChanged", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowCloseRequested": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "WindowCloseRequested", + "title": "bevy_window::event::WindowCloseRequested", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowClosed": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "WindowClosed", + "title": "bevy_window::event::WindowClosed", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowCreated": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window" + ], + "short_name": "WindowCreated", + "title": "bevy_window::event::WindowCreated", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowFocused": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "focused": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "focused" + ], + "short_name": "WindowFocused", + "title": "bevy_window::event::WindowFocused", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowMoved": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "entity": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + }, + "position": { + "type": { + "$ref": "#/$defs/glam::IVec2" + } + } + }, + "required": [ + "entity", + "position" + ], + "short_name": "WindowMoved", + "title": "bevy_window::event::WindowMoved", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowResized": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "height": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "width": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "width", + "height" + ], + "short_name": "WindowResized", + "title": "bevy_window::event::WindowResized", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowScaleFactorChanged": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "scale_factor": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "scale_factor" + ], + "short_name": "WindowScaleFactorChanged", + "title": "bevy_window::event::WindowScaleFactorChanged", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::event::WindowThemeChanged": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "theme": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowTheme" + } + }, + "window": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + } + }, + "required": [ + "window", + "theme" + ], + "short_name": "WindowThemeChanged", + "title": "bevy_window::event::WindowThemeChanged", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::CompositeAlphaMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Auto", + "Opaque", + "PreMultiplied", + "PostMultiplied", + "Inherit" + ], + "short_name": "CompositeAlphaMode", + "title": "bevy_window::window::CompositeAlphaMode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::window::Cursor": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "grab_mode": { + "type": { + "$ref": "#/$defs/bevy_window::window::CursorGrabMode" + } + }, + "hit_test": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "icon": { + "type": { + "$ref": "#/$defs/bevy_window::cursor::CursorIcon" + } + }, + "visible": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "icon", + "visible", + "grab_mode", + "hit_test" + ], + "short_name": "Cursor", + "title": "bevy_window::window::Cursor", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::CursorGrabMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "None", + "Confined", + "Locked" + ], + "short_name": "CursorGrabMode", + "title": "bevy_window::window::CursorGrabMode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::window::EnabledButtons": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "close": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "maximize": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "minimize": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "minimize", + "maximize", + "close" + ], + "short_name": "EnabledButtons", + "title": "bevy_window::window::EnabledButtons", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::InternalWindowState": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "maximize_request": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "minimize_request": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "physical_cursor_position": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [], + "short_name": "InternalWindowState", + "title": "bevy_window::window::InternalWindowState", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::MonitorSelection": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Current" + }, + { + "title": "Primary" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/usize" + } + } + ], + "short_name": "Index", + "title": "Index", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "MonitorSelection", + "title": "bevy_window::window::MonitorSelection", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_window::window::PresentMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "AutoVsync", + "AutoNoVsync", + "Fifo", + "FifoRelaxed", + "Immediate", + "Mailbox" + ], + "short_name": "PresentMode", + "title": "bevy_window::window::PresentMode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::window::PrimaryWindow": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": {}, + "required": [], + "short_name": "PrimaryWindow", + "title": "bevy_window::window::PrimaryWindow", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::Window": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "properties": { + "canvas": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "composite_alpha_mode": { + "type": { + "$ref": "#/$defs/bevy_window::window::CompositeAlphaMode" + } + }, + "cursor": { + "type": { + "$ref": "#/$defs/bevy_window::window::Cursor" + } + }, + "decorations": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "enabled_buttons": { + "type": { + "$ref": "#/$defs/bevy_window::window::EnabledButtons" + } + }, + "fit_canvas_to_parent": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "focused": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "ime_enabled": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "ime_position": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "internal": { + "type": { + "$ref": "#/$defs/bevy_window::window::InternalWindowState" + } + }, + "mode": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowMode" + } + }, + "position": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowPosition" + } + }, + "present_mode": { + "type": { + "$ref": "#/$defs/bevy_window::window::PresentMode" + } + }, + "prevent_default_event_handling": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "resizable": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "resize_constraints": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowResizeConstraints" + } + }, + "resolution": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowResolution" + } + }, + "title": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + }, + "transparent": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "visible": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "window_level": { + "type": { + "$ref": "#/$defs/bevy_window::window::WindowLevel" + } + }, + "window_theme": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [ + "cursor", + "present_mode", + "mode", + "position", + "resolution", + "title", + "composite_alpha_mode", + "resize_constraints", + "resizable", + "enabled_buttons", + "decorations", + "transparent", + "focused", + "window_level", + "fit_canvas_to_parent", + "prevent_default_event_handling", + "internal", + "ime_enabled", + "ime_position", + "visible" + ], + "short_name": "Window", + "title": "bevy_window::window::Window", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::WindowLevel": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "AlwaysOnBottom", + "Normal", + "AlwaysOnTop" + ], + "short_name": "WindowLevel", + "title": "bevy_window::window::WindowLevel", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::window::WindowMode": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Windowed", + "BorderlessFullscreen", + "SizedFullscreen", + "Fullscreen" + ], + "short_name": "WindowMode", + "title": "bevy_window::window::WindowMode", + "type": "string", + "typeInfo": "Enum" + }, + "bevy_window::window::WindowPosition": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "Automatic" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_window::window::MonitorSelection" + } + } + ], + "short_name": "Centered", + "title": "Centered", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::IVec2" + } + } + ], + "short_name": "At", + "title": "At", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "WindowPosition", + "title": "bevy_window::window::WindowPosition", + "type": "object", + "typeInfo": "Enum" + }, + "bevy_window::window::WindowResizeConstraints": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "max_height": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "max_width": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "min_height": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "min_width": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "min_width", + "min_height", + "max_width", + "max_height" + ], + "short_name": "WindowResizeConstraints", + "title": "bevy_window::window::WindowResizeConstraints", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::WindowResolution": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "physical_height": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "physical_width": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "scale_factor": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "scale_factor_override": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [ + "physical_width", + "physical_height", + "scale_factor" + ], + "short_name": "WindowResolution", + "title": "bevy_window::window::WindowResolution", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_window::window::WindowTheme": { + "isComponent": false, + "isResource": false, + "oneOf": [ + "Light", + "Dark" + ], + "short_name": "WindowTheme", + "title": "bevy_window::window::WindowTheme", + "type": "string", + "typeInfo": "Enum" + }, + "bool": { + "isComponent": false, + "isResource": false, + "short_name": "bool", + "title": "bool", + "type": "boolean", + "typeInfo": "Value" + }, + "char": { + "isComponent": false, + "isResource": false, + "short_name": "char", + "title": "char", + "type": "string", + "typeInfo": "Value" + }, + "core::ops::Range": { + "isComponent": false, + "isResource": false, + "short_name": "Range", + "title": "core::ops::Range", + "type": "object", + "typeInfo": "Value" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option>": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option>", + "title": "core::option::Option>", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option>": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_asset::handle::Handle" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option>", + "title": "core::option::Option>", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::camera::camera::Viewport" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_render::mesh::mesh::Indices" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bool" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f64" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "oneOf": [ + { + "title": "None" + }, + { + "items": false, + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::DVec2" + } + } + ], + "short_name": "Some", + "title": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "title": "core::option::Option", + "type": "object", + "typeInfo": "Enum" + }, + "f32": { + "isComponent": false, + "isResource": false, + "short_name": "f32", + "title": "f32", + "type": "float", + "typeInfo": "Value" + }, + "f64": { + "isComponent": false, + "isResource": false, + "short_name": "f64", + "title": "f64", + "type": "float", + "typeInfo": "Value" + }, + "glam::Affine2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "matrix2": { + "type": { + "$ref": "#/$defs/glam::Mat2" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "matrix2", + "translation" + ], + "short_name": "Affine2", + "title": "glam::Affine2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Affine3A": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "matrix3": { + "type": { + "$ref": "#/$defs/glam::Mat3A" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + } + }, + "required": [ + "matrix3", + "translation" + ], + "short_name": "Affine3A", + "title": "glam::Affine3A", + "type": "object", + "typeInfo": "Struct" + }, + "glam::BVec2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "y": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "BVec2", + "title": "glam::BVec2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::BVec3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "z": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "BVec3", + "title": "glam::BVec3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::BVec3A": { + "isComponent": false, + "isResource": false, + "short_name": "BVec3A", + "title": "glam::BVec3A", + "type": "object", + "typeInfo": "Value" + }, + "glam::BVec4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "x": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "y": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "z": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "BVec4", + "title": "glam::BVec4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::BVec4A": { + "isComponent": false, + "isResource": false, + "short_name": "BVec4A", + "title": "glam::BVec4A", + "type": "object", + "typeInfo": "Value" + }, + "glam::DAffine2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "matrix2": { + "type": { + "$ref": "#/$defs/glam::DMat2" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::DVec2" + } + } + }, + "required": [ + "matrix2", + "translation" + ], + "short_name": "DAffine2", + "title": "glam::DAffine2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DAffine3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "matrix3": { + "type": { + "$ref": "#/$defs/glam::DMat3" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::DVec3" + } + } + }, + "required": [ + "matrix3", + "translation" + ], + "short_name": "DAffine3", + "title": "glam::DAffine3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DMat2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x_axis": { + "type": { + "$ref": "#/$defs/glam::DVec2" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::DVec2" + } + } + }, + "required": [ + "x_axis", + "y_axis" + ], + "short_name": "DMat2", + "title": "glam::DMat2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DMat3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x_axis": { + "type": { + "$ref": "#/$defs/glam::DVec3" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::DVec3" + } + }, + "z_axis": { + "type": { + "$ref": "#/$defs/glam::DVec3" + } + } + }, + "required": [ + "x_axis", + "y_axis", + "z_axis" + ], + "short_name": "DMat3", + "title": "glam::DMat3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DMat4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w_axis": { + "type": { + "$ref": "#/$defs/glam::DVec4" + } + }, + "x_axis": { + "type": { + "$ref": "#/$defs/glam::DVec4" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::DVec4" + } + }, + "z_axis": { + "type": { + "$ref": "#/$defs/glam::DVec4" + } + } + }, + "required": [ + "x_axis", + "y_axis", + "z_axis", + "w_axis" + ], + "short_name": "DMat4", + "title": "glam::DMat4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DQuat": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "x": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "DQuat", + "title": "glam::DQuat", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DVec2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "DVec2", + "title": "glam::DVec2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DVec3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "DVec3", + "title": "glam::DVec3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::DVec4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "x": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f64" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "DVec4", + "title": "glam::DVec4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::IVec2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/i32" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "IVec2", + "title": "glam::IVec2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::IVec3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/i32" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "IVec3", + "title": "glam::IVec3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::IVec4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "x": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/i32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/i32" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "IVec4", + "title": "glam::IVec4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Mat2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x_axis": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::Vec2" + } + } + }, + "required": [ + "x_axis", + "y_axis" + ], + "short_name": "Mat2", + "title": "glam::Mat2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Mat3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "z_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "x_axis", + "y_axis", + "z_axis" + ], + "short_name": "Mat3", + "title": "glam::Mat3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Mat3A": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + }, + "z_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3A" + } + } + }, + "required": [ + "x_axis", + "y_axis", + "z_axis" + ], + "short_name": "Mat3A", + "title": "glam::Mat3A", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Mat4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w_axis": { + "type": { + "$ref": "#/$defs/glam::Vec4" + } + }, + "x_axis": { + "type": { + "$ref": "#/$defs/glam::Vec4" + } + }, + "y_axis": { + "type": { + "$ref": "#/$defs/glam::Vec4" + } + }, + "z_axis": { + "type": { + "$ref": "#/$defs/glam::Vec4" + } + } + }, + "required": [ + "x_axis", + "y_axis", + "z_axis", + "w_axis" + ], + "short_name": "Mat4", + "title": "glam::Mat4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Quat": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "Quat", + "title": "glam::Quat", + "type": "object", + "typeInfo": "Struct" + }, + "glam::UVec2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "UVec2", + "title": "glam::UVec2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::UVec3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "UVec3", + "title": "glam::UVec3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::UVec4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "x": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "UVec4", + "title": "glam::UVec4", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Vec2": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x", + "y" + ], + "short_name": "Vec2", + "title": "glam::Vec2", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Vec3": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "Vec3", + "title": "glam::Vec3", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Vec3A": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x", + "y", + "z" + ], + "short_name": "Vec3A", + "title": "glam::Vec3A", + "type": "object", + "typeInfo": "Struct" + }, + "glam::Vec4": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "properties": { + "w": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "x": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "y": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "z": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x", + "y", + "z", + "w" + ], + "short_name": "Vec4", + "title": "glam::Vec4", + "type": "object", + "typeInfo": "Struct" + }, + "i128": { + "isComponent": false, + "isResource": false, + "short_name": "i128", + "title": "i128", + "type": "int", + "typeInfo": "Value" + }, + "i16": { + "isComponent": false, + "isResource": false, + "short_name": "i16", + "title": "i16", + "type": "int", + "typeInfo": "Value" + }, + "i32": { + "isComponent": false, + "isResource": false, + "short_name": "i32", + "title": "i32", + "type": "int", + "typeInfo": "Value" + }, + "i64": { + "isComponent": false, + "isResource": false, + "short_name": "i64", + "title": "i64", + "type": "int", + "typeInfo": "Value" + }, + "i8": { + "isComponent": false, + "isResource": false, + "short_name": "i8", + "title": "i8", + "type": "int", + "typeInfo": "Value" + }, + "isize": { + "isComponent": false, + "isResource": false, + "short_name": "isize", + "title": "isize", + "type": "int", + "typeInfo": "Value" + }, + "smallvec::SmallVec<[bevy_ecs::Entity; 8]>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/bevy_ecs::Entity" + } + }, + "short_name": "SmallVec<[Entity; 8]>", + "title": "smallvec::SmallVec<[bevy_ecs::Entity; 8]>", + "type": "array", + "typeInfo": "List" + }, + "std::ffi::OsString": { + "isComponent": false, + "isResource": false, + "short_name": "OsString", + "title": "std::ffi::OsString", + "type": "object", + "typeInfo": "Value" + }, + "std::path::PathBuf": { + "isComponent": false, + "isResource": false, + "short_name": "PathBuf", + "title": "std::path::PathBuf", + "type": "object", + "typeInfo": "Value" + }, + "u128": { + "isComponent": false, + "isResource": false, + "short_name": "u128", + "title": "u128", + "type": "uint", + "typeInfo": "Value" + }, + "u16": { + "isComponent": false, + "isResource": false, + "short_name": "u16", + "title": "u16", + "type": "uint", + "typeInfo": "Value" + }, + "u32": { + "isComponent": false, + "isResource": false, + "short_name": "u32", + "title": "u32", + "type": "uint", + "typeInfo": "Value" + }, + "u64": { + "isComponent": false, + "isResource": false, + "short_name": "u64", + "title": "u64", + "type": "uint", + "typeInfo": "Value" + }, + "u8": { + "isComponent": false, + "isResource": false, + "short_name": "u8", + "title": "u8", + "type": "uint", + "typeInfo": "Value" + }, + "usize": { + "isComponent": false, + "isResource": false, + "short_name": "usize", + "title": "usize", + "type": "uint", + "typeInfo": "Value" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "bevy component registry schema" +} \ No newline at end of file diff --git a/testing/bevy_registry_export/basic/src/core/mod.rs b/testing/bevy_registry_export/basic/src/core/mod.rs new file mode 100644 index 0000000..5421e4e --- /dev/null +++ b/testing/bevy_registry_export/basic/src/core/mod.rs @@ -0,0 +1,22 @@ +use bevy::prelude::*; +use bevy_gltf_blueprints::*; +use bevy_registry_export::*; + +pub struct CorePlugin; +impl Plugin for CorePlugin { + fn build(&self, app: &mut App) { + app.add_plugins(( + ExportRegistryPlugin { + save_path: "assets/registry.json".into(), + ..Default::default() + }, + BlueprintsPlugin { + legacy_mode: false, + library_folder: "models/library".into(), + format: GltfFormat::GLB, + aabbs: true, + ..Default::default() + }, + )); + } +} diff --git a/testing/bevy_registry_export/basic/src/game/in_game.rs b/testing/bevy_registry_export/basic/src/game/in_game.rs new file mode 100644 index 0000000..2338956 --- /dev/null +++ b/testing/bevy_registry_export/basic/src/game/in_game.rs @@ -0,0 +1,128 @@ +use bevy::prelude::*; +use bevy_gltf_blueprints::{BluePrintBundle, BlueprintName, GameWorldTag}; +use bevy_gltf_worlflow_examples_common::{assets::GameAssets, GameState, InAppRunning}; + +use bevy_rapier3d::prelude::Velocity; +use rand::Rng; + +pub fn setup_game( + mut commands: Commands, + game_assets: Res, + models: Res>, + mut next_game_state: ResMut>, +) { + println!("setting up all stuff"); + commands.insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 0.2, + }); + // here we actually spawn our game world/level + + commands.spawn(( + SceneBundle { + // note: because of this issue https://github.com/bevyengine/bevy/issues/10436, "world" is now a gltf file instead of a scene + scene: models + .get(game_assets.world.id()) + .expect("main level should have been loaded") + .scenes[0] + .clone(), + ..default() + }, + bevy::prelude::Name::from("world"), + GameWorldTag, + InAppRunning, + )); + + next_game_state.set(GameState::InGame) +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct UnregisteredComponent; + +pub fn spawn_test( + keycode: Res>, + mut commands: Commands, + + mut game_world: Query<(Entity, &Children), With>, +) { + if keycode.just_pressed(KeyCode::T) { + let world = game_world.single_mut(); + let world = world.1[0]; + + let mut rng = rand::thread_rng(); + let range = 5.5; + let x: f32 = rng.gen_range(-range..range); + let y: f32 = rng.gen_range(-range..range); + + let mut rng = rand::thread_rng(); + let range = 0.8; + let vel_x: f32 = rng.gen_range(-range..range); + let vel_y: f32 = rng.gen_range(2.0..2.5); + let vel_z: f32 = rng.gen_range(-range..range); + + let name_index: u64 = rng.gen(); + + let new_entity = commands + .spawn(( + BluePrintBundle { + blueprint: BlueprintName("Health_Pickup".to_string()), + ..Default::default() + }, + bevy::prelude::Name::from(format!("test{}", name_index)), + // BlueprintName("Health_Pickup".to_string()), + // SpawnHere, + TransformBundle::from_transform(Transform::from_xyz(x, 2.0, y)), + Velocity { + linvel: Vec3::new(vel_x, vel_y, vel_z), + angvel: Vec3::new(0.0, 0.0, 0.0), + }, + )) + .id(); + commands.entity(world).add_child(new_entity); + } +} + +pub fn spawn_test_unregisted_components( + keycode: Res>, + mut commands: Commands, + + mut game_world: Query<(Entity, &Children), With>, +) { + if keycode.just_pressed(KeyCode::U) { + let world = game_world.single_mut(); + let world = world.1[0]; + + let mut rng = rand::thread_rng(); + let range = 5.5; + let x: f32 = rng.gen_range(-range..range); + let y: f32 = rng.gen_range(-range..range); + + let mut rng = rand::thread_rng(); + let range = 0.8; + let vel_x: f32 = rng.gen_range(-range..range); + let vel_y: f32 = rng.gen_range(2.0..2.5); + let vel_z: f32 = rng.gen_range(-range..range); + + let name_index: u64 = rng.gen(); + + let new_entity = commands + .spawn(( + BluePrintBundle { + blueprint: BlueprintName("Health_Pickup".to_string()), + ..Default::default() + }, + bevy::prelude::Name::from(format!("test{}", name_index)), + // BlueprintName("Health_Pickup".to_string()), + // SpawnHere, + TransformBundle::from_transform(Transform::from_xyz(x, 2.0, y)), + Velocity { + linvel: Vec3::new(vel_x, vel_y, vel_z), + angvel: Vec3::new(0.0, 0.0, 0.0), + }, + UnregisteredComponent, + )) + .id(); + commands.entity(world).add_child(new_entity); + } +} diff --git a/testing/bevy_registry_export/basic/src/game/in_main_menu.rs b/testing/bevy_registry_export/basic/src/game/in_main_menu.rs new file mode 100644 index 0000000..c1a4b8b --- /dev/null +++ b/testing/bevy_registry_export/basic/src/game/in_main_menu.rs @@ -0,0 +1,112 @@ +use bevy::prelude::*; +use bevy_gltf_worlflow_examples_common::{AppState, InMainMenu}; + +pub fn setup_main_menu(mut commands: Commands) { + commands.spawn((Camera2dBundle::default(), InMainMenu)); + + commands.spawn(( + TextBundle::from_section( + "SOME GAME TITLE !!", + TextStyle { + //font: asset_server.load("fonts/FiraMono-Medium.ttf"), + font_size: 18.0, + color: Color::WHITE, + ..Default::default() + }, + ) + .with_style(Style { + position_type: PositionType::Absolute, + top: Val::Px(100.0), + left: Val::Px(200.0), + ..default() + }), + InMainMenu, + )); + + commands.spawn(( + TextBundle::from_section( + "New Game (press Enter to start, press T once the game is started for demo spawning)", + TextStyle { + //font: asset_server.load("fonts/FiraMono-Medium.ttf"), + font_size: 18.0, + color: Color::WHITE, + ..Default::default() + }, + ) + .with_style(Style { + position_type: PositionType::Absolute, + top: Val::Px(200.0), + left: Val::Px(200.0), + ..default() + }), + InMainMenu, + )); + + /* + commands.spawn(( + TextBundle::from_section( + "Load Game", + TextStyle { + //font: asset_server.load("fonts/FiraMono-Medium.ttf"), + font_size: 18.0, + color: Color::WHITE, + ..Default::default() + }, + ) + .with_style(Style { + position_type: PositionType::Absolute, + top: Val::Px(250.0), + left: Val::Px(200.0), + ..default() + }), + InMainMenu + )); + + commands.spawn(( + TextBundle::from_section( + "Exit Game", + TextStyle { + //font: asset_server.load("fonts/FiraMono-Medium.ttf"), + font_size: 18.0, + color: Color::WHITE, + ..Default::default() + }, + ) + .with_style(Style { + position_type: PositionType::Absolute, + top: Val::Px(300.0), + left: Val::Px(200.0), + ..default() + }), + InMainMenu + ));*/ +} + +pub fn teardown_main_menu(bla: Query>, mut commands: Commands) { + for bli in bla.iter() { + commands.entity(bli).despawn_recursive(); + } +} + +pub fn main_menu( + keycode: Res>, + + mut next_app_state: ResMut>, + // mut next_game_state: ResMut>, + // mut save_requested_events: EventWriter, + // mut load_requested_events: EventWriter, +) { + if keycode.just_pressed(KeyCode::Return) { + next_app_state.set(AppState::AppLoading); + // next_game_state.set(GameState::None); + } + + if keycode.just_pressed(KeyCode::L) { + next_app_state.set(AppState::AppLoading); + // load_requested_events.send(LoadRequest { path: "toto".into() }) + } + + if keycode.just_pressed(KeyCode::S) { + // save_requested_events.send(SaveRequest { path: "toto".into() }) + } +} diff --git a/testing/bevy_registry_export/basic/src/game/mod.rs b/testing/bevy_registry_export/basic/src/game/mod.rs new file mode 100644 index 0000000..b236141 --- /dev/null +++ b/testing/bevy_registry_export/basic/src/game/mod.rs @@ -0,0 +1,22 @@ +pub mod in_game; +pub use in_game::*; + +pub mod in_main_menu; +pub use in_main_menu::*; + +use bevy::prelude::*; +use bevy_gltf_worlflow_examples_common::{AppState, GameState}; + +pub struct GamePlugin; +impl Plugin for GamePlugin { + fn build(&self, app: &mut App) { + app.add_systems( + Update, + (spawn_test, spawn_test_unregisted_components).run_if(in_state(GameState::InGame)), + ) + .add_systems(OnEnter(AppState::MenuRunning), setup_main_menu) + .add_systems(OnExit(AppState::MenuRunning), teardown_main_menu) + .add_systems(Update, main_menu.run_if(in_state(AppState::MenuRunning))) + .add_systems(OnEnter(AppState::AppRunning), setup_game); + } +} diff --git a/testing/bevy_registry_export/basic/src/main.rs b/testing/bevy_registry_export/basic/src/main.rs new file mode 100644 index 0000000..8fca426 --- /dev/null +++ b/testing/bevy_registry_export/basic/src/main.rs @@ -0,0 +1,27 @@ +use bevy::prelude::*; +use bevy_editor_pls::prelude::*; +use bevy_gltf_worlflow_examples_common::CommonPlugin; + +mod core; +use crate::core::*; + +mod game; +use game::*; + +mod test_components; +use test_components::*; + +fn main() { + App::new() + .add_plugins(( + DefaultPlugins.set(AssetPlugin::default()), + // editor + EditorPlugin::default(), + // our custom plugins + CommonPlugin, + CorePlugin, // reusable plugins + GamePlugin, // specific to our game + ComponentsTestPlugin, // Showcases different type of components /structs + )) + .run(); +} diff --git a/testing/bevy_registry_export/basic/src/test_components.rs b/testing/bevy_registry_export/basic/src/test_components.rs new file mode 100644 index 0000000..58a19c2 --- /dev/null +++ b/testing/bevy_registry_export/basic/src/test_components.rs @@ -0,0 +1,190 @@ +use bevy::{ + pbr::{ExtendedMaterial, MaterialExtension}, + prelude::*, + render::render_resource::*, +}; +use std::ops::Range; + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct UnitTest; + +#[derive(Component, Reflect, Default, Debug, Deref, DerefMut)] +#[reflect(Component)] +struct TupleTestF32(f32); + +#[derive(Component, Reflect, Default, Debug, Deref, DerefMut)] +#[reflect(Component)] +struct TupleTestU64(u64); + +#[derive(Component, Reflect, Default, Debug, Deref, DerefMut)] +#[reflect(Component)] +pub struct TupleTestStr(String); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleTest2(f32, u64, String); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleTestBool(bool); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleVec2(Vec2); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleVec3(Vec3); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleVec(Vec); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleVecF32F32(Vec<(f32, f32)>); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct TupleTestColor(Color); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct BasicTest { + a: f32, + b: u64, + c: String, +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub enum EnumTest { + Metal, + Wood, + Rock, + Cloth, + Squishy, + #[default] + None, +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct NestingTestLevel2 { + text: String, + enable: bool, + enum_inner: EnumTest, + color: TupleTestColor, + toggle: TupleTestBool, + basic: BasicTest, + pub nested: NestingTestLevel3, + colors_list: VecOfColors, +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct NestingTestLevel3 { + vec: TupleVec3, +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct NestedTupleStuff(f32, u64, NestingTestLevel2); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub enum EnumComplex { + Float(f32), + Wood(String), + Vec(BasicTest), + SomeThing, + StructLike { + a: f32, + b: u32, + c: String, + }, + #[default] + None, +} + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct VecOfVec3s2(Vec); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct VecOfColors(Vec); + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct AAAAddedCOMPONENT; + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut; + +/* fn toto(){ + let bla:core::ops::Range = Range { start: 0.1, end: 5.0}; +} */ + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub struct VecOfF32s(Vec); + +// test for extended materials +#[derive(Asset, AsBindGroup, Reflect, Debug, Clone)] +struct MyExtension { + // We need to ensure that the bindings of the base material and the extension do not conflict, + // so we start from binding slot 100, leaving slots 0-99 for the base material. + #[uniform(100)] + quantize_steps: u32, +} + +impl MaterialExtension for MyExtension { + fn fragment_shader() -> ShaderRef { + "shaders/extended_material.wgsl".into() + } + + fn deferred_fragment_shader() -> ShaderRef { + "shaders/extended_material.wgsl".into() + } +} + +pub struct ComponentsTestPlugin; +impl Plugin for ComponentsTestPlugin { + fn build(&self, app: &mut App) { + app.register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::>() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::<(f32, f32)>() + .register_type::>() + .register_type::>() + .register_type::>() + .register_type::() + .register_type::>() + .register_type::() + .register_type::>() + // .register_type::() + .register_type::() + .add_plugins(MaterialPlugin::< + ExtendedMaterial, + >::default()); + } +} diff --git a/tools/bevy_components/README.md b/tools/bevy_components/README.md index 426e127..2c385d3 100644 --- a/tools/bevy_components/README.md +++ b/tools/bevy_components/README.md @@ -15,6 +15,9 @@ of your Bevy components you get a nicely packed custom_property to use with ... > Important: the tooling is still in the early stages, even if it is feature complete : use with caution!. +> IMPORTANT !! if you have previously used v0.1 , v0.2 had a breaking change, please see [this](#regenerate-ui-values) section on how to upgrade your data to v0.2.\ +This problem should not be present going forward + ## Installation: * grab the latest release zip file from the releases tab (choose the bevy_components releases !) @@ -95,6 +98,24 @@ it will automatically update the value of the corresponding custom property ![edit component](./docs/edit_component2.png) +### Create components from custom properties + +- IF you have a valid component type and the correct corresponding RON string in the custom_property value (this button will not appear if not), this add-on can automatically +generate the corresponding component for you: + +- Fill/check your custom property (here for Aabb) + +![generate_components 2](./docs/generate_components2.png) + +- click on the button + +![generate_components](./docs/generate_components.png) + +-voila ! + +![generate_components 3](./docs/generate_components3.png) + + ### copy & pasting - you can also copy & paste components between objects @@ -161,21 +182,39 @@ It will add the component to the select object ## advanced configuration - - there are also additional QOL features, that you should not need most of the time + ### registry file polling - - "update custom properties of current object" : will go over **all components** that you have defined for the **currently selected object**, and re-generate the + + * by default, the add-on will check for changes in your registry file every second, and refresh the UI accordingly + * you can set the polling frequency or turn it off if you do not want auto-refresh + + ![registry file polling](./docs/registry_polling.png) + + + ### regenerate custom property values + + - "update custom properties of current object" : will go over **all components** that you have defined for the **currently selected object**, and re-generate the corresponding custom property values ![update custom properties](./docs/other_options.png) - - "update custom properties of ALL objects" : same as above but it will do so for the **ALL objects in your blend file** (so can be slow!), and re-generate the + - "update custom properties of ALL objects" : same as above but it will do so for the **ALL objects in your blend file** (so can be slow!), and re-generate the corresponding custom property values ![update custom properties for all](./docs/other_options2.png) + + ### regenerate UI values + + - since v0.2, you have the option to regenerate (for the selected object or all objects, as above) to regenerate your UI values from the custom property values + + ![update UI FROM custom properties](./docs/update_ui_from_custom_properties.png) + + > IMPORTANT !! use this if you have previously used v0.1 , as v0.2 had a breaking change, that makes it **necessary** to use this **once** to upgrade the UI data + ## Additional important information @@ -191,6 +230,11 @@ Please see the documentation of those crates for more information. you can find an example [here](https://github.com/kaosat-dev/Blender_bevy_components_workflow/tree/main/examples/bevy_registry_export/) +## Known issues & limitations: + +* **Range** data (ie ```Range``` etc) are not handled at this time (issue seems to be on the Bevy side) +* **Entity** structs are always set to 0 (setting entity values on the Blender side at this time does not make much sense anyway) + ## License This tool, all its code, contents & assets is Dual-licensed under either of diff --git a/tools/bevy_components/TODO.md b/tools/bevy_components/TODO.md index 994e6f0..a18dd11 100644 --- a/tools/bevy_components/TODO.md +++ b/tools/bevy_components/TODO.md @@ -133,7 +133,77 @@ UI: - [x] update version - [x] add ability to set legacy mode for bevy_gltf_components ? - - [ ] release all versions - - [ ] update main documentation, add compatibility version grid + - [x] release all versions + - [x] update main documentation, add compatibility version grid - \ No newline at end of file + +## Phase 2 + +- [x] fix handling of long component names + - [x] fix nesting level handling issue for new system : ie basic component DOES NOT work, but nestedLevel2 does + - add goddam tests ! + - [ ] verify some weird prop => custom property values (Calculated Clip for example) + +- [x] fix "reload registry" not clearing all previous data (reloading registry does not seem to account for added/removed components in the registry ) +- add file watcher for registry + - [x] have the watcher work as expected + - [ ] add handling of removed registry file + - [ ] clear & reset handler when the file browser for the registry is used +- [ ] re-enable watcher + +- tests + clear && pytest -svv --blender-executable /blender/blender-4.0.2-linux-x64/blender + + - [x] load registry + - just check list of components vs lists in registry + - [x] try adding all components + - [x] select an object + - [x] call the add_component operator + + - [x] change params + - use field names + component definitions to set values + - [x] find a way to shuffle params of ALL components based on a reliable, repeatable seed + + - [x] test propgroup values => custom property values + - [x] test custom property value => propgroup value + + - check if all went well + + - [x] fix issues with incorect custom_property generation + - [x] fix issue with object variants for enums + + - [ ] add handling for core::ops::Range & other ranges + - [x] add handling for alloc::borrow::Cow + - [x] add handling of isize + + - [x] indirection level + - currently + - short_name +_"ui => direct lookup + - problem : max 64 chars for propertyGroupNames + - possible solution + - propertyGroupName storage: simple , incremented INT (call it propGroupId for ex) + - lookup shortName => propGroupId + + - do a first pass, by replacing manual propGroupNames creation with a function + - in a second pass, replace the innards + +- add button to regenerate cutom prop values from custom properties (allows us to sidestep any future issues with internals changing) + - [x] fix lists + - [x] fix enums (see Clusterconfig) + - [x] need an example with one tupple one struct + - [x] projection + - [ ] additionalmassproperties + - [x] fix tupleStructs (see TupleVecF32F32) => always the same problem of having us pre-parse data without knowing what we have inside + - find a way to only split by level 0 (highest level) nesting "," seperators, ignoring any level of nesting until we dig one level deeper + - solve nesting level use issues + +- [x] remove metadata when deleting components +- [x] add try catch around custom_prop => propGroup +- [x] enhance the GenerateComponent_From_custom_property_Operator to use the new system to actually generate the stuff + +- coherence in operators: + - component_name vs component_type + - [x] delete => remove + +- [x] clean up reloading of registry settings +- [x] clean up file watcher \ No newline at end of file diff --git a/tools/bevy_components/__init__.py b/tools/bevy_components/__init__.py index b63f3eb..74637f0 100644 --- a/tools/bevy_components/__init__.py +++ b/tools/bevy_components/__init__.py @@ -1,7 +1,7 @@ bl_info = { "name": "bevy_components", "author": "kaosigh", - "version": (0, 1, 0), + "version": (0, 2, 0), "blender": (3, 4, 0), "location": "VIEW_3D", "description": "UI to help create Bevy blueprints and components", @@ -16,13 +16,13 @@ from bpy.props import (StringProperty) from .helpers import load_settings from .blueprints import CreateBlueprintOperator -from .components.operators import CopyComponentOperator, DeleteComponentOperator, GenerateComponent_From_custom_property_Operator, PasteComponentOperator, AddComponentOperator, Toggle_ComponentVisibility +from .components.operators import CopyComponentOperator, RemoveComponentOperator, GenerateComponent_From_custom_property_Operator, PasteComponentOperator, AddComponentOperator, Toggle_ComponentVisibility from .registry.registry import ComponentsRegistry,MissingBevyType -from .registry.operators import (COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT, ReloadRegistryOperator, OT_OpenFilebrowser) +from .registry.operators import (COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT, COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_ALL, COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_CURRENT, ReloadRegistryOperator, OT_OpenFilebrowser) from .registry.ui import (BEVY_COMPONENTS_PT_Configuration, BEVY_COMPONENTS_PT_MissingTypesPanel, MISSING_TYPES_UL_List) -from .components.metadata import (ComponentInfos, ComponentsMeta, ensure_metadata_for_all_objects) +from .components.metadata import (ComponentMetadata, ComponentsMeta, ensure_metadata_for_all_objects) from .propGroups.prop_groups import (generate_propertyGroups_for_components) from .components.lists import GENERIC_LIST_OT_actions, Generic_LIST_OT_AddItem, Generic_LIST_OT_RemoveItem, Generic_LIST_OT_SelectItem from .components.definitions_list import (ComponentDefinitionsList, ClearComponentDefinitionsList) @@ -86,14 +86,14 @@ classes = [ AddComponentOperator, CopyComponentOperator, PasteComponentOperator, - DeleteComponentOperator, + RemoveComponentOperator, GenerateComponent_From_custom_property_Operator, Toggle_ComponentVisibility, ComponentDefinitionsList, ClearComponentDefinitionsList, - ComponentInfos, + ComponentMetadata, ComponentsMeta, MissingBevyType, ComponentsRegistry, @@ -102,6 +102,9 @@ classes = [ ReloadRegistryOperator, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT, + + COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_ALL, + COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_CURRENT, BEVY_COMPONENTS_PT_MainPanel, BEVY_COMPONENTS_PT_ComponentsPanel, @@ -119,19 +122,14 @@ from bpy.app.handlers import persistent @persistent def post_load(file_name): - print("post load", file_name) registry = bpy.context.window_manager.components_registry - registry.schemaPath = load_settings(registry.settings_save_path)["schemaPath"] - registry.load_schema() - generate_propertyGroups_for_components() - ensure_metadata_for_all_objects() - - + if registry != None: + registry.load_settings() + def register(): for cls in classes: bpy.utils.register_class(cls) bpy.types.WindowManager.blueprint_name = StringProperty() - bpy.app.handlers.load_post.append(post_load) def unregister(): diff --git a/tools/bevy_components/components/metadata.py b/tools/bevy_components/components/metadata.py index 666a343..f97a342 100644 --- a/tools/bevy_components/components/metadata.py +++ b/tools/bevy_components/components/metadata.py @@ -1,9 +1,10 @@ import bpy from bpy.props import (StringProperty, BoolProperty, PointerProperty) from bpy_types import (PropertyGroup) -from ..propGroups.conversions import property_group_value_from_custom_property_value, property_group_value_to_custom_property_value +from ..propGroups.conversions_from_prop_group import property_group_value_to_custom_property_value +from ..propGroups.conversions_to_prop_group import property_group_value_from_custom_property_value -class ComponentInfos(bpy.types.PropertyGroup): +class ComponentMetadata(bpy.types.PropertyGroup): name : bpy.props.StringProperty( name = "name", default = "" @@ -51,7 +52,7 @@ class ComponentsMeta(PropertyGroup): name="infos per component", description="component" ) - components: bpy.props.CollectionProperty(type = ComponentInfos) + components: bpy.props.CollectionProperty(type = ComponentMetadata) @classmethod def register(cls): @@ -131,12 +132,12 @@ def add_metadata_to_components_without_metadata(object): def add_component_to_object(object, component_definition, value=None): cleanup_invalid_metadata(object) if object is not None: - print("add_component_to_object", component_definition) + # print("add_component_to_object", component_definition) long_name = component_definition["title"] short_name = component_definition["short_name"] registry = bpy.context.window_manager.components_registry - if registry.type_infos == None: - raise Exception('registry type infos have not been loaded yet or ar missing !') + if not registry.has_type_infos(): + raise Exception('registry type infos have not been loaded yet or are missing !') definition = registry.type_infos[long_name] # now we use our pre_generated property groups to set the initial value of our custom property (_, propertyGroup) = upsert_component_in_object(object, component_name=short_name, registry=registry) @@ -157,7 +158,7 @@ def upsert_component_in_object(object, component_name, registry): if component_definition != None: short_name = component_definition["short_name"] long_name = component_definition["title"] - property_group_name = short_name+"_ui" + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) propertyGroup = None component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) @@ -175,7 +176,7 @@ def upsert_component_in_object(object, component_name, registry): if property_group_name in registry.component_propertyGroups: # we have found a matching property_group, so try to inject it # now inject property group - setattr(ComponentInfos, property_group_name, registry.component_propertyGroups[property_group_name]) # FIXME: not ideal as all ComponentInfos get the propGroup, but have not found a way to assign it per instance + setattr(ComponentMetadata, property_group_name, registry.component_propertyGroups[property_group_name]) # FIXME: not ideal as all ComponentMetadata get the propGroup, but have not found a way to assign it per instance propertyGroup = getattr(component_meta, property_group_name, None) # now deal with property groups details @@ -196,13 +197,14 @@ def upsert_component_in_object(object, component_name, registry): return(None, None) -def copy_propertyGroup_values_to_another_object(source_object, target_object, component_name): +def copy_propertyGroup_values_to_another_object(source_object, target_object, component_name, registry): if source_object == None or target_object == None or component_name == None: raise Exception('missing input data, cannot copy component propertryGroup') component_definition = find_component_definition_from_short_name(component_name) short_name = component_definition["short_name"] - property_group_name = short_name+"_ui" + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + registry = bpy.context.window_manager.components_registry source_components_metadata = source_object.components_meta.components @@ -234,3 +236,46 @@ def apply_propertyGroup_values_to_object_customProperties(object): if component_definition != None: value = property_group_value_to_custom_property_value(propertyGroup, component_definition, registry, None) object[component_name] = value + + + +def apply_customProperty_values_to_object_propertyGroups(object): + print("apply custom properties to ", object.name) + registry = bpy.context.window_manager.components_registry + for component_name in dict(object) : + if component_name == "components_meta": + continue + component_definition = find_component_definition_from_short_name(component_name) + if component_definition != None: + property_group_name = registry.get_propertyGroupName_from_shortName(component_name) + components_metadata = object.components_meta.components + source_componentMeta = next(filter(lambda component: component["name"] == component_name, components_metadata), None) + # matching component means we already have this type of component + propertyGroup = getattr(source_componentMeta, property_group_name, None) + customProperty_value = object[component_name] + #value = property_group_value_to_custom_property_value(propertyGroup, component_definition, registry, None) + + object["__disable__update"] = True # disable update callback while we set the values of the propertyGroup "tree" (as a propertyGroup can contain other propertyGroups) + property_group_value_from_custom_property_value(propertyGroup, component_definition, registry, customProperty_value) + del object["__disable__update"] + +# removes the given component from the object: removes both the custom property and the matching metadata from the object +def remove_component_from_object(object, component_name): + del object[component_name] + + components_metadata = getattr(object, "components_meta", None) + if components_metadata == None: + return False + + components_metadata = components_metadata.components + to_remove = [] + for index, component_meta in enumerate(components_metadata): + short_name = component_meta.name + if short_name == component_name: + to_remove.append(index) + break + for index in to_remove: + components_metadata.remove(index) + return True + + \ No newline at end of file diff --git a/tools/bevy_components/components/operators.py b/tools/bevy_components/components/operators.py index 8c2c3df..13ddffc 100644 --- a/tools/bevy_components/components/operators.py +++ b/tools/bevy_components/components/operators.py @@ -3,22 +3,22 @@ import json import bpy from bpy_types import Operator from bpy.props import (StringProperty) -from .metadata import add_component_to_object, add_metadata_to_components_without_metadata, copy_propertyGroup_values_to_another_object, find_component_definition_from_short_name +from .metadata import add_component_to_object, add_metadata_to_components_without_metadata, apply_customProperty_values_to_object_propertyGroups, copy_propertyGroup_values_to_another_object, find_component_definition_from_short_name, remove_component_from_object class AddComponentOperator(Operator): """Add component to blueprint""" - bl_idname = "object.addblueprint_to_component" + bl_idname = "object.add_bevy_component" bl_label = "Add component to blueprint Operator" bl_options = {"UNDO"} component_type: StringProperty( name="component_type", description="component type to add", - ) + ) # type: ignore def execute(self, context): - print("adding component to blueprint", self.component_type) object = context.object + print("adding component ", self.component_type, "to object '"+object.name+"'") has_component_type = self.component_type != "" if has_component_type and object != None: @@ -30,19 +30,19 @@ class AddComponentOperator(Operator): class CopyComponentOperator(Operator): """Copy component from blueprint""" - bl_idname = "object.copy_component" + bl_idname = "object.copy_bevy_component" bl_label = "Copy component Operator" bl_options = {"UNDO"} source_component_name: StringProperty( name="source component_name", description="name of the component to copy", - ) + ) # type: ignore source_object_name: StringProperty( name="source object name", description="name of the object to copy the component from", - ) + ) # type: ignore @classmethod def register(cls): @@ -67,7 +67,7 @@ class CopyComponentOperator(Operator): class PasteComponentOperator(Operator): """Paste component to blueprint""" - bl_idname = "object.paste_component" + bl_idname = "object.paste_bevy_component" bl_label = "Paste component to blueprint Operator" bl_options = {"UNDO"} @@ -80,67 +80,79 @@ class PasteComponentOperator(Operator): else: component_name = context.window_manager.copied_source_component_name if not component_name in source_object: - self.report({"ERROR"}, "The source component to copy a component from does not exist") + self.report({"ERROR"}, "The source component to copy from does not exist") else: component_value = source_object[component_name] print("pasting component to object: component name:", str(component_name), "component value:" + str(component_value)) print (context.object) - copy_propertyGroup_values_to_another_object(source_object, context.object, component_name) + registry = context.window_manager.components_registry + copy_propertyGroup_values_to_another_object(source_object, context.object, component_name, registry) return {'FINISHED'} -class DeleteComponentOperator(Operator): +class RemoveComponentOperator(Operator): """Delete component from blueprint""" - bl_idname = "object.delete_component" + bl_idname = "object.remove_bevy_component" bl_label = "Delete component from blueprint Operator" bl_options = {"UNDO"} component_name: StringProperty( name="component name", description="component to delete", - ) + ) # type: ignore def execute(self, context): object = context.object + + print("removing component ", self.component_name, "from object '"+object.name+"'") + if object is not None and self.component_name in object: - del object[self.component_name] + remove_component_from_object(object, self.component_name) else: - self.report({"ERROR"}, "The object/ component to remove does not exist") + self.report({"ERROR"}, "The object/ component to remove ("+ self.component_name +") does not exist") return {'FINISHED'} class GenerateComponent_From_custom_property_Operator(Operator): """generate components from custom property""" - bl_idname = "object.generate_component" + bl_idname = "object.generate_bevy_component_from_custom_property" bl_label = "Generate component from custom_property Operator" bl_options = {"UNDO"} component_name: StringProperty( name="component name", description="component to generate custom properties for", - ) + ) # type: ignore def execute(self, context): object = context.object - add_metadata_to_components_without_metadata(object) + error = False + try: + add_metadata_to_components_without_metadata(object) + apply_customProperty_values_to_object_propertyGroups(object) + except Exception as error: + del object["__disable__update"] # make sure custom properties are updateable afterwards, even in the case of failure + error = True + self.report({'ERROR'}, "Failed to update propertyGroup values from custom property: Error:" + str(error)) + if not error: + self.report({'INFO'}, "Sucessfully generated UI values for custom properties for selected object") return {'FINISHED'} - class Toggle_ComponentVisibility(Operator): """toggles components visibility""" - bl_idname = "object.toggle_component_visibility" + bl_idname = "object.toggle_bevy_component_visibility" bl_label = "Toggle component visibility" bl_options = {"UNDO"} component_name: StringProperty( name="component name", description="component to toggle", - ) + ) # type: ignore def execute(self, context): object = context.object diff --git a/tools/bevy_components/components/ui.py b/tools/bevy_components/components/ui.py index a169210..23e8fe3 100644 --- a/tools/bevy_components/components/ui.py +++ b/tools/bevy_components/components/ui.py @@ -1,12 +1,11 @@ import json import bpy from .metadata import do_object_custom_properties_have_missing_metadata -from .operators import AddComponentOperator, CopyComponentOperator, DeleteComponentOperator, GenerateComponent_From_custom_property_Operator, PasteComponentOperator, Toggle_ComponentVisibility +from .operators import AddComponentOperator, CopyComponentOperator, RemoveComponentOperator, GenerateComponent_From_custom_property_Operator, PasteComponentOperator, Toggle_ComponentVisibility def draw_propertyGroup( propertyGroup, layout, nesting =[], rootName=None): is_enum = getattr(propertyGroup, "with_enum") is_list = getattr(propertyGroup, "with_list") - #current_short_name = getattr(propertyGroup, "short_name", "") + "_ui" #nesting = nesting + [current_short_name] # we need this convoluted "nested path strings " workaround so that operators working on a given # item in our components hierarchy can get the correct propertyGroup by STRINGS because of course, we cannot pass objects to operators...sigh @@ -119,7 +118,7 @@ class BEVY_COMPONENTS_PT_ComponentsPanel(bpy.types.Panel): # we get & load our component registry registry = bpy.context.window_manager.components_registry available_components = bpy.context.window_manager.components_list - + registry_has_type_infos = registry.has_type_infos() if object is not None: row = layout.row(align=True) @@ -137,12 +136,12 @@ class BEVY_COMPONENTS_PT_ComponentsPanel(bpy.types.Panel): # paste components row = layout.row(align=True) row.operator(PasteComponentOperator.bl_idname, text="Paste component ("+bpy.context.window_manager.copied_source_component_name+")", icon="PASTEDOWN") - row.enabled = registry.type_infos != None and context.window_manager.copied_source_object != '' + row.enabled = registry_has_type_infos and context.window_manager.copied_source_object != '' layout.separator() # upgrate custom props to components - upgradeable_customProperties = registry.type_infos != None and do_object_custom_properties_have_missing_metadata(context.object) + upgradeable_customProperties = registry.has_type_infos() and do_object_custom_properties_have_missing_metadata(context.object) if upgradeable_customProperties: row = layout.row(align=True) op = row.operator(GenerateComponent_From_custom_property_Operator.bl_idname, text="generate components from custom properties" , icon="LOOP_FORWARDS") @@ -172,28 +171,29 @@ class BEVY_COMPONENTS_PT_ComponentsPanel(bpy.types.Panel): row.label(text=component_name) # we fetch the matching ui property group - root_propertyGroup_name = component_name+"_ui" - propertyGroup = getattr(component_meta, root_propertyGroup_name, None) - if propertyGroup: - # if the component has only 0 or 1 field names, display inline, otherwise change layout - single_field = len(propertyGroup.field_names) < 2 - prop_group_location = box.row(align=True).column() - if single_field: - prop_group_location = row.column(align=True)#.split(factor=0.9)#layout.row(align=False) - - if component_visible: - if component_invalid: - error_message = invalid_details if component_invalid else "Missing component UI data, please reload registry !" - prop_group_location.label(text=error_message) - draw_propertyGroup(propertyGroup, prop_group_location, [root_propertyGroup_name], component_name) - else : - row.label(text="details hidden, click on toggle to display") - else: - error_message = invalid_details if component_invalid else "Missing component UI data, please reload registry !" - row.label(text=error_message) + root_propertyGroup_name = registry.get_propertyGroupName_from_shortName(component_name) + if root_propertyGroup_name: + propertyGroup = getattr(component_meta, root_propertyGroup_name, None) + if propertyGroup: + # if the component has only 0 or 1 field names, display inline, otherwise change layout + single_field = len(propertyGroup.field_names) < 2 + prop_group_location = box.row(align=True).column() + if single_field: + prop_group_location = row.column(align=True)#.split(factor=0.9)#layout.row(align=False) + + if component_visible: + if component_invalid: + error_message = invalid_details if component_invalid else "Missing component UI data, please reload registry !" + prop_group_location.label(text=error_message) + draw_propertyGroup(propertyGroup, prop_group_location, [root_propertyGroup_name], component_name) + else : + row.label(text="details hidden, click on toggle to display") + else: + error_message = invalid_details if component_invalid else "Missing component UI data, please reload registry !" + row.label(text=error_message) # "footer" with additional controls - op = row.operator(DeleteComponentOperator.bl_idname, text="", icon="X") + op = row.operator(RemoveComponentOperator.bl_idname, text="", icon="X") op.component_name = component_name row.separator() diff --git a/tools/bevy_components/docs/generate_components.png b/tools/bevy_components/docs/generate_components.png new file mode 100644 index 0000000..e77a65f Binary files /dev/null and b/tools/bevy_components/docs/generate_components.png differ diff --git a/tools/bevy_components/docs/generate_components2.png b/tools/bevy_components/docs/generate_components2.png new file mode 100644 index 0000000..71eaec2 Binary files /dev/null and b/tools/bevy_components/docs/generate_components2.png differ diff --git a/tools/bevy_components/docs/generate_components3.png b/tools/bevy_components/docs/generate_components3.png new file mode 100644 index 0000000..685b64f Binary files /dev/null and b/tools/bevy_components/docs/generate_components3.png differ diff --git a/tools/bevy_components/docs/registry_polling.png b/tools/bevy_components/docs/registry_polling.png new file mode 100644 index 0000000..134533b Binary files /dev/null and b/tools/bevy_components/docs/registry_polling.png differ diff --git a/tools/bevy_components/docs/update_ui_from_custom_properties.png b/tools/bevy_components/docs/update_ui_from_custom_properties.png new file mode 100644 index 0000000..c2a1d9a Binary files /dev/null and b/tools/bevy_components/docs/update_ui_from_custom_properties.png differ diff --git a/tools/bevy_components/helpers.py b/tools/bevy_components/helpers.py index ad4d662..0c56e39 100644 --- a/tools/bevy_components/helpers.py +++ b/tools/bevy_components/helpers.py @@ -18,7 +18,6 @@ def make_empty(name, location, rotation, scale, collection): #bpy.context.view_layer.update() return empty_obj -#".gltf_auto_export_settings" def upsert_settings(name, data): stored_settings = bpy.data.texts[name] if name in bpy.data.texts else bpy.data.texts.new(name) stored_settings.clear() diff --git a/tools/bevy_components/propGroups/conversions.py b/tools/bevy_components/propGroups/conversions_from_prop_group.py similarity index 63% rename from tools/bevy_components/propGroups/conversions.py rename to tools/bevy_components/propGroups/conversions_from_prop_group.py index 57e3697..c1d5c61 100644 --- a/tools/bevy_components/propGroups/conversions.py +++ b/tools/bevy_components/propGroups/conversions_from_prop_group.py @@ -1,7 +1,5 @@ -import json from bpy_types import PropertyGroup - conversion_tables = { "bool": lambda value: value, @@ -99,9 +97,9 @@ def property_group_value_to_custom_property_value(property_group, definition, re value = getattr(property_group, variant_name) is_property_group = isinstance(value, PropertyGroup) child_property_group = value if is_property_group else None - + value = property_group_value_to_custom_property_value(child_property_group, variant_definition, registry, parent=component_name, value=value) - value = selected + str(value,) + value = selected + str(value,) #"{}{},".format(selected ,value) elif "properties" in variant_definition: value = getattr(property_group, variant_name) is_property_group = isinstance(value, PropertyGroup) @@ -110,8 +108,14 @@ def property_group_value_to_custom_property_value(property_group, definition, re value = property_group_value_to_custom_property_value(child_property_group, variant_definition, registry, parent=component_name, value=value) value = selected + str(value,) else: - print("basic enum stuff") - value = selected # here the value of the enum is just the name of the variant + value = getattr(property_group, variant_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + if child_property_group: + value = property_group_value_to_custom_property_value(child_property_group, variant_definition, registry, parent=component_name, value=value) + value = selected + str(value,) + else: + value = selected # here the value of the enum is just the name of the variant else: value = selected @@ -131,9 +135,13 @@ def property_group_value_to_custom_property_value(property_group, definition, re value.append(item_value) else: value = conversion_tables[type_name](value) if is_value_type else value + value = '""' if isinstance(value, PropertyGroup) else value + - #print("VALUE", value, type(value)) #print("generating custom property value", value, type(value)) + if isinstance(value, str): + value = value.replace("'", "") + if parent == None: value = str(value).replace("'", "") value = value.replace(",)",")") @@ -141,81 +149,3 @@ def property_group_value_to_custom_property_value(property_group, definition, re value = value.replace("True", "true").replace("False", "false") return value -import re -#converts the value of a single custom property into a value (values) of a property group -def property_group_value_from_custom_property_value(property_group, definition, registry, custom_property_value): - #print(" ") - #print("setting property group value", property_group, definition, custom_property_value) - type_infos = registry.type_infos - value_types_defaults = registry.value_types_defaults - print("custom_property_value", custom_property_value) - - def parse_field(item, property_group, definition, field_name): - type_info = definition["typeInfo"] if "typeInfo" in definition else None - type_def = definition["type"] if "type" in definition else None - properties = definition["properties"] if "properties" in definition else {} - prefixItems = definition["prefixItems"] if "prefixItems" in definition else [] - has_properties = len(properties.keys()) > 0 - has_prefixItems = len(prefixItems) > 0 - is_enum = type_info == "Enum" - is_list = type_info == "List" - is_value_type = type_def in value_types_defaults - - print("parsing field", item, "type infos", type_info, "type_def", type_def) - if type_info == "Struct": - print("is object") - for field_name in property_group.field_names: - print("field name", field_name) - # sub field - if isinstance(getattr(property_group, field_name), PropertyGroup): - sub_prop_group = getattr(property_group, field_name) - ref_name = properties[field_name]["type"]["$ref"].replace("#/$defs/", "") - sub_definition = type_infos[ref_name] - parse_field(item[field_name], sub_prop_group, sub_definition, field_name) - else: - setattr(property_group, field_name, item[field_name]) - - if has_prefixItems: - if len(property_group.field_names) == 1: - setattr(property_group, "0", item) # FIXME: not ideal - else: - for field_name in property_group.field_names: - setattr(property_group, field_name, item) - if is_enum: - if type_def == "object": - regexp = re.search('(^[^\(]+)(\((.*)\))', item) - chosen_variant = regexp.group(1) - chosen_variant_value = regexp.group(3).replace("'", '"').replace("(", "[").replace(")","]") - chosen_variant_value = json.loads(chosen_variant_value) - - # first set chosen selection - field_name = property_group.field_names[0] - setattr(property_group, field_name, chosen_variant) - - # thenlook for the information about the matching variant - sub_definition= None - for variant in definition["oneOf"]: - if variant["title"] == chosen_variant: - ref_name = variant["prefixItems"][0]["type"]["$ref"].replace("#/$defs/", "") - sub_definition = type_infos[ref_name] - break - variant_name = "variant_"+chosen_variant - if isinstance(getattr(property_group, variant_name), PropertyGroup): - sub_prop_group = getattr(property_group, variant_name) - parse_field(chosen_variant_value, sub_prop_group, sub_definition, variant_name) - else: - setattr(property_group, variant_name, chosen_variant_value) - else: - field_name = property_group.field_names[0] - setattr(property_group, field_name, item) - - if is_list: - print("is list") - - if is_value_type: - print("is value type") - - try: - parse_field(custom_property_value, property_group, definition, None) - except Exception as error: - print("failed to parse raw custom property data", error) diff --git a/tools/bevy_components/propGroups/conversions_to_prop_group.py b/tools/bevy_components/propGroups/conversions_to_prop_group.py new file mode 100644 index 0000000..1bbfde2 --- /dev/null +++ b/tools/bevy_components/propGroups/conversions_to_prop_group.py @@ -0,0 +1,320 @@ +from bpy_types import PropertyGroup +import re + +def parse_struct_string(string, start_nesting=0): + #print("processing struct string", string, "start_nesting", start_nesting) + fields = {} + buff = [] + current_fieldName = None + nesting_level = 0 + + start_offset = 0 + end_offset = 0 + + for index, char in enumerate(string): + buff.append(char) + if char == "," and nesting_level == start_nesting: + #print("first case", end_offset) + end_offset = index + end_offset = len(string) if end_offset == 0 else end_offset + + val = "".join(string[start_offset:end_offset]) + fields[current_fieldName] = val.strip() + start_offset = index + 1 + #print("done with field name", current_fieldName, "value", fields[current_fieldName]) + + if char == "[" or char == "(": + nesting_level += 1 + if nesting_level == start_nesting: + start_offset = index + 1 + #print("nesting & setting start offset", start_offset) + #print("nesting down", nesting_level) + + if char == "]" or char == ")" : + #print("nesting up", nesting_level) + if nesting_level == start_nesting: + end_offset = index + #print("unesting & setting end offset", end_offset) + nesting_level -= 1 + + + if char == ":" and nesting_level == start_nesting: + end_offset = index + fieldName = "".join(string[start_offset:end_offset]) + current_fieldName = fieldName.strip() + start_offset = index + 1 + end_offset = 0 #hack + #print("starting field name", fieldName, "index", index) + buff = [] + + end_offset = len(string) if end_offset == 0 else end_offset + #print("final start and end offset", start_offset, end_offset, "total length", len(string)) + + val = "".join(string[start_offset:end_offset]) + + fields[current_fieldName] = val.strip() + #print("done with all fields", fields) + return fields + +def parse_tuplestruct_string(string, start_nesting=0): + #print("processing tuppleStruct", string, "start_nesting", start_nesting) + fields = [] + buff = [] + nesting_level = 0 + field_index = 0 + + start_offset = 0 + end_offset = 0 + # todo: strip all stuff before start_nesting + + for index, char in enumerate(string): + buff.append(char) + if char == "," and nesting_level == start_nesting: + end_offset = index + end_offset = len(string) if end_offset == 0 else end_offset + + val = "".join(string[start_offset:end_offset]) + fields.append(val.strip()) + field_index += 1 + #print("start and end offset", start_offset, end_offset, "total length", len(string)) + #print("done with field name", field_index, "value", fields) + start_offset = index + 1 + end_offset = 0 # hack + + if char == "[" or char == "(": + nesting_level += 1 + if nesting_level == start_nesting: + start_offset = index + 1 + #print("nesting & setting start offset", start_offset) + #print("nesting down", nesting_level) + + if char == "]" or char == ")" : + if nesting_level == start_nesting: + end_offset = index + #print("unesting & setting end offset", end_offset) + #print("nesting up", nesting_level) + nesting_level -= 1 + + + end_offset = len(string) if end_offset == 0 else end_offset + #print("final start and end offset", start_offset, end_offset, "total length", len(string)) + + val = "".join(string[start_offset:end_offset]) #if end_offset != 0 else buff) + fields.append(val.strip()) + fields = list(filter(lambda entry: entry != '', fields)) + #print("done with all fields", fields) + return fields + + +def parse_vec2(value, caster, typeName): + parsed = parse_struct_string(value.replace(typeName,"").replace("(", "").replace(")","") ) + return [caster(parsed['x']), caster(parsed['y'])] + +def parse_vec3(value, caster, typeName): + parsed = parse_struct_string(value.replace(typeName,"").replace("(", "").replace(")","") ) + return [caster(parsed['x']), caster(parsed['y']), caster(parsed['z'])] + +def parse_vec4(value, caster, typeName): + parsed = parse_struct_string(value.replace(typeName,"").replace("(", "").replace(")","") ) + return [caster(parsed['x']), caster(parsed['y']), caster(parsed['z']), caster(parsed['w'])] + +def parse_color(value, caster, typeName): + parsed = parse_struct_string(value.replace(typeName,"").replace("(", "").replace(")","") ) + return [caster(parsed['red']), caster(parsed['green']), caster(parsed['blue']), caster(parsed['alpha'])] + +def to_int(input): + return int(float(input)) + +type_mappings = { + "bool": lambda value: True if value == "true" else False, + + "u8": lambda value: int(value), + "u16": lambda value: int(value), + "u32": lambda value: int(value), + "u64": lambda value: int(value), + "u128": lambda value: int(value), + "u64": lambda value: int(value), + "usize": lambda value: int(value), + + "i8": lambda value: int(value), + "i16": lambda value: int(value), + "i32": lambda value: int(value), + "i64": lambda value: int(value), + "i128": lambda value: int(value), + "isize": lambda value: int(value), + + 'f32': lambda value: float(value), + 'f64': lambda value: float(value), + + "glam::Vec2": lambda value: parse_vec2(value, float, "Vec2"), + "glam::DVec2": lambda value: parse_vec2(value, float, "DVec2"), + "glam::UVec2": lambda value: parse_vec2(value, to_int, "UVec2"), + + 'glam::Vec3': lambda value: parse_vec3(value, float, "Vec3"), + "glam::Vec3A": lambda value: parse_vec3(value, float, "Vec3A"), + "glam::UVec3": lambda value: parse_vec3(value, to_int, "UVec3"), + + "glam::Vec4": lambda value: parse_vec4(value, float, "Vec4"), + "glam::DVec4": lambda value: parse_vec4(value, float, "DVec4"), + "glam::UVec4": lambda value: parse_vec4(value, to_int, "UVec4"), + + "glam::Quat": lambda value: parse_vec4(value, float, "Quat"), + + 'alloc::string::String': lambda value: str(value.replace('"', "")), + 'bevy_render::color::Color': lambda value: parse_color(value, float, "Rgba"), + 'bevy_ecs::Entity': lambda value: int(value), +} + +def is_def_value_type(definition, registry): + if definition == None: + return True + value_types_defaults = registry.value_types_defaults + type_name = definition["title"] + is_value_type = type_name in value_types_defaults + return is_value_type + +#converts the value of a single custom property into a value (values) of a property group +def property_group_value_from_custom_property_value(property_group, definition, registry, value, nesting = []): + value_types_defaults = registry.value_types_defaults + + type_info = definition["typeInfo"] if "typeInfo" in definition else None + type_def = definition["type"] if "type" in definition else None + properties = definition["properties"] if "properties" in definition else {} + prefixItems = definition["prefixItems"] if "prefixItems" in definition else [] + has_properties = len(properties.keys()) > 0 + has_prefixItems = len(prefixItems) > 0 + is_enum = type_info == "Enum" + is_list = type_info == "List" + type_name = definition["title"] + + #is_value_type = type_def in value_types_defaults or type_name in value_types_defaults + is_value_type = type_name in value_types_defaults + nesting = nesting + [definition["short_name"]] + + """print(" ") + print("raw value", value, "nesting", nesting) + print("nesting", len(nesting)) + print("definition", definition)""" + + if is_value_type: + value = value.replace("(", "").replace(")", "")# FIXME: temporary, incoherent use of nesting levels between parse_tuplestruct_string & parse_struct_string + value = type_mappings[type_name](value) if type_name in type_mappings else value + return value + elif type_info == "Struct": + if len(property_group.field_names) != 0 : + custom_property_values = parse_struct_string(value, start_nesting=1 if value.startswith("(") else 0) + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["properties"][field_name]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + custom_prop_value = custom_property_values[field_name] + #print("field name", field_name, "value", custom_prop_value) + propGroup_value = getattr(property_group, field_name) + is_property_group = isinstance(propGroup_value, PropertyGroup) + child_property_group = propGroup_value if is_property_group else None + if item_definition != None: + custom_prop_value = property_group_value_from_custom_property_value(child_property_group, item_definition, registry, value=custom_prop_value, nesting=nesting) + else: + custom_prop_value = custom_prop_value + + if is_def_value_type(item_definition, registry): + setattr(property_group , field_name, custom_prop_value) + + + else: + pass + #print("struct with zero fields") + + elif type_info == "Tuple": + custom_property_values = parse_tuplestruct_string(value, start_nesting=1 if len(nesting) == 1 else 1) + + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["prefixItems"][index]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + custom_property_value = custom_property_values[index] + + propGroup_value = getattr(property_group, field_name) + is_property_group = isinstance(propGroup_value, PropertyGroup) + child_property_group = propGroup_value if is_property_group else None + if item_definition != None: + custom_property_value = property_group_value_from_custom_property_value(child_property_group, item_definition, registry, value=custom_property_value, nesting=nesting) + if is_def_value_type(item_definition, registry): + setattr(property_group , field_name, custom_property_value) + + elif type_info == "TupleStruct": + custom_property_values = parse_tuplestruct_string(value, start_nesting=1 if len(nesting) == 1 else 0) + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["prefixItems"][index]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + custom_prop_value = custom_property_values[index] + + value = getattr(property_group, field_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + if item_definition != None: + custom_prop_value = property_group_value_from_custom_property_value(child_property_group, item_definition, registry, value=custom_prop_value, nesting=nesting) + + if is_def_value_type(item_definition, registry): + setattr(property_group , field_name, custom_prop_value) + + elif type_info == "Enum": + field_names = property_group.field_names + if type_def == "object": + regexp = re.search('(^[^\(]+)(\((.*)\))', value) + try: + chosen_variant_raw = regexp.group(1) + chosen_variant_value = regexp.group(3) + chosen_variant_name = "variant_" + chosen_variant_raw + except: + chosen_variant_raw = value + chosen_variant_value = "" + chosen_variant_name = "variant_" + chosen_variant_raw + selection_index = property_group.field_names.index(chosen_variant_name) + variant_definition = definition["oneOf"][selection_index-1] + # first we set WHAT variant is selected + setattr(property_group, field_names[0], chosen_variant_raw) + + # and then we set the value of the variant + if "prefixItems" in variant_definition: + value = getattr(property_group, chosen_variant_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + + chosen_variant_value = "(" +chosen_variant_value +")" # needed to handle nesting correctly + value = property_group_value_from_custom_property_value(child_property_group, variant_definition, registry, value=chosen_variant_value, nesting=nesting) + + elif "properties" in variant_definition: + value = getattr(property_group, chosen_variant_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + + value = property_group_value_from_custom_property_value(child_property_group, variant_definition, registry, value=chosen_variant_value, nesting=nesting) + + else: + chosen_variant_raw = value + setattr(property_group, field_names[0], chosen_variant_raw) + + elif type_info == "List": + item_list = getattr(property_group, "list") + item_type_name = getattr(property_group, "type_name_short") + custom_property_values = parse_tuplestruct_string(value, start_nesting=2 if item_type_name.startswith("wrapper_") and value.startswith('(') else 1) # TODO : the additional check here is wrong, there is an issue somewhere in higher level stuff + # clear list first + item_list.clear() + #print("custom_property_values", custom_property_values, "value", value, "item_type_name", item_type_name) + + for raw_value in custom_property_values: + new_entry = item_list.add() + item_type_name = getattr(new_entry, "type_name") # we get the REAL type name + definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + if definition != None: + property_group_value_from_custom_property_value(new_entry, definition, registry, value=raw_value, nesting=nesting) + else: + try: + value = value.replace("(", "").replace(")", "")# FIXME: temporary, incoherent use of nesting levels between parse_tuplestruct_string & parse_struct_string + value = type_mappings[type_name](value) if type_name in type_mappings else value + return value + except: + pass \ No newline at end of file diff --git a/tools/bevy_components/propGroups/process_component.py b/tools/bevy_components/propGroups/process_component.py index c10d8ef..1ed8363 100644 --- a/tools/bevy_components/propGroups/process_component.py +++ b/tools/bevy_components/propGroups/process_component.py @@ -59,7 +59,6 @@ def process_component(registry, definition, update, extras=None, nesting = []): root_component = nesting[0] if len(nesting) > 0 else component_name # print("DONE:",short_name,"__annotations__", __annotations__) # print("") - # property_group_name = short_name+"_ui" property_group_params = { **extras, '__annotations__': __annotations__, @@ -75,8 +74,7 @@ def process_component(registry, definition, update, extras=None, nesting = []): -BasicTest => the registration & update callback of this one overwrites the first "basicTest" have not found a cleaner workaround so far """ - property_group_name = str(hash(str(nesting))) + short_name+"_ui" if len(nesting) > 0 else short_name+"_ui" - + property_group_name = registry.generate_propGroup_name(nesting, short_name) (property_group_pointer, property_group_class) = property_group_from_infos(property_group_name, property_group_params) # add our component propertyGroup to the registry registry.register_component_propertyGroup(property_group_name, property_group_pointer) diff --git a/tools/bevy_components/propGroups/process_enum.py b/tools/bevy_components/propGroups/process_enum.py index efd316a..e7a1e24 100644 --- a/tools/bevy_components/propGroups/process_enum.py +++ b/tools/bevy_components/propGroups/process_enum.py @@ -7,7 +7,7 @@ def process_enum(registry, definition, update, nesting): type_def = definition["type"] if "type" in definition else None values = definition["oneOf"] - nesting = nesting+ [short_name] + nesting = nesting + [short_name] __annotations__ = {} original_type_name = "enum" diff --git a/tools/bevy_components/propGroups/process_list.py b/tools/bevy_components/propGroups/process_list.py index ed332ff..0d9fc73 100644 --- a/tools/bevy_components/propGroups/process_list.py +++ b/tools/bevy_components/propGroups/process_list.py @@ -11,6 +11,7 @@ def process_list(registry, definition, update, nesting=[]): item_definition = type_infos[ref_name] item_long_name = item_definition["title"] + item_short_name = item_definition["short_name"] is_item_value_type = item_long_name in value_types_defaults property_group_class = None @@ -24,10 +25,11 @@ def process_list(registry, definition, update, nesting=[]): nesting = nesting+[short_name] item_collection = CollectionProperty(type=property_group_class) + item_short_name = item_short_name if not is_item_value_type else "wrapper_" + item_short_name __annotations__ = { "list": item_collection, "list_index": IntProperty(name = "Index for list", default = 0, update=update), - "type_name_short": StringProperty(default=short_name) + "type_name_short": StringProperty(default=item_short_name) } return __annotations__ \ No newline at end of file diff --git a/tools/bevy_components/propGroups/prop_groups.py b/tools/bevy_components/propGroups/prop_groups.py index 35c0302..8ac1a1b 100644 --- a/tools/bevy_components/propGroups/prop_groups.py +++ b/tools/bevy_components/propGroups/prop_groups.py @@ -1,5 +1,5 @@ import bpy -from .conversions import property_group_value_to_custom_property_value +from .conversions_from_prop_group import property_group_value_to_custom_property_value from .process_component import process_component from .utils import update_calback_helper @@ -8,21 +8,23 @@ def update_component(self, context, definition, component_name): registry = bpy.context.window_manager.components_registry current_object = bpy.context.object update_disabled = current_object["__disable__update"] if "__disable__update" in current_object else False + update_disabled = registry.disable_all_object_updates or update_disabled # global settings if update_disabled: return print("") - print("update in component", component_name, self) + print("update in component", component_name, self, "current_object", current_object.name) components_in_object = current_object.components_meta.components component_meta = next(filter(lambda component: component["name"] == component_name, components_in_object), None) if component_meta != None: - self = getattr(component_meta, component_name+"_ui") + property_group_name = registry.get_propertyGroupName_from_shortName(component_name) + self = getattr(component_meta, property_group_name) # we use our helper to set the values context.object[component_name] = property_group_value_to_custom_property_value(self, definition, registry, None) def generate_propertyGroups_for_components(): registry = bpy.context.window_manager.components_registry - if registry.type_infos == None: + if not registry.has_type_infos(): registry.load_type_infos() type_infos = registry.type_infos @@ -33,6 +35,6 @@ def generate_propertyGroups_for_components(): is_component = definition['isComponent'] if "isComponent" in definition else False root_property_name = short_name if is_component else None process_component(registry, definition, update_calback_helper(definition, update_component, root_property_name), None, []) - + # if we had to add any wrapper types on the fly, process them now registry.process_custom_types() \ No newline at end of file diff --git a/tools/bevy_components/pytest.ini b/tools/bevy_components/pytest.ini new file mode 100644 index 0000000..7f369af --- /dev/null +++ b/tools/bevy_components/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +testpaths = + tests \ No newline at end of file diff --git a/tools/bevy_components/registry/operators.py b/tools/bevy_components/registry/operators.py index 58d124d..8abee81 100644 --- a/tools/bevy_components/registry/operators.py +++ b/tools/bevy_components/registry/operators.py @@ -5,8 +5,7 @@ from bpy.props import (StringProperty) from bpy_extras.io_utils import ImportHelper from ..helpers import upsert_settings -from ..components.metadata import apply_propertyGroup_values_to_object_customProperties, ensure_metadata_for_all_objects -from ..components.operators import GenerateComponent_From_custom_property_Operator +from ..components.metadata import apply_customProperty_values_to_object_propertyGroups, apply_propertyGroup_values_to_object_customProperties, ensure_metadata_for_all_objects from ..propGroups.prop_groups import generate_propertyGroups_for_components class ReloadRegistryOperator(Operator): @@ -18,7 +17,7 @@ class ReloadRegistryOperator(Operator): component_type: StringProperty( name="component_type", description="component type to add", - ) + ) # type: ignore def execute(self, context): print("reload registry") @@ -28,7 +27,12 @@ class ReloadRegistryOperator(Operator): print("") print("") ensure_metadata_for_all_objects() - #add_metadata_to_components_without_metadata(context.object) + + # now force refresh the ui + for area in context.screen.areas: + for region in area.regions: + if region.type == "UI": + region.tag_redraw() return {'FINISHED'} @@ -47,7 +51,7 @@ class COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL(Operator): return {'FINISHED'} class COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT(Operator): - """Apply registry to CURRENT object: update the custom property values of all objects based on their definition, if any""" + """Apply registry to CURRENT object: update the custom property values of current object based on their definition, if any""" bl_idname = "object.refresh_custom_properties_current" bl_label = "Apply Registry to current object" bl_options = {"UNDO"} @@ -57,6 +61,53 @@ class COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT(Operator): object = context.object apply_propertyGroup_values_to_object_customProperties(object) return {'FINISHED'} + + +class COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_CURRENT(Operator): + """Update UI values from custom properties to CURRENT object""" + bl_idname = "object.refresh_ui_from_custom_properties_current" + bl_label = "Apply custom_properties to current object" + bl_options = {"UNDO"} + + def execute(self, context): + print("apply custom properties to current object") + object = context.object + error = False + try: + apply_customProperty_values_to_object_propertyGroups(object) + except Exception as error: + del object["__disable__update"] # make sure custom properties are updateable afterwards, even in the case of failure + error = True + self.report({'ERROR'}, "Failed to update propertyGroup values from custom property: Error:" + str(error)) + if not error: + self.report({'INFO'}, "Sucessfully generated UI values for custom properties for selected object") + + return {'FINISHED'} + +class COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_ALL(Operator): + """Update UI values from custom properties to ALL object""" + bl_idname = "object.refresh_ui_from_custom_properties_all" + bl_label = "Apply custom_properties to all objects" + bl_options = {"UNDO"} + + def execute(self, context): + print("apply custom properties to all object") + bpy.context.window_manager.components_registry.disable_all_object_updates = True + errors = [] + for object in bpy.data.objects: + try: + apply_customProperty_values_to_object_propertyGroups(object) + except Exception as error: + del object["__disable__update"] # make sure custom properties are updateable afterwards, even in the case of failure + errors.append( "object: '" + object.name + "', error: " + str(error)) + if len(errors) > 0: + self.report({'ERROR'}, "Failed to update propertyGroup values from custom property: Errors:" + str(errors)) + else: + self.report({'INFO'}, "Sucessfully generated UI values for custom properties for all objects") + bpy.context.window_manager.components_registry.disable_all_object_updates = False + + + return {'FINISHED'} class OT_OpenFilebrowser(Operator, ImportHelper): """Browse for registry json file""" @@ -66,7 +117,7 @@ class OT_OpenFilebrowser(Operator, ImportHelper): filter_glob: StringProperty( default='*.json', options={'HIDDEN'} - ) + ) # type: ignore def execute(self, context): """Do something with the selected file(s).""" #filename, extension = os.path.splitext(self.filepath) diff --git a/tools/bevy_components/registry/registry.py b/tools/bevy_components/registry/registry.py index 063b65d..9312cbf 100644 --- a/tools/bevy_components/registry/registry.py +++ b/tools/bevy_components/registry/registry.py @@ -1,16 +1,58 @@ import bpy import json import os +import uuid from pathlib import Path from bpy_types import (PropertyGroup) from bpy.props import (StringProperty, BoolProperty, FloatProperty, FloatVectorProperty, IntProperty, IntVectorProperty, EnumProperty, PointerProperty, CollectionProperty) -from ..components.metadata import ComponentInfos + +from ..helpers import load_settings +from ..propGroups.prop_groups import generate_propertyGroups_for_components +from ..components.metadata import ComponentMetadata, ensure_metadata_for_all_objects # helper class to store missing bevy types information class MissingBevyType(bpy.types.PropertyGroup): type_name: bpy.props.StringProperty( name="type", - ) + ) # type: ignore + +# helper function to deal with timer +def toggle_watcher(self, context): + print("toggling watcher", self.watcher_enabled, watch_schema, self, bpy.app.timers) + if not self.watcher_enabled: + try: + bpy.app.timers.unregister(watch_schema) + except Exception as error: + print("failed to unregister", error) + pass + else: + self.watcher_active = True + bpy.app.timers.register(watch_schema) + +def watch_schema(): + self = bpy.context.window_manager.components_registry + print("watching schema file for changes") + try: + stamp = os.stat(self.schemaFullPath).st_mtime + stamp = str(stamp) + if stamp != self.schemaTimeStamp and self.schemaTimeStamp != "": + print("FILE CHANGED !!", stamp, self.schemaTimeStamp) + # see here for better ways : https://stackoverflow.com/questions/11114492/check-if-a-file-is-not-open-nor-being-used-by-another-process + """try: + os.rename(path, path) + #return False + except OSError: # file is in use + print("in use") + #return True""" + #bpy.ops.object.reload_registry() + # we need to add an additional delay as the file might not have loaded yet + bpy.app.timers.register(lambda: bpy.ops.object.reload_registry(), first_interval=1) + + self.schemaTimeStamp = stamp + except Exception as error: + pass + return self.watcher_poll_frequency if self.watcher_enabled else None + # this is where we store the information for all available components class ComponentsRegistry(PropertyGroup): @@ -21,20 +63,45 @@ class ComponentsRegistry(PropertyGroup): name="schema path", description="path to the registry schema file", default="registry.json" - ) + )# type: ignore + schemaFullPath : bpy.props.StringProperty( + name="schema full path", + description="path to the registry schema file", + )# type: ignore registry: bpy.props. StringProperty( name="registry", description="component registry" - ) + )# type: ignore missing_type_infos: StringProperty( name="missing type infos", description="unregistered/missing type infos" - ) + )# type: ignore - missing_types_list: CollectionProperty(name="missing types list", type=MissingBevyType) - missing_types_list_index: IntProperty(name = "Index for missing types list", default = 0) + disable_all_object_updates: BoolProperty(name="disable_object_updates", default=False) # type: ignore + + ## file watcher + watcher_enabled: BoolProperty(name="Watcher_enabled", default=True, update=toggle_watcher)# type: ignore + watcher_active: BoolProperty(name = "Flag for watcher status", default = False)# type: ignore + + watcher_poll_frequency: IntProperty( + name="watcher poll frequency", + description="frequency (s) at wich to poll for changes to the registry file", + min=1, + max=10, + default=1 + )# type: ignore + + schemaTimeStamp: StringProperty( + name="last timestamp of schema file", + description="", + default="" + )# type: ignore + + + missing_types_list: CollectionProperty(name="missing types list", type=MissingBevyType)# type: ignore + missing_types_list_index: IntProperty(name = "Index for missing types list", default = 0)# type: ignore blender_property_mapping = { "bool": dict(type=BoolProperty, presets=dict()), @@ -52,6 +119,7 @@ class ComponentsRegistry(PropertyGroup): "i32":dict(type=IntProperty, presets=dict()), "i64":dict(type=IntProperty, presets=dict()), "i128":dict(type=IntProperty, presets=dict()), + "isize": dict(type=IntProperty, presets=dict()), "f32": dict(type=FloatProperty, presets=dict()), "f64": dict(type=FloatProperty, presets=dict()), @@ -77,9 +145,14 @@ class ComponentsRegistry(PropertyGroup): "char": dict(type=StringProperty, presets=dict()), "str": dict(type=StringProperty, presets=dict()), "alloc::string::String": dict(type=StringProperty, presets=dict()), + "alloc::borrow::Cow": dict(type=StringProperty, presets=dict()), + + "enum": dict(type=EnumProperty, presets=dict()), - #"alloc::vec::Vec": dict(type=CollectionProperty, presets=dict(type=PointerProperty(StringProperty))), #FIXME: we need more generic stuff + 'bevy_ecs::Entity': {"type": IntProperty, "presets": {"min":0} }, + 'bevy_utils::Uuid': dict(type=StringProperty, presets=dict()), + } @@ -98,12 +171,14 @@ class ComponentsRegistry(PropertyGroup): "u32":0, "u64":0, "u128":0, + "usize":0, "i8": 0, "i16":0, "i32":0, "i64":0, "i128":0, + "isize":0, "f32": 0.0, "f64":0.0, @@ -111,6 +186,7 @@ class ComponentsRegistry(PropertyGroup): "char": " ", "str": " ", "alloc::string::String": " ", + "alloc::borrow::Cow": " ", "glam::Vec2": [0.0, 0.0], "glam::DVec2": [0.0, 0.0], @@ -127,40 +203,66 @@ class ComponentsRegistry(PropertyGroup): "glam::Quat": [0.0, 0.0, 0.0, 0.0], "bevy_render::color::Color": [1.0, 1.0, 0.0, 1.0], + + 'bevy_ecs::Entity': 0,#4294967295, # this is the same as Bevy's Entity::Placeholder, too big for Blender..sigh + 'bevy_utils::Uuid': '"'+str(uuid.uuid4())+'"' + } - type_infos = None + type_infos = {} type_infos_missing = [] component_propertyGroups = {} short_names_to_long_names = {} - + custom_types_to_add = {} + invalid_components = [] @classmethod def register(cls): bpy.types.WindowManager.components_registry = PointerProperty(type=ComponentsRegistry) + bpy.context.window_manager.components_registry.watcher_active = False @classmethod def unregister(cls): + bpy.context.window_manager.components_registry.watcher_active = False + for propgroup_name in cls.component_propertyGroups.keys(): try: - delattr(ComponentInfos, propgroup_name) - print("unregistered propertyGroup", propgroup_name) + delattr(ComponentMetadata, propgroup_name) + #print("unregistered propertyGroup", propgroup_name) except Exception as error: pass - #print("failed to remove", error, "ComponentInfos") + #print("failed to remove", error, "ComponentMetadata") - del bpy.types.WindowManager.components_registry - - def load_schema(self): - # cleanup missing types list - self.missing_types_list.clear() - self.type_infos = None - self.type_infos_missing.clear() - file_path = bpy.data.filepath + try: + bpy.app.timers.unregister(watch_schema) + except Exception as error: + print("failed to unregister", error) + pass + del bpy.types.WindowManager.components_registry + + + + + def load_schema(self): + print("load schema", self) + # cleanup previous data if any + self.propGroupIdCounter = 0 + self.short_names_to_propgroup_names.clear() + self.missing_types_list.clear() + self.type_infos.clear() + self.type_infos_missing.clear() + self.component_propertyGroups.clear() + self.short_names_to_long_names.clear() + self.custom_types_to_add.clear() + self.invalid_components.clear() + + # now prepare paths to load data + file_path = bpy.data.filepath # Get the folder folder_path = os.path.dirname(file_path) path = os.path.join(folder_path, self.schemaPath) + self.schemaFullPath = path f = Path(bpy.path.abspath(path)) # make a path object of abs path with open(path) as f: @@ -168,9 +270,32 @@ class ComponentsRegistry(PropertyGroup): defs = data["$defs"] self.registry = json.dumps(defs) # FIXME:meh ? + # start timer + if not self.watcher_active and self.watcher_enabled: + self.watcher_active = True + print("registering function", watch_schema) + bpy.app.timers.register(watch_schema) + + # we load the json once, so we do not need to do it over & over again def load_type_infos(self): + print("load type infos") ComponentsRegistry.type_infos = json.loads(self.registry) + + def has_type_infos(self): + return len(self.type_infos.keys()) != 0 + + def load_settings(self): + print("loading settings") + settings = load_settings(self.settings_save_path) + + if settings!= None: + print("settings", settings) + self.schemaPath = settings["schemaPath"] + self.load_schema() + generate_propertyGroups_for_components() + ensure_metadata_for_all_objects() + # we keep a list of component propertyGroup around def register_component_propertyGroup(self, name, propertyGroup): @@ -188,7 +313,6 @@ class ComponentsRegistry(PropertyGroup): item = self.missing_types_list.add() item.type_name = type_name - custom_types_to_add = {} def add_custom_type(self, type_name, type_definition): self.custom_types_to_add[type_name] = type_definition @@ -197,9 +321,41 @@ class ComponentsRegistry(PropertyGroup): self.type_infos[type_name] = self.custom_types_to_add[type_name] self.custom_types_to_add.clear() - invalid_components = [] def add_invalid_component(self, component_name): self.invalid_components.append(component_name) + + + ########### + + propGroupIdCounter: IntProperty( + name="propGroupIdCounter", + description="", + min=0, + max=1000000000, + default=0 + ) # type: ignore + + short_names_to_propgroup_names = {} + + # generate propGroup name from nesting level & shortName: each shortName + nesting is unique + def generate_propGroup_name(self, nesting, shortName): + #print("gen propGroup name for", shortName, nesting) + #if shortName in self.short_names_to_propgroup_names and len(nesting) == 0: + # return self.get_propertyGroupName_from_shortName(shortName) + + self.propGroupIdCounter += 1 + + propGroupIndex = str(self.propGroupIdCounter) + propGroupName = propGroupIndex + "_ui" + key = str(nesting) + shortName if len(nesting) > 0 else shortName + self.short_names_to_propgroup_names[key] = propGroupName + return propGroupName + + def get_propertyGroupName_from_shortName(self, shortName): + + return self.short_names_to_propgroup_names.get(shortName, None) + + """ object[component_definition.name] = 0.5 property_manager = object.id_properties_ui(component_definition.name) diff --git a/tools/bevy_components/registry/ui.py b/tools/bevy_components/registry/ui.py index 5cced14..18ff21a 100644 --- a/tools/bevy_components/registry/ui.py +++ b/tools/bevy_components/registry/ui.py @@ -1,6 +1,11 @@ import bpy from bpy_types import (UIList) -from .operators import(OT_OpenFilebrowser, ReloadRegistryOperator, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL, COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT) +from .operators import( + COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_ALL, + COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_CURRENT, + OT_OpenFilebrowser, ReloadRegistryOperator, + COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL, + COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT) class BEVY_COMPONENTS_PT_Configuration(bpy.types.Panel): bl_idname = "BEVY_COMPONENTS_PT_Configuration" @@ -16,6 +21,7 @@ class BEVY_COMPONENTS_PT_Configuration(bpy.types.Panel): def draw(self, context): layout = self.layout registry = context.window_manager.components_registry + registry_has_type_infos = registry.has_type_infos() selected_object = context.selected_objects[0] if len(context.selected_objects) > 0 else None row = layout.row() @@ -28,6 +34,12 @@ class BEVY_COMPONENTS_PT_Configuration(bpy.types.Panel): layout.separator() layout.operator(ReloadRegistryOperator.bl_idname, text="reload registry" , icon="FILE_REFRESH") + layout.separator() + row = layout.row() + + row.prop(registry, "watcher_enabled", text="enable registry file polling") + row.prop(registry, "watcher_poll_frequency", text="registry file poll frequency (s)") + layout.separator() layout.separator() @@ -36,13 +48,26 @@ class BEVY_COMPONENTS_PT_Configuration(bpy.types.Panel): row.alert = True row = layout.row() - row.operator(COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT.bl_idname, text="update custom properties of current object" , icon="FILE_REFRESH") - row.enabled = registry.type_infos != None and selected_object is not None + row.operator(COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_CURRENT.bl_idname, text="update custom properties of current object" , icon="LOOP_FORWARDS") + row.enabled = registry_has_type_infos and selected_object is not None layout.separator() row = layout.row() - row.operator(COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL.bl_idname, text="update custom properties of ALL objects" , icon="FILE_REFRESH") - row.enabled = registry.type_infos != None + row.operator(COMPONENTS_OT_REFRESH_CUSTOM_PROPERTIES_ALL.bl_idname, text="update custom properties of ALL objects" , icon="LOOP_FORWARDS") + row.enabled = registry_has_type_infos + + row = layout.row() + row.label(text="WARNING ! The following operations will try to overwrite your existing ui values if they have matching types on the bevy side !") + row.alert = True + + row = layout.row() + row.operator(COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_CURRENT.bl_idname, text="update UI FROM custom properties of current object" , icon="LOOP_BACK") + row.enabled = registry_has_type_infos and selected_object is not None + + layout.separator() + row = layout.row() + row.operator(COMPONENTS_OT_REFRESH_PROPGROUPS_FROM_CUSTOM_PROPERTIES_ALL.bl_idname, text="update UI FROM custom properties of ALL objects" , icon="LOOP_BACK") + row.enabled = registry_has_type_infos class BEVY_COMPONENTS_PT_MissingTypesPanel(bpy.types.Panel): diff --git a/tools/bevy_components/tests/__init__.py b/tools/bevy_components/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/bevy_components/tests/component_values_shuffler.py b/tools/bevy_components/tests/component_values_shuffler.py new file mode 100644 index 0000000..1de4f0d --- /dev/null +++ b/tools/bevy_components/tests/component_values_shuffler.py @@ -0,0 +1,216 @@ + +import random +import string +import uuid +from bpy_types import PropertyGroup + +def random_bool(): + return bool(random.getrandbits(1)) + +def rand_int(): + return random.randint(0, 100) + +def rand_float(): + return random.random() + +def random_word(length): + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(length)) + +def random_vec(length, type,): + value = [] + for i in range(0, length): + if type == 'float': + value.append(rand_float()) + if type == 'int': + value.append(rand_int()) + return value + +type_mappings = { + "bool": random_bool, + + "u8": rand_int, + "u16": rand_int, + "u32": rand_int, + "u64": rand_int, + "u128": rand_int, + "u64": rand_int, + "usize": rand_int, + + "i8": rand_int, + "i16": rand_int, + "i32": rand_int, + "i64": rand_int, + "i128": rand_int, + "isize": rand_int, + + 'f32': rand_float, + 'f64': rand_float, + + "glam::Vec2": lambda : random_vec(2, 'float'), + "glam::DVec2": lambda : random_vec(2, 'float'), + "glam::UVec2": lambda : random_vec(2, 'int'), + + 'glam::Vec3': lambda : random_vec(3, 'float'), + "glam::Vec3A": lambda : random_vec(3, 'float'), + "glam::UVec3": lambda : random_vec(3, 'int'), + + "glam::Vec4": lambda : random_vec(4, 'float'), + "glam::DVec4": lambda : random_vec(4, 'float'), + "glam::UVec4": lambda : random_vec(4, 'int'), + + "glam::Quat": lambda : random_vec(4, 'float'), + + 'bevy_render::color::Color': lambda : random_vec(4, 'float'), + 'alloc::string::String': lambda : random_word(8), + 'alloc::borrow::Cow': lambda : random_word(8), + + 'bevy_ecs::Entity': lambda: 0, #4294967295, # + 'bevy_utils::Uuid': lambda: '"'+str( uuid.UUID("73b3b118-7d01-4778-8bcc-4e79055f5d22") )+'"' +} +# + +def is_def_value_type(definition, registry): + if definition == None: + return True + value_types_defaults = registry.value_types_defaults + type_name = definition["title"] + is_value_type = type_name in value_types_defaults + return is_value_type + +# see https://docs.python.org/3/library/random.html +def component_values_shuffler(seed=1, property_group=None, definition=None, registry=None, parent=None): + if parent == None: + random.seed(seed) + + value_types_defaults = registry.value_types_defaults + component_name = definition["short_name"] + type_info = definition["typeInfo"] if "typeInfo" in definition else None + type_def = definition["type"] if "type" in definition else None + properties = definition["properties"] if "properties" in definition else {} + prefixItems = definition["prefixItems"] if "prefixItems" in definition else [] + has_properties = len(properties.keys()) > 0 + has_prefixItems = len(prefixItems) > 0 + is_enum = type_info == "Enum" + is_list = type_info == "List" + type_name = definition["title"] + + #is_value_type = type_def in value_types_defaults or type_name in value_types_defaults + is_value_type = type_name in value_types_defaults + + if is_value_type: + fieldValue = type_mappings[type_name]() + return fieldValue + + elif type_info == "Struct": + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["properties"][field_name]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + value = getattr(property_group, field_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + if item_definition != None: + value = component_values_shuffler(seed, child_property_group, item_definition, registry, parent=component_name) + else: + value = '""' + is_item_value_type = is_def_value_type(item_definition, registry) + if is_item_value_type: + #print("setting attr", field_name , "for", component_name, "to", value, "value type", is_item_value_type) + setattr(property_group , field_name, value) + + elif type_info == "Tuple": + #print("tup") + + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["prefixItems"][index]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + value = getattr(property_group, field_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + if item_definition != None: + value = component_values_shuffler(seed, child_property_group, item_definition, registry, parent=component_name) + else: + value = '""' + + is_item_value_type = is_def_value_type(item_definition, registry) + if is_item_value_type: + #print("setting attr", field_name , "for", component_name, "to", value, "value type", is_item_value_type) + setattr(property_group , field_name, value) + + elif type_info == "TupleStruct": + #print("tupstruct") + for index, field_name in enumerate(property_group.field_names): + item_type_name = definition["prefixItems"][index]["type"]["$ref"].replace("#/$defs/", "") + item_definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + value = getattr(property_group, field_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + if item_definition != None: + value = component_values_shuffler(seed, child_property_group, item_definition, registry, parent=component_name) + else: + value = '""' + + is_item_value_type = is_def_value_type(item_definition, registry) + if is_item_value_type: + setattr(property_group , field_name, value) + + elif type_info == "Enum": + available_variants = definition["oneOf"] if type_def != "object" else list(map(lambda x: x["title"], definition["oneOf"])) + selected = random.choice(available_variants) + + # set selected variant + setattr(property_group , component_name, selected) + + if type_def == "object": + selection_index = property_group.field_names.index("variant_"+selected) + variant_name = property_group.field_names[selection_index] + variant_definition = definition["oneOf"][selection_index-1] + if "prefixItems" in variant_definition: + value = getattr(property_group, variant_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + + value = component_values_shuffler(seed, child_property_group, variant_definition, registry, parent=component_name) + value = selected + str(value,) + elif "properties" in variant_definition: + value = getattr(property_group, variant_name) + is_property_group = isinstance(value, PropertyGroup) + child_property_group = value if is_property_group else None + + value = component_values_shuffler(seed, child_property_group, variant_definition, registry, parent=component_name) + value = selected + str(value,) + else: + value = selected # here the value of the enum is just the name of the variant + else: + value = selected + + + + elif type_info == "List": + item_list = getattr(property_group, "list") + item_list.clear() + + item_type_name = getattr(property_group, "type_name_short") + number_of_list_items_to_add = random.randint(1, 2) + + for i in range(0, number_of_list_items_to_add): + new_entry = item_list.add() + item_type_name = getattr(new_entry, "type_name") # we get the REAL type name + definition = registry.type_infos[item_type_name] if item_type_name in registry.type_infos else None + + if definition != None: + component_values_shuffler(seed, new_entry, definition, registry, parent=component_name) + else: + pass + else: + print("something else") + fieldValue = type_mappings[type_name]() + return fieldValue + + #return value + + + \ No newline at end of file diff --git a/tools/bevy_components/tests/expected_component_values.py b/tools/bevy_components/tests/expected_component_values.py new file mode 100644 index 0000000..533a6d8 --- /dev/null +++ b/tools/bevy_components/tests/expected_component_values.py @@ -0,0 +1,427 @@ + + +expected_custom_property_values = {'AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut': '', + 'Aabb': '(center: Vec3A(x:0.0, y:0.0, z:0.0), half_extents: Vec3A(x:0.0, y:0.0, z:0.0))', + 'AdditionalMassProperties': 'Mass(0.0)', + 'AmbientLightSettings': '(brightness: 0.0, color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0))', + 'AnimationPlayer': '(animation: "", paused: true)', + 'Animations': '(named_animations: "")', + 'AutoAABBCollider': 'Cuboid', + 'BackgroundColor': '(Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0))', + 'BasicTest': '(a: 0.0, b: 0, c: " ")', + 'BloomSettings': '(composite_mode: EnergyConserving, high_pass_frequency: 0.0, intensity: 0.0, low_frequency_boost: ' + '0.0, low_frequency_boost_curvature: 0.0, prefilter_settings: (threshold: 0.0, threshold_softness: ' + '0.0))', + 'BlueprintName': '(" ")', + 'BorderColor': '(Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0))', + 'Button': '', + 'CalculatedClip': '(clip: (max: Vec2(x:0.0, y:0.0), min: Vec2(x:0.0, y:0.0)))', + 'Camera': '(hdr: true, is_active: true, msaa_writeback: true, order: 0, viewport: None)', + 'Camera2d': '(clear_color: Default)', + 'Camera3d': '(clear_color: Default, depth_load_op: Clear(0.0), depth_texture_usages: "", ' + 'screen_space_specular_transmission_quality: "", screen_space_specular_transmission_steps: 0)', + 'CameraRenderGraph': '( )', + 'CameraTrackable': '', + 'CameraTracking': '(offset: Vec3(x:0.0, y:0.0, z:0.0))', + 'CameraTrackingOffset': '(Vec3(x:0.0, y:0.0, z:0.0))', + 'CascadeShadowConfig': '(bounds: [], minimum_distance: 0.0, overlap_proportion: 0.0)', + 'Cascades': '(cascades: "")', + 'CascadesFrusta': '', + 'CascadesVisibleEntities': '', + 'Ccd': '(enabled: true)', + 'Children': '([])', + 'ClusterConfig': 'None', + 'Collider': 'Ball(0.0)', + 'CollidingEntities': '("")', + 'CollisionGroups': '(filters: (0), memberships: (0))', + 'ColorGrading': '(exposure: 0.0, gamma: 0.0, post_saturation: 0.0, pre_saturation: 0.0)', + 'ContactForceEventThreshold': '(0.0)', + 'ContentSize': '', + 'ContrastAdaptiveSharpeningSettings': '(denoise: true, enabled: true, sharpening_strength: 0.0)', + 'CubemapFrusta': '', + 'CubemapVisibleEntities': '', + 'Damping': '(angular_damping: 0.0, linear_damping: 0.0)', + 'DebandDither': 'Disabled', + 'DirectionalLight': '(color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), illuminance: 0.0, shadow_depth_bias: 0.0, ' + 'shadow_normal_bias: 0.0, shadows_enabled: true)', + 'Dominance': '(groups: 0)', + 'EnumComplex': 'Float(0.0)', + 'EnumTest': 'Metal', + 'ExternalForce': '(force: Vec3(x:0.0, y:0.0, z:0.0), torque: Vec3(x:0.0, y:0.0, z:0.0))', + 'ExternalImpulse': '(impulse: Vec3(x:0.0, y:0.0, z:0.0), torque_impulse: Vec3(x:0.0, y:0.0, z:0.0))', + 'FocusPolicy': 'Block', + 'FogSettings': '(color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), directional_light_color: Rgba(red:1.0, ' + 'green:1.0, blue:0.0, alpha:1.0), directional_light_exponent: 0.0, falloff: "")', + 'Friction': '(coefficient: 0.0, combine_rule: "")', + 'Frustum': '', + 'Fxaa': '(edge_threshold: "", edge_threshold_min: "", enabled: true)', + 'GlobalTransform': '((matrix3: (x_axis: Vec3A(x:0.0, y:0.0, z:0.0), y_axis: Vec3A(x:0.0, y:0.0, z:0.0), z_axis: ' + 'Vec3A(x:0.0, y:0.0, z:0.0)), translation: Vec3A(x:0.0, y:0.0, z:0.0)))', + 'GltfExtras': '(value: " ")', + 'GravityScale': '(0.0)', + 'Group': '(0)', + 'Handle<()>': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle>': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'InheritedVisibility': '(true)', + 'Interaction': 'Pressed', + 'Label': '', + 'LockedAxes': '(0)', + 'MaterialInfo': '(name: " ", source: " ")', + 'Mesh2dHandle': '(Strong(""))', + 'MeshMorphWeights': '(weights: [])', + 'MorphWeights': '(first_mesh: "", weights: [])', + 'Name': '(hash: 0, name: )', + 'NestedTupleStuff': '(0.0, 0, (basic: (a: 0.0, b: 0, c: " "), color: (Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0)), ' + 'colors_list: ([]), enable: true, enum_inner: Metal, nested: (vec: (Vec3(x:0.0, y:0.0, z:0.0))), ' + 'text: " ", toggle: (true)))', + 'NestingTestLevel2': '(basic: (a: 0.0, b: 0, c: " "), color: (Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0)), ' + 'colors_list: ([]), enable: true, enum_inner: Metal, nested: (vec: (Vec3(x:0.0, y:0.0, z:0.0))), ' + 'text: " ", toggle: (true))', + 'NestingTestLevel3': '(vec: (Vec3(x:0.0, y:0.0, z:0.0)))', + 'NoFrustumCulling': '', + 'NoWireframe': '', + 'Node': '(calculated_size: Vec2(x:0.0, y:0.0), outline_offset: 0.0, outline_width: 0.0, stack_index: 0, ' + 'unrounded_size: Vec2(x:0.0, y:0.0))', + 'NotShadowCaster': '', + 'NotShadowReceiver': '', + 'OrthographicProjection': '(area: (max: Vec2(x:0.0, y:0.0), min: Vec2(x:0.0, y:0.0)), far: 0.0, near: 0.0, scale: ' + '0.0, scaling_mode: Fixed(height: 0.0, width: 0.0), viewport_origin: Vec2(x:0.0, y:0.0))', + 'Outline': '(color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), offset: Auto, width: Auto)', + 'Parent': '(0)', + 'PerspectiveProjection': '(aspect_ratio: 0.0, far: 0.0, fov: 0.0, near: 0.0)', + 'Pickable': '', + 'Player': '', + 'PointLight': '(color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), intensity: 0.0, radius: 0.0, range: 0.0, ' + 'shadow_depth_bias: 0.0, shadow_normal_bias: 0.0, shadows_enabled: true)', + 'PrimaryWindow': '', + 'Projection': 'Perspective((aspect_ratio: 0.0, far: 0.0, fov: 0.0, near: 0.0))', + 'RelativeCursorPosition': '(normalized: "", normalized_visible_node_rect: (max: Vec2(x:0.0, y:0.0), min: Vec2(x:0.0, ' + 'y:0.0)))', + 'RenderLayers': '(0)', + 'Restitution': '(coefficient: 0.0, combine_rule: "")', + 'RigidBody': 'Dynamic', + 'SSAOSettings': '', + 'ScreenSpaceAmbientOcclusionSettings': '(quality_level: "")', + 'Sensor': '', + 'ShadowFilteringMethod': 'Hardware2x2', + 'ShadowmapSettings': '(size: 0)', + 'SkinnedMesh': '(inverse_bindposes: Strong(""), joints: [])', + 'Sleeping': '(angular_threshold: 0.0, linear_threshold: 0.0, sleeping: true)', + 'SolverGroups': '(filters: (0), memberships: (0))', + 'SpawnHere': '', + 'SpotLight': '(color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), inner_angle: 0.0, intensity: 0.0, outer_angle: ' + '0.0, radius: 0.0, range: 0.0, shadow_depth_bias: 0.0, shadow_normal_bias: 0.0, shadows_enabled: true)', + 'Sprite': '(anchor: Center, color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), custom_size: "", flip_x: true, ' + 'flip_y: true, rect: "")', + 'Style': '(align_content: Default, align_items: Default, align_self: Auto, aspect_ratio: None, border: (bottom: Auto, ' + 'left: Auto, right: Auto, top: Auto), bottom: Auto, column_gap: Auto, direction: Inherit, display: Flex, ' + 'flex_basis: Auto, flex_direction: Row, flex_grow: 0.0, flex_shrink: 0.0, flex_wrap: NoWrap, ' + 'grid_auto_columns: "", grid_auto_flow: Row, grid_auto_rows: "", grid_column: (end: "", span: "", start: ' + '""), grid_row: (end: "", span: "", start: ""), grid_template_columns: "", grid_template_rows: "", height: ' + 'Auto, justify_content: Default, justify_items: Default, justify_self: Auto, left: Auto, margin: (bottom: ' + 'Auto, left: Auto, right: Auto, top: Auto), max_height: Auto, max_width: Auto, min_height: Auto, min_width: ' + 'Auto, overflow: (x: Visible, y: Visible), padding: (bottom: Auto, left: Auto, right: Auto, top: Auto), ' + 'position_type: Relative, right: Auto, row_gap: Auto, top: Auto, width: Auto)', + 'Text': '(alignment: Left, linebreak_behavior: WordBoundary, sections: [])', + 'Text2dBounds': '(size: Vec2(x:0.0, y:0.0))', + 'TextFlags': '(needs_new_measure_func: true, needs_recompute: true)', + 'TextLayoutInfo': '(glyphs: "", logical_size: Vec2(x:0.0, y:0.0))', + 'TextureAtlasSprite': '(anchor: Center, color: Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), custom_size: "", ' + 'flip_x: true, flip_y: true, index: 0)', + 'Tonemapping': 'None', + 'Transform': '(rotation: Quat(x:0.0, y:0.0, z:0.0, w:0.0), scale: Vec3(x:0.0, y:0.0, z:0.0), translation: Vec3(x:0.0, ' + 'y:0.0, z:0.0))', + 'TupleTest2': '(0.0, 0, " ")', + 'TupleTestBool': '(true)', + 'TupleTestColor': '(Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0))', + 'TupleTestF32': '(0.0)', + 'TupleTestStr': '(" ")', + 'TupleTestU64': '(0)', + 'TupleVec': '([])', + 'TupleVec2': '(Vec2(x:0.0, y:0.0))', + 'TupleVec3': '(Vec3(x:0.0, y:0.0, z:0.0))', + 'TupleVecF32F32': '([])', + 'UiCameraConfig': '(show_ui: true)', + 'UiImage': '(flip_x: true, flip_y: true, texture: Strong(""))', + 'UiImageSize': '(size: Vec2(x:0.0, y:0.0))', + 'UiTextureAtlasImage': '(flip_x: true, flip_y: true, index: 0)', + 'UnitTest': '', + 'VecOfColors': '([])', + 'VecOfF32s': '([])', + 'VecOfVec3s2': '([])', + 'Velocity': '(angvel: Vec3(x:0.0, y:0.0, z:0.0), linvel: Vec3(x:0.0, y:0.0, z:0.0))', + 'ViewVisibility': '(true)', + 'Visibility': 'Inherited', + 'VisibleEntities': '', + 'Window': '(canvas: None, composite_alpha_mode: Auto, cursor: (grab_mode: None, hit_test: true, icon: Default, ' + 'visible: true), decorations: true, enabled_buttons: (close: true, maximize: true, minimize: true), ' + 'fit_canvas_to_parent: true, focused: true, ime_enabled: true, ime_position: Vec2(x:0.0, y:0.0), internal: ' + '(maximize_request: None, minimize_request: None, physical_cursor_position: None), mode: Windowed, ' + 'position: Automatic, present_mode: AutoVsync, prevent_default_event_handling: true, resizable: true, ' + 'resize_constraints: (max_height: 0.0, max_width: 0.0, min_height: 0.0, min_width: 0.0), resolution: ' + '(physical_height: 0, physical_width: 0, scale_factor: 0.0, scale_factor_override: None), title: " ", ' + 'transparent: true, visible: true, window_level: AlwaysOnBottom, window_theme: "")', + 'Wireframe': '', + 'ZIndex': 'Local(0)'} + + + +expected_custom_property_values_randomized = {'AComponentWithAnExtremlyExageratedOrMaybeNotButCouldBeNameOrWut': '', + 'Aabb': '(center: Vec3A(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019), half_extents: ' + 'Vec3A(x:0.20609822869300842, y:0.8133212327957153, z:0.8235888481140137))', + 'AdditionalMassProperties': 'Mass(0.42888906598091125)', + 'AmbientLightSettings': '(brightness: 0.5714026093482971, color: Rgba(red:0.42888906598091125, ' + 'green:0.5780913233757019, blue:0.20609822869300842, alpha:0.8133212327957153))', + 'AnimationPlayer': '(animation: "", paused: true)', + 'Animations': '(named_animations: "")', + 'AutoAABBCollider': 'Capsule', + 'BackgroundColor': '(Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842))', + 'BasicTest': '(a: 0.5714026093482971, b: 54, c: "psagopiu")', + 'BloomSettings': '(composite_mode: EnergyConserving, high_pass_frequency: 0.42888906598091125, intensity: ' + '0.5780913233757019, low_frequency_boost: 0.20609822869300842, low_frequency_boost_curvature: ' + '0.8133212327957153, prefilter_settings: (threshold: 0.8235888481140137, threshold_softness: ' + '0.6534725427627563))', + 'BlueprintName': '("sbnpsago")', + 'BorderColor': '(Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842))', + 'Button': '', + 'CalculatedClip': '(clip: (max: Vec2(x:0.5714026093482971, y:0.42888906598091125), min: Vec2(x:0.5780913233757019, ' + 'y:0.20609822869300842)))', + 'Camera': '(hdr: true, is_active: false, msaa_writeback: false, order: 61, viewport: None)', + 'Camera2d': '(clear_color: None)', + 'Camera3d': '(clear_color: None, depth_load_op: Clear(0.42888906598091125), depth_texture_usages: "", ' + 'screen_space_specular_transmission_quality: "", screen_space_specular_transmission_steps: 73)', + 'CameraRenderGraph': '(sbnpsago)', + 'CameraTrackable': '', + 'CameraTracking': '(offset: Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019))', + 'CameraTrackingOffset': '(Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019))', + 'CascadeShadowConfig': '(bounds: [0.42888906598091125], minimum_distance: 0.5780913233757019, overlap_proportion: ' + '0.20609822869300842)', + 'Cascades': '(cascades: "")', + 'CascadesFrusta': '', + 'CascadesVisibleEntities': '', + 'Ccd': '(enabled: true)', + 'Children': '([0])', + 'ClusterConfig': 'None', + 'Collider': 'Ball(0.42888906598091125)', + 'CollidingEntities': '("")', + 'CollisionGroups': '(filters: (73), memberships: (4))', + 'ColorGrading': '(exposure: 0.5714026093482971, gamma: 0.42888906598091125, post_saturation: 0.5780913233757019, ' + 'pre_saturation: 0.20609822869300842)', + 'ContactForceEventThreshold': '(0.5714026093482971)', + 'ContentSize': '', + 'ContrastAdaptiveSharpeningSettings': '(denoise: true, enabled: false, sharpening_strength: 0.42888906598091125)', + 'CubemapFrusta': '', + 'CubemapVisibleEntities': '', + 'Damping': '(angular_damping: 0.5714026093482971, linear_damping: 0.42888906598091125)', + 'DebandDither': 'Disabled', + 'DirectionalLight': '(color: Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842), illuminance: 0.8133212327957153, shadow_depth_bias: ' + '0.8235888481140137, shadow_normal_bias: 0.6534725427627563, shadows_enabled: false)', + 'Dominance': '(groups: 73)', + 'EnumComplex': 'StructLike(a: 0.03258506581187248, b: 61, c: "sagopiuz")', + 'EnumTest': 'Squishy', + 'ExternalForce': '(force: Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019), torque: ' + 'Vec3(x:0.20609822869300842, y:0.8133212327957153, z:0.8235888481140137))', + 'ExternalImpulse': '(impulse: Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019), ' + 'torque_impulse: Vec3(x:0.20609822869300842, y:0.8133212327957153, z:0.8235888481140137))', + 'FocusPolicy': 'Block', + 'FogSettings': '(color: Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842), directional_light_color: Rgba(red:0.8133212327957153, ' + 'green:0.8235888481140137, blue:0.6534725427627563, alpha:0.16022956371307373), ' + 'directional_light_exponent: 0.5206693410873413, falloff: "")', + 'Friction': '(coefficient: 0.5714026093482971, combine_rule: "")', + 'Frustum': '', + 'Fxaa': '(edge_threshold: "", edge_threshold_min: "", enabled: true)', + 'GlobalTransform': '((matrix3: (x_axis: Vec3A(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019), ' + 'y_axis: Vec3A(x:0.20609822869300842, y:0.8133212327957153, z:0.8235888481140137), z_axis: ' + 'Vec3A(x:0.6534725427627563, y:0.16022956371307373, z:0.5206693410873413)), translation: ' + 'Vec3A(x:0.3277728259563446, y:0.24999667704105377, z:0.952816903591156)))', + 'GltfExtras': '(value: "sbnpsago")', + 'GravityScale': '(0.5714026093482971)', + 'Group': '(73)', + 'Handle<()>': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle>': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'Handle': 'Strong("")', + 'InheritedVisibility': '(true)', + 'Interaction': 'None', + 'Label': '', + 'LockedAxes': '(73)', + 'MaterialInfo': '(name: "sbnpsago", source: "piuzfbqp")', + 'Mesh2dHandle': '(Strong(""))', + 'MeshMorphWeights': '(weights: [0.42888906598091125])', + 'MorphWeights': '(first_mesh: "", weights: [0.42888906598091125])', + 'Name': '(hash: 73, name: bnpsagop)', + 'NestedTupleStuff': '(0.5714026093482971, 54, (basic: (a: 0.4825616776943207, b: 1, c: "gopiuzfb"), color: ' + '(Rgba(red:0.5206693410873413, green:0.3277728259563446, blue:0.24999667704105377, ' + 'alpha:0.952816903591156)), colors_list: ([Rgba(red:0.0445563830435276, green:0.8601610660552979, ' + 'blue:0.6031906008720398, alpha:0.38160598278045654), Rgba(red:0.2836182117462158, ' + 'green:0.6749648451805115, blue:0.456831157207489, alpha:0.6858614683151245)]), enable: true, ' + 'enum_inner: Rock, nested: (vec: (Vec3(x:0.1329781413078308, y:0.7678378224372864, ' + 'z:0.9824132323265076))), text: "otmbsahe", toggle: (false)))', + 'NestingTestLevel2': '(basic: (a: 0.5714026093482971, b: 54, c: "psagopiu"), color: (Rgba(red:0.8106188178062439, ' + 'green:0.03440357372164726, blue:0.49008557200431824, alpha:0.07608934491872787)), colors_list: ' + '([Rgba(red:0.0445563830435276, green:0.8601610660552979, blue:0.6031906008720398, ' + 'alpha:0.38160598278045654), Rgba(red:0.2836182117462158, green:0.6749648451805115, ' + 'blue:0.456831157207489, alpha:0.6858614683151245)]), enable: true, enum_inner: Rock, nested: ' + '(vec: (Vec3(x:0.1329781413078308, y:0.7678378224372864, z:0.9824132323265076))), text: ' + '"otmbsahe", toggle: (false))', + 'NestingTestLevel3': '(vec: (Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019)))', + 'NoFrustumCulling': '', + 'NoWireframe': '', + 'Node': '(calculated_size: Vec2(x:0.5714026093482971, y:0.42888906598091125), outline_offset: 0.5780913233757019, ' + 'outline_width: 0.20609822869300842, stack_index: 62, unrounded_size: Vec2(x:0.8235888481140137, ' + 'y:0.6534725427627563))', + 'NotShadowCaster': '', + 'NotShadowReceiver': '', + 'OrthographicProjection': '(area: (max: Vec2(x:0.5714026093482971, y:0.42888906598091125), min: ' + 'Vec2(x:0.5780913233757019, y:0.20609822869300842)), far: 0.8133212327957153, near: ' + '0.8235888481140137, scale: 0.6534725427627563, scaling_mode: ' + 'WindowSize(0.03440357372164726), viewport_origin: Vec2(x:0.49008557200431824, ' + 'y:0.07608934491872787))', + 'Outline': '(color: Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842), offset: VMax(0.4912964105606079), width: Percent(0.6534725427627563))', + 'Parent': '(0)', + 'PerspectiveProjection': '(aspect_ratio: 0.5714026093482971, far: 0.42888906598091125, fov: 0.5780913233757019, near: ' + '0.20609822869300842)', + 'Pickable': '', + 'Player': '', + 'PointLight': '(color: Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842), intensity: 0.8133212327957153, radius: 0.8235888481140137, range: ' + '0.6534725427627563, shadow_depth_bias: 0.16022956371307373, shadow_normal_bias: 0.5206693410873413, ' + 'shadows_enabled: false)', + 'PrimaryWindow': '', + 'Projection': 'Perspective((aspect_ratio: 0.42888906598091125, far: 0.5780913233757019, fov: 0.20609822869300842, ' + 'near: 0.8133212327957153))', + 'RelativeCursorPosition': '(normalized: "", normalized_visible_node_rect: (max: Vec2(x:0.5714026093482971, ' + 'y:0.42888906598091125), min: Vec2(x:0.5780913233757019, y:0.20609822869300842)))', + 'RenderLayers': '(73)', + 'Restitution': '(coefficient: 0.5714026093482971, combine_rule: "")', + 'RigidBody': 'Dynamic', + 'SSAOSettings': '', + 'ScreenSpaceAmbientOcclusionSettings': '(quality_level: "")', + 'Sensor': '', + 'ShadowFilteringMethod': 'Jimenez14', + 'ShadowmapSettings': '(size: 73)', + 'SkinnedMesh': '(inverse_bindposes: Strong(""), joints: [0, 0])', + 'Sleeping': '(angular_threshold: 0.5714026093482971, linear_threshold: 0.42888906598091125, sleeping: true)', + 'SolverGroups': '(filters: (73), memberships: (4))', + 'SpawnHere': '', + 'SpotLight': '(color: Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842), inner_angle: 0.8133212327957153, intensity: 0.8235888481140137, ' + 'outer_angle: 0.6534725427627563, radius: 0.16022956371307373, range: 0.5206693410873413, ' + 'shadow_depth_bias: 0.3277728259563446, shadow_normal_bias: 0.24999667704105377, shadows_enabled: true)', + 'Sprite': '(anchor: Custom(Vec2(x:0.03258506581187248, y:0.4825616776943207)), color: Rgba(red:0.014832446351647377, ' + 'green:0.46258050203323364, blue:0.4912964105606079, alpha:0.27752065658569336), custom_size: "", flip_x: ' + 'true, flip_y: false, rect: "")', + 'Style': '(align_content: SpaceAround, align_items: Default, align_self: Baseline, aspect_ratio: ' + 'Some(0.5780913233757019), border: (bottom: Px(0.46258050203323364), left: Vw(0.8235888481140137), right: ' + 'VMin(0.8106188178062439), top: Auto), bottom: Vh(0.49008557200431824), column_gap: Auto, direction: ' + 'Inherit, display: None, flex_basis: Percent(0.0445563830435276), flex_direction: Column, flex_grow: ' + '0.6031906008720398, flex_shrink: 0.38160598278045654, flex_wrap: Wrap, grid_auto_columns: "", ' + 'grid_auto_flow: RowDense, grid_auto_rows: "", grid_column: (end: "", span: "", start: ""), grid_row: (end: ' + '"", span: "", start: ""), grid_template_columns: "", grid_template_rows: "", height: ' + 'Vw(0.17467059195041656), justify_content: FlexEnd, justify_items: Stretch, justify_self: End, left: ' + 'Px(0.45692843198776245), margin: (bottom: VMax(0.9824132323265076), left: Vw(0.6133268475532532), right: ' + 'Auto, top: Vh(0.004055144265294075)), max_height: Px(0.1949533075094223), max_width: ' + 'Percent(0.5363451838493347), min_height: VMax(0.8981962203979492), min_width: Percent(0.666689932346344), ' + 'overflow: (x: Clip, y: Clip), padding: (bottom: Vw(0.06499417871236801), left: Vh(0.32468828558921814), ' + 'right: Vh(0.15641891956329346), top: Px(0.9697836637496948)), position_type: Relative, right: Auto, ' + 'row_gap: Auto, top: Vw(0.3011642396450043), width: Vh(0.6578909158706665))', + 'Text': '(alignment: Right, linebreak_behavior: WordBoundary, sections: [(style: (color: Rgba(red:0.4825616776943207, ' + 'green:0.014832446351647377, blue:0.46258050203323364, alpha:0.4912964105606079), font: Weak(Index(index: ' + '"")), font_size: 0.03440357372164726), value: "pkchxlbn"), (style: (color: Rgba(red:0.8601610660552979, ' + 'green:0.6031906008720398, blue:0.38160598278045654, alpha:0.2836182117462158), font: Weak(Uuid(uuid: ' + '"73b3b118-7d01-4778-8bcc-4e79055f5d22")), font_size: 0.17467059195041656), value: "jvleoyho")])', + 'Text2dBounds': '(size: Vec2(x:0.5714026093482971, y:0.42888906598091125))', + 'TextFlags': '(needs_new_measure_func: true, needs_recompute: false)', + 'TextLayoutInfo': '(glyphs: "", logical_size: Vec2(x:0.5714026093482971, y:0.42888906598091125))', + 'TextureAtlasSprite': '(anchor: Custom(Vec2(x:0.03258506581187248, y:0.4825616776943207)), color: ' + 'Rgba(red:0.014832446351647377, green:0.46258050203323364, blue:0.4912964105606079, ' + 'alpha:0.27752065658569336), custom_size: "", flip_x: true, flip_y: false, index: 4)', + 'Tonemapping': 'None', + 'Transform': '(rotation: Quat(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019, ' + 'w:0.20609822869300842), scale: Vec3(x:0.8133212327957153, y:0.8235888481140137, z:0.6534725427627563), ' + 'translation: Vec3(x:0.16022956371307373, y:0.5206693410873413, z:0.3277728259563446))', + 'TupleTest2': '(0.5714026093482971, 54, "psagopiu")', + 'TupleTestBool': '(true)', + 'TupleTestColor': '(Rgba(red:0.5714026093482971, green:0.42888906598091125, blue:0.5780913233757019, ' + 'alpha:0.20609822869300842))', + 'TupleTestF32': '(0.5714026093482971)', + 'TupleTestStr': '("sbnpsago")', + 'TupleTestU64': '(73)', + 'TupleVec': '(["npsagopi"])', + 'TupleVec2': '(Vec2(x:0.5714026093482971, y:0.42888906598091125))', + 'TupleVec3': '(Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019))', + 'TupleVecF32F32': '([(0.42888906598091125, 0.5780913233757019)])', + 'UiCameraConfig': '(show_ui: true)', + 'UiImage': '(flip_x: true, flip_y: false, texture: Weak(Uuid(uuid: "73b3b118-7d01-4778-8bcc-4e79055f5d22")))', + 'UiImageSize': '(size: Vec2(x:0.5714026093482971, y:0.42888906598091125))', + 'UiTextureAtlasImage': '(flip_x: true, flip_y: false, index: 54)', + 'UnitTest': '', + 'VecOfColors': '([Rgba(red:0.42888906598091125, green:0.5780913233757019, blue:0.20609822869300842, ' + 'alpha:0.8133212327957153)])', + 'VecOfF32s': '([0.42888906598091125])', + 'VecOfVec3s2': '([(Vec3(x:0.42888906598091125, y:0.5780913233757019, z:0.20609822869300842))])', + 'Velocity': '(angvel: Vec3(x:0.5714026093482971, y:0.42888906598091125, z:0.5780913233757019), linvel: ' + 'Vec3(x:0.20609822869300842, y:0.8133212327957153, z:0.8235888481140137))', + 'ViewVisibility': '(true)', + 'Visibility': 'Visible', + 'VisibleEntities': '', + 'Window': '(canvas: None, composite_alpha_mode: PostMultiplied, cursor: (grab_mode: Confined, hit_test: true, icon: ' + 'Default, visible: false), decorations: false, enabled_buttons: (close: true, maximize: false, minimize: ' + 'true), fit_canvas_to_parent: false, focused: true, ime_enabled: true, ime_position: ' + 'Vec2(x:0.16022956371307373, y:0.5206693410873413), internal: (maximize_request: Some(false), ' + 'minimize_request: None, physical_cursor_position: Some(DVec2(x:0.0445563830435276, ' + 'y:0.8601610660552979))), mode: SizedFullscreen, position: Centered(Primary), present_mode: Fifo, ' + 'prevent_default_event_handling: true, resizable: true, resize_constraints: (max_height: ' + '0.2623211145401001, max_width: 0.17467059195041656, min_height: 0.30310511589050293, min_width: ' + '0.36258742213249207), resolution: (physical_height: 58, physical_width: 98, scale_factor: ' + '0.8600491285324097, scale_factor_override: None), title: "otmbsahe", transparent: false, visible: true, ' + 'window_level: Normal, window_theme: "")', + 'Wireframe': '', + 'ZIndex': 'Local(54)'} diff --git a/tools/bevy_components/tests/test_components.py b/tools/bevy_components/tests/test_components.py new file mode 100644 index 0000000..49487ef --- /dev/null +++ b/tools/bevy_components/tests/test_components.py @@ -0,0 +1,297 @@ +import bpy +import pytest +import pprint + +from ..propGroups.conversions_to_prop_group import property_group_value_from_custom_property_value +from ..propGroups.conversions_from_prop_group import property_group_value_to_custom_property_value +from .component_values_shuffler import component_values_shuffler +from .expected_component_values import (expected_custom_property_values, expected_custom_property_values_randomized) + +@pytest.fixture +def setup_data(request): + print("\nSetting up resources...") + + def finalizer(): + print("\nPerforming teardown...") + registry = bpy.context.window_manager.components_registry + #registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + #bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + object = bpy.context.object + remove_component_operator = bpy.ops.object.remove_bevy_component + + for type_name in type_infos: + definition = type_infos[type_name] + component_name = definition["short_name"] + if component_name in object: + try: + remove_component_operator(component_name=component_name) + except Exception as error: + pass + + request.addfinalizer(finalizer) + + return None + + +def test_components_should_generate_correct_custom_properties(setup_data): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + object = bpy.context.object + + add_component_operator = bpy.ops.object.add_bevy_component + errors = [] + addable_components = [] + added_components = [] + + custom_property_values = {} + + for type_name in type_infos: + definition = type_infos[type_name] + component_type = definition["title"] + short_name = definition["short_name"] + is_component = definition['isComponent'] if "isComponent" in definition else False + if not is_component: + continue + + addable_components.append(component_type) + + try: + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + added_components.append(component_type) + custom_property_values[short_name] = object[short_name] + assert object[short_name] == expected_custom_property_values[short_name] + + except Exception as error: + errors.append(error) + + """pp = pprint.PrettyPrinter(depth=14, width=120) + print("CUSTOM PROPERTY VALUES") + pp.pprint(custom_property_values)""" + + assert len(errors) == 0 + assert len(added_components) == 152 + + +def test_components_should_generate_correct_custom_properties_with_randomozied_values(setup_data): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + object = bpy.context.object + + add_component_operator = bpy.ops.object.add_bevy_component + errors = [] + error_components = [] + addable_components = [] + added_components = [] + + custom_property_values = {} + + for type_name in type_infos: + definition = type_infos[type_name] + component_type = definition["title"] + short_name = definition["short_name"] + is_component = definition['isComponent'] if "isComponent" in definition else False + if not is_component: + continue + + addable_components.append(component_type) + + try: + add_component_operator(component_type=component_type) + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + component_values_shuffler(seed= 10, property_group=propertyGroup, definition=definition, registry=registry) + + added_components.append(component_type) + custom_property_values[short_name] = object[short_name] + assert object[short_name] == expected_custom_property_values_randomized[short_name] + + except Exception as error: + errors.append(error) + error_components.append(short_name) + + pp = pprint.PrettyPrinter(depth=14, width=120) + print("CUSTOM PROPERTY VALUES") + pp.pprint(custom_property_values) + + print("error_components", error_components) + assert len(errors) == 0 + assert len(added_components) == 152 + +def test_components_should_generate_correct_propertyGroup_values_from_custom_properties(setup_data): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + object = bpy.context.object + + add_component_operator = bpy.ops.object.add_bevy_component + errors = [] + addable_components = [] + added_components = [] + failing_components = [] + + for type_name in type_infos: + definition = type_infos[type_name] + component_type = definition["title"] + short_name = definition["short_name"] + is_component = definition['isComponent'] if "isComponent" in definition else False + if not is_component: + continue + + addable_components.append(component_type) + + try: + add_component_operator(component_type=component_type) + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + added_components.append(component_type) + # randomise values + component_values_shuffler(seed= 10, property_group=propertyGroup, definition=definition, registry=registry) + custom_property_value = object[short_name] + + # first check if custom property value matches what we expect + assert custom_property_value == expected_custom_property_values_randomized[short_name] + + # we update propgroup values from custom property values + property_group_value_from_custom_property_value(propertyGroup, definition, registry, custom_property_value, nesting = []) + # and then generate it back + custom_property_value_regen = property_group_value_to_custom_property_value(propertyGroup, definition, registry, None) + assert custom_property_value_regen == expected_custom_property_values_randomized[short_name] + + # custom_property_values[short_name] = object[short_name] + #assert object[short_name] == expected_custom_property_values[short_name] + #print("CUSTOM PROPERTY ", object[short_name]) + + except Exception as error: + errors.append(error) + failing_components.append(short_name) + + for index, error in enumerate(errors): + print("ERROR", error, failing_components[index]) + assert len(errors) == 0 + assert len(added_components) == 152 + + +def test_remove_components(setup_data): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + + add_component_operator = bpy.ops.object.add_bevy_component + errors = [] + addable_components = [] + added_components = [] + + for type_name in type_infos: + definition = type_infos[type_name] + component_type = definition["title"] + short_name = definition["short_name"] + is_component = definition['isComponent'] if "isComponent" in definition else False + if not is_component: + continue + + addable_components.append(component_type) + + try: + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + object = bpy.context.object + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + # print("propertyGroup", propertyGroup, propertyGroup.field_names) + added_components.append(component_type) + except Exception as error: + errors.append(error) + assert len(errors) == 0 + + # now test component removal + errors.clear() + remove_component_operator = bpy.ops.object.remove_bevy_component + for component_type in added_components: + component_name = type_infos[component_type]["short_name"] + try: + remove_component_operator(component_name=component_name) + except Exception as error: + errors.append(error) + assert len(errors) == 0 + +def test_copy_paste_components(setup_data): + context = bpy.context + registry = context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + #component_type = "bevy_bevy_registry_export_basic_example::test_components::BasicTest" + short_name = "BasicTest" + component_type = registry.short_names_to_long_names[short_name] + + # SOURCE object setup + add_component_operator = bpy.ops.object.add_bevy_component + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + object = context.object + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + setattr(propertyGroup, propertyGroup.field_names[0], 25.0) + + copy_component_operator = bpy.ops.object.copy_bevy_component + copy_component_operator(source_component_name=short_name, source_object_name=object.name) + + # --------------------------------------- + # TARGET object + bpy.ops.mesh.primitive_cube_add() + new_cube = bpy.context.selected_objects[0] + # change name + new_cube.name = "TargetCube" + target_components_metadata = new_cube.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + + # first check that there is no component currently + assert component_meta == None + + paste_component_operator = bpy.ops.object.paste_bevy_component + paste_component_operator() + + target_components_metadata = new_cube.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + + # now after pasting to the new object, it should have component meta + assert component_meta != None + + # and then check if the propertyGroup of the target object is correct + propertyGroup = getattr(component_meta, property_group_name, None) + assert propertyGroup.field_names == ['a', 'b', 'c'] + + a_fieldValue = getattr(propertyGroup, propertyGroup.field_names[0]) + assert a_fieldValue == 25.0 + diff --git a/tools/bevy_components/tests/test_conversions.py b/tools/bevy_components/tests/test_conversions.py new file mode 100644 index 0000000..4125ce0 --- /dev/null +++ b/tools/bevy_components/tests/test_conversions.py @@ -0,0 +1,51 @@ +from ..propGroups.conversions_to_prop_group import parse_struct_string, parse_tuplestruct_string + + +def test_parse_tuplestruct_string(): + assert parse_tuplestruct_string("(A)", start_nesting=1) == ['A'] + assert parse_tuplestruct_string("[(A)]", start_nesting=1) == ['(A)'] + + assert parse_tuplestruct_string("(a: 45, b: 65)", start_nesting=1) == ['a: 45', 'b: 65'] + assert parse_tuplestruct_string("[(a: 45, b: 65)]", start_nesting=1) == ['(a: 45, b: 65)'] + assert parse_tuplestruct_string("45, 65, 'bla'", start_nesting=0) == ['45', '65', "'bla'"] + + assert parse_tuplestruct_string("[(A), (B)]", start_nesting=1) == ['(A)', '(B)'] + + assert parse_tuplestruct_string("([(-1.8, 2.9), (0.0, -62)])", start_nesting=1) == ['[(-1.8, 2.9), (0.0, -62)]'] + assert parse_tuplestruct_string("([(-1.8, 2.9), (0.0, -62)])", start_nesting=2) == ['(-1.8, 2.9)', '(0.0, -62)'] + assert parse_tuplestruct_string("([(-1.8, 2.9), (0.0, -62), (25)])", start_nesting=2) == ['(-1.8, 2.9)', '(0.0, -62)', '(25)'] + + assert parse_tuplestruct_string("(Vec3(x:-2.0, y:120.0, z:1.0))", start_nesting=2) == ['x:-2.0', 'y:120.0', 'z:1.0'] + + assert parse_tuplestruct_string("(9)", start_nesting=1) == ['9'] + assert parse_tuplestruct_string('("toto")', start_nesting=1) == ['"toto"'] + + assert parse_tuplestruct_string("(Rgba(red:0.0, green:0.2, blue:0.9, alpha:1.0))", start_nesting=1) == ['Rgba(red:0.0, green:0.2, blue:0.9, alpha:1.0)'] + assert parse_tuplestruct_string("(Rgba(red:0.0, green:0.2, blue:0.9, alpha:1.0))", start_nesting=2) == ['red:0.0', 'green:0.2', 'blue:0.9', 'alpha:1.0'] + + assert parse_tuplestruct_string("([(-1.2, 2.9), (0.0, -62)])", start_nesting=2) == ['(-1.2, 2.9)', '(0.0, -62)'] + + assert parse_tuplestruct_string("([Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0), Rgba(red:1.0, green:0.0, blue:0.5, alpha:1.0)])", start_nesting=2) == ['Rgba(red:1.0, green:1.0, blue:0.0, alpha:1.0)', 'Rgba(red:1.0, green:0.0, blue:0.5, alpha:1.0)'] + assert parse_tuplestruct_string('(7.2, 2607, "sdf")', start_nesting=1) == ['7.2', '2607', '"sdf"'] + + assert parse_tuplestruct_string('[a, b]', start_nesting=1) == ['a', 'b'] + assert parse_tuplestruct_string('[]', start_nesting=1) == [] + +def test_parse_struct_string(): + assert parse_struct_string("a: 45, b:65") == {'a': '45', 'b':'65'} + assert parse_struct_string("x:-2.0, y:120.0, z:1.0") == {'x': '-2.0', 'y':'120.0', 'z':'1.0'} + + assert parse_struct_string("enabled: true") == {'enabled': 'true'} + assert parse_struct_string("(enabled: true)", start_nesting=1) == {'enabled': 'true'} + + + assert parse_struct_string("(filters: (25), memberships: (5))", start_nesting=1) == {'filters': '(25)', 'memberships':'(5)'} + assert parse_struct_string("groups: 0", start_nesting=0) == {'groups': '0'} + assert parse_struct_string("(groups: 0)", start_nesting=1) == {'groups': '0'} + + assert parse_struct_string("(composite_mode: EnergyConserving, high_pass_frequency: 4.0, intensity: 0.0, low_frequency_boost: -6.0, low_frequency_boost_curvature: 4.1, prefilter_settings: (threshold: -5.1, threshold_softness: 2.1))", start_nesting=1) == {'composite_mode': 'EnergyConserving', 'high_pass_frequency': '4.0', 'intensity': '0.0', 'low_frequency_boost': '-6.0', 'low_frequency_boost_curvature': '4.1', 'prefilter_settings': '(threshold: -5.1, threshold_softness: 2.1)'} + + + assert parse_struct_string("dimensions: UVec3(x:0.0, y:0.0, z:0.0), dynamic_resizing: true, z_config: (far_z_mode: MaxLightRange, first_slice_depth: 0.0)") == {'dimensions': 'UVec3(x:0.0, y:0.0, z:0.0)', 'dynamic_resizing': 'true', 'z_config': '(far_z_mode: MaxLightRange, first_slice_depth: 0.0)'} + + assert parse_struct_string('(inverse_bindposes: Strong(""), joints: [4294967295, 4294967295, 4294967295])', start_nesting=1) == {'inverse_bindposes': 'Strong("")', 'joints': '[4294967295, 4294967295, 4294967295]'} \ No newline at end of file diff --git a/tools/bevy_components/tests/test_registry.py b/tools/bevy_components/tests/test_registry.py new file mode 100644 index 0000000..8322212 --- /dev/null +++ b/tools/bevy_components/tests/test_registry.py @@ -0,0 +1,29 @@ +import bpy + + +def test_blend(): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + #print("registry type infos", registry.type_infos) + + short_name = "BasicTest" + component_type = registry.short_names_to_long_names[short_name] + + add_component_operator = bpy.ops.object.add_bevy_component + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + object = bpy.context.object + + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + print("propertyGroup", propertyGroup, propertyGroup.field_names) + + + """copy_component_operator = bpy.ops.object.copy_bevy_component + copy_component_operator()""" + + + assert propertyGroup.field_names == ['a', 'b', 'c'] \ No newline at end of file diff --git a/tools/bevy_components/tests/test_shuffler.py b/tools/bevy_components/tests/test_shuffler.py new file mode 100644 index 0000000..8d5aad6 --- /dev/null +++ b/tools/bevy_components/tests/test_shuffler.py @@ -0,0 +1,141 @@ +import bpy +from .component_values_shuffler import component_values_shuffler + +def test_shuffler(): + registry = bpy.context.window_manager.components_registry + registry.schemaPath = "../../testing/bevy_registry_export/basic/assets/registry.json" + bpy.ops.object.reload_registry() + + type_infos = registry.type_infos + object = bpy.context.object + + add_component_operator = bpy.ops.object.add_bevy_component + + short_name = "BasicTest" + component_type = registry.short_names_to_long_names[short_name] + + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 10, property_group=propertyGroup, definition=definition, registry=registry) + + assert getattr(propertyGroup, 'a') == 0.5714026093482971 + assert getattr(propertyGroup, 'b') == 54 + assert getattr(propertyGroup, 'c') == "psagopiu" + + + # Testing a more complex component + short_name = "NestingTestLevel2" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == '(basic: (a: 0.5219839215278625, b: 38, c: "ljfywwrv"), color: (Rgba(red:0.2782765030860901, green:0.9174930453300476, blue:0.24890311062335968, alpha:0.815186083316803)), colors_list: ([Rgba(red:0.2523837685585022, green:0.5016026496887207, blue:0.317435085773468, alpha:0.8463277816772461), Rgba(red:0.945193886756897, green:0.4015909433364868, blue:0.9984470009803772, alpha:0.06219279021024704)]), enable: true, enum_inner: Wood, nested: (vec: (Vec3(x:0.1509154736995697, y:0.7055686116218567, z:0.5588918924331665))), text: "vgkrdwuc", toggle: (false))' + + + # And another complex component + short_name = "EnumComplex" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == 'StructLike(a: 0.41416797041893005, b: 38, c: "ljfywwrv")' + + # And another complex component + short_name = "AnimationPlayer" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == '(animation: "", paused: true)' + + + + # And another complex component + short_name = "VecOfColors" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == '([Rgba(red:0.8066907525062561, green:0.9604947566986084, blue:0.2896253764629364, alpha:0.766107439994812), Rgba(red:0.7042198777198792, green:0.6613830327987671, blue:0.11016204953193665, alpha:0.02693677879869938)])' + + + # And another complex component + short_name = "VecOfF32s" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == '([0.8066907525062561, 0.9604947566986084])' + + # And another complex component + short_name = "SkinnedMesh" + component_type = registry.short_names_to_long_names[short_name] + add_component_operator(component_type=component_type) + + property_group_name = registry.get_propertyGroupName_from_shortName(short_name) + target_components_metadata = object.components_meta.components + component_meta = next(filter(lambda component: component["name"] == short_name, target_components_metadata), None) + propertyGroup = getattr(component_meta, property_group_name, None) + + definition = type_infos[component_type] + component_values_shuffler(seed= 17, property_group=propertyGroup, definition=definition, registry=registry) + + print("propertyGroup", object[short_name]) + # cheating / making things easier for us for complex types: we use the custom property value + assert object[short_name] == '(inverse_bindposes: Weak(Uuid(uuid: "73b3b118-7d01-4778-8bcc-4e79055f5d22")), joints: [0, 0])' + \ No newline at end of file