diff --git a/Cargo.lock b/Cargo.lock index 7542aaf..95596a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -394,6 +394,36 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "avian3d" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263f406c08c5ec296039ba06d7aa50e54f9ecd996f682aaa63eae25709e8935b" +dependencies = [ + "avian_derive", + "bevy", + "bevy_math", + "bitflags 2.6.0", + "derive_more", + "fxhash", + "indexmap", + "itertools", + "nalgebra", + "parry3d", + "parry3d-f64", +] + +[[package]] +name = "avian_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4adeeecb6d4628d3ca11836ce9af8309f9552d4bd3e3f6e4368440d8163260c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -1881,6 +1911,12 @@ dependencies = [ "const_soft_float", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1996,6 +2032,7 @@ dependencies = [ name = "crooks" version = "0.1.0" dependencies = [ + "avian3d", "bevy", "bevy_editor_pls", "blenvy", @@ -2014,6 +2051,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -2107,6 +2163,19 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.85", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -2545,6 +2614,15 @@ dependencies = [ "thread_local", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -3159,6 +3237,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libredox" version = "0.1.3" @@ -3188,6 +3272,7 @@ checksum = "dc3129ca879c52b7e814b7af6f7e1586c771a043ec90761e71d4322a65822848" dependencies = [ "async-channel", "async-compat", + "avian3d", "bevy", "bevy_web_keepalive", "bincode", @@ -3286,6 +3371,16 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3380,6 +3475,34 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "glam 0.27.0", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "ndk" version = "0.8.0" @@ -3507,6 +3630,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-derive" version = "0.4.2" @@ -3518,6 +3650,25 @@ dependencies = [ "syn 2.0.85", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3525,6 +3676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -3877,6 +4029,52 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "parry3d" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa342e0cdfc774fed0196714290ba2d85408b8ce9f295c40a0b1e05f3f8256ab" +dependencies = [ + "approx", + "arrayvec", + "bitflags 1.3.2", + "downcast-rs", + "either", + "log", + "nalgebra", + "num-derive", + "num-traits", + "rayon", + "rustc-hash", + "simba", + "slab", + "smallvec", + "spade", +] + +[[package]] +name = "parry3d-f64" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc07fa374273eca29066d59d3ded520bf845ed582e38c0d60109459ea4ed76e" +dependencies = [ + "approx", + "arrayvec", + "bitflags 1.3.2", + "downcast-rs", + "either", + "log", + "nalgebra", + "num-derive", + "num-traits", + "rayon", + "rustc-hash", + "simba", + "slab", + "smallvec", + "spade", +] + [[package]] name = "paste" version = "1.0.15" @@ -4163,6 +4361,32 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "rectangle-pack" version = "0.4.2" @@ -4243,6 +4467,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3df6368f71f205ff9c33c076d170dd56ebf68e8161c733c0caa07a7a5509ed53" +[[package]] +name = "robust" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30" + [[package]] name = "rodio" version = "0.18.1" @@ -4278,6 +4508,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.38" @@ -4306,6 +4545,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "safe_arch" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +dependencies = [ + "bytemuck", +] + [[package]] name = "same-file" version = "1.0.6" @@ -4352,6 +4600,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + [[package]] name = "send_wrapper" version = "0.6.0" @@ -4405,6 +4659,19 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -4472,6 +4739,18 @@ dependencies = [ "serde", ] +[[package]] +name = "spade" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f5ef1f863aca7d1d7dda7ccfc36a0a4279bd6d3c375176e5e0712e25cb4889" +dependencies = [ + "hashbrown 0.14.5", + "num-traits", + "robust", + "smallvec", +] + [[package]] name = "spinning_top" version = "0.3.0" @@ -5284,6 +5563,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wide" +version = "0.7.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "widestring" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index 20dac0b..7025d15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,12 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] +avian3d = "0.1.2" bevy = { version = "0.14.2", features = ["jpeg"] } bevy_editor_pls = "0.10.0" blenvy = "0.1.0-alpha.1" clap = { version = "4.5.20", features = ["derive"] } lazy_static = "1.5.0" -lightyear = "0.17.1" +lightyear = { version = "0.17.1", features = ["avian3d"] } serde = { version = "1.0.213", features = ["derive"] } [profile.dev.package."*"] diff --git a/art/crooks.blend b/art/crooks.blend index 4a20d34..bb63fc6 100644 Binary files a/art/crooks.blend and b/art/crooks.blend differ diff --git a/assets/blueprints/Hotel.glb b/assets/blueprints/Hotel.glb index 90660c9..bd7433a 100644 Binary files a/assets/blueprints/Hotel.glb and b/assets/blueprints/Hotel.glb differ diff --git a/assets/blueprints/Player.glb b/assets/blueprints/Player.glb index 1540422..c835b8b 100644 Binary files a/assets/blueprints/Player.glb and b/assets/blueprints/Player.glb differ diff --git a/assets/levels/World.glb b/assets/levels/World.glb index f85613c..6c61f02 100644 Binary files a/assets/levels/World.glb and b/assets/levels/World.glb differ diff --git a/assets/levels/World.meta.ron b/assets/levels/World.meta.ron index f30acec..8ad824c 100644 --- a/assets/levels/World.meta.ron +++ b/assets/levels/World.meta.ron @@ -2,9 +2,9 @@ assets: [ ("Player", File ( path: "blueprints/Player.glb" )), + ("head.001", File ( path: "materials/head.001.glb" )), ("glasses.001", File ( path: "materials/glasses.001.glb" )), ("body.001", File ( path: "materials/body.001.glb" )), - ("head.001", File ( path: "materials/head.001.glb" )), ("Hotel", File ( path: "blueprints/Hotel.glb" )), ("floor", File ( path: "materials/floor.glb" )), ] diff --git a/assets/registry.json b/assets/registry.json index b743096..3cdda02 100644 --- a/assets/registry.json +++ b/assets/registry.json @@ -10,6 +10,27 @@ "type": "array", "typeInfo": "Tuple" }, + "(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)": { + "isComponent": false, + "isResource": false, + "items": false, + "long_name": "(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + } + ], + "short_name": "(Entity, Entity)", + "type": "array", + "typeInfo": "Tuple" + }, "(u8, u8)": { "isComponent": false, "isResource": false, @@ -31,6 +52,45 @@ "type": "array", "typeInfo": "Tuple" }, + "[f32; 4]": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "long_name": "[f32; 4]", + "short_name": "[f32; 4]", + "type": "array", + "typeInfo": "Array" + }, + "[u32; 2]": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "long_name": "[u32; 2]", + "short_name": "[u32; 2]", + "type": "array", + "typeInfo": "Array" + }, + "[u32; 3]": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "long_name": "[u32; 3]", + "short_name": "[u32; 3]", + "type": "array", + "typeInfo": "Array" + }, "alloc::borrow::Cow": { "isComponent": false, "isResource": false, @@ -47,6 +107,45 @@ "type": "string", "typeInfo": "Value" }, + "alloc::vec::Vec<(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)" + } + }, + "long_name": "alloc::vec::Vec<(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)>", + "short_name": "Vec<(Entity, Entity)>", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec<[u32; 2]>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/[u32; 2]" + } + }, + "long_name": "alloc::vec::Vec<[u32; 2]>", + "short_name": "Vec<[u32; 2]>", + "type": "array", + "typeInfo": "List" + }, + "alloc::vec::Vec<[u32; 3]>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/[u32; 3]" + } + }, + "long_name": "alloc::vec::Vec<[u32; 3]>", + "short_name": "Vec<[u32; 3]>", + "type": "array", + "typeInfo": "List" + }, "alloc::vec::Vec": { "isComponent": false, "isResource": false, @@ -60,6 +159,19 @@ "type": "array", "typeInfo": "List" }, + "alloc::vec::Vec>": { + "isComponent": false, + "isResource": false, + "items": { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + }, + "long_name": "alloc::vec::Vec>", + "short_name": "Vec>", + "type": "array", + "typeInfo": "List" + }, "alloc::vec::Vec": { "isComponent": false, "isResource": false, @@ -294,6 +406,2772 @@ "type": "array", "typeInfo": "List" }, + "avian3d::collision::broad_phase::AabbIntersections": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::broad_phase::AabbIntersections", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + ], + "short_name": "AabbIntersections", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::broad_phase::BroadCollisionPairs": { + "isComponent": false, + "isResource": true, + "items": false, + "long_name": "avian3d::collision::broad_phase::BroadCollisionPairs", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec<(bevy_ecs::entity::Entity, bevy_ecs::entity::Entity)>" + } + } + ], + "short_name": "BroadCollisionPairs", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::collider::ColliderAabb": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::collider::ColliderAabb", + "properties": { + "max": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "min": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "min", + "max" + ], + "short_name": "ColliderAabb", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::collider::ColliderParent": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::collider::ColliderParent", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + } + ], + "short_name": "ColliderParent", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::collider::ColliderTransform": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::collider::ColliderTransform", + "properties": { + "rotation": { + "type": { + "$ref": "#/$defs/avian3d::position::Rotation" + } + }, + "scale": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "translation": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "translation", + "rotation", + "scale" + ], + "short_name": "ColliderTransform", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::collider::CollidingEntities": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::collider::CollidingEntities", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashSet" + } + } + ], + "short_name": "CollidingEntities", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::collider::CollisionMargin": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::collider::CollisionMargin", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "CollisionMargin", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::collider::PreviousColliderTransform": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::collider::PreviousColliderTransform", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::ColliderTransform" + } + } + ], + "short_name": "PreviousColliderTransform", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::collider::Sensor": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::collider::Sensor", + "properties": {}, + "required": [], + "short_name": "Sensor", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::collider::constructor::ColliderConstructor": { + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::collider::constructor::ColliderConstructor", + "oneOf": [ + { + "additionalProperties": false, + "long_name": "Sphere", + "properties": { + "radius": { + "long_name": "radius", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "radius" + ], + "short_name": "Sphere", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Cuboid", + "properties": { + "x_length": { + "long_name": "x_length", + "type": { + "$ref": "#/$defs/f32" + } + }, + "y_length": { + "long_name": "y_length", + "type": { + "$ref": "#/$defs/f32" + } + }, + "z_length": { + "long_name": "z_length", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x_length", + "y_length", + "z_length" + ], + "short_name": "Cuboid", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "RoundCuboid", + "properties": { + "border_radius": { + "long_name": "border_radius", + "type": { + "$ref": "#/$defs/f32" + } + }, + "x_length": { + "long_name": "x_length", + "type": { + "$ref": "#/$defs/f32" + } + }, + "y_length": { + "long_name": "y_length", + "type": { + "$ref": "#/$defs/f32" + } + }, + "z_length": { + "long_name": "z_length", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "x_length", + "y_length", + "z_length", + "border_radius" + ], + "short_name": "RoundCuboid", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Cylinder", + "properties": { + "height": { + "long_name": "height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "radius": { + "long_name": "radius", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "radius", + "height" + ], + "short_name": "Cylinder", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Cone", + "properties": { + "height": { + "long_name": "height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "radius": { + "long_name": "radius", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "radius", + "height" + ], + "short_name": "Cone", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Capsule", + "properties": { + "height": { + "long_name": "height", + "type": { + "$ref": "#/$defs/f32" + } + }, + "radius": { + "long_name": "radius", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "radius", + "height" + ], + "short_name": "Capsule", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "CapsuleEndpoints", + "properties": { + "a": { + "long_name": "a", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "b": { + "long_name": "b", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "radius": { + "long_name": "radius", + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "radius", + "a", + "b" + ], + "short_name": "CapsuleEndpoints", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "HalfSpace", + "properties": { + "outward_normal": { + "long_name": "outward_normal", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "outward_normal" + ], + "short_name": "HalfSpace", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Segment", + "properties": { + "a": { + "long_name": "a", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "b": { + "long_name": "b", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "a", + "b" + ], + "short_name": "Segment", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Triangle", + "properties": { + "a": { + "long_name": "a", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "b": { + "long_name": "b", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "c": { + "long_name": "c", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "a", + "b", + "c" + ], + "short_name": "Triangle", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Polyline", + "properties": { + "indices": { + "long_name": "indices", + "type": { + "$ref": "#/$defs/core::option::Option>" + } + }, + "vertices": { + "long_name": "vertices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "vertices" + ], + "short_name": "Polyline", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Trimesh", + "properties": { + "indices": { + "long_name": "indices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec<[u32; 3]>" + } + }, + "vertices": { + "long_name": "vertices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "vertices", + "indices" + ], + "short_name": "Trimesh", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "TrimeshWithConfig", + "properties": { + "flags": { + "long_name": "flags", + "type": { + "$ref": "#/$defs/avian3d::collision::collider::parry::TrimeshFlags" + } + }, + "indices": { + "long_name": "indices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec<[u32; 3]>" + } + }, + "vertices": { + "long_name": "vertices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "vertices", + "indices", + "flags" + ], + "short_name": "TrimeshWithConfig", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "ConvexDecomposition", + "properties": { + "indices": { + "long_name": "indices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec<[u32; 3]>" + } + }, + "vertices": { + "long_name": "vertices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "vertices", + "indices" + ], + "short_name": "ConvexDecomposition", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "ConvexDecompositionWithConfig", + "properties": { + "indices": { + "long_name": "indices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec<[u32; 3]>" + } + }, + "params": { + "long_name": "params", + "type": { + "$ref": "#/$defs/avian3d::collision::collider::parry::VhacdParameters" + } + }, + "vertices": { + "long_name": "vertices", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "vertices", + "indices", + "params" + ], + "short_name": "ConvexDecompositionWithConfig", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "ConvexHull", + "properties": { + "points": { + "long_name": "points", + "type": { + "$ref": "#/$defs/alloc::vec::Vec" + } + } + }, + "required": [ + "points" + ], + "short_name": "ConvexHull", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Heightfield", + "properties": { + "heights": { + "long_name": "heights", + "type": { + "$ref": "#/$defs/alloc::vec::Vec>" + } + }, + "scale": { + "long_name": "scale", + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "heights", + "scale" + ], + "short_name": "Heightfield", + "type": "object", + "typeInfo": "Struct" + }, + { + "long_name": "TrimeshFromMesh" + }, + { + "items": false, + "long_name": "TrimeshFromMeshWithConfig", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::parry::TrimeshFlags" + } + } + ], + "short_name": "TrimeshFromMeshWithConfig", + "type": "array", + "typeInfo": "Tuple" + }, + { + "long_name": "ConvexDecompositionFromMesh" + }, + { + "items": false, + "long_name": "ConvexDecompositionFromMeshWithConfig", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::parry::VhacdParameters" + } + } + ], + "short_name": "ConvexDecompositionFromMeshWithConfig", + "type": "array", + "typeInfo": "Tuple" + }, + { + "long_name": "ConvexHullFromMesh" + } + ], + "short_name": "ColliderConstructor", + "type": "object", + "typeInfo": "Enum" + }, + "avian3d::collision::collider::constructor::ColliderConstructorHierarchy": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::collider::constructor::ColliderConstructorHierarchy", + "properties": { + "config": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashMap, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>" + } + }, + "default_constructor": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "default_density": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::ColliderDensity" + } + }, + "default_layers": { + "type": { + "$ref": "#/$defs/avian3d::collision::layers::CollisionLayers" + } + } + }, + "required": [ + "default_layers", + "default_density", + "config" + ], + "short_name": "ColliderConstructorHierarchy", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::collider::constructor::ColliderConstructorHierarchyConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::collision::collider::constructor::ColliderConstructorHierarchyConfig", + "properties": { + "constructor": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "density": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "layers": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, + "required": [], + "short_name": "ColliderConstructorHierarchyConfig", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::collider::parry::FillMode": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::collision::collider::parry::FillMode", + "oneOf": [ + { + "long_name": "SurfaceOnly" + }, + { + "additionalProperties": false, + "long_name": "FloodFill", + "properties": { + "detect_cavities": { + "long_name": "detect_cavities", + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "detect_cavities" + ], + "short_name": "FloodFill", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "FillMode", + "type": "object", + "typeInfo": "Enum" + }, + "avian3d::collision::collider::parry::TrimeshFlags": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::collision::collider::parry::TrimeshFlags", + "short_name": "TrimeshFlags", + "type": "object", + "typeInfo": "Value" + }, + "avian3d::collision::collider::parry::VhacdParameters": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::collision::collider::parry::VhacdParameters", + "properties": { + "alpha": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "beta": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "concavity": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "convex_hull_approximation": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "convex_hull_downsampling": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "fill_mode": { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::parry::FillMode" + } + }, + "max_convex_hulls": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "plane_downsampling": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "resolution": { + "type": { + "$ref": "#/$defs/u32" + } + } + }, + "required": [ + "concavity", + "alpha", + "beta", + "resolution", + "plane_downsampling", + "convex_hull_downsampling", + "fill_mode", + "convex_hull_approximation", + "max_convex_hulls" + ], + "short_name": "VhacdParameters", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::layers::CollisionLayers": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::collision::layers::CollisionLayers", + "properties": { + "filters": { + "type": { + "$ref": "#/$defs/avian3d::collision::layers::LayerMask" + } + }, + "memberships": { + "type": { + "$ref": "#/$defs/avian3d::collision::layers::LayerMask" + } + } + }, + "required": [ + "memberships", + "filters" + ], + "short_name": "CollisionLayers", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::collision::layers::LayerMask": { + "isComponent": false, + "isResource": false, + "items": false, + "long_name": "avian3d::collision::layers::LayerMask", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u32" + } + } + ], + "short_name": "LayerMask", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::collision::narrow_phase::NarrowPhaseConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "avian3d::collision::narrow_phase::NarrowPhaseConfig", + "properties": { + "contact_tolerance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "default_speculative_margin": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "match_contacts": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "default_speculative_margin", + "contact_tolerance", + "match_contacts" + ], + "short_name": "NarrowPhaseConfig", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::debug_render::configuration::ContactGizmoScale": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::debug_render::configuration::ContactGizmoScale", + "oneOf": [ + { + "items": false, + "long_name": "Constant", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Constant", + "type": "array", + "typeInfo": "Tuple" + }, + { + "items": false, + "long_name": "Scaled", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Scaled", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "ContactGizmoScale", + "type": "object", + "typeInfo": "Enum" + }, + "avian3d::debug_render::configuration::DebugRender": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::debug_render::configuration::DebugRender", + "properties": { + "aabb_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "axis_lengths": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "collider_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "hide_mesh": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "sleeping_color_multiplier": { + "type": { + "$ref": "#/$defs/core::option::Option<[f32; 4]>" + } + } + }, + "required": [ + "hide_mesh" + ], + "short_name": "DebugRender", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::debug_render::configuration::PhysicsGizmos": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::debug_render::configuration::PhysicsGizmos", + "properties": { + "aabb_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "axis_lengths": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "collider_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "contact_normal_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "contact_normal_scale": { + "type": { + "$ref": "#/$defs/avian3d::debug_render::configuration::ContactGizmoScale" + } + }, + "contact_point_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "hide_meshes": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "joint_anchor_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "joint_separation_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "raycast_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "raycast_normal_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "raycast_point_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "shapecast_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "shapecast_normal_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "shapecast_point_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "shapecast_shape_color": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "sleeping_color_multiplier": { + "type": { + "$ref": "#/$defs/core::option::Option<[f32; 4]>" + } + } + }, + "required": [ + "contact_normal_scale", + "hide_meshes" + ], + "short_name": "PhysicsGizmos", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::ccd::SpeculativeMargin": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::ccd::SpeculativeMargin", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "SpeculativeMargin", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::ccd::SweepMode": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::dynamics::ccd::SweepMode", + "oneOf": [ + "Linear", + "NonLinear" + ], + "short_name": "SweepMode", + "type": "string", + "typeInfo": "Enum" + }, + "avian3d::dynamics::ccd::SweptCcd": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::ccd::SweptCcd", + "properties": { + "angular_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "include_dynamic": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "linear_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "mode": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::ccd::SweepMode" + } + } + }, + "required": [ + "mode", + "include_dynamic", + "linear_threshold", + "angular_threshold" + ], + "short_name": "SweptCcd", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::integrator::Gravity": { + "isComponent": false, + "isResource": true, + "items": false, + "long_name": "avian3d::dynamics::integrator::Gravity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "Gravity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::AccumulatedTranslation": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::AccumulatedTranslation", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "AccumulatedTranslation", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::AngularDamping": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::AngularDamping", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "AngularDamping", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::AngularVelocity": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::AngularVelocity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "AngularVelocity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::CoefficientCombine": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::CoefficientCombine", + "oneOf": [ + "Average", + "Min", + "Multiply", + "Max" + ], + "short_name": "CoefficientCombine", + "type": "string", + "typeInfo": "Enum" + }, + "avian3d::dynamics::rigid_body::Dominance": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::Dominance", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/i8" + } + } + ], + "short_name": "Dominance", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::Friction": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::Friction", + "properties": { + "combine_rule": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::CoefficientCombine" + } + }, + "dynamic_coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "static_coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "dynamic_coefficient", + "static_coefficient", + "combine_rule" + ], + "short_name": "Friction", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::GravityScale": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::GravityScale", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "GravityScale", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::LinearDamping": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::LinearDamping", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "LinearDamping", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::LinearVelocity": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::LinearVelocity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "LinearVelocity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::PreSolveAngularVelocity": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::PreSolveAngularVelocity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "PreSolveAngularVelocity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::PreSolveLinearVelocity": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::PreSolveLinearVelocity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "PreSolveLinearVelocity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::Restitution": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::Restitution", + "properties": { + "coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "combine_rule": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::CoefficientCombine" + } + } + }, + "required": [ + "coefficient", + "combine_rule" + ], + "short_name": "Restitution", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::RigidBody": { + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::RigidBody", + "oneOf": [ + "Dynamic", + "Static", + "Kinematic" + ], + "short_name": "RigidBody", + "type": "string", + "typeInfo": "Enum" + }, + "avian3d::dynamics::rigid_body::Sleeping": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::Sleeping", + "properties": {}, + "required": [], + "short_name": "Sleeping", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::SleepingDisabled": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::SleepingDisabled", + "properties": {}, + "required": [], + "short_name": "SleepingDisabled", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::TimeSleeping": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::TimeSleeping", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "TimeSleeping", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::forces::ExternalAngularImpulse": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::forces::ExternalAngularImpulse", + "properties": { + "impulse": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "persistent": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "impulse", + "persistent" + ], + "short_name": "ExternalAngularImpulse", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::forces::ExternalForce": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::forces::ExternalForce", + "properties": { + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "persistent": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "force", + "persistent", + "torque" + ], + "short_name": "ExternalForce", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::forces::ExternalImpulse": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::forces::ExternalImpulse", + "properties": { + "angular_impulse": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "impulse": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "persistent": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "impulse", + "persistent", + "angular_impulse" + ], + "short_name": "ExternalImpulse", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::forces::ExternalTorque": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::forces::ExternalTorque", + "properties": { + "persistent": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "torque", + "persistent" + ], + "short_name": "ExternalTorque", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::locked_axes::LockedAxes": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::locked_axes::LockedAxes", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u8" + } + } + ], + "short_name": "LockedAxes", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::CenterOfMass": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::CenterOfMass", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "CenterOfMass", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::ColliderDensity": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::ColliderDensity", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "ColliderDensity", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::ColliderMassProperties": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::ColliderMassProperties", + "properties": { + "center_of_mass": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::CenterOfMass" + } + }, + "inertia": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::Inertia" + } + }, + "inverse_inertia": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::InverseInertia" + } + }, + "inverse_mass": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::InverseMass" + } + }, + "mass": { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::Mass" + } + } + }, + "required": [ + "mass", + "inverse_mass", + "inertia", + "inverse_inertia", + "center_of_mass" + ], + "short_name": "ColliderMassProperties", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::rigid_body::mass_properties::Inertia": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::Inertia", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Mat3" + } + } + ], + "short_name": "Inertia", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::InverseInertia": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::InverseInertia", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Mat3" + } + } + ], + "short_name": "InverseInertia", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::InverseMass": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::InverseMass", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "InverseMass", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::rigid_body::mass_properties::Mass": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::rigid_body::mass_properties::Mass", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "Mass", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::sleeping::DeactivationTime": { + "isComponent": false, + "isResource": false, + "items": false, + "long_name": "avian3d::dynamics::sleeping::DeactivationTime", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/f32" + } + } + ], + "short_name": "DeactivationTime", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::dynamics::sleeping::SleepingThreshold": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "avian3d::dynamics::sleeping::SleepingThreshold", + "properties": { + "angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "linear": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "linear", + "angular" + ], + "short_name": "SleepingThreshold", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::SolverConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "avian3d::dynamics::solver::SolverConfig", + "properties": { + "contact_damping_ratio": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "contact_frequency_factor": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "max_overlap_solve_speed": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "restitution_iterations": { + "type": { + "$ref": "#/$defs/usize" + } + }, + "restitution_threshold": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "warm_start_coefficient": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "contact_damping_ratio", + "contact_frequency_factor", + "max_overlap_solve_speed", + "warm_start_coefficient", + "restitution_threshold", + "restitution_iterations" + ], + "short_name": "SolverConfig", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::AngleLimit": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::AngleLimit", + "properties": { + "max": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "min": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "min", + "max" + ], + "short_name": "AngleLimit", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::DistanceLimit": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::DistanceLimit", + "properties": { + "max": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "min": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "min", + "max" + ], + "short_name": "DistanceLimit", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::distance::DistanceJoint": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::distance::DistanceJoint", + "properties": { + "compliance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_linear": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "entity1": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "entity2": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "length_limits": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "local_anchor1": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor2": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "rest_length": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "entity1", + "entity2", + "local_anchor1", + "local_anchor2", + "rest_length", + "damping_linear", + "damping_angular", + "lagrange", + "compliance", + "force" + ], + "short_name": "DistanceJoint", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::fixed::FixedJoint": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::fixed::FixedJoint", + "properties": { + "align_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "align_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "compliance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_linear": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "entity1": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "entity2": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor1": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor2": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "position_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "entity1", + "entity2", + "local_anchor1", + "local_anchor2", + "damping_linear", + "damping_angular", + "position_lagrange", + "align_lagrange", + "compliance", + "force", + "align_torque" + ], + "short_name": "FixedJoint", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::prismatic::PrismaticJoint": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::prismatic::PrismaticJoint", + "properties": { + "align_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "align_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "compliance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_linear": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "entity1": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "entity2": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "free_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "free_axis_limits": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "local_anchor1": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor2": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "position_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "entity1", + "entity2", + "local_anchor1", + "local_anchor2", + "free_axis", + "damping_linear", + "damping_angular", + "position_lagrange", + "align_lagrange", + "compliance", + "force", + "align_torque" + ], + "short_name": "PrismaticJoint", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::revolute::RevoluteJoint": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::revolute::RevoluteJoint", + "properties": { + "align_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "align_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "aligned_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "angle_limit": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "angle_limit_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "angle_limit_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "compliance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_linear": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "entity1": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "entity2": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor1": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor2": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "position_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + } + }, + "required": [ + "entity1", + "entity2", + "local_anchor1", + "local_anchor2", + "aligned_axis", + "damping_linear", + "damping_angular", + "position_lagrange", + "align_lagrange", + "angle_limit_lagrange", + "compliance", + "force", + "align_torque", + "angle_limit_torque" + ], + "short_name": "RevoluteJoint", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::dynamics::solver::joints::spherical::SphericalJoint": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::dynamics::solver::joints::spherical::SphericalJoint", + "properties": { + "compliance": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_angular": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "damping_linear": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "entity1": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "entity2": { + "type": { + "$ref": "#/$defs/bevy_ecs::entity::Entity" + } + }, + "force": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor1": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "local_anchor2": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "position_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "swing_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "swing_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "swing_limit": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "swing_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "twist_axis": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "twist_lagrange": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "twist_limit": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + }, + "twist_torque": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + }, + "required": [ + "entity1", + "entity2", + "local_anchor1", + "local_anchor2", + "swing_axis", + "twist_axis", + "damping_linear", + "damping_angular", + "position_lagrange", + "swing_lagrange", + "twist_lagrange", + "compliance", + "force", + "swing_torque", + "twist_torque" + ], + "short_name": "SphericalJoint", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::position::Position": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::position::Position", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "Position", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::position::PreSolveAccumulatedTranslation": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::position::PreSolveAccumulatedTranslation", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "PreSolveAccumulatedTranslation", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::position::PreviousRotation": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::position::PreviousRotation", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::position::Rotation" + } + } + ], + "short_name": "PreviousRotation", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::position::Rotation": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::position::Rotation", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Quat" + } + } + ], + "short_name": "Rotation", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::prepare::PrepareConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "avian3d::prepare::PrepareConfig", + "properties": { + "position_to_transform": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "transform_to_position": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "position_to_transform", + "transform_to_position" + ], + "short_name": "PrepareConfig", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::schedule::SubstepCount": { + "isComponent": false, + "isResource": true, + "items": false, + "long_name": "avian3d::schedule::SubstepCount", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/u32" + } + } + ], + "short_name": "SubstepCount", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::schedule::time::Physics": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::schedule::time::Physics", + "properties": { + "paused": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "relative_speed": { + "type": { + "$ref": "#/$defs/f64" + } + }, + "timestep_mode": { + "type": { + "$ref": "#/$defs/avian3d::schedule::time::TimestepMode" + } + } + }, + "required": [ + "timestep_mode", + "paused", + "relative_speed" + ], + "short_name": "Physics", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::schedule::time::Substeps": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::schedule::time::Substeps", + "properties": {}, + "required": [], + "short_name": "Substeps", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::schedule::time::TimestepMode": { + "isComponent": false, + "isResource": false, + "long_name": "avian3d::schedule::time::TimestepMode", + "oneOf": [ + { + "additionalProperties": false, + "long_name": "Fixed", + "properties": { + "delta": { + "long_name": "delta", + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "max_delta_overstep": { + "long_name": "max_delta_overstep", + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + }, + "overstep": { + "long_name": "overstep", + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "delta", + "overstep", + "max_delta_overstep" + ], + "short_name": "Fixed", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "FixedOnce", + "properties": { + "delta": { + "long_name": "delta", + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "delta" + ], + "short_name": "FixedOnce", + "type": "object", + "typeInfo": "Struct" + }, + { + "additionalProperties": false, + "long_name": "Variable", + "properties": { + "max_delta": { + "long_name": "max_delta", + "type": { + "$ref": "#/$defs/bevy_utils::Duration" + } + } + }, + "required": [ + "max_delta" + ], + "short_name": "Variable", + "type": "object", + "typeInfo": "Struct" + } + ], + "short_name": "TimestepMode", + "type": "object", + "typeInfo": "Enum" + }, + "avian3d::spatial_query::query_filter::SpatialQueryFilter": { + "additionalProperties": false, + "isComponent": false, + "isResource": false, + "long_name": "avian3d::spatial_query::query_filter::SpatialQueryFilter", + "properties": { + "excluded_entities": { + "type": { + "$ref": "#/$defs/bevy_utils::hashbrown::HashSet" + } + }, + "mask": { + "type": { + "$ref": "#/$defs/avian3d::collision::layers::LayerMask" + } + } + }, + "required": [ + "mask", + "excluded_entities" + ], + "short_name": "SpatialQueryFilter", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::spatial_query::ray_caster::RayCaster": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::spatial_query::ray_caster::RayCaster", + "properties": { + "direction": { + "type": { + "$ref": "#/$defs/bevy_math::direction::Dir3" + } + }, + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "global_direction": { + "type": { + "$ref": "#/$defs/bevy_math::direction::Dir3" + } + }, + "global_origin": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "ignore_self": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "max_hits": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "max_time_of_impact": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "origin": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "query_filter": { + "type": { + "$ref": "#/$defs/avian3d::spatial_query::query_filter::SpatialQueryFilter" + } + }, + "solid": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "enabled", + "origin", + "global_origin", + "direction", + "global_direction", + "max_time_of_impact", + "max_hits", + "solid", + "ignore_self", + "query_filter" + ], + "short_name": "RayCaster", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::spatial_query::shape_caster::ShapeCaster": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::spatial_query::shape_caster::ShapeCaster", + "properties": { + "direction": { + "type": { + "$ref": "#/$defs/bevy_math::direction::Dir3" + } + }, + "enabled": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "global_direction": { + "type": { + "$ref": "#/$defs/bevy_math::direction::Dir3" + } + }, + "global_origin": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "global_shape_rotation": { + "type": { + "$ref": "#/$defs/glam::Quat" + } + }, + "ignore_origin_penetration": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "ignore_self": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "max_hits": { + "type": { + "$ref": "#/$defs/u32" + } + }, + "max_time_of_impact": { + "type": { + "$ref": "#/$defs/f32" + } + }, + "origin": { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + }, + "query_filter": { + "type": { + "$ref": "#/$defs/avian3d::spatial_query::query_filter::SpatialQueryFilter" + } + }, + "shape_rotation": { + "type": { + "$ref": "#/$defs/glam::Quat" + } + } + }, + "required": [ + "enabled", + "origin", + "global_origin", + "shape_rotation", + "global_shape_rotation", + "direction", + "global_direction", + "max_time_of_impact", + "max_hits", + "ignore_origin_penetration", + "ignore_self", + "query_filter" + ], + "short_name": "ShapeCaster", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::sync::PreviousGlobalTransform": { + "isComponent": true, + "isResource": false, + "items": false, + "long_name": "avian3d::sync::PreviousGlobalTransform", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/bevy_transform::components::global_transform::GlobalTransform" + } + } + ], + "short_name": "PreviousGlobalTransform", + "type": "array", + "typeInfo": "TupleStruct" + }, + "avian3d::sync::SyncConfig": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "avian3d::sync::SyncConfig", + "properties": { + "position_to_transform": { + "type": { + "$ref": "#/$defs/bool" + } + }, + "transform_to_position": { + "type": { + "$ref": "#/$defs/bool" + } + } + }, + "required": [ + "position_to_transform", + "transform_to_position" + ], + "short_name": "SyncConfig", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::sync::ancestor_marker::AncestorMarker": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::sync::ancestor_marker::AncestorMarker", + "properties": {}, + "required": [], + "short_name": "AncestorMarker", + "type": "object", + "typeInfo": "Struct" + }, + "avian3d::sync::ancestor_marker::AncestorMarker": { + "additionalProperties": false, + "isComponent": true, + "isResource": false, + "long_name": "avian3d::sync::ancestor_marker::AncestorMarker", + "properties": {}, + "required": [], + "short_name": "AncestorMarker", + "type": "object", + "typeInfo": "Struct" + }, "bevy_animation::AnimationClip": { "additionalProperties": false, "isComponent": false, @@ -6700,6 +9578,22 @@ "type": "string", "typeInfo": "Enum" }, + "bevy_math::direction::Dir3": { + "isComponent": false, + "isResource": false, + "items": false, + "long_name": "bevy_math::direction::Dir3", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "Dir3", + "type": "array", + "typeInfo": "TupleStruct" + }, "bevy_math::rects::rect::Rect": { "additionalProperties": false, "isComponent": false, @@ -9778,6 +12672,164 @@ "type": "object", "typeInfo": "Struct" }, + "bevy_time::time::Time": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "bevy_time::time::Time", + "properties": { + "context": { + "type": { + "$ref": "#/$defs/avian3d::schedule::time::Physics" + } + }, + "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", + "type": "object", + "typeInfo": "Struct" + }, + "bevy_time::time::Time": { + "additionalProperties": false, + "isComponent": false, + "isResource": true, + "long_name": "bevy_time::time::Time", + "properties": { + "context": { + "type": { + "$ref": "#/$defs/avian3d::schedule::time::Substeps" + } + }, + "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", + "type": "object", + "typeInfo": "Struct" + }, "bevy_time::time::Time": { "additionalProperties": false, "isComponent": false, @@ -11385,6 +14437,24 @@ } } }, + "bevy_utils::hashbrown::HashMap, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>": { + "isComponent": false, + "isResource": false, + "keyType": { + "type": { + "$ref": "#/$defs/alloc::string::String" + } + }, + "long_name": "bevy_utils::hashbrown::HashMap, bevy_utils::hashbrown::hash_map::DefaultHashBuilder>", + "short_name": "HashMap, DefaultHashBuilder>", + "type": "object", + "typeInfo": "Map", + "valueType": { + "type": { + "$ref": "#/$defs/core::option::Option" + } + } + }, "bevy_utils::hashbrown::HashMap": { "isComponent": false, "isResource": false, @@ -11565,6 +14635,14 @@ } } }, + "bevy_utils::hashbrown::HashSet": { + "isComponent": false, + "isResource": false, + "long_name": "bevy_utils::hashbrown::HashSet", + "short_name": "HashSet", + "type": "object", + "typeInfo": "Value" + }, "bevy_window::cursor::CursorIcon": { "isComponent": false, "isResource": false, @@ -13118,6 +16196,33 @@ "type": "object", "typeInfo": "Enum" }, + "core::option::Option<[f32; 4]>": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option<[f32; 4]>", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/[f32; 4]" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option<[f32; 4]>", + "type": "object", + "typeInfo": "Enum" + }, "core::option::Option": { "isComponent": false, "isResource": false, @@ -13145,6 +16250,33 @@ "type": "object", "typeInfo": "Enum" }, + "core::option::Option>": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option>", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/alloc::vec::Vec<[u32; 2]>" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option>", + "type": "object", + "typeInfo": "Enum" + }, "core::option::Option>": { "isComponent": false, "isResource": false, @@ -13172,6 +16304,168 @@ "type": "object", "typeInfo": "Enum" }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::constructor::ColliderConstructor" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::collider::constructor::ColliderConstructorHierarchyConfig" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::collision::layers::CollisionLayers" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::dynamics::rigid_body::mass_properties::ColliderDensity" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::dynamics::solver::joints::AngleLimit" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/avian3d::dynamics::solver::joints::DistanceLimit" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, "core::option::Option>": { "isComponent": false, "isResource": false, @@ -13766,6 +17060,33 @@ "type": "object", "typeInfo": "Enum" }, + "core::option::Option": { + "isComponent": false, + "isResource": false, + "long_name": "core::option::Option", + "oneOf": [ + { + "long_name": "None" + }, + { + "items": false, + "long_name": "Some", + "prefixItems": [ + { + "type": { + "$ref": "#/$defs/glam::Vec3" + } + } + ], + "short_name": "Some", + "type": "array", + "typeInfo": "Tuple" + } + ], + "short_name": "Option", + "type": "object", + "typeInfo": "Enum" + }, "core::option::Option": { "isComponent": false, "isResource": false, diff --git a/src/char_controller.rs b/src/char_controller.rs new file mode 100644 index 0000000..5a4fa6c --- /dev/null +++ b/src/char_controller.rs @@ -0,0 +1,450 @@ +use avian3d::{math::*, prelude::*}; +use bevy::{ecs::query::Has, prelude::*, window::PrimaryWindow}; + +pub struct CharacterControllerPlugin; + +impl Plugin for CharacterControllerPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems( + Update, + ( + (keyboard_input, cursor_input), + update_grounded, + apply_gravity, + movement, + apply_movement_damping, + ) + .chain(), + ) + .add_systems( + // Run collision handling after collision detection. + // + // NOTE: The collision implementation here is very basic and a bit buggy. + // A collide-and-slide algorithm would likely work better. + PostProcessCollisions, + kinematic_controller_collisions, + ); + } +} + +/// An event sent for a movement input action. +#[derive(Event)] +pub enum MovementAction { + Move(Vector2), + Rotate(Vec2), + Jump, +} + +/// A marker component indicating that an entity is using a character controller. +#[derive(Component)] +pub struct CharacterController; + +/// A marker component indicating that an entity is on the ground. +#[derive(Component)] +#[component(storage = "SparseSet")] +pub struct Grounded; + +/// The acceleration used for character movement. +#[derive(Component)] +pub struct MovementAcceleration(Scalar); + +/// The damping factor used for slowing down movement. +#[derive(Component)] +pub struct MovementDampingFactor(Scalar); + +/// The strength of a jump. +#[derive(Component)] +pub struct JumpImpulse(Scalar); + +/// The gravitational acceleration used for a character controller. +#[derive(Component)] +pub struct ControllerGravity(Vector); + +/// The maximum angle a slope can have for a character controller +/// to be able to climb and jump. If the slope is steeper than this angle, +/// the character will slide down. +#[derive(Component)] +pub struct MaxSlopeAngle(Scalar); + +/// A bundle that contains the components needed for a basic +/// kinematic character controller. +#[derive(Bundle)] +pub struct CharacterControllerBundle { + character_controller: CharacterController, + rigid_body: RigidBody, + collider: Collider, + ground_caster: ShapeCaster, + gravity: ControllerGravity, + movement: MovementBundle, +} + +/// A bundle that contains components for character movement. +#[derive(Bundle)] +pub struct MovementBundle { + acceleration: MovementAcceleration, + damping: MovementDampingFactor, + jump_impulse: JumpImpulse, + max_slope_angle: MaxSlopeAngle, +} + +impl MovementBundle { + pub const fn new( + acceleration: Scalar, + damping: Scalar, + jump_impulse: Scalar, + max_slope_angle: Scalar, + ) -> Self { + Self { + acceleration: MovementAcceleration(acceleration), + damping: MovementDampingFactor(damping), + jump_impulse: JumpImpulse(jump_impulse), + max_slope_angle: MaxSlopeAngle(max_slope_angle), + } + } +} + +impl Default for MovementBundle { + fn default() -> Self { + Self::new(30.0, 0.9, 7.0, PI * 0.45) + } +} + +impl CharacterControllerBundle { + pub fn new(collider: Collider, gravity: Vector) -> Self { + // Create shape caster as a slightly smaller version of collider + let mut caster_shape = collider.clone(); + caster_shape.set_scale(Vector::ONE * 0.99, 10); + + Self { + character_controller: CharacterController, + rigid_body: RigidBody::Kinematic, + collider, + ground_caster: ShapeCaster::new( + caster_shape, + Vector::ZERO, + Quaternion::default(), + Dir3::NEG_Y, + ) + .with_max_time_of_impact(0.2), + gravity: ControllerGravity(gravity), + movement: MovementBundle::default(), + } + } + + pub fn with_movement( + mut self, + acceleration: Scalar, + damping: Scalar, + jump_impulse: Scalar, + max_slope_angle: Scalar, + ) -> Self { + self.movement = MovementBundle::new(acceleration, damping, jump_impulse, max_slope_angle); + self + } +} + +fn cursor_input( + mut q_windows: Query<&mut Window, With>, + mut ew_movement: EventWriter, +) { + let mut window = q_windows.single_mut(); + + let window_center = window.size() / 2.; + if let Some(cursor_pos) = window.cursor_position() { + let delta = cursor_pos - window_center; + if delta != Vec2::ZERO { + ew_movement.send(MovementAction::Rotate(delta)); + window.set_cursor_position(Some(window_center)); + } + } +} + +/// Sends [`MovementAction`] events based on keyboard input. +fn keyboard_input( + mut ew_movement: EventWriter, + keyboard_input: Res>, +) { + let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]); + let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]); + let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]); + let right = keyboard_input.any_pressed([KeyCode::KeyD, KeyCode::ArrowRight]); + + let horizontal = right as i8 - left as i8; + let vertical = up as i8 - down as i8; + let direction = Vector2::new(horizontal as Scalar, vertical as Scalar).clamp_length_max(1.0); + + if direction != Vector2::ZERO { + ew_movement.send(MovementAction::Move(direction)); + } + + if keyboard_input.just_pressed(KeyCode::Space) { + ew_movement.send(MovementAction::Jump); + } +} + +/// Updates the [`Grounded`] status for character controllers. +fn update_grounded( + mut commands: Commands, + mut query: Query< + (Entity, &ShapeHits, &Rotation, Option<&MaxSlopeAngle>), + With, + >, +) { + for (entity, hits, rotation, max_slope_angle) in &mut query { + // The character is grounded if the shape caster has a hit with a normal + // that isn't too steep. + let is_grounded = hits.iter().any(|hit| { + if let Some(angle) = max_slope_angle { + (rotation * -hit.normal2).angle_between(Vector::Y).abs() <= angle.0 + } else { + true + } + }); + + if is_grounded { + commands.entity(entity).insert(Grounded); + } else { + commands.entity(entity).remove::(); + } + } +} + +/// Responds to [`MovementAction`] events and moves character controllers accordingly. +fn movement( + time: Res