diff --git a/Cargo.lock b/Cargo.lock index 6414f08..66b2e13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,10 @@ name = "accesskit" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" +dependencies = [ + "enumn", + "serde", +] [[package]] name = "accesskit_consumer" @@ -128,7 +132,7 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys 0.6.0+11769913", - "num_enum", + "num_enum 0.7.3", "thiserror 1.0.69", ] @@ -264,7 +268,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -302,7 +306,7 @@ checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -435,9 +439,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bevy" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5cd3b24a5adb7c7378da7b3eea47639877643d11b6b087fc8a8094f2528615" +checksum = "4b8369c16b7c017437021341521f8b4a0d98e1c70113fb358c3258ae7d661d79" dependencies = [ "bevy_dylib", "bevy_internal", @@ -485,27 +489,28 @@ checksum = "2656316165dbe2af6b3acaa763332f5dbdd12f809d59f5bf4304e0642a8005c9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_a11y" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ed969a58fbe449ef35ebec58ab19578302537f34ee8a35d04e5a038b3c40f5" +checksum = "ed3561712cf49074d89e9989bfc2e6c6add5d33288f689db9a0c333300d2d004" dependencies = [ "accesskit", "bevy_app", "bevy_derive", "bevy_ecs", "bevy_reflect", + "serde", ] [[package]] name = "bevy_app" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b6267ac23a9947d5b2725ff047a1e1add70076d85fa9fb73d044ab9bea1f3c" +checksum = "4491cc4c718ae76b4c6883df58b94cc88b32dcd894ea8d5b603c7c7da72ca967" dependencies = [ "bevy_derive", "bevy_ecs", @@ -541,9 +546,9 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0698040d63199391ea77fd02e039630748e3e335c3070c6d932fd96cbf80f5d6" +checksum = "f56111d9b88d8649f331a667d9d72163fb26bd09518ca16476d238653823db1e" dependencies = [ "async-broadcast", "async-fs", @@ -581,21 +586,21 @@ dependencies = [ [[package]] name = "bevy_asset_macros" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf8c00b5d532f8e5ac7b49af10602f9f7774a2d522cf0638323b5dfeee7b31c" +checksum = "a4cca3e67c0ec760d8889d42293d987ce5da92eaf9c592bf5d503728a63b276d" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_color" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf6a5ad35496bbc41713efbcf06ab72b9a310fabcab0f9db1debb56e8488c6e" +checksum = "5c101cbe1e26b8d701eb77263b14346e2e0cbbd2a6e254b9b1aead814e5ca8d3" dependencies = [ "bevy_math", "bevy_reflect", @@ -609,9 +614,9 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c2310717b9794e4a45513ee5946a7be0838852a4c1e185884195e1a8688ff3" +checksum = "59ed46363cad80dc00f08254c3015232bd6f640738403961c6d63e7ecfc61625" dependencies = [ "bevy_app", "bevy_asset", @@ -639,20 +644,20 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f626531b9c05c25a758ede228727bd11c2c2c8498ecbed9925044386d525a2a3" +checksum = "1b837bf6c51806b10ebfa9edf1844ad80a3a0760d6c5fac4e90761df91a8901a" dependencies = [ "bevy_macro_utils", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_diagnostic" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048a1ff3944a534b8472516866284181eef0a75b6dd4d39b6e5925715e350766" +checksum = "48797366f312a8f31e237d08ce3ee70162591282d2bfe7c5ad8be196fb263e55" dependencies = [ "bevy_app", "bevy_ecs", @@ -667,18 +672,18 @@ dependencies = [ [[package]] name = "bevy_dylib" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843c7ce266dfc46e49d01fbf9aa1829d33b70a1859b9ed6a526ac03070c52e97" +checksum = "1dc3602098b2604941b2829a04ac316de1e36aad949cbffce8861896b9b32532" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_ecs" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e807b5d9aab3bb8dfe47e7a44c9ff088bad2ceefe299b80ac77609a87fe9d4" +checksum = "3c2bf6521aae57a0ec3487c4bfb59e36c4a378e834b626a4bea6a885af2fdfe7" dependencies = [ "arrayvec", "bevy_ecs_macros", @@ -704,14 +709,14 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467d7bb98aeb8dd30f36e6a773000c12a891d4f1bee2adc3841ec89cc8eaf54e" +checksum = "38748d6f3339175c582d751f410fb60a93baf2286c3deb7efebb0878dce7f413" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -753,19 +758,45 @@ dependencies = [ [[package]] name = "bevy_encase_derive" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb31dc1090c6f8fabbf6b21994d19a12766e786885ee48ffc547f0f1fa7863" +checksum = "8148f4edee470a2ea5cad010184c492a4c94c36d7a7158ea28e134ea87f274ab" dependencies = [ "bevy_macro_utils", "encase_derive_impl", ] +[[package]] +name = "bevy_gaussian_splatting" +version = "5.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e362c56b856723cca44f62a3cc01b3e6e6d4c6399f5f04ccffbaf4823ba09c23" +dependencies = [ + "bevy", + "bevy_args", + "bevy_interleave", + "bytemuck", + "clap", + "console_error_panic_hook", + "flexbuffers", + "half", + "ply-rs", + "rand", + "rayon", + "serde", + "serde_json", + "static_assertions", + "typenum", + "wasm-bindgen", + "web-sys", + "wgpu", +] + [[package]] name = "bevy_gizmos" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54af8145b35ab2a830a6dd1058e23c1e1ddc4b893db79d295259ef82f51c7520" +checksum = "7823154a9682128c261d8bddb3a4d7192a188490075c527af04520c2f0f8aad6" dependencies = [ "bevy_app", "bevy_asset", @@ -788,21 +819,21 @@ dependencies = [ [[package]] name = "bevy_gizmos_macros" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40137ace61f092b7a09eba41d7d1e6aef941f53a7818b06ef86dcce7b6a1fd3f" +checksum = "f378f3b513218ddc78254bbe76536d9de59c1429ebd0c14f5d8f2a25812131ad" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_gltf" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa25b809ee024ef2682bafc1ca22ca8275552edb549dc6f69a030fdffd976c63" +checksum = "10a080237c0b8842ccc15a06d3379302c68580eeea4497b1c7387e470eda1f07" dependencies = [ "base64 0.22.1", "bevy_app", @@ -834,9 +865,9 @@ dependencies = [ [[package]] name = "bevy_image" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "840b25f7f58894c641739f756959028a04f519c448db7e2cd3e2e29fc5fd188d" +checksum = "65e6e900cfecadbc3149953169e36b9e26f922ed8b002d62339d8a9dc6129328" dependencies = [ "bevy_app", "bevy_asset", @@ -862,9 +893,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763410715714f3d4d2dcdf077af276e2e4ea93fd8081b183d446d060ea95baaa" +checksum = "18d6b6516433f6f7d680f648d04eb1866bb3927a1782d52f74831b62042f3cd1" dependencies = [ "bevy_app", "bevy_ecs", @@ -874,15 +905,16 @@ dependencies = [ "bevy_utils", "derive_more", "log", + "serde", "smol_str", "thiserror 2.0.12", ] [[package]] name = "bevy_input_focus" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e7b4ed65e10927a39a987cf85ef98727dd319aafb6e6835f2cb05b883c6d66" +checksum = "2e2d079fda74d1416e0a57dac29ea2b79ff77f420cd6b87f833d3aa29a46bc4d" dependencies = [ "bevy_app", "bevy_ecs", @@ -894,11 +926,54 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "bevy_interleave" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bfe1f7e02a4113fd2ee3be2cbc7647234a9e84d5f176d562e74c0b9fc77dcba" +dependencies = [ + "bevy", + "bevy_interleave_interface", + "bevy_interleave_macros", + "bytemuck", + "console_error_panic_hook", + "serde", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_interleave_interface" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85dfed00d02ff904f9140e2f7e65a2a3a1dd57323d9be95799ea7712bb784522" +dependencies = [ + "bevy", +] + +[[package]] +name = "bevy_interleave_macros" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2f1c9a83705a01dc2968dd3e8860073ba106c6f9198b9c6e8bee6d19f90e65" +dependencies = [ + "bevy", + "bevy_interleave_interface", + "bytemuck", + "convert_case", + "proc-macro2", + "quote", + "sha1", + "syn 2.0.101", + "wgpu", +] + [[package]] name = "bevy_internal" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "526ffd64c58004cb97308826e896c07d0e23dc056c243b97492e31cdf72e2830" +checksum = "857da8785678fde537d02944cd20dec9cafb7d4c447efe15f898dc60e733cacd" dependencies = [ "bevy_a11y", "bevy_app", @@ -935,9 +1010,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7156df8d2f11135cf71c03eb4c11132b65201fd4f51648571e59e39c9c9ee2f6" +checksum = "d7a61ee8aef17a974f5ca481dcedf0c2bd52670e231d4c4bc9ddef58328865f9" dependencies = [ "android_log-sys", "bevy_app", @@ -952,22 +1027,22 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2473db70d8785b5c75d6dd951a2e51e9be2c2311122db9692c79c9d887517b" +checksum = "052eeebcb8e7e072beea5031b227d9a290f8a7fbbb947573ab6ec81df0fb94be" dependencies = [ "parking_lot", "proc-macro2", "quote", - "syn", - "toml_edit", + "syn 2.0.101", + "toml_edit 0.22.25", ] [[package]] name = "bevy_math" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a3a926d02dc501c6156a047510bdb538dcb1fa744eeba13c824b73ba88de55" +checksum = "68553e0090fe9c3ba066c65629f636bd58e4ebd9444fdba097b91af6cd3e243f" dependencies = [ "approx", "bevy_reflect", @@ -985,9 +1060,9 @@ dependencies = [ [[package]] name = "bevy_mesh" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12af58280c7453e32e2f083d86eaa4c9b9d03ea8683977108ded8f1930c539f2" +checksum = "b10399c7027001edbc0406d7d0198596b1f07206c1aae715274106ba5bdcac40" dependencies = [ "bevy_asset", "bevy_derive", @@ -1010,9 +1085,9 @@ dependencies = [ [[package]] name = "bevy_mikktspace" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e0258423c689f764556e36b5d9eebdbf624b29a1fd5b33cd9f6c42dcc4d5f3" +checksum = "8bb60c753b968a2de0fd279b76a3d19517695e771edb4c23575c7f92156315de" dependencies = [ "glam", ] @@ -1029,9 +1104,9 @@ dependencies = [ [[package]] name = "bevy_pbr" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fe0de43b68bf9e5090a33efc963f125e9d3f9d97be9ebece7bcfdde1b6da80" +checksum = "d5e0b4eb871f364a0d217f70f6c41d7fdc6f9f931fa1abbf222180c03d0ae410" dependencies = [ "bevy_app", "bevy_asset", @@ -1086,9 +1161,9 @@ dependencies = [ [[package]] name = "bevy_platform" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704db2c11b7bc31093df4fbbdd3769f9606a6a5287149f4b51f2680f25834ebc" +checksum = "f7573dc824a1b08b4c93fdbe421c53e1e8188e9ca1dd74a414455fe571facb47" dependencies = [ "cfg-if", "critical-section", @@ -1104,15 +1179,15 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f1275dfb4cfef4ffc90c3fa75408964864facf833acc932413d52aa5364ba4" +checksum = "df7370d0e46b60e071917711d0860721f5347bc958bf325975ae6913a5dfcf01" [[package]] name = "bevy_reflect" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607ebacc31029cf2f39ac330eabf1d4bc411b159528ec08dbe6b0593eaccfd41" +checksum = "daeb91a63a1a4df00aa58da8cc4ddbd4b9f16ab8bb647c5553eb156ce36fa8c2" dependencies = [ "assert_type_match", "bevy_platform", @@ -1136,22 +1211,22 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf35e45e4eb239018369f63f2adc2107a54c329f9276d020e01eee1625b0238b" +checksum = "40ddadc55fe16b45faaa54ab2f9cb00548013c74812e8b018aa172387103cce6" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", "uuid", ] [[package]] name = "bevy_render" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a7306235b3343b032801504f3e884b93abfb7ba58179fc555c479df509f349" +checksum = "ef91fed1f09405769214b99ebe4390d69c1af5cdd27967deae9135c550eb1667" dependencies = [ "async-channel", "bevy_app", @@ -1201,21 +1276,21 @@ dependencies = [ [[package]] name = "bevy_render_macros" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85c4fb26b66d3a257b655485d11b9b6df9d3c85026493ba8092767a5edfc1b2" +checksum = "abd42cf6c875bcf38da859f8e731e119a6aff190d41dd0a1b6000ad57cf2ed3d" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_scene" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b628f560f2d2fe9f35ecd4526627ba3992f082de03fd745536e4053a0266fe" +checksum = "5c52ca165200995fe8afd2a1a6c03e4ffee49198a1d4653d32240ea7f217d4ab" dependencies = [ "bevy_app", "bevy_asset", @@ -1234,9 +1309,9 @@ dependencies = [ [[package]] name = "bevy_sprite" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01f97bf54fb1c37a1077139b59bb32bc77f7ca53149cfcaa512adbb69a2d492c" +checksum = "6ccae7bab2cb956fb0434004c359e432a3a1a074a6ef4eb471f1fb099f0b620b" dependencies = [ "bevy_app", "bevy_asset", @@ -1262,9 +1337,9 @@ dependencies = [ [[package]] name = "bevy_state" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" +checksum = "155d3cd97b900539008cdcaa702f88b724d94b08977b8e591a32536ce66faa8c" dependencies = [ "bevy_app", "bevy_ecs", @@ -1278,21 +1353,21 @@ dependencies = [ [[package]] name = "bevy_state_macros" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b4bf3970c4f0e60572901df4641656722172c222d71a80c430d36b0e31426c" +checksum = "2481c1304fd2a1851a0d4cb63a1ce6421ae40f3f0117cbc9882963ee4c9bb609" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "bevy_tasks" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444c450b65e108855f42ecb6db0c041a56ea7d7f10cc6222f0ca95e9536a7d19" +checksum = "5b674242641cab680688fc3b850243b351c1af49d4f3417a576debd6cca8dcf5" dependencies = [ "async-channel", "async-executor", @@ -1312,9 +1387,9 @@ dependencies = [ [[package]] name = "bevy_text" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef071262c5a9afbc39caba4c0b282c7d045fbb5cf33bdab1924bd2343403833" +checksum = "1d76c85366159f5f54110f33321c76d8429cfd8f39638f26793a305dae568b60" dependencies = [ "bevy_app", "bevy_asset", @@ -1342,9 +1417,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" +checksum = "bc98eb356c75be04fbbc77bb3d8ffa24c8bacd99f76111cee23d444be6ac8c9c" dependencies = [ "bevy_app", "bevy_ecs", @@ -1357,9 +1432,9 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8479cdd5461246943956a7c8347e4e5d6ff857e57add889fb50eee0b5c26ab48" +checksum = "df218e440bb9a19058e1b80a68a031c887bcf7bd3a145b55f361359a2fa3100d" dependencies = [ "bevy_app", "bevy_ecs", @@ -1375,9 +1450,9 @@ dependencies = [ [[package]] name = "bevy_ui" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110dc5d0059f112263512be8cd7bfe0466dfb7c26b9bf4c74529355249fd23f9" +checksum = "ea4a4d2ba51865bc3039af29a26b4f52c48b54cc758369f52004caf4b6f03770" dependencies = [ "accesskit", "bevy_a11y", @@ -1401,6 +1476,7 @@ dependencies = [ "bytemuck", "derive_more", "nonmax", + "serde", "smallvec", "taffy", "thiserror 2.0.12", @@ -1409,9 +1485,9 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2da3b3c1f94dadefcbe837aaa4aa119fcea37f7bdc5307eb05b4ede1921e24" +checksum = "94f7a8905a125d2017e8561beefb7f2f5e67e93ff6324f072ad87c5fd6ec3b99" dependencies = [ "bevy_platform", "thread_local", @@ -1419,9 +1495,9 @@ dependencies = [ [[package]] name = "bevy_window" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d83327cc5584da463d12b7a88ddb97f9e006828832287e1564531171fffdeb4" +checksum = "df7e8ad0c17c3cc23ff5566ae2905c255e6986037fb041f74c446216f5c38431" dependencies = [ "android-activity", "bevy_app", @@ -1439,9 +1515,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b14928923ae4274f4b867dce3d0e7b2c8a31bebcb0f6e65a4261c3e0765064" +checksum = "6a5e7f00c6b3b6823df5ec2a5e9067273607208919bc8c211773ebb9643c87f0" dependencies = [ "accesskit", "accesskit_winit", @@ -1462,6 +1538,7 @@ dependencies = [ "cfg-if", "crossbeam-channel", "raw-window-handle", + "serde", "tracing", "wasm-bindgen", "web-sys", @@ -1495,13 +1572,15 @@ dependencies = [ [[package]] name = "bevy_zeroverse" -version = "0.13.3" +version = "0.14.0" dependencies = [ "bevy", "bevy-inspector-egui", "bevy_args", "bevy_egui", + "bevy_gaussian_splatting", "bevy_panorbit_camera", + "bytemuck", "clap", "console_error_panic_hook", "criterion", @@ -1556,7 +1635,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 2.0.101", ] [[package]] @@ -1635,6 +1714,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block2" version = "0.5.1" @@ -1669,11 +1757,17 @@ version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" dependencies = [ "bytemuck_derive", ] @@ -1686,7 +1780,7 @@ checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1716,7 +1810,7 @@ dependencies = [ "bitflags 2.9.0", "log", "polling", - "rustix", + "rustix 0.38.44", "slab", "thiserror 1.0.69", ] @@ -1728,11 +1822,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", - "rustix", + "rustix 0.38.44", "wayland-backend", "wayland-client", ] +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + [[package]] name = "cast" version = "0.3.0" @@ -1865,7 +1990,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1968,6 +2093,15 @@ dependencies = [ "const_soft_float", ] +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -2041,6 +2175,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -2052,25 +2195,22 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -2141,6 +2281,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "ctrlc" version = "3.4.6" @@ -2180,10 +2330,20 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "unicode-xid", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -2208,7 +2368,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2321,7 +2481,18 @@ checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -2373,6 +2544,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + [[package]] name = "error-code" version = "3.3.1" @@ -2455,6 +2635,19 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flexbuffers" +version = "25.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935627e7bc8f083035d9faad09ffaed9128f73fb1f74a8798f115749c43378e8" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "num_enum 0.5.11", + "serde", + "serde_derive", +] + [[package]] name = "foldhash" version = "0.1.5" @@ -2511,7 +2704,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2583,6 +2776,16 @@ dependencies = [ "thread_local", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "gethostname" version = "0.4.3" @@ -2690,7 +2893,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2789,6 +2992,7 @@ checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", + "serde", ] [[package]] @@ -2834,12 +3038,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" -[[package]] -name = "hermit-abi" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" - [[package]] name = "hexasphere" version = "15.1.0" @@ -2981,7 +3179,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -3084,18 +3282,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi 0.5.0", - "libc", - "windows-sys 0.59.0", + "syn 2.0.101", ] [[package]] @@ -3275,12 +3462,24 @@ dependencies = [ "redox_syscall 0.5.11", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "litemap" version = "0.7.5" @@ -3481,7 +3680,7 @@ dependencies = [ "jni-sys", "log", "ndk-sys 0.6.0+11769913", - "num_enum", + "num_enum 0.7.3", "raw-window-handle", "thiserror 1.0.69", ] @@ -3604,7 +3803,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -3637,13 +3836,34 @@ dependencies = [ "libm", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.7.3", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -3652,10 +3872,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -4027,6 +4247,33 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "peg" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f76678828272f177ac33b7e2ac2e3e73cc6c1cd1e3e387928aa69562fa51367" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "636d60acf97633e48d266d7415a9355d4389cea327a193f87df395d88cd2b14d" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555b1514d2d99d78150d3c799d4c357a3e2c2a8062cd108e93a06d9057629c5" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4050,7 +4297,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -4104,6 +4351,18 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "ply-rs" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbadf9cb4a79d516de4c64806fe64ffbd8161d1ac685d000be789fb628b88963" +dependencies = [ + "byteorder", + "linked-hash-map", + "peg", + "skeptic", +] + [[package]] name = "png" version = "0.17.16" @@ -4125,9 +4384,9 @@ checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] @@ -4184,7 +4443,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", ] [[package]] @@ -4193,7 +4462,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit", + "toml_edit 0.22.25", ] [[package]] @@ -4221,7 +4490,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.9.0", + "memchr", + "unicase", ] [[package]] @@ -4282,7 +4562,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -4295,7 +4575,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -4609,7 +4889,20 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -4701,6 +4994,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + [[package]] name = "send_wrapper" version = "0.6.0" @@ -4724,7 +5026,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -4748,6 +5050,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -4778,6 +5091,21 @@ dependencies = [ "quote", ] +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "skrifa" version = "0.26.6" @@ -4811,6 +5139,9 @@ name = "smallvec" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] [[package]] name = "smithay-client-toolkit" @@ -4825,7 +5156,7 @@ dependencies = [ "libc", "log", "memmap2", - "rustix", + "rustix 0.38.44", "thiserror 1.0.69", "wayland-backend", "wayland-client", @@ -4919,7 +5250,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.101", ] [[package]] @@ -4932,7 +5263,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.101", ] [[package]] @@ -4952,6 +5283,17 @@ dependencies = [ "zeno", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.101" @@ -4971,7 +5313,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5014,6 +5356,19 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix 1.0.8", + "windows-sys 0.59.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5049,7 +5404,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5060,7 +5415,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5153,7 +5508,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.25", ] [[package]] @@ -5165,6 +5520,17 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.22.25" @@ -5175,7 +5541,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.7.7", ] [[package]] @@ -5197,7 +5563,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5295,6 +5661,18 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -5427,7 +5805,7 @@ checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5489,7 +5867,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -5524,7 +5902,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5546,7 +5924,7 @@ checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs 1.2.1", - "rustix", + "rustix 0.38.44", "scoped-tls", "smallvec", "wayland-sys", @@ -5559,7 +5937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ "bitflags 2.9.0", - "rustix", + "rustix 0.38.44", "wayland-backend", "wayland-scanner", ] @@ -5581,7 +5959,7 @@ version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ - "rustix", + "rustix 0.38.44", "wayland-client", "xcursor", ] @@ -5862,7 +6240,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -5873,7 +6251,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -6132,7 +6510,7 @@ dependencies = [ "pin-project", "raw-window-handle", "redox_syscall 0.4.1", - "rustix", + "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit", "smol_str", @@ -6152,6 +6530,15 @@ dependencies = [ "xkbcommon-dl", ] +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.7.7" @@ -6204,7 +6591,7 @@ dependencies = [ "libc", "libloading", "once_cell", - "rustix", + "rustix 0.38.44", "x11rb-protocol", ] @@ -6271,7 +6658,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -6307,7 +6694,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -6318,7 +6705,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -6338,7 +6725,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -6361,7 +6748,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5aeef2e..d992553 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bevy_zeroverse" description = "bevy zeroverse synthetic dataset generator" -version = "0.13.3" +version = "0.14.0" edition = "2021" authors = ["mosure "] license = "MIT" @@ -48,6 +48,7 @@ default = [ multi_threaded = [ "bevy/multi_threaded", + "rayon", ] development = ["bevy/dynamic_linking"] @@ -60,12 +61,14 @@ python = ["extension-module", "pyo3", "webgpu"] viewer = [ "bevy_egui", + "bevy_gaussian_splatting", "bevy-inspector-egui", "bevy_panorbit_camera", "bevy/bevy_ui", ] web = [ + "rayon", "viewer", "webgpu", ] @@ -79,8 +82,10 @@ webgpu = [ [dependencies] bevy_args = "1.8" bevy_egui = { version = "0.34", optional = true } +bevy_gaussian_splatting = { version = "5.0", default-features = false, features = ["buffer_storage", "sh3", "io_flexbuffers", "io_ply", "planar", "sort_rayon"], optional = true } bevy-inspector-egui = { version = "0.31", optional = true } bevy_panorbit_camera = { version = "0.26", optional = true, features = ["bevy_egui"] } +bytemuck = { version = "1.23", features = ["derive"] } clap = { version = "4.5", features = ["derive"] } futures-intrusive = "0.5" glob = "0.3" @@ -88,7 +93,7 @@ itertools = "0.14" noise = { version = "0.9" } pollster = "0.4" pyo3 = { version = "0.23", features = ["macros"], optional = true } -rand = "0.8" +rand = { version = "0.8", features = ["small_rng"] } rayon = { version = "1.10", optional = true } serde = "1.0" strum = "0.27" @@ -133,8 +138,7 @@ features = [ [dev-dependencies] -criterion = { version = "0.5", features = ["html_reports"] } -futures-intrusive = { version = "0.5.0" } +criterion = { version = "0.6", features = ["html_reports"] } pollster = { version = "0.4" } [profile.dev.package."*"] diff --git a/ffi/python/bevy_zeroverse_dataloader/__init__.py b/ffi/python/bevy_zeroverse_dataloader/__init__.py index 5a03f8f..7591136 100644 --- a/ffi/python/bevy_zeroverse_dataloader/__init__.py +++ b/ffi/python/bevy_zeroverse_dataloader/__init__.py @@ -214,6 +214,7 @@ class BevyZeroverseDataset(Dataset): 'normal': bevy_zeroverse_ffi.RenderMode.Normal, 'optical_flow': bevy_zeroverse_ffi.RenderMode.OpticalFlow, 'position': bevy_zeroverse_ffi.RenderMode.Position, + 'sdf': bevy_zeroverse_ffi.RenderMode.Sdf, 'semantic': bevy_zeroverse_ffi.RenderMode.Semantic, } diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index 7b43434..1fe35f6 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -167,6 +167,7 @@ impl Default for SamplerState { // RenderMode::Normal, // RenderMode::OpticalFlow, // RenderMode::Position, + // RenderMode::Sdf, ], step: 0, timesteps: vec![0.125], @@ -406,6 +407,7 @@ fn sample_stream( RenderMode::Normal => view.normal = image_data, RenderMode::OpticalFlow => view.optical_flow = image_data, RenderMode::Position => view.position = image_data, + RenderMode::Sdf => panic!("sdf rendering not supported"), RenderMode::Semantic => panic!("semantic rendering not supported"), } } diff --git a/src/camera.rs b/src/camera.rs index ff0cdef..01ab4f1 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -39,6 +39,7 @@ use bevy_args::{ Serialize, ValueEnum, }; +use bevy_gaussian_splatting::GaussianCamera; use rand::Rng; #[cfg(feature = "python")] @@ -814,6 +815,9 @@ fn insert_cameras( ..default() }, Exposure::INDOOR, + GaussianCamera { + warmup: true, + }, Projection::Perspective(zeroverse_camera.perspective_sampler.sample()), zeroverse_camera.override_transform.unwrap_or(zeroverse_camera.trajectory.sample(0.0)), MotionVectorPrepass, @@ -986,6 +990,9 @@ fn setup_editor_camera( hdr: true, ..default() }, + GaussianCamera { + warmup: true, + }, Projection::Perspective(PerspectiveProjection { far: 25.0, ..default() diff --git a/src/render/mod.rs b/src/render/mod.rs index 641f576..89720fd 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -24,9 +24,11 @@ pub mod depth; pub mod normal; pub mod optical_flow; pub mod position; +pub mod sdf; pub mod semantic; +// TODO: render mode should be a per-camera setting #[derive( Debug, Default, @@ -48,6 +50,7 @@ pub enum RenderMode { Normal, OpticalFlow, Position, + Sdf, Semantic, } @@ -94,6 +97,7 @@ impl Plugin for RenderPlugin { app.add_plugins(normal::NormalPlugin); app.add_plugins(optical_flow::OpticalFlowPlugin); app.add_plugins(position::PositionPlugin); + app.add_plugins(sdf::SdfPlugin); app.add_plugins(semantic::SemanticPlugin); // TODO: add wireframe depth, pbr disable, normals @@ -108,6 +112,7 @@ impl Plugin for RenderPlugin { auto_disable_pbr_material::, auto_disable_pbr_material::, auto_disable_pbr_material::, + auto_disable_pbr_material::, auto_disable_pbr_material::, enable_pbr_material, ) @@ -206,6 +211,10 @@ fn apply_render_modes( commands.entity(entity) .insert(position::Position); } + RenderMode::Sdf => { + commands.entity(entity) + .insert(sdf::Sdf); + } RenderMode::Semantic => { commands.entity(entity) .insert(semantic::Semantic); @@ -221,6 +230,7 @@ fn apply_render_modes( .remove::() .remove::() .remove::() + .remove::() .remove::(); insert_render_mode_flag(&mut commands, entity); diff --git a/src/render/sdf.rs b/src/render/sdf.rs new file mode 100644 index 0000000..31a2ec2 --- /dev/null +++ b/src/render/sdf.rs @@ -0,0 +1,666 @@ +use std::collections::{HashMap, HashSet}; + +use bevy::{ + prelude::*, + pbr::{ExtendedMaterial, MaterialExtension}, + render::{ + mesh::{ + Indices, + Mesh, + VertexAttributeValues, + }, + render_resource::*, + }, +}; +use bevy_gaussian_splatting::{ + CloudSettings, + Gaussian3d, + GaussianSplattingPlugin, + gaussian::f32::{ + PositionVisibility, + ScaleOpacity, + }, + material::spherical_harmonics::SH_COEFF_COUNT, + PlanarGaussian3d, + PlanarGaussian3dHandle, + SphericalHarmonicCoefficients, +}; +use bytemuck::{ + Pod, + Zeroable, +}; +use rand::{ + prelude::{Rng, SliceRandom, thread_rng}, + rngs::SmallRng, + SeedableRng, +}; + +use rayon::prelude::*; + + + +#[derive(Component, Clone, Debug, Default, Reflect)] +#[reflect(Component, Default)] +pub struct SdfRoot; + + +// TODO: python api +#[derive(Resource, Reflect, Debug, Clone)] +#[reflect(Resource, Default)] +pub struct SdfConfig { + pub per_m2: f32, + pub band: f32, + pub jitter: f32, + pub min_pts: u32, + pub max_pts: u32, + pub near_z: f32, + pub far_z: f32, + pub gaussian_visualization: bool, + pub dense_sampling: bool, +} + +impl Default for SdfConfig { + fn default() -> Self { + Self { + per_m2: 10.0, + band: 0.01, + jitter: 0.05, + min_pts: 256, + max_pts: 1024, + near_z: 0.1, + far_z: 25.0, + gaussian_visualization: true, + dense_sampling: false, + } + } +} + + +#[derive(Clone, Copy, Debug, Default, Reflect, ShaderType, Pod, Zeroable)] +#[repr(C)] +pub struct GpuPt { + pub pos_dist: Vec4, +} + +#[derive(Clone, Copy, Debug, Default, Reflect, ShaderType, Pod, Zeroable)] +#[repr(C)] +struct LodParams { + counts: UVec4, + range: Vec4, +} + +pub type SdfMaterial = ExtendedMaterial; + + +#[derive(Asset, AsBindGroup, TypePath, Debug, Default, Clone)] +pub struct SdfExtension { + #[uniform(16)] lod: LodParams, +} + +impl MaterialExtension for SdfExtension { } + + +#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[reflect(Component, Default)] +pub struct Sdf; + + +#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[reflect(Component, Default)] +pub struct ComputeSdf; + + +// TODO: cache across mesh instances? +#[derive(Component, Debug, Default, Reflect)] +#[reflect(Component)] +struct MeshSdfCache { + pts: Vec, + dirty: bool, +} + + +#[derive(Resource, Default)] +struct AggregateSdf { + pts: Vec, + uniform_start: usize, + dirty: bool, +} + + +pub struct SdfPlugin; +impl Plugin for SdfPlugin { + fn build(&self, app: &mut App) { + app + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .register_type::() + .init_resource::() + .init_resource::() + .add_plugins(( + MaterialPlugin::::default(), + )) + .add_plugins(GaussianSplattingPlugin) + .add_systems(PreUpdate, propagate_sdf_tags) + .add_systems(Update, cache_mesh_sdf) + .add_systems(PostUpdate, aggregate_sdf_system) + .add_systems(PreUpdate, upload_sdf) + .add_systems(Update, apply_sdf_material); + } +} + + + +pub fn propagate_sdf_tags( + mut commands: Commands, + roots: Query>, + has_sdf: Query>, + parents: Query<&ChildOf>, +) { + let root_set: HashSet = roots.iter().collect(); + + for entity in has_sdf.iter() { + let is_descendant = parents + .iter_ancestors(entity) + .any(|ancestor| root_set.contains(&ancestor)); + + if is_descendant { + if let Ok(mut valid_mesh) = commands.get_entity(entity) { + valid_mesh.try_insert(ComputeSdf); + } + } + } +} + + +#[allow(clippy::type_complexity)] +fn cache_mesh_sdf( + mut commands: Commands, + cfg: Res, + meshes: Res>, + mut q: Query< + ( + Entity, + &Mesh3d, + &GlobalTransform, + Option<&mut MeshSdfCache>, + ), + ( + With, + // Changed, + // Changed, + Without, + ), + >, + caches: Query>, + mut agg: ResMut, + mut rng: Local>, +) { + if rng.is_none() { *rng = SmallRng::from_entropy().into(); } + let rng = rng.as_mut().unwrap(); + + if cfg.is_changed() { + for e in caches.iter() { + if let Ok(mut ent) = commands.get_entity(e) { + ent.remove::(); + } + } + return; + } + + for (e, mesh_handle, tf, maybe_cache) in &mut q { + let Some(mesh) = meshes.get(mesh_handle) else { continue }; + + let pts = compute_sparse_sdf_for_mesh( + mesh, + tf, + &cfg, + &mut *rng, + ); + + match maybe_cache { + Some(mut cache) => { + info!("updating cached {} SDF points for mesh {:?}", pts.len(), e); + cache.pts = pts; + cache.dirty = true; + } + None => { + info!("cached {} SDF points for mesh {:?}", pts.len(), e); + commands + .entity(e) + .insert(MeshSdfCache { + pts, + dirty: true, + }); + } + } + + agg.dirty = true; + } +} + + +fn apply_sdf_material( + mut commands: Commands, + tagged: Query< + Entity, + ( + With, + Without>, + ), + >, + mut removed: RemovedComponents, + mut mats: ResMut>, + cfg: Res, +) { + for e in removed.read() { + if let Ok(mut ent) = commands.get_entity(e) { + ent.remove::>(); + } + } + + let lod = LodParams { + counts: UVec4::new(cfg.max_pts, cfg.min_pts, 0, 0), + range : Vec4::new(cfg.near_z , cfg.far_z, 0.0, 0.0), + }; + + for e in &tagged { + let mat = mats.add(SdfMaterial { + base: StandardMaterial { + alpha_mode: AlphaMode::Blend, + base_color: Color::srgba(0.4, 0.4, 0.4, 0.05), + cull_mode: None, + unlit: true, + ..default() + }, + extension: SdfExtension { + lod, + }, + }); + + commands + .entity(e) + .insert(MeshMaterial3d(mat)); + } +} + + +fn point_budget(area_sum: f32, cfg: &SdfConfig) -> (usize, u32) { + let raw = (area_sum * cfg.per_m2 * 2.0).round() as u32; + let want = raw.clamp(cfg.min_pts, cfg.max_pts); + let per_tri = (want as f32 / (area_sum.max(1.0e-6) * 2.0)).ceil() as u32; + (want as usize, per_tri) +} + + +// TODO: resolve non-manifold ambiguities +#[inline] +pub fn compute_sparse_sdf_for_mesh( + mesh: &Mesh, + tf: &GlobalTransform, + cfg: &SdfConfig, + rng: &mut SmallRng, +) -> Vec { + let mat = tf.compute_matrix(); + let verts: Vec = match mesh.attribute(Mesh::ATTRIBUTE_POSITION) { + Some(VertexAttributeValues::Float32x3(v)) => + v.iter().map(|&[x, y, z]| mat.transform_point3(Vec3::new(x, y, z))).collect(), + Some(VertexAttributeValues::Float32x2(v)) => + v.iter().map(|&[x, y]| mat.transform_point3(Vec3::new(x, y, 0.0))).collect(), + _ => return vec![], + }; + + let tris: Vec<[usize; 3]> = match mesh.indices() { + Some(Indices::U32(ix)) => ix.chunks_exact(3).map(|t| [t[0] as usize, t[1] as usize, t[2] as usize]).collect(), + Some(Indices::U16(ix)) => ix.chunks_exact(3).map(|t| [t[0] as usize, t[1] as usize, t[2] as usize]).collect(), + None => (0..verts.len()).step_by(3).map(|i| [i, i + 1, i + 2]).collect(), + }; + if tris.is_empty() { return vec![]; } + + #[inline] fn tri_area_normal(v0: Vec3, v1: Vec3, v2: Vec3) -> (f32, Vec3) { + let n = (v1 - v0).cross(v2 - v0); + (0.5 * n.length(), n.normalize()) + } + + let per_tri: Vec<(f32, Vec3)> = tris.par_iter() + .map(|&[i0, i1, i2]| tri_area_normal(verts[i0], verts[i1], verts[i2])) + .collect(); + + let area_sum: f32 = per_tri.par_iter().map(|(a, _)| *a).sum(); + let (k_target, _) = point_budget(area_sum, cfg); + if k_target == 0 { return vec![]; } + + let per_tri_samples: Vec = per_tri + .iter() + .map(|(a, _)| ((a / area_sum) * k_target as f32).ceil() as u32) + .collect(); + + let mut band: Vec<(Vec3, f32)> = tris.par_iter() + .zip(per_tri.par_iter()) + .zip(per_tri_samples.par_iter()) + .flat_map_iter(|((&[i0, i1, i2], &(_area, n)), &n_samples)| { + let mut thread_rng = SmallRng::from_rng(thread_rng()).unwrap(); + let mut local = Vec::with_capacity(n_samples as usize * 2); + for _ in 0..n_samples { + let (u, v): (f32, f32) = (thread_rng.gen(), thread_rng.gen()); + let b = (1.0 - u).sqrt(); + let p = verts[i0] * (1.0 - b) + + verts[i1] * b * (1.0 - v) + + verts[i2] * b * v; + + let jitter = cfg.jitter * (thread_rng.gen::() * 2.0 - 1.0); + let band_r = cfg.band + jitter; + + let sign = if thread_rng.gen_bool(0.5) { 1.0 } else { -1.0 }; + let dist = thread_rng.gen::() * band_r; + let offset = n * dist * sign; + local.push((p + offset, dist * sign)); + } + local + }) + .collect(); + + if band.is_empty() { return vec![]; } + + band[..].shuffle(rng); + + let mut selected = Vec::<(Vec3, f32)>::with_capacity(k_target); + let mut remaining = band; + let seed = remaining.swap_remove(rng.gen_range(0..remaining.len())); + let (seed_p, seed_d) = seed; + selected.push((seed_p, seed_d)); + + let mut dists: Vec = remaining.iter() + .map(|(q, _)| (*q - seed_p).length_squared()) + .collect(); + + while selected.len() < k_target && !remaining.is_empty() { + let best = dists + .iter() + .enumerate() + .max_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .unwrap() + .0; + + let (p_new, d_new) = remaining.swap_remove(best); + selected.push((p_new, d_new)); + dists.swap_remove(best); + + for (di, (q, _)) in remaining.iter().enumerate() { + let new_d2 = (*q - p_new).length_squared(); + if new_d2 < dists[di] { dists[di] = new_d2; } + } + } + + selected.into_iter() + .map(|(p, d)| GpuPt { pos_dist: p.extend(d) }) + .collect() +} + + +pub fn aggregate_sdf_system( + mut agg: ResMut, + mut caches: Query<&mut MeshSdfCache>, + config: Res, +) { + if !caches.iter().any(|c| c.dirty) { + return; + } + + agg.pts.clear(); + for mut c in &mut caches { + agg.pts.extend(&c.pts); + c.dirty = false; + } + agg.dirty = true; + agg.uniform_start = agg.pts.len(); + + info!("aggregated {} SDF points from mesh caches", agg.pts.len()); + + if !config.dense_sampling { + return; + } + + if agg.pts.is_empty() { + return; + } + + let (mut min, mut max) = + (Vec3::splat(f32::INFINITY), Vec3::splat(f32::NEG_INFINITY)); + + for p in &agg.pts { + let pos = p.pos_dist.truncate(); + min = min.min(pos); + max = max.max(pos); + } + + const CELLS_PER_AXIS: f32 = 64.0; + let cell_size = (max - min).max_element() / CELLS_PER_AXIS; + if cell_size == 0.0 { + return; + } + let inv_cell = 1.0 / cell_size; + let dims = ((max - min) * inv_cell).ceil().as_ivec3(); + + #[derive(Default, Clone, Copy)] + struct Acc { + sum_pos: Vec3, + sum_dist: f32, + count: u32, + has_neg: bool, + } + let mut acc: HashMap = HashMap::with_capacity(agg.pts.len()); + + const NB6: [IVec3; 6] = [ + IVec3::new( 1, 0, 0), IVec3::new(-1, 0, 0), + IVec3::new( 0, 1, 0), IVec3::new( 0,-1, 0), + IVec3::new( 0, 0, 1), IVec3::new( 0, 0,-1), + ]; + + for p in &agg.pts { + let pos = p.pos_dist.truncate(); + let key = ((pos - min) * inv_cell).floor().as_ivec3(); + let dist = p.pos_dist.w; + let isneg = dist.is_sign_negative(); + + let mut bump = |k: IVec3| { + let e = acc.entry(k).or_default(); + e.sum_pos += pos; + e.sum_dist += dist; + e.count += 1; + e.has_neg |= isneg; + }; + + bump(key); + + for dx in -1..=1 { + for dy in -1..=1 { + for dz in -1..=1 { + if dx == 0 && dy == 0 && dz == 0 { + continue; + } + bump(key + IVec3::new(dx, dy, dz)); + } + } + } + } + + #[derive(Clone, Copy)] + struct Cell { pos: Vec3, dist: f32, has_neg: bool } + + let occ: HashMap = acc + .into_iter() + .map(|(k, a)| { + let inv = 1.0 / a.count as f32; + ( + k, + Cell { + pos: a.sum_pos * inv, + dist: a.sum_dist * inv, + has_neg: a.has_neg, + }, + ) + }) + .collect(); + + let mut outside = HashSet::::new(); + let mut stack = Vec::::new(); + + for x in 0..=dims.x { + for y in 0..=dims.y { + for z in 0..=dims.z { + if x == 0 || y == 0 || z == 0 || + x == dims.x || y == dims.y || z == dims.z + { + let k = IVec3::new(x, y, z); + if !occ.contains_key(&k) && outside.insert(k) { + stack.push(k); + } + } + } + } + } + + let is_solid = |k: &IVec3| occ.contains_key(k); + + while let Some(c) = stack.pop() { + for d in NB6 { + let n = c + d; + if n.cmpge(IVec3::ZERO).all() && + n.cmple(dims).all() && + !outside.contains(&n) && + !is_solid(&n) + { + outside.insert(n); + stack.push(n); + } + } + } + + let offsets_26 = || { + (-1..=1) + .flat_map(|dx| (-1..=1).flat_map(move |dy| (-1..=1).map(move |dz| (dx, dy, dz)))) + .filter(|&(dx, dy, dz)| dx != 0 || dy != 0 || dz != 0) + .map(|(dx, dy, dz)| IVec3::new(dx, dy, dz)) + }; + + for x in 0..=dims.x { + for y in 0..=dims.y { + for z in 0..=dims.z { + let k = IVec3::new(x, y, z); + if occ.contains_key(&k) { + continue; + } + + let centre = min + (k.as_vec3() + Vec3::splat(0.5)) * cell_size; + + let want_positive = outside.contains(&k); + + let mut best_mag: Option = None; + for off in offsets_26() { + if let Some(c) = occ.get(&(k + off)) { + if c.dist.is_sign_positive() != want_positive { + continue; + } + + let cand = c.dist.abs() + (centre - c.pos).length(); + best_mag = Some(match best_mag { + Some(b) => b.min(cand), + None => cand, + }); + } + } + + let magnitude = best_mag.unwrap_or(0.5 * cell_size); + let signed = if want_positive { magnitude } else { -magnitude }; + + agg.pts.push(GpuPt { + pos_dist: centre.extend(signed), + }); + } + } + } + + info!("SDF aggregate: {} points after uniform sampling", agg.pts.len()); +} + + +fn upload_sdf( + mut commands: Commands, + mut planar_gaussian_3d: ResMut>, + mut agg: ResMut, + scene_root: Query< + Entity, + With, + >, + config: Res, +) { + if !config.gaussian_visualization { + return; + } + + if agg.pts.is_empty() || !agg.dirty { + return; + } + + info!("uploading {} SDF points to PlanarGaussian3d", agg.pts.len()); + + // TODO: write gaussians in compute shader + { // map sdf to gaussians + const MIN_SCALE: f32 = 0.005; + const MAX_SCALE: f32 = 0.02; + + let max_abs = agg.pts[..agg.uniform_start] + .iter() + .map(|p| p.pos_dist.w.abs()) + .fold(1e-5f32, f32::max); + + let gaussians: Vec = agg.pts//[..agg.uniform_start] + .iter() + .map(|pt| { + let dist = pt.pos_dist.w; + let signed_n = (dist / max_abs).clamp(-1.0, 1.0); + let mag_n = signed_n.abs().sqrt(); + + let s = MAX_SCALE - mag_n * (MAX_SCALE - MIN_SCALE); + let opacity = 1.0;// - mag_n; + + Gaussian3d { + rotation: [1.0, 0.0, 0.0, 0.0].into(), + position_visibility: PositionVisibility { + position: pt.pos_dist.truncate().into(), + visibility: 1.0, + }, + scale_opacity: ScaleOpacity { + scale: [s, s, s], + opacity, + }, + spherical_harmonic: SphericalHarmonicCoefficients { + coefficients: { + let mut coefficients = [0.0; SH_COEFF_COUNT]; + let r = dist.is_sign_positive() as u32 as f32; + coefficients[0] = r; + coefficients[1] = 0.3; + coefficients[2] = 1.0 - r; + coefficients + }, + }, + } + }) + .collect(); + let gaussians_handle = planar_gaussian_3d.add(PlanarGaussian3d::from(gaussians)); + + // TODO: redraw on PlanarGaussian3dHandle override (upstream issue) + commands + .entity(scene_root.single().expect("SdfRoot required to attach gaussians")) + .insert(( + CloudSettings::default(), + PlanarGaussian3dHandle(gaussians_handle), + )); + + // TODO: remove gaussians from scene root when leaving RenderMode::Sdf? + } + + agg.dirty = false; +} diff --git a/src/render/sdf.wgsl b/src/render/sdf.wgsl new file mode 100644 index 0000000..111a590 --- /dev/null +++ b/src/render/sdf.wgsl @@ -0,0 +1,153 @@ +#import bevy_pbr::{ + forward_io::VertexOutput, + mesh_view_bindings::view, +} + + +struct SdfPt { + pos: vec3, + d: f32, +}; + +struct KdNode { + min_split: vec4, + max_pad: vec4, + axis: u32, + left: u32, + right: u32, + _pad: u32, +}; + +struct LodParams { + counts: vec4, + range: vec4, +}; + + +@group(2) @binding(14) var pts: array; +@group(2) @binding(15) var kd: array; +@group(2) @binding(16) var lod : LodParams; + + +fn dist2(a: vec3, b: vec3) -> f32 { + let d = a - b; return dot(d, d); +} + +fn nearest(root: u32, q: vec3, limit: u32) -> f32 { + var best = 1e9; + var sgn = 1.0; + var stack: array; + var sp: i32 = 0; + + stack[sp] = root; + sp += 1; + + loop { + if sp==0 { break; } + sp -= 1; + let id = stack[sp]; + let n = kd[id]; + + let off = max(vec3(0.0), n.min_split.xyz - q) + + max(vec3(0.0), q - n.max_pad.xyz); + if dot(off, off) > best * best { continue; } + + if n.axis == 3u { + let idx = u32(n.min_split.w); + if idx < limit { + let d = dist2(q, pts[idx].pos); + if d < best*best { + best = sqrt(d); + sgn = sign(pts[idx].d); + } + } + } else { + let left_is_near = q[n.axis] < n.min_split.w; + + let near = select(n.right, n.left, left_is_near); + let far = select(n.left , n.right, left_is_near); + + stack[sp] = far; + sp += 1; + + stack[sp] = near; + sp += 1; + } + } + + return best * sgn; +} + + + +// fn vis_pt(sdf: f32, radius: f32) -> vec4 { +// let a = clamp(1.0 - abs(sdf) / radius, 0.0, 1.0); +// let col = select( +// vec3(1.0, 0.25, 0.25), +// vec3(0.2, 0.6, 1.0), +// sdf < 0.0, +// ); +// return vec4(col, a * a); +// } + + +fn srgb(x: vec3) -> vec3 { + return pow(x, vec3(1.0 / 2.2)); +} + +fn heat(t: f32) -> vec3 { + let r = clamp(t * 2.0 - 0.5, 0.0, 1.0); + let g = clamp(2.0 - abs(t * 2.0 - 1.0), 0.0, 1.0); + let b = clamp(1.5 - t * 2.0, 0.0, 1.0); + return srgb(vec3(r, g, b)); +} + +fn vis_pt(sdf: f32, radius: f32) -> vec4 { + let a = clamp(1.0 - abs(sdf) / radius, 0.0, 1.0); + let t = 0.5 + 0.5 * clamp(sdf / radius, -1.0, 1.0); + let col = heat(t); + return vec4(col, a * a); +} + + +struct FOut { @location(0) color : vec4 }; + +@fragment +fn fragment(in: VertexOutput) -> FOut { + // return FOut(vec4(1.0, 0.0, 0.0, 1.0)); + + let p_world = in.world_position.xyz; + let cam = (view.view_from_world * vec4(p_world, 1.0)).xyz; + + + + let want = mix( + f32(lod.counts.x), + f32(lod.counts.y), + clamp( + (abs(cam.z) - lod.range.x) / (lod.range.y - lod.range.x), + 0.0, + 1.0, + ) + ); + let limit = u32(round(want)); + + let sdf = nearest(0u, p_world, limit); + let vis = vis_pt(sdf, 0.08 * (1.0 + 0.03 * abs(cam.z))); + + if vis.a < 0.01 { discard; } + return FOut(vis); + + + + // let z = abs(cam.z); + // let t = clamp((z - lod.range.x) / (lod.range.y - lod.range.x), 0.0, 1.0); + // let want = mix(f32(lod.counts.x), f32(lod.counts.y), t); + // let count = u32(round(want)); + + // let sdf = nearest(0u, p_world, count); + + // // visualize: −0.5 m..+0.5 m → black..white + // let gray = clamp(sdf + 0.5, 0.0, 1.0); + // return FOut(vec4(gray, gray, gray, 1.0)); +} diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 46932e4..f4f5819 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -121,10 +121,10 @@ pub struct SceneAabb { } impl SceneAabb { - fn new(center: Vec3) -> Self { + fn empty() -> Self { Self { - min: center, - max: center, + min: Vec3::splat(f32::MAX), + max: Vec3::splat(f32::MIN), } } @@ -143,26 +143,8 @@ impl SceneAabb { ]; for corner in corners { - let gt = corner.cmpgt(self.max); - let lt = corner.cmplt(self.min); - - if gt.x { - self.max.x = corner.x; - } else if lt.x { - self.min.x = corner.x; - } - - if gt.y { - self.max.y = corner.y; - } else if lt.y { - self.min.y = corner.y; - } - - if gt.z { - self.max.z = corner.z; - } else if lt.z { - self.min.z = corner.z; - } + self.min = self.min.min(corner); + self.max = self.max.max(corner); } } } @@ -184,25 +166,20 @@ impl From<&SceneAabb> for Transform { fn create_scene_aabb( mut commands: Commands, scene_instances: Query< - ( - Entity, - &ZeroverseSceneRoot, - &GlobalTransform, - ), + Entity, + With, >, children: Query<&Children>, bounding_boxes: Query<(&Aabb, &GlobalTransform)>, ) { - for (entity, _root_tag, root_tf) in &scene_instances { - let mut scene_aabb = SceneAabb::new(root_tf.translation()); + for entity in &scene_instances { + let mut scene_aabb = SceneAabb::empty(); let merged_any = children .iter_descendants(entity) .filter_map(|child| bounding_boxes.get(child).ok()) - .any(|(bb, tf)| { - scene_aabb.merge_aabb(bb, tf); - true - }); + .map(|(bb, tf)| { scene_aabb.merge_aabb(bb, tf); }) + .count() > 0; if merged_any { commands.entity(entity).insert(scene_aabb); diff --git a/src/scene/object.rs b/src/scene/object.rs index 0f9cf04..b40ff11 100644 --- a/src/scene/object.rs +++ b/src/scene/object.rs @@ -7,6 +7,7 @@ use crate::{ TrajectorySampler, ZeroverseCamera, }, + render::sdf::SdfRoot, scene::{ lighting::{ setup_lighting, @@ -14,6 +15,7 @@ use crate::{ }, RegenerateSceneEvent, RotationAugment, + SceneAabbNode, SceneLoadedEvent, ZeroverseScene, ZeroverseSceneRoot, @@ -74,6 +76,8 @@ fn setup_scene( Name::new("zeroverse_object"), object_settings.primitive.clone(), RotationAugment, + SceneAabbNode, + SdfRoot, ZeroverseScene, ZeroverseSceneRoot, )) diff --git a/src/scene/semantic_room.rs b/src/scene/semantic_room.rs index 65df599..120aea4 100644 --- a/src/scene/semantic_room.rs +++ b/src/scene/semantic_room.rs @@ -15,6 +15,7 @@ use crate::{ TrajectorySampler, ZeroverseCamera, }, + render::sdf::SdfRoot, scene::{ lighting::{ setup_lighting, @@ -735,41 +736,44 @@ fn spawn_room_neighborhood( base_scale: &Vec3, settings: &ZeroverseSemanticRoomSettings, ) { + let mut windows_root = [false; 4]; + commands .spawn(( InheritedVisibility::default(), Name::new("room"), SceneAabbNode, + SdfRoot, Transform::default(), Visibility::default(), )) .with_children(|root| { - let windows_root = spawn_room( + windows_root = spawn_room( root, base_scale, settings, 0, false, ); + }); - let mut rooms: HashMap<(i32, i32), (Vec3, Vec3)> = HashMap::new(); - rooms.insert((0, 0), (Vec3::ZERO, *base_scale)); + let mut rooms: HashMap<(i32, i32), (Vec3, Vec3)> = HashMap::new(); + rooms.insert((0, 0), (Vec3::ZERO, *base_scale)); - for (idx, &(dx, dz)) in DIRS.iter().enumerate() { - if !windows_root[idx] { continue; } - spawn_room_rec( - root, - (dx, dz), - (0, 0), - (dx, dz), - 1, - settings.neighborhood_depth as i32 - 1, - *base_scale, - &mut rooms, - settings, - ); - } - }); + for (idx, &(dx, dz)) in DIRS.iter().enumerate() { + if !windows_root[idx] { continue; } + spawn_room_rec( + commands, + (dx, dz), + (0, 0), + (dx, dz), + 1, + settings.neighborhood_depth as i32 - 1, + *base_scale, + &mut rooms, + settings, + ); + } }