├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── assets ├── bevy_logo.png ├── examples │ ├── mirrors.gif │ ├── parallax.gif │ ├── poisson.gif │ └── tilemap.gif ├── gems │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ └── 7.png ├── parallax │ ├── 0.png │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ └── 5.png ├── sprite_sheet.png └── tilemap │ ├── hills.png │ ├── ocean.png │ └── tileset.png ├── examples ├── mirrors.rs ├── multiple.rs ├── parallax.rs ├── poisson.rs ├── random_sequence.rs ├── sequence.rs ├── shared │ └── mod.rs ├── single.rs └── sprite_sheet.rs ├── rustfmt.toml ├── src ├── generators │ ├── generator.rs │ ├── mod.rs │ ├── poisson.rs │ ├── sprite.rs │ └── sprite_sheet.rs ├── lib.rs ├── plugin.rs ├── scroller.rs └── scroller_app.rs └── tests └── scroller.rs /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [master] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | # Run cargo test 14 | test: 15 | name: Test Suite 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 30 18 | steps: 19 | - name: Checkout sources 20 | uses: actions/checkout@v4 21 | - name: Cache 22 | uses: actions/cache@v4 23 | with: 24 | path: | 25 | ~/.cargo/bin/ 26 | ~/.cargo/registry/index/ 27 | ~/.cargo/registry/cache/ 28 | ~/.cargo/git/db/ 29 | target/ 30 | key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.toml') }} 31 | - name: Install stable toolchain 32 | uses: dtolnay/rust-toolchain@stable 33 | - name: Install Dependencies 34 | run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev 35 | - name: Run cargo test 36 | run: cargo test --lib --tests 37 | 38 | # Run cargo clippy -- -D warnings 39 | clippy_check: 40 | name: Clippy 41 | runs-on: ubuntu-latest 42 | timeout-minutes: 30 43 | steps: 44 | - name: Checkout sources 45 | uses: actions/checkout@v4 46 | - name: Cache 47 | uses: actions/cache@v4 48 | with: 49 | path: | 50 | ~/.cargo/bin/ 51 | ~/.cargo/registry/index/ 52 | ~/.cargo/registry/cache/ 53 | ~/.cargo/git/db/ 54 | target/ 55 | key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.toml') }} 56 | - name: Install stable toolchain 57 | uses: dtolnay/rust-toolchain@stable 58 | with: 59 | components: clippy 60 | - name: Install Dependencies 61 | run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev 62 | - name: Run clippy 63 | run: cargo clippy -- -D warnings 64 | 65 | # Run cargo fmt --all -- --check 66 | format: 67 | name: Format 68 | runs-on: ubuntu-latest 69 | timeout-minutes: 30 70 | steps: 71 | - name: Checkout sources 72 | uses: actions/checkout@v4 73 | - name: Install stable toolchain 74 | uses: dtolnay/rust-toolchain@stable 75 | with: 76 | components: rustfmt 77 | - name: Run cargo fmt 78 | run: cargo fmt --all -- --check 79 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | todo.txt 3 | trace*json 4 | .vscode 5 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ab_glyph" 7 | version = "0.2.25" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "6f90148830dac590fac7ccfe78ec4a8ea404c60f75a24e16407a71f0f40de775" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.8" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 | 21 | [[package]] 22 | name = "accesskit" 23 | version = "0.12.3" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" 26 | 27 | [[package]] 28 | name = "accesskit_consumer" 29 | version = "0.16.1" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" 32 | dependencies = [ 33 | "accesskit", 34 | ] 35 | 36 | [[package]] 37 | name = "accesskit_macos" 38 | version = "0.10.1" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" 41 | dependencies = [ 42 | "accesskit", 43 | "accesskit_consumer", 44 | "objc2 0.3.0-beta.3.patch-leaks.3", 45 | "once_cell", 46 | ] 47 | 48 | [[package]] 49 | name = "accesskit_windows" 50 | version = "0.15.1" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" 53 | dependencies = [ 54 | "accesskit", 55 | "accesskit_consumer", 56 | "once_cell", 57 | "paste", 58 | "static_assertions", 59 | "windows 0.48.0", 60 | ] 61 | 62 | [[package]] 63 | name = "accesskit_winit" 64 | version = "0.17.0" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "45f8f7c9f66d454d5fd8e344c8c8c7324b57194e1041b955519fc58a01e77a25" 67 | dependencies = [ 68 | "accesskit", 69 | "accesskit_macos", 70 | "accesskit_windows", 71 | "raw-window-handle 0.6.1", 72 | "winit", 73 | ] 74 | 75 | [[package]] 76 | name = "adler" 77 | version = "1.0.2" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 80 | 81 | [[package]] 82 | name = "ahash" 83 | version = "0.8.11" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 86 | dependencies = [ 87 | "cfg-if", 88 | "getrandom", 89 | "once_cell", 90 | "version_check", 91 | "zerocopy", 92 | ] 93 | 94 | [[package]] 95 | name = "aho-corasick" 96 | version = "1.1.3" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 99 | dependencies = [ 100 | "memchr", 101 | ] 102 | 103 | [[package]] 104 | name = "aligned" 105 | version = "0.4.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" 108 | dependencies = [ 109 | "as-slice", 110 | ] 111 | 112 | [[package]] 113 | name = "aligned-array" 114 | version = "1.0.1" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "e05c92d086290f52938013f6242ac62bf7d401fab8ad36798a609faa65c3fd2c" 117 | dependencies = [ 118 | "generic-array", 119 | ] 120 | 121 | [[package]] 122 | name = "allocator-api2" 123 | version = "0.2.18" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 126 | 127 | [[package]] 128 | name = "android-activity" 129 | version = "0.5.2" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" 132 | dependencies = [ 133 | "android-properties", 134 | "bitflags 2.5.0", 135 | "cc", 136 | "cesu8", 137 | "jni", 138 | "jni-sys", 139 | "libc", 140 | "log", 141 | "ndk", 142 | "ndk-context", 143 | "ndk-sys", 144 | "num_enum", 145 | "thiserror", 146 | ] 147 | 148 | [[package]] 149 | name = "android-properties" 150 | version = "0.2.2" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 153 | 154 | [[package]] 155 | name = "android_log-sys" 156 | version = "0.3.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" 159 | 160 | [[package]] 161 | name = "android_system_properties" 162 | version = "0.1.5" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 165 | dependencies = [ 166 | "libc", 167 | ] 168 | 169 | [[package]] 170 | name = "approx" 171 | version = "0.5.1" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" 174 | dependencies = [ 175 | "num-traits", 176 | ] 177 | 178 | [[package]] 179 | name = "arboard" 180 | version = "3.4.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" 183 | dependencies = [ 184 | "clipboard-win", 185 | "core-graphics", 186 | "image 0.25.1", 187 | "log", 188 | "objc2 0.5.1", 189 | "objc2-app-kit", 190 | "objc2-foundation", 191 | "parking_lot", 192 | "windows-sys 0.48.0", 193 | "x11rb", 194 | ] 195 | 196 | [[package]] 197 | name = "arrayref" 198 | version = "0.3.7" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" 201 | 202 | [[package]] 203 | name = "arrayvec" 204 | version = "0.7.4" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 207 | 208 | [[package]] 209 | name = "as-raw-xcb-connection" 210 | version = "1.0.1" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 213 | 214 | [[package]] 215 | name = "as-slice" 216 | version = "0.2.1" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" 219 | dependencies = [ 220 | "stable_deref_trait", 221 | ] 222 | 223 | [[package]] 224 | name = "ash" 225 | version = "0.37.3+1.3.251" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" 228 | dependencies = [ 229 | "libloading 0.7.4", 230 | ] 231 | 232 | [[package]] 233 | name = "async-broadcast" 234 | version = "0.5.1" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" 237 | dependencies = [ 238 | "event-listener 2.5.3", 239 | "futures-core", 240 | ] 241 | 242 | [[package]] 243 | name = "async-channel" 244 | version = "2.2.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" 247 | dependencies = [ 248 | "concurrent-queue", 249 | "event-listener 5.3.0", 250 | "event-listener-strategy 0.5.2", 251 | "futures-core", 252 | "pin-project-lite", 253 | ] 254 | 255 | [[package]] 256 | name = "async-executor" 257 | version = "1.11.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" 260 | dependencies = [ 261 | "async-task", 262 | "concurrent-queue", 263 | "fastrand", 264 | "futures-lite", 265 | "slab", 266 | ] 267 | 268 | [[package]] 269 | name = "async-fs" 270 | version = "2.1.2" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 273 | dependencies = [ 274 | "async-lock", 275 | "blocking", 276 | "futures-lite", 277 | ] 278 | 279 | [[package]] 280 | name = "async-lock" 281 | version = "3.3.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" 284 | dependencies = [ 285 | "event-listener 4.0.3", 286 | "event-listener-strategy 0.4.0", 287 | "pin-project-lite", 288 | ] 289 | 290 | [[package]] 291 | name = "async-task" 292 | version = "4.7.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 295 | 296 | [[package]] 297 | name = "atomic-waker" 298 | version = "1.1.2" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 301 | 302 | [[package]] 303 | name = "autocfg" 304 | version = "1.3.0" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 307 | 308 | [[package]] 309 | name = "az" 310 | version = "1.2.1" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" 313 | 314 | [[package]] 315 | name = "base64" 316 | version = "0.21.7" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 319 | 320 | [[package]] 321 | name = "bevy" 322 | version = "0.13.2" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "65b9eadaacf8fe971331bc3f250f35c18bc9dace3f96b483062f38ac07e3a1b4" 325 | dependencies = [ 326 | "bevy_dylib", 327 | "bevy_internal", 328 | ] 329 | 330 | [[package]] 331 | name = "bevy-inspector-egui" 332 | version = "0.23.4" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "bb36c3adb02afa4496085250d437217b2a5280d8dd464937c6c5b21bc88830c0" 335 | dependencies = [ 336 | "bevy-inspector-egui-derive", 337 | "bevy_app", 338 | "bevy_asset", 339 | "bevy_core", 340 | "bevy_core_pipeline", 341 | "bevy_ecs", 342 | "bevy_egui", 343 | "bevy_hierarchy", 344 | "bevy_log", 345 | "bevy_math", 346 | "bevy_pbr", 347 | "bevy_reflect", 348 | "bevy_render", 349 | "bevy_time", 350 | "bevy_utils", 351 | "bevy_window", 352 | "egui", 353 | "image 0.24.9", 354 | "once_cell", 355 | "pretty-type-name", 356 | "smallvec", 357 | ] 358 | 359 | [[package]] 360 | name = "bevy-inspector-egui-derive" 361 | version = "0.23.0" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "b3c488161a04a123e10273e16d4533945943fcfcf345f066242790e8977aee2d" 364 | dependencies = [ 365 | "proc-macro2", 366 | "quote", 367 | "syn 2.0.61", 368 | ] 369 | 370 | [[package]] 371 | name = "bevy_a11y" 372 | version = "0.13.2" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "cd8ef2795f7f5c816a4eda04834083eb5a92e8fef603bc21d2091c6e3b63621a" 375 | dependencies = [ 376 | "accesskit", 377 | "bevy_app", 378 | "bevy_derive", 379 | "bevy_ecs", 380 | ] 381 | 382 | [[package]] 383 | name = "bevy_app" 384 | version = "0.13.2" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "ab348a32e46d21c5d61794294a92d415a770d26c7ba8951830b127b40b53ccc4" 387 | dependencies = [ 388 | "bevy_derive", 389 | "bevy_ecs", 390 | "bevy_reflect", 391 | "bevy_tasks", 392 | "bevy_utils", 393 | "downcast-rs", 394 | "wasm-bindgen", 395 | "web-sys", 396 | ] 397 | 398 | [[package]] 399 | name = "bevy_asset" 400 | version = "0.13.2" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "50028e0d4f28a9f6aab48f61b688ba2793141188f88cdc9aa6c2bca2cc02ad35" 403 | dependencies = [ 404 | "async-broadcast", 405 | "async-fs", 406 | "async-lock", 407 | "bevy_app", 408 | "bevy_asset_macros", 409 | "bevy_ecs", 410 | "bevy_log", 411 | "bevy_reflect", 412 | "bevy_tasks", 413 | "bevy_utils", 414 | "bevy_winit", 415 | "blake3", 416 | "crossbeam-channel", 417 | "downcast-rs", 418 | "futures-io", 419 | "futures-lite", 420 | "js-sys", 421 | "parking_lot", 422 | "ron", 423 | "serde", 424 | "thiserror", 425 | "wasm-bindgen", 426 | "wasm-bindgen-futures", 427 | "web-sys", 428 | ] 429 | 430 | [[package]] 431 | name = "bevy_asset_macros" 432 | version = "0.13.2" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "6617475908368418d815360148fdbb82f879dc255a70d2d7baa3766f0cd4bfd7" 435 | dependencies = [ 436 | "bevy_macro_utils", 437 | "proc-macro2", 438 | "quote", 439 | "syn 2.0.61", 440 | ] 441 | 442 | [[package]] 443 | name = "bevy_core" 444 | version = "0.13.2" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "12b0042f241ba7cd61487aadd8addfb56f7eeb662d713ac1577026704508fc6c" 447 | dependencies = [ 448 | "bevy_app", 449 | "bevy_ecs", 450 | "bevy_math", 451 | "bevy_reflect", 452 | "bevy_tasks", 453 | "bevy_utils", 454 | "bytemuck", 455 | ] 456 | 457 | [[package]] 458 | name = "bevy_core_pipeline" 459 | version = "0.13.2" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "48b7a471cb8ba665f12f7a167faa5566c11386f5bfc77d2e10bfde22b179f7b3" 462 | dependencies = [ 463 | "bevy_app", 464 | "bevy_asset", 465 | "bevy_core", 466 | "bevy_derive", 467 | "bevy_ecs", 468 | "bevy_log", 469 | "bevy_math", 470 | "bevy_reflect", 471 | "bevy_render", 472 | "bevy_transform", 473 | "bevy_utils", 474 | "bitflags 2.5.0", 475 | "radsort", 476 | "serde", 477 | ] 478 | 479 | [[package]] 480 | name = "bevy_derive" 481 | version = "0.13.2" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "f0e01f8343f391e2d6a63b368b82fb5b252ed43c8713fc87f9a8f2d59407dd00" 484 | dependencies = [ 485 | "bevy_macro_utils", 486 | "quote", 487 | "syn 2.0.61", 488 | ] 489 | 490 | [[package]] 491 | name = "bevy_diagnostic" 492 | version = "0.13.2" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "e1401cdccec7e49378d013dfb0ff62c251f85b3be19dcdf04cfd827f793d1ee9" 495 | dependencies = [ 496 | "bevy_app", 497 | "bevy_core", 498 | "bevy_ecs", 499 | "bevy_log", 500 | "bevy_time", 501 | "bevy_utils", 502 | "const-fnv1a-hash", 503 | "sysinfo", 504 | ] 505 | 506 | [[package]] 507 | name = "bevy_dylib" 508 | version = "0.13.2" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "922826e3b8f37c19836b49e18ceca662260cce87ab8faa4db6df8433903660cc" 511 | dependencies = [ 512 | "bevy_internal", 513 | ] 514 | 515 | [[package]] 516 | name = "bevy_ecs" 517 | version = "0.13.2" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "98e612a8e7962ead849e370f3a7e972b88df879ced05cd9dad6a0286d14650cf" 520 | dependencies = [ 521 | "async-channel", 522 | "bevy_ecs_macros", 523 | "bevy_ptr", 524 | "bevy_reflect", 525 | "bevy_tasks", 526 | "bevy_utils", 527 | "downcast-rs", 528 | "fixedbitset", 529 | "rustc-hash", 530 | "serde", 531 | "thiserror", 532 | "thread_local", 533 | ] 534 | 535 | [[package]] 536 | name = "bevy_ecs_macros" 537 | version = "0.13.2" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "807b5106c3410e58f4f523b55ea3c071e2a09e31e9510f3c22021c6a04732b5b" 540 | dependencies = [ 541 | "bevy_macro_utils", 542 | "proc-macro2", 543 | "quote", 544 | "syn 2.0.61", 545 | ] 546 | 547 | [[package]] 548 | name = "bevy_editor_pls" 549 | version = "0.8.1" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "d08e119d7983670a41690d60ef0e4730f0c02719118b8e6dd42b13f90a0348c0" 552 | dependencies = [ 553 | "bevy", 554 | "bevy_editor_pls_core", 555 | "bevy_editor_pls_default_windows", 556 | "egui", 557 | "egui-gizmo", 558 | ] 559 | 560 | [[package]] 561 | name = "bevy_editor_pls_core" 562 | version = "0.8.1" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "84de9dc9204638e9eabaef4f1426a73280570a98ab3cf750e473d89e8d49e1f4" 565 | dependencies = [ 566 | "bevy", 567 | "bevy-inspector-egui", 568 | "egui_dock", 569 | "indexmap", 570 | ] 571 | 572 | [[package]] 573 | name = "bevy_editor_pls_default_windows" 574 | version = "0.8.1" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "4d12a4a8a762b6dd1212700dd4a82a6f16ed8cab1d6313c242a23fb53610ce1d" 577 | dependencies = [ 578 | "bevy", 579 | "bevy-inspector-egui", 580 | "bevy_editor_pls_core", 581 | "bevy_mod_debugdump", 582 | "egui-gizmo", 583 | "indexmap", 584 | "opener", 585 | "pretty-type-name", 586 | ] 587 | 588 | [[package]] 589 | name = "bevy_egui" 590 | version = "0.25.0" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "b84bfb8d4104a1467910cf2090bc6a6d394ebde39c0dbc02397b45aa9ef88e80" 593 | dependencies = [ 594 | "arboard", 595 | "bevy", 596 | "egui", 597 | "thread_local", 598 | "web-sys", 599 | "webbrowser", 600 | ] 601 | 602 | [[package]] 603 | name = "bevy_encase_derive" 604 | version = "0.13.2" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "887087a5e522d9f20733a84dd7e6e9ca04cd8fdfac659220ed87d675eebc83a7" 607 | dependencies = [ 608 | "bevy_macro_utils", 609 | "encase_derive_impl", 610 | ] 611 | 612 | [[package]] 613 | name = "bevy_gizmos" 614 | version = "0.13.2" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "054df3550a9d423a961de65b459946ff23304f97f25af8a62c23f4259db8506d" 617 | dependencies = [ 618 | "bevy_app", 619 | "bevy_asset", 620 | "bevy_core", 621 | "bevy_core_pipeline", 622 | "bevy_ecs", 623 | "bevy_gizmos_macros", 624 | "bevy_log", 625 | "bevy_math", 626 | "bevy_pbr", 627 | "bevy_reflect", 628 | "bevy_render", 629 | "bevy_sprite", 630 | "bevy_transform", 631 | "bevy_utils", 632 | ] 633 | 634 | [[package]] 635 | name = "bevy_gizmos_macros" 636 | version = "0.13.2" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "abdcaf74d8cd34aa5c3293527e7a012826840886ad3496c1b963ed8b66b1619f" 639 | dependencies = [ 640 | "bevy_macro_utils", 641 | "proc-macro2", 642 | "quote", 643 | "syn 2.0.61", 644 | ] 645 | 646 | [[package]] 647 | name = "bevy_hierarchy" 648 | version = "0.13.2" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "bbb3dfad24866a6713dafa3065a91c5cf5e355f6e1b191c25d704ae54185246c" 651 | dependencies = [ 652 | "bevy_app", 653 | "bevy_core", 654 | "bevy_ecs", 655 | "bevy_log", 656 | "bevy_reflect", 657 | "bevy_utils", 658 | ] 659 | 660 | [[package]] 661 | name = "bevy_input" 662 | version = "0.13.2" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "47f2b2b3df168c6ef661d25e09abf5bd4fecaacd400f27e5db650df1c3fa3a3b" 665 | dependencies = [ 666 | "bevy_app", 667 | "bevy_ecs", 668 | "bevy_math", 669 | "bevy_reflect", 670 | "bevy_utils", 671 | "smol_str", 672 | "thiserror", 673 | ] 674 | 675 | [[package]] 676 | name = "bevy_internal" 677 | version = "0.13.2" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "f58ec0ce77603df9474cde61f429126bfe06eb79094440e9141afb4217751c79" 680 | dependencies = [ 681 | "bevy_a11y", 682 | "bevy_app", 683 | "bevy_asset", 684 | "bevy_core", 685 | "bevy_core_pipeline", 686 | "bevy_derive", 687 | "bevy_diagnostic", 688 | "bevy_ecs", 689 | "bevy_gizmos", 690 | "bevy_hierarchy", 691 | "bevy_input", 692 | "bevy_log", 693 | "bevy_math", 694 | "bevy_pbr", 695 | "bevy_ptr", 696 | "bevy_reflect", 697 | "bevy_render", 698 | "bevy_scene", 699 | "bevy_sprite", 700 | "bevy_tasks", 701 | "bevy_text", 702 | "bevy_time", 703 | "bevy_transform", 704 | "bevy_ui", 705 | "bevy_utils", 706 | "bevy_window", 707 | "bevy_winit", 708 | ] 709 | 710 | [[package]] 711 | name = "bevy_log" 712 | version = "0.13.2" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "a5eea6c527fd828b7fef8d0f518167f27f405b904a16f227b644687d3f46a809" 715 | dependencies = [ 716 | "android_log-sys", 717 | "bevy_app", 718 | "bevy_ecs", 719 | "bevy_utils", 720 | "console_error_panic_hook", 721 | "tracing-log 0.1.4", 722 | "tracing-subscriber", 723 | "tracing-wasm", 724 | ] 725 | 726 | [[package]] 727 | name = "bevy_macro_utils" 728 | version = "0.13.2" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "eb270c98a96243b29465139ed10bda2f675d00a11904f6588a5f7fc4774119c7" 731 | dependencies = [ 732 | "proc-macro2", 733 | "quote", 734 | "rustc-hash", 735 | "syn 2.0.61", 736 | "toml_edit", 737 | ] 738 | 739 | [[package]] 740 | name = "bevy_math" 741 | version = "0.13.2" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "f06daa26ffb82d90ba772256c0ba286f6c305c392f6976c9822717974805837c" 744 | dependencies = [ 745 | "glam", 746 | "serde", 747 | ] 748 | 749 | [[package]] 750 | name = "bevy_mikktspace" 751 | version = "0.13.2" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "a0d7ef7f2a826d0b19f059035831ce00a5e930435cc53c61e045773d0483f67a" 754 | dependencies = [ 755 | "glam", 756 | ] 757 | 758 | [[package]] 759 | name = "bevy_mod_debugdump" 760 | version = "0.10.0" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "d39eb6372d6af22b209d68c10e3b742938b450117281387c94ce3f9f51902b76" 763 | dependencies = [ 764 | "bevy_app", 765 | "bevy_ecs", 766 | "bevy_render", 767 | "bevy_utils", 768 | "once_cell", 769 | "petgraph", 770 | "pretty-type-name", 771 | ] 772 | 773 | [[package]] 774 | name = "bevy_pbr" 775 | version = "0.13.2" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "75b29c80269fa6db55c9e33701edd3ecb73d8866ca8cb814d49a9d3fb72531b6" 778 | dependencies = [ 779 | "bevy_app", 780 | "bevy_asset", 781 | "bevy_core_pipeline", 782 | "bevy_derive", 783 | "bevy_ecs", 784 | "bevy_math", 785 | "bevy_reflect", 786 | "bevy_render", 787 | "bevy_transform", 788 | "bevy_utils", 789 | "bevy_window", 790 | "bitflags 2.5.0", 791 | "bytemuck", 792 | "fixedbitset", 793 | "radsort", 794 | "smallvec", 795 | "thread_local", 796 | ] 797 | 798 | [[package]] 799 | name = "bevy_ptr" 800 | version = "0.13.2" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "8050e2869fe341db6874203b5a01ff12673807a2c7c80cb829f6c7bea6997268" 803 | 804 | [[package]] 805 | name = "bevy_reflect" 806 | version = "0.13.2" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "ccbd7de21d586457a340a0962ad0747dc5098ff925eb6b27a918c4bdd8252f7b" 809 | dependencies = [ 810 | "bevy_math", 811 | "bevy_ptr", 812 | "bevy_reflect_derive", 813 | "bevy_utils", 814 | "downcast-rs", 815 | "erased-serde", 816 | "glam", 817 | "serde", 818 | "smol_str", 819 | "thiserror", 820 | ] 821 | 822 | [[package]] 823 | name = "bevy_reflect_derive" 824 | version = "0.13.2" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "3ce33051bd49036d4a5a62aa3f2068672ec55f3ebe92aa0d003a341f15cc37ac" 827 | dependencies = [ 828 | "bevy_macro_utils", 829 | "proc-macro2", 830 | "quote", 831 | "syn 2.0.61", 832 | "uuid", 833 | ] 834 | 835 | [[package]] 836 | name = "bevy_render" 837 | version = "0.13.2" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "88b2c4b644c739c0b474b6f8f7b0bc68ac13d83b59688781e9a7753c52780177" 840 | dependencies = [ 841 | "async-channel", 842 | "bevy_app", 843 | "bevy_asset", 844 | "bevy_core", 845 | "bevy_derive", 846 | "bevy_ecs", 847 | "bevy_encase_derive", 848 | "bevy_hierarchy", 849 | "bevy_log", 850 | "bevy_math", 851 | "bevy_mikktspace", 852 | "bevy_reflect", 853 | "bevy_render_macros", 854 | "bevy_tasks", 855 | "bevy_time", 856 | "bevy_transform", 857 | "bevy_utils", 858 | "bevy_window", 859 | "bitflags 2.5.0", 860 | "bytemuck", 861 | "codespan-reporting", 862 | "downcast-rs", 863 | "encase", 864 | "futures-lite", 865 | "hexasphere", 866 | "image 0.24.9", 867 | "js-sys", 868 | "naga", 869 | "naga_oil", 870 | "serde", 871 | "thiserror", 872 | "thread_local", 873 | "wasm-bindgen", 874 | "web-sys", 875 | "wgpu", 876 | ] 877 | 878 | [[package]] 879 | name = "bevy_render_macros" 880 | version = "0.13.2" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "720b88406e786e378829b7d43c1ffb5300186912b99904d0d4d8ec6698a4f210" 883 | dependencies = [ 884 | "bevy_macro_utils", 885 | "proc-macro2", 886 | "quote", 887 | "syn 2.0.61", 888 | ] 889 | 890 | [[package]] 891 | name = "bevy_scene" 892 | version = "0.13.2" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "1f3d2caa1bfe7542dbe2c62e1bcc10791ba181fb744d2fe6711d1d373354da7c" 895 | dependencies = [ 896 | "bevy_app", 897 | "bevy_asset", 898 | "bevy_derive", 899 | "bevy_ecs", 900 | "bevy_hierarchy", 901 | "bevy_reflect", 902 | "bevy_render", 903 | "bevy_transform", 904 | "bevy_utils", 905 | "serde", 906 | "thiserror", 907 | "uuid", 908 | ] 909 | 910 | [[package]] 911 | name = "bevy_scroller" 912 | version = "0.4.0" 913 | dependencies = [ 914 | "bevy", 915 | "bevy_editor_pls", 916 | "fast_poisson", 917 | "iyes_perf_ui", 918 | "rand", 919 | "rstest", 920 | ] 921 | 922 | [[package]] 923 | name = "bevy_sprite" 924 | version = "0.13.2" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "8cad1b555161f50e5d62b7fdf7ebeef1b24338aae7a88e51985da9553cd60ddf" 927 | dependencies = [ 928 | "bevy_app", 929 | "bevy_asset", 930 | "bevy_core_pipeline", 931 | "bevy_derive", 932 | "bevy_ecs", 933 | "bevy_log", 934 | "bevy_math", 935 | "bevy_reflect", 936 | "bevy_render", 937 | "bevy_transform", 938 | "bevy_utils", 939 | "bitflags 2.5.0", 940 | "bytemuck", 941 | "fixedbitset", 942 | "guillotiere", 943 | "radsort", 944 | "rectangle-pack", 945 | "thiserror", 946 | ] 947 | 948 | [[package]] 949 | name = "bevy_tasks" 950 | version = "0.13.2" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "f07fcc4969b357de143509925b39c9a2c56eaa8750828d97f319ca9ed41897cb" 953 | dependencies = [ 954 | "async-channel", 955 | "async-executor", 956 | "async-task", 957 | "concurrent-queue", 958 | "futures-lite", 959 | "wasm-bindgen-futures", 960 | ] 961 | 962 | [[package]] 963 | name = "bevy_text" 964 | version = "0.13.2" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "c4e8456ae0bea7d6b7621e42c1c12bf66c0891381e62c948ab23920673ce611c" 967 | dependencies = [ 968 | "ab_glyph", 969 | "bevy_app", 970 | "bevy_asset", 971 | "bevy_ecs", 972 | "bevy_math", 973 | "bevy_reflect", 974 | "bevy_render", 975 | "bevy_sprite", 976 | "bevy_transform", 977 | "bevy_utils", 978 | "bevy_window", 979 | "glyph_brush_layout", 980 | "serde", 981 | "thiserror", 982 | ] 983 | 984 | [[package]] 985 | name = "bevy_time" 986 | version = "0.13.2" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "38ea5ae9fe7f56f555dbb05a88d34931907873e3f0c7dc426591839eef72fe3e" 989 | dependencies = [ 990 | "bevy_app", 991 | "bevy_ecs", 992 | "bevy_reflect", 993 | "bevy_utils", 994 | "crossbeam-channel", 995 | "thiserror", 996 | ] 997 | 998 | [[package]] 999 | name = "bevy_transform" 1000 | version = "0.13.2" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "a0d51a1f332cc00939d2f19ed6b909e5ed7037e39c7e25cc86930d79d432163e" 1003 | dependencies = [ 1004 | "bevy_app", 1005 | "bevy_ecs", 1006 | "bevy_hierarchy", 1007 | "bevy_math", 1008 | "bevy_reflect", 1009 | "thiserror", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "bevy_ui" 1014 | version = "0.13.2" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "b6bbc30be39cfbfa3a073b541d22aea43ab14452dea12d7411ce201df17ff7b1" 1017 | dependencies = [ 1018 | "bevy_a11y", 1019 | "bevy_app", 1020 | "bevy_asset", 1021 | "bevy_core_pipeline", 1022 | "bevy_derive", 1023 | "bevy_ecs", 1024 | "bevy_hierarchy", 1025 | "bevy_input", 1026 | "bevy_log", 1027 | "bevy_math", 1028 | "bevy_reflect", 1029 | "bevy_render", 1030 | "bevy_sprite", 1031 | "bevy_text", 1032 | "bevy_transform", 1033 | "bevy_utils", 1034 | "bevy_window", 1035 | "bytemuck", 1036 | "taffy", 1037 | "thiserror", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "bevy_utils" 1042 | version = "0.13.2" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "5a9f845a985c00e0ee8dc2d8af3f417be925fb52aad4bda5b96e2e58a2b4d2eb" 1045 | dependencies = [ 1046 | "ahash", 1047 | "bevy_utils_proc_macros", 1048 | "getrandom", 1049 | "hashbrown", 1050 | "nonmax", 1051 | "petgraph", 1052 | "smallvec", 1053 | "thiserror", 1054 | "tracing", 1055 | "uuid", 1056 | "web-time", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "bevy_utils_proc_macros" 1061 | version = "0.13.2" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "bef158627f30503d5c18c20c60b444829f698d343516eeaf6eeee078c9a45163" 1064 | dependencies = [ 1065 | "proc-macro2", 1066 | "quote", 1067 | "syn 2.0.61", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "bevy_window" 1072 | version = "0.13.2" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "976202d2ed838176595b550ac654b15ae236e0178a6f19a94ca6d58f2a96ca60" 1075 | dependencies = [ 1076 | "bevy_a11y", 1077 | "bevy_app", 1078 | "bevy_ecs", 1079 | "bevy_input", 1080 | "bevy_math", 1081 | "bevy_reflect", 1082 | "bevy_utils", 1083 | "raw-window-handle 0.6.1", 1084 | "smol_str", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "bevy_winit" 1089 | version = "0.13.2" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "aa66539aa93d8522b146bf82de429714ea6370a6061fc1f1ff7bcacd4e64c6c4" 1092 | dependencies = [ 1093 | "accesskit_winit", 1094 | "approx", 1095 | "bevy_a11y", 1096 | "bevy_app", 1097 | "bevy_derive", 1098 | "bevy_ecs", 1099 | "bevy_hierarchy", 1100 | "bevy_input", 1101 | "bevy_math", 1102 | "bevy_tasks", 1103 | "bevy_utils", 1104 | "bevy_window", 1105 | "crossbeam-channel", 1106 | "raw-window-handle 0.6.1", 1107 | "wasm-bindgen", 1108 | "web-sys", 1109 | "winit", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "bit-set" 1114 | version = "0.5.3" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 1117 | dependencies = [ 1118 | "bit-vec", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "bit-vec" 1123 | version = "0.6.3" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 1126 | 1127 | [[package]] 1128 | name = "bitflags" 1129 | version = "1.3.2" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 1132 | 1133 | [[package]] 1134 | name = "bitflags" 1135 | version = "2.5.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 1138 | dependencies = [ 1139 | "serde", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "blake3" 1144 | version = "1.5.1" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" 1147 | dependencies = [ 1148 | "arrayref", 1149 | "arrayvec", 1150 | "cc", 1151 | "cfg-if", 1152 | "constant_time_eq", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "block" 1157 | version = "0.1.6" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 1160 | 1161 | [[package]] 1162 | name = "block-sys" 1163 | version = "0.1.0-beta.1" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" 1166 | dependencies = [ 1167 | "objc-sys 0.2.0-beta.2", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "block-sys" 1172 | version = "0.2.1" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" 1175 | dependencies = [ 1176 | "objc-sys 0.3.3", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "block2" 1181 | version = "0.2.0-alpha.6" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" 1184 | dependencies = [ 1185 | "block-sys 0.1.0-beta.1", 1186 | "objc2-encode 2.0.0-pre.2", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "block2" 1191 | version = "0.3.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" 1194 | dependencies = [ 1195 | "block-sys 0.2.1", 1196 | "objc2 0.4.1", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "block2" 1201 | version = "0.5.0" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "43ff7d91d3c1d568065b06c899777d1e48dcf76103a672a0adbc238a7f247f1e" 1204 | dependencies = [ 1205 | "objc2 0.5.1", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "blocking" 1210 | version = "1.6.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" 1213 | dependencies = [ 1214 | "async-channel", 1215 | "async-lock", 1216 | "async-task", 1217 | "futures-io", 1218 | "futures-lite", 1219 | "piper", 1220 | ] 1221 | 1222 | [[package]] 1223 | name = "bstr" 1224 | version = "1.9.1" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" 1227 | dependencies = [ 1228 | "memchr", 1229 | "regex-automata 0.4.6", 1230 | "serde", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "bumpalo" 1235 | version = "3.16.0" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 1238 | 1239 | [[package]] 1240 | name = "bytemuck" 1241 | version = "1.15.0" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" 1244 | dependencies = [ 1245 | "bytemuck_derive", 1246 | ] 1247 | 1248 | [[package]] 1249 | name = "bytemuck_derive" 1250 | version = "1.6.0" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" 1253 | dependencies = [ 1254 | "proc-macro2", 1255 | "quote", 1256 | "syn 2.0.61", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "byteorder" 1261 | version = "1.5.0" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 1264 | 1265 | [[package]] 1266 | name = "bytes" 1267 | version = "1.6.0" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 1270 | 1271 | [[package]] 1272 | name = "calloop" 1273 | version = "0.12.4" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" 1276 | dependencies = [ 1277 | "bitflags 2.5.0", 1278 | "log", 1279 | "polling", 1280 | "rustix", 1281 | "slab", 1282 | "thiserror", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "cc" 1287 | version = "1.0.97" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" 1290 | dependencies = [ 1291 | "jobserver", 1292 | "libc", 1293 | "once_cell", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "cesu8" 1298 | version = "1.1.0" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 1301 | 1302 | [[package]] 1303 | name = "cfg-if" 1304 | version = "1.0.0" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 1307 | 1308 | [[package]] 1309 | name = "cfg_aliases" 1310 | version = "0.1.1" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 1313 | 1314 | [[package]] 1315 | name = "clipboard-win" 1316 | version = "5.3.1" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" 1319 | dependencies = [ 1320 | "error-code", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "codespan-reporting" 1325 | version = "0.11.1" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 1328 | dependencies = [ 1329 | "termcolor", 1330 | "unicode-width", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "color_quant" 1335 | version = "1.1.0" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 1338 | 1339 | [[package]] 1340 | name = "com" 1341 | version = "0.6.0" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" 1344 | dependencies = [ 1345 | "com_macros", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "com_macros" 1350 | version = "0.6.0" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" 1353 | dependencies = [ 1354 | "com_macros_support", 1355 | "proc-macro2", 1356 | "syn 1.0.109", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "com_macros_support" 1361 | version = "0.6.0" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" 1364 | dependencies = [ 1365 | "proc-macro2", 1366 | "quote", 1367 | "syn 1.0.109", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "combine" 1372 | version = "4.6.7" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 1375 | dependencies = [ 1376 | "bytes", 1377 | "memchr", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "concurrent-queue" 1382 | version = "2.5.0" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 1385 | dependencies = [ 1386 | "crossbeam-utils", 1387 | ] 1388 | 1389 | [[package]] 1390 | name = "console_error_panic_hook" 1391 | version = "0.1.7" 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" 1393 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 1394 | dependencies = [ 1395 | "cfg-if", 1396 | "wasm-bindgen", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "const-fnv1a-hash" 1401 | version = "1.1.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" 1404 | 1405 | [[package]] 1406 | name = "const_panic" 1407 | version = "0.2.8" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" 1410 | 1411 | [[package]] 1412 | name = "const_soft_float" 1413 | version = "0.1.4" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" 1416 | 1417 | [[package]] 1418 | name = "constant_time_eq" 1419 | version = "0.3.0" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" 1422 | 1423 | [[package]] 1424 | name = "constgebra" 1425 | version = "0.1.4" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" 1428 | dependencies = [ 1429 | "const_soft_float", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "core-foundation" 1434 | version = "0.9.4" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 1437 | dependencies = [ 1438 | "core-foundation-sys", 1439 | "libc", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "core-foundation-sys" 1444 | version = "0.8.6" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 1447 | 1448 | [[package]] 1449 | name = "core-graphics" 1450 | version = "0.23.2" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 1453 | dependencies = [ 1454 | "bitflags 1.3.2", 1455 | "core-foundation", 1456 | "core-graphics-types", 1457 | "foreign-types", 1458 | "libc", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "core-graphics-types" 1463 | version = "0.1.3" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 1466 | dependencies = [ 1467 | "bitflags 1.3.2", 1468 | "core-foundation", 1469 | "libc", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "crc32fast" 1474 | version = "1.4.0" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 1477 | dependencies = [ 1478 | "cfg-if", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "crossbeam-channel" 1483 | version = "0.5.12" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" 1486 | dependencies = [ 1487 | "crossbeam-utils", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "crossbeam-deque" 1492 | version = "0.8.5" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 1495 | dependencies = [ 1496 | "crossbeam-epoch", 1497 | "crossbeam-utils", 1498 | ] 1499 | 1500 | [[package]] 1501 | name = "crossbeam-epoch" 1502 | version = "0.9.18" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 1505 | dependencies = [ 1506 | "crossbeam-utils", 1507 | ] 1508 | 1509 | [[package]] 1510 | name = "crossbeam-utils" 1511 | version = "0.8.19" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 1514 | 1515 | [[package]] 1516 | name = "crunchy" 1517 | version = "0.2.2" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 1520 | 1521 | [[package]] 1522 | name = "cursor-icon" 1523 | version = "1.1.0" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 1526 | 1527 | [[package]] 1528 | name = "d3d12" 1529 | version = "0.19.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" 1532 | dependencies = [ 1533 | "bitflags 2.5.0", 1534 | "libloading 0.8.3", 1535 | "winapi", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "data-encoding" 1540 | version = "2.6.0" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" 1543 | 1544 | [[package]] 1545 | name = "dispatch" 1546 | version = "0.2.0" 1547 | source = "registry+https://github.com/rust-lang/crates.io-index" 1548 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 1549 | 1550 | [[package]] 1551 | name = "divrem" 1552 | version = "1.0.0" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "69dde51e8fef5e12c1d65e0929b03d66e4c0c18282bc30ed2ca050ad6f44dd82" 1555 | 1556 | [[package]] 1557 | name = "dlib" 1558 | version = "0.5.2" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 1561 | dependencies = [ 1562 | "libloading 0.8.3", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "doc-comment" 1567 | version = "0.3.3" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 1570 | 1571 | [[package]] 1572 | name = "downcast-rs" 1573 | version = "1.2.1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 1576 | 1577 | [[package]] 1578 | name = "duplicate" 1579 | version = "1.0.0" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" 1582 | dependencies = [ 1583 | "heck", 1584 | "proc-macro-error", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "ecolor" 1589 | version = "0.26.2" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "03cfe80b1890e1a8cdbffc6044d6872e814aaf6011835a2a5e2db0e5c5c4ef4e" 1592 | dependencies = [ 1593 | "bytemuck", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "egui" 1598 | version = "0.26.2" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "180f595432a5b615fc6b74afef3955249b86cfea72607b40740a4cd60d5297d0" 1601 | dependencies = [ 1602 | "ahash", 1603 | "epaint", 1604 | "nohash-hasher", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "egui-gizmo" 1609 | version = "0.16.2" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "65371711037f6f256024371f21fd8f8c5fa2ce5221469a5fb1efc670f205f740" 1612 | dependencies = [ 1613 | "egui", 1614 | "glam", 1615 | "mint", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "egui_dock" 1620 | version = "0.11.4" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "9a062ac200c9f3ddf120ffcc5582f9fbd5d8fbd046d2eed215ed5426f56513d0" 1623 | dependencies = [ 1624 | "duplicate", 1625 | "egui", 1626 | "paste", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "either" 1631 | version = "1.11.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 1634 | 1635 | [[package]] 1636 | name = "elapsed" 1637 | version = "0.1.2" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "6f4e5af126dafd0741c2ad62d47f68b28602550102e5f0dd45c8a97fc8b49c29" 1640 | 1641 | [[package]] 1642 | name = "emath" 1643 | version = "0.26.2" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "6916301ecf80448f786cdf3eb51d9dbdd831538732229d49119e2d4312eaaf09" 1646 | dependencies = [ 1647 | "bytemuck", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "encase" 1652 | version = "0.7.0" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "95ed933078d2e659745df651f4c180511cd582e5b9414ff896e7d50d207e3103" 1655 | dependencies = [ 1656 | "const_panic", 1657 | "encase_derive", 1658 | "glam", 1659 | "thiserror", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "encase_derive" 1664 | version = "0.7.0" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "f4ce1449c7d19eba6cc0abd231150ad81620a8dce29601d7f8d236e5d431d72a" 1667 | dependencies = [ 1668 | "encase_derive_impl", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "encase_derive_impl" 1673 | version = "0.7.0" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "92959a9e8d13eaa13b8ae8c7b583c3bf1669ca7a8e7708a088d12587ba86effc" 1676 | dependencies = [ 1677 | "proc-macro2", 1678 | "quote", 1679 | "syn 2.0.61", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "epaint" 1684 | version = "0.26.2" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "77b9fdf617dd7f58b0c8e6e9e4a1281f730cde0831d40547da446b2bb76a47af" 1687 | dependencies = [ 1688 | "ab_glyph", 1689 | "ahash", 1690 | "bytemuck", 1691 | "ecolor", 1692 | "emath", 1693 | "nohash-hasher", 1694 | "parking_lot", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "equivalent" 1699 | version = "1.0.1" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1702 | 1703 | [[package]] 1704 | name = "erased-serde" 1705 | version = "0.4.4" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" 1708 | dependencies = [ 1709 | "serde", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "errno" 1714 | version = "0.3.8" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 1717 | dependencies = [ 1718 | "libc", 1719 | "windows-sys 0.52.0", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "error-code" 1724 | version = "3.2.0" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" 1727 | 1728 | [[package]] 1729 | name = "euclid" 1730 | version = "0.22.9" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" 1733 | dependencies = [ 1734 | "num-traits", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "event-listener" 1739 | version = "2.5.3" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 1742 | 1743 | [[package]] 1744 | name = "event-listener" 1745 | version = "4.0.3" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" 1748 | dependencies = [ 1749 | "concurrent-queue", 1750 | "parking", 1751 | "pin-project-lite", 1752 | ] 1753 | 1754 | [[package]] 1755 | name = "event-listener" 1756 | version = "5.3.0" 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" 1758 | checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" 1759 | dependencies = [ 1760 | "concurrent-queue", 1761 | "parking", 1762 | "pin-project-lite", 1763 | ] 1764 | 1765 | [[package]] 1766 | name = "event-listener-strategy" 1767 | version = "0.4.0" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" 1770 | dependencies = [ 1771 | "event-listener 4.0.3", 1772 | "pin-project-lite", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "event-listener-strategy" 1777 | version = "0.5.2" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" 1780 | dependencies = [ 1781 | "event-listener 5.3.0", 1782 | "pin-project-lite", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "fast_poisson" 1787 | version = "1.0.0" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "2472baa9796d2ee497bd61690e3093a26935390d8ce0dd0ddc2db9b47a65898f" 1790 | dependencies = [ 1791 | "kiddo", 1792 | "rand", 1793 | "rand_distr", 1794 | "rand_xoshiro", 1795 | ] 1796 | 1797 | [[package]] 1798 | name = "fastrand" 1799 | version = "2.1.0" 1800 | source = "registry+https://github.com/rust-lang/crates.io-index" 1801 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 1802 | 1803 | [[package]] 1804 | name = "fdeflate" 1805 | version = "0.3.4" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" 1808 | dependencies = [ 1809 | "simd-adler32", 1810 | ] 1811 | 1812 | [[package]] 1813 | name = "fixed" 1814 | version = "1.27.0" 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" 1816 | checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" 1817 | dependencies = [ 1818 | "az", 1819 | "bytemuck", 1820 | "half", 1821 | "num-traits", 1822 | "typenum", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "fixedbitset" 1827 | version = "0.4.2" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 1830 | 1831 | [[package]] 1832 | name = "flate2" 1833 | version = "1.0.30" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" 1836 | dependencies = [ 1837 | "crc32fast", 1838 | "miniz_oxide", 1839 | ] 1840 | 1841 | [[package]] 1842 | name = "foreign-types" 1843 | version = "0.5.0" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1846 | dependencies = [ 1847 | "foreign-types-macros", 1848 | "foreign-types-shared", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "foreign-types-macros" 1853 | version = "0.2.3" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1856 | dependencies = [ 1857 | "proc-macro2", 1858 | "quote", 1859 | "syn 2.0.61", 1860 | ] 1861 | 1862 | [[package]] 1863 | name = "foreign-types-shared" 1864 | version = "0.3.1" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1867 | 1868 | [[package]] 1869 | name = "form_urlencoded" 1870 | version = "1.2.1" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1873 | dependencies = [ 1874 | "percent-encoding", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "futures" 1879 | version = "0.3.30" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 1882 | dependencies = [ 1883 | "futures-channel", 1884 | "futures-core", 1885 | "futures-executor", 1886 | "futures-io", 1887 | "futures-sink", 1888 | "futures-task", 1889 | "futures-util", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "futures-channel" 1894 | version = "0.3.30" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 1897 | dependencies = [ 1898 | "futures-core", 1899 | "futures-sink", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "futures-core" 1904 | version = "0.3.30" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 1907 | 1908 | [[package]] 1909 | name = "futures-executor" 1910 | version = "0.3.30" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 1913 | dependencies = [ 1914 | "futures-core", 1915 | "futures-task", 1916 | "futures-util", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "futures-io" 1921 | version = "0.3.30" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 1924 | 1925 | [[package]] 1926 | name = "futures-lite" 1927 | version = "2.3.0" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" 1930 | dependencies = [ 1931 | "fastrand", 1932 | "futures-core", 1933 | "futures-io", 1934 | "parking", 1935 | "pin-project-lite", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "futures-macro" 1940 | version = "0.3.30" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 1943 | dependencies = [ 1944 | "proc-macro2", 1945 | "quote", 1946 | "syn 2.0.61", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "futures-sink" 1951 | version = "0.3.30" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 1954 | 1955 | [[package]] 1956 | name = "futures-task" 1957 | version = "0.3.30" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 1960 | 1961 | [[package]] 1962 | name = "futures-timer" 1963 | version = "3.0.3" 1964 | source = "registry+https://github.com/rust-lang/crates.io-index" 1965 | checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" 1966 | 1967 | [[package]] 1968 | name = "futures-util" 1969 | version = "0.3.30" 1970 | source = "registry+https://github.com/rust-lang/crates.io-index" 1971 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 1972 | dependencies = [ 1973 | "futures-channel", 1974 | "futures-core", 1975 | "futures-io", 1976 | "futures-macro", 1977 | "futures-sink", 1978 | "futures-task", 1979 | "memchr", 1980 | "pin-project-lite", 1981 | "pin-utils", 1982 | "slab", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "generic-array" 1987 | version = "0.14.7" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1990 | dependencies = [ 1991 | "typenum", 1992 | "version_check", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "gethostname" 1997 | version = "0.4.3" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 2000 | dependencies = [ 2001 | "libc", 2002 | "windows-targets 0.48.5", 2003 | ] 2004 | 2005 | [[package]] 2006 | name = "getrandom" 2007 | version = "0.2.15" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 2010 | dependencies = [ 2011 | "cfg-if", 2012 | "js-sys", 2013 | "libc", 2014 | "wasi", 2015 | "wasm-bindgen", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "gl_generator" 2020 | version = "0.14.0" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 2023 | dependencies = [ 2024 | "khronos_api", 2025 | "log", 2026 | "xml-rs", 2027 | ] 2028 | 2029 | [[package]] 2030 | name = "glam" 2031 | version = "0.25.0" 2032 | source = "registry+https://github.com/rust-lang/crates.io-index" 2033 | checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" 2034 | dependencies = [ 2035 | "bytemuck", 2036 | "mint", 2037 | "serde", 2038 | ] 2039 | 2040 | [[package]] 2041 | name = "glob" 2042 | version = "0.3.1" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 2045 | 2046 | [[package]] 2047 | name = "glow" 2048 | version = "0.13.1" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" 2051 | dependencies = [ 2052 | "js-sys", 2053 | "slotmap", 2054 | "wasm-bindgen", 2055 | "web-sys", 2056 | ] 2057 | 2058 | [[package]] 2059 | name = "glutin_wgl_sys" 2060 | version = "0.5.0" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" 2063 | dependencies = [ 2064 | "gl_generator", 2065 | ] 2066 | 2067 | [[package]] 2068 | name = "glyph_brush_layout" 2069 | version = "0.2.3" 2070 | source = "registry+https://github.com/rust-lang/crates.io-index" 2071 | checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" 2072 | dependencies = [ 2073 | "ab_glyph", 2074 | "approx", 2075 | "xi-unicode", 2076 | ] 2077 | 2078 | [[package]] 2079 | name = "gpu-alloc" 2080 | version = "0.6.0" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 2083 | dependencies = [ 2084 | "bitflags 2.5.0", 2085 | "gpu-alloc-types", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "gpu-alloc-types" 2090 | version = "0.3.0" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 2093 | dependencies = [ 2094 | "bitflags 2.5.0", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "gpu-allocator" 2099 | version = "0.25.0" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" 2102 | dependencies = [ 2103 | "log", 2104 | "presser", 2105 | "thiserror", 2106 | "winapi", 2107 | "windows 0.52.0", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "gpu-descriptor" 2112 | version = "0.2.4" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" 2115 | dependencies = [ 2116 | "bitflags 2.5.0", 2117 | "gpu-descriptor-types", 2118 | "hashbrown", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "gpu-descriptor-types" 2123 | version = "0.1.2" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" 2126 | dependencies = [ 2127 | "bitflags 2.5.0", 2128 | ] 2129 | 2130 | [[package]] 2131 | name = "grid" 2132 | version = "0.10.0" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c" 2135 | 2136 | [[package]] 2137 | name = "guillotiere" 2138 | version = "0.6.2" 2139 | source = "registry+https://github.com/rust-lang/crates.io-index" 2140 | checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" 2141 | dependencies = [ 2142 | "euclid", 2143 | "svg_fmt", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "half" 2148 | version = "2.4.1" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 2151 | dependencies = [ 2152 | "cfg-if", 2153 | "crunchy", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "hashbrown" 2158 | version = "0.14.5" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 2161 | dependencies = [ 2162 | "ahash", 2163 | "allocator-api2", 2164 | "serde", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "hassle-rs" 2169 | version = "0.11.0" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" 2172 | dependencies = [ 2173 | "bitflags 2.5.0", 2174 | "com", 2175 | "libc", 2176 | "libloading 0.8.3", 2177 | "thiserror", 2178 | "widestring", 2179 | "winapi", 2180 | ] 2181 | 2182 | [[package]] 2183 | name = "heck" 2184 | version = "0.4.1" 2185 | source = "registry+https://github.com/rust-lang/crates.io-index" 2186 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 2187 | 2188 | [[package]] 2189 | name = "hermit-abi" 2190 | version = "0.3.9" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 2193 | 2194 | [[package]] 2195 | name = "hexasphere" 2196 | version = "10.0.0" 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" 2198 | checksum = "f33ddb7f7143d9e703c072e88b98cd8b9719f174137a671429351bd2ee43c02a" 2199 | dependencies = [ 2200 | "constgebra", 2201 | "glam", 2202 | ] 2203 | 2204 | [[package]] 2205 | name = "hexf-parse" 2206 | version = "0.2.1" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 2209 | 2210 | [[package]] 2211 | name = "home" 2212 | version = "0.5.9" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 2215 | dependencies = [ 2216 | "windows-sys 0.52.0", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "icrate" 2221 | version = "0.0.4" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" 2224 | dependencies = [ 2225 | "block2 0.3.0", 2226 | "dispatch", 2227 | "objc2 0.4.1", 2228 | ] 2229 | 2230 | [[package]] 2231 | name = "idna" 2232 | version = "0.5.0" 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" 2234 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 2235 | dependencies = [ 2236 | "unicode-bidi", 2237 | "unicode-normalization", 2238 | ] 2239 | 2240 | [[package]] 2241 | name = "image" 2242 | version = "0.24.9" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 2245 | dependencies = [ 2246 | "bytemuck", 2247 | "byteorder", 2248 | "color_quant", 2249 | "num-traits", 2250 | ] 2251 | 2252 | [[package]] 2253 | name = "image" 2254 | version = "0.25.1" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" 2257 | dependencies = [ 2258 | "bytemuck", 2259 | "byteorder", 2260 | "num-traits", 2261 | "png", 2262 | "tiff", 2263 | ] 2264 | 2265 | [[package]] 2266 | name = "indexmap" 2267 | version = "2.2.6" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 2270 | dependencies = [ 2271 | "equivalent", 2272 | "hashbrown", 2273 | ] 2274 | 2275 | [[package]] 2276 | name = "iyes_perf_ui" 2277 | version = "0.2.3" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | checksum = "a49f5aa5866dadfdd274c45eddc0a94c84ad1ce0c02c27bcb33c34a20b961f9e" 2280 | dependencies = [ 2281 | "bevy", 2282 | ] 2283 | 2284 | [[package]] 2285 | name = "jni" 2286 | version = "0.21.1" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 2289 | dependencies = [ 2290 | "cesu8", 2291 | "cfg-if", 2292 | "combine", 2293 | "jni-sys", 2294 | "log", 2295 | "thiserror", 2296 | "walkdir", 2297 | "windows-sys 0.45.0", 2298 | ] 2299 | 2300 | [[package]] 2301 | name = "jni-sys" 2302 | version = "0.3.0" 2303 | source = "registry+https://github.com/rust-lang/crates.io-index" 2304 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 2305 | 2306 | [[package]] 2307 | name = "jobserver" 2308 | version = "0.1.31" 2309 | source = "registry+https://github.com/rust-lang/crates.io-index" 2310 | checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" 2311 | dependencies = [ 2312 | "libc", 2313 | ] 2314 | 2315 | [[package]] 2316 | name = "jpeg-decoder" 2317 | version = "0.3.1" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 2320 | 2321 | [[package]] 2322 | name = "js-sys" 2323 | version = "0.3.69" 2324 | source = "registry+https://github.com/rust-lang/crates.io-index" 2325 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 2326 | dependencies = [ 2327 | "wasm-bindgen", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "khronos-egl" 2332 | version = "6.0.0" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 2335 | dependencies = [ 2336 | "libc", 2337 | "libloading 0.8.3", 2338 | "pkg-config", 2339 | ] 2340 | 2341 | [[package]] 2342 | name = "khronos_api" 2343 | version = "3.1.0" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 2346 | 2347 | [[package]] 2348 | name = "kiddo" 2349 | version = "2.1.2" 2350 | source = "registry+https://github.com/rust-lang/crates.io-index" 2351 | checksum = "8e1c5ea778d68eacd5c33f29537ba0b7b6c2595e74ee013a69cedc20ab4d3177" 2352 | dependencies = [ 2353 | "aligned", 2354 | "aligned-array", 2355 | "az", 2356 | "divrem", 2357 | "doc-comment", 2358 | "elapsed", 2359 | "fixed", 2360 | "log", 2361 | "min-max-heap", 2362 | "num-traits", 2363 | "rand", 2364 | "rayon", 2365 | ] 2366 | 2367 | [[package]] 2368 | name = "lazy_static" 2369 | version = "1.4.0" 2370 | source = "registry+https://github.com/rust-lang/crates.io-index" 2371 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 2372 | 2373 | [[package]] 2374 | name = "libc" 2375 | version = "0.2.154" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" 2378 | 2379 | [[package]] 2380 | name = "libloading" 2381 | version = "0.7.4" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" 2384 | dependencies = [ 2385 | "cfg-if", 2386 | "winapi", 2387 | ] 2388 | 2389 | [[package]] 2390 | name = "libloading" 2391 | version = "0.8.3" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" 2394 | dependencies = [ 2395 | "cfg-if", 2396 | "windows-targets 0.52.5", 2397 | ] 2398 | 2399 | [[package]] 2400 | name = "libm" 2401 | version = "0.2.8" 2402 | source = "registry+https://github.com/rust-lang/crates.io-index" 2403 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 2404 | 2405 | [[package]] 2406 | name = "libredox" 2407 | version = "0.0.2" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" 2410 | dependencies = [ 2411 | "bitflags 2.5.0", 2412 | "libc", 2413 | "redox_syscall 0.4.1", 2414 | ] 2415 | 2416 | [[package]] 2417 | name = "linux-raw-sys" 2418 | version = "0.4.13" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 2421 | 2422 | [[package]] 2423 | name = "lock_api" 2424 | version = "0.4.12" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 2427 | dependencies = [ 2428 | "autocfg", 2429 | "scopeguard", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "log" 2434 | version = "0.4.21" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 2437 | 2438 | [[package]] 2439 | name = "malloc_buf" 2440 | version = "0.0.6" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 2443 | dependencies = [ 2444 | "libc", 2445 | ] 2446 | 2447 | [[package]] 2448 | name = "matchers" 2449 | version = "0.1.0" 2450 | source = "registry+https://github.com/rust-lang/crates.io-index" 2451 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 2452 | dependencies = [ 2453 | "regex-automata 0.1.10", 2454 | ] 2455 | 2456 | [[package]] 2457 | name = "memchr" 2458 | version = "2.7.2" 2459 | source = "registry+https://github.com/rust-lang/crates.io-index" 2460 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 2461 | 2462 | [[package]] 2463 | name = "metal" 2464 | version = "0.27.0" 2465 | source = "registry+https://github.com/rust-lang/crates.io-index" 2466 | checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" 2467 | dependencies = [ 2468 | "bitflags 2.5.0", 2469 | "block", 2470 | "core-graphics-types", 2471 | "foreign-types", 2472 | "log", 2473 | "objc", 2474 | "paste", 2475 | ] 2476 | 2477 | [[package]] 2478 | name = "min-max-heap" 2479 | version = "1.3.0" 2480 | source = "registry+https://github.com/rust-lang/crates.io-index" 2481 | checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" 2482 | 2483 | [[package]] 2484 | name = "miniz_oxide" 2485 | version = "0.7.2" 2486 | source = "registry+https://github.com/rust-lang/crates.io-index" 2487 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 2488 | dependencies = [ 2489 | "adler", 2490 | "simd-adler32", 2491 | ] 2492 | 2493 | [[package]] 2494 | name = "mint" 2495 | version = "0.5.9" 2496 | source = "registry+https://github.com/rust-lang/crates.io-index" 2497 | checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" 2498 | 2499 | [[package]] 2500 | name = "naga" 2501 | version = "0.19.2" 2502 | source = "registry+https://github.com/rust-lang/crates.io-index" 2503 | checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" 2504 | dependencies = [ 2505 | "bit-set", 2506 | "bitflags 2.5.0", 2507 | "codespan-reporting", 2508 | "hexf-parse", 2509 | "indexmap", 2510 | "log", 2511 | "num-traits", 2512 | "pp-rs", 2513 | "rustc-hash", 2514 | "spirv", 2515 | "termcolor", 2516 | "thiserror", 2517 | "unicode-xid", 2518 | ] 2519 | 2520 | [[package]] 2521 | name = "naga_oil" 2522 | version = "0.13.0" 2523 | source = "registry+https://github.com/rust-lang/crates.io-index" 2524 | checksum = "c0ea62ae0f2787456afca7209ca180522b41f00cbe159ee369eba1e07d365cd1" 2525 | dependencies = [ 2526 | "bit-set", 2527 | "codespan-reporting", 2528 | "data-encoding", 2529 | "indexmap", 2530 | "naga", 2531 | "once_cell", 2532 | "regex", 2533 | "regex-syntax 0.8.3", 2534 | "rustc-hash", 2535 | "thiserror", 2536 | "tracing", 2537 | "unicode-ident", 2538 | ] 2539 | 2540 | [[package]] 2541 | name = "ndk" 2542 | version = "0.8.0" 2543 | source = "registry+https://github.com/rust-lang/crates.io-index" 2544 | checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 2545 | dependencies = [ 2546 | "bitflags 2.5.0", 2547 | "jni-sys", 2548 | "log", 2549 | "ndk-sys", 2550 | "num_enum", 2551 | "raw-window-handle 0.6.1", 2552 | "thiserror", 2553 | ] 2554 | 2555 | [[package]] 2556 | name = "ndk-context" 2557 | version = "0.1.1" 2558 | source = "registry+https://github.com/rust-lang/crates.io-index" 2559 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 2560 | 2561 | [[package]] 2562 | name = "ndk-sys" 2563 | version = "0.5.0+25.2.9519653" 2564 | source = "registry+https://github.com/rust-lang/crates.io-index" 2565 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 2566 | dependencies = [ 2567 | "jni-sys", 2568 | ] 2569 | 2570 | [[package]] 2571 | name = "nohash-hasher" 2572 | version = "0.2.0" 2573 | source = "registry+https://github.com/rust-lang/crates.io-index" 2574 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 2575 | 2576 | [[package]] 2577 | name = "nonmax" 2578 | version = "0.5.5" 2579 | source = "registry+https://github.com/rust-lang/crates.io-index" 2580 | checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" 2581 | 2582 | [[package]] 2583 | name = "normpath" 2584 | version = "1.2.0" 2585 | source = "registry+https://github.com/rust-lang/crates.io-index" 2586 | checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" 2587 | dependencies = [ 2588 | "windows-sys 0.52.0", 2589 | ] 2590 | 2591 | [[package]] 2592 | name = "ntapi" 2593 | version = "0.4.1" 2594 | source = "registry+https://github.com/rust-lang/crates.io-index" 2595 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 2596 | dependencies = [ 2597 | "winapi", 2598 | ] 2599 | 2600 | [[package]] 2601 | name = "nu-ansi-term" 2602 | version = "0.46.0" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 2605 | dependencies = [ 2606 | "overload", 2607 | "winapi", 2608 | ] 2609 | 2610 | [[package]] 2611 | name = "num-traits" 2612 | version = "0.2.19" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2615 | dependencies = [ 2616 | "autocfg", 2617 | "libm", 2618 | ] 2619 | 2620 | [[package]] 2621 | name = "num_enum" 2622 | version = "0.7.2" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" 2625 | dependencies = [ 2626 | "num_enum_derive", 2627 | ] 2628 | 2629 | [[package]] 2630 | name = "num_enum_derive" 2631 | version = "0.7.2" 2632 | source = "registry+https://github.com/rust-lang/crates.io-index" 2633 | checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" 2634 | dependencies = [ 2635 | "proc-macro-crate", 2636 | "proc-macro2", 2637 | "quote", 2638 | "syn 2.0.61", 2639 | ] 2640 | 2641 | [[package]] 2642 | name = "objc" 2643 | version = "0.2.7" 2644 | source = "registry+https://github.com/rust-lang/crates.io-index" 2645 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 2646 | dependencies = [ 2647 | "malloc_buf", 2648 | "objc_exception", 2649 | ] 2650 | 2651 | [[package]] 2652 | name = "objc-sys" 2653 | version = "0.2.0-beta.2" 2654 | source = "registry+https://github.com/rust-lang/crates.io-index" 2655 | checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" 2656 | 2657 | [[package]] 2658 | name = "objc-sys" 2659 | version = "0.3.3" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60" 2662 | 2663 | [[package]] 2664 | name = "objc2" 2665 | version = "0.3.0-beta.3.patch-leaks.3" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" 2668 | dependencies = [ 2669 | "block2 0.2.0-alpha.6", 2670 | "objc-sys 0.2.0-beta.2", 2671 | "objc2-encode 2.0.0-pre.2", 2672 | ] 2673 | 2674 | [[package]] 2675 | name = "objc2" 2676 | version = "0.4.1" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" 2679 | dependencies = [ 2680 | "objc-sys 0.3.3", 2681 | "objc2-encode 3.0.0", 2682 | ] 2683 | 2684 | [[package]] 2685 | name = "objc2" 2686 | version = "0.5.1" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "b4b25e1034d0e636cd84707ccdaa9f81243d399196b8a773946dcffec0401659" 2689 | dependencies = [ 2690 | "objc-sys 0.3.3", 2691 | "objc2-encode 4.0.1", 2692 | ] 2693 | 2694 | [[package]] 2695 | name = "objc2-app-kit" 2696 | version = "0.2.0" 2697 | source = "registry+https://github.com/rust-lang/crates.io-index" 2698 | checksum = "fb79768a710a9a1798848179edb186d1af7e8a8679f369e4b8d201dd2a034047" 2699 | dependencies = [ 2700 | "block2 0.5.0", 2701 | "objc2 0.5.1", 2702 | "objc2-core-data", 2703 | "objc2-foundation", 2704 | ] 2705 | 2706 | [[package]] 2707 | name = "objc2-core-data" 2708 | version = "0.2.0" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "6e092bc42eaf30a08844e6a076938c60751225ec81431ab89f5d1ccd9f958d6c" 2711 | dependencies = [ 2712 | "block2 0.5.0", 2713 | "objc2 0.5.1", 2714 | "objc2-foundation", 2715 | ] 2716 | 2717 | [[package]] 2718 | name = "objc2-encode" 2719 | version = "2.0.0-pre.2" 2720 | source = "registry+https://github.com/rust-lang/crates.io-index" 2721 | checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" 2722 | dependencies = [ 2723 | "objc-sys 0.2.0-beta.2", 2724 | ] 2725 | 2726 | [[package]] 2727 | name = "objc2-encode" 2728 | version = "3.0.0" 2729 | source = "registry+https://github.com/rust-lang/crates.io-index" 2730 | checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" 2731 | 2732 | [[package]] 2733 | name = "objc2-encode" 2734 | version = "4.0.1" 2735 | source = "registry+https://github.com/rust-lang/crates.io-index" 2736 | checksum = "88658da63e4cc2c8adb1262902cd6af51094df0488b760d6fd27194269c0950a" 2737 | 2738 | [[package]] 2739 | name = "objc2-foundation" 2740 | version = "0.2.0" 2741 | source = "registry+https://github.com/rust-lang/crates.io-index" 2742 | checksum = "cfaefe14254871ea16c7d88968c0ff14ba554712a20d76421eec52f0a7fb8904" 2743 | dependencies = [ 2744 | "block2 0.5.0", 2745 | "objc2 0.5.1", 2746 | ] 2747 | 2748 | [[package]] 2749 | name = "objc_exception" 2750 | version = "0.1.2" 2751 | source = "registry+https://github.com/rust-lang/crates.io-index" 2752 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 2753 | dependencies = [ 2754 | "cc", 2755 | ] 2756 | 2757 | [[package]] 2758 | name = "once_cell" 2759 | version = "1.19.0" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 2762 | 2763 | [[package]] 2764 | name = "opener" 2765 | version = "0.6.1" 2766 | source = "registry+https://github.com/rust-lang/crates.io-index" 2767 | checksum = "6c62dcb6174f9cb326eac248f07e955d5d559c272730b6c03e396b443b562788" 2768 | dependencies = [ 2769 | "bstr", 2770 | "normpath", 2771 | "winapi", 2772 | ] 2773 | 2774 | [[package]] 2775 | name = "orbclient" 2776 | version = "0.3.47" 2777 | source = "registry+https://github.com/rust-lang/crates.io-index" 2778 | checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" 2779 | dependencies = [ 2780 | "libredox", 2781 | ] 2782 | 2783 | [[package]] 2784 | name = "overload" 2785 | version = "0.1.1" 2786 | source = "registry+https://github.com/rust-lang/crates.io-index" 2787 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2788 | 2789 | [[package]] 2790 | name = "owned_ttf_parser" 2791 | version = "0.20.0" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" 2794 | dependencies = [ 2795 | "ttf-parser", 2796 | ] 2797 | 2798 | [[package]] 2799 | name = "parking" 2800 | version = "2.2.0" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" 2803 | 2804 | [[package]] 2805 | name = "parking_lot" 2806 | version = "0.12.2" 2807 | source = "registry+https://github.com/rust-lang/crates.io-index" 2808 | checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" 2809 | dependencies = [ 2810 | "lock_api", 2811 | "parking_lot_core", 2812 | ] 2813 | 2814 | [[package]] 2815 | name = "parking_lot_core" 2816 | version = "0.9.10" 2817 | source = "registry+https://github.com/rust-lang/crates.io-index" 2818 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2819 | dependencies = [ 2820 | "cfg-if", 2821 | "libc", 2822 | "redox_syscall 0.5.1", 2823 | "smallvec", 2824 | "windows-targets 0.52.5", 2825 | ] 2826 | 2827 | [[package]] 2828 | name = "paste" 2829 | version = "1.0.15" 2830 | source = "registry+https://github.com/rust-lang/crates.io-index" 2831 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2832 | 2833 | [[package]] 2834 | name = "percent-encoding" 2835 | version = "2.3.1" 2836 | source = "registry+https://github.com/rust-lang/crates.io-index" 2837 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2838 | 2839 | [[package]] 2840 | name = "petgraph" 2841 | version = "0.6.4" 2842 | source = "registry+https://github.com/rust-lang/crates.io-index" 2843 | checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" 2844 | dependencies = [ 2845 | "fixedbitset", 2846 | "indexmap", 2847 | ] 2848 | 2849 | [[package]] 2850 | name = "pin-project-lite" 2851 | version = "0.2.14" 2852 | source = "registry+https://github.com/rust-lang/crates.io-index" 2853 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 2854 | 2855 | [[package]] 2856 | name = "pin-utils" 2857 | version = "0.1.0" 2858 | source = "registry+https://github.com/rust-lang/crates.io-index" 2859 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2860 | 2861 | [[package]] 2862 | name = "piper" 2863 | version = "0.2.1" 2864 | source = "registry+https://github.com/rust-lang/crates.io-index" 2865 | checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" 2866 | dependencies = [ 2867 | "atomic-waker", 2868 | "fastrand", 2869 | "futures-io", 2870 | ] 2871 | 2872 | [[package]] 2873 | name = "pkg-config" 2874 | version = "0.3.30" 2875 | source = "registry+https://github.com/rust-lang/crates.io-index" 2876 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 2877 | 2878 | [[package]] 2879 | name = "png" 2880 | version = "0.17.13" 2881 | source = "registry+https://github.com/rust-lang/crates.io-index" 2882 | checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" 2883 | dependencies = [ 2884 | "bitflags 1.3.2", 2885 | "crc32fast", 2886 | "fdeflate", 2887 | "flate2", 2888 | "miniz_oxide", 2889 | ] 2890 | 2891 | [[package]] 2892 | name = "polling" 2893 | version = "3.7.0" 2894 | source = "registry+https://github.com/rust-lang/crates.io-index" 2895 | checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" 2896 | dependencies = [ 2897 | "cfg-if", 2898 | "concurrent-queue", 2899 | "hermit-abi", 2900 | "pin-project-lite", 2901 | "rustix", 2902 | "tracing", 2903 | "windows-sys 0.52.0", 2904 | ] 2905 | 2906 | [[package]] 2907 | name = "pp-rs" 2908 | version = "0.2.1" 2909 | source = "registry+https://github.com/rust-lang/crates.io-index" 2910 | checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" 2911 | dependencies = [ 2912 | "unicode-xid", 2913 | ] 2914 | 2915 | [[package]] 2916 | name = "ppv-lite86" 2917 | version = "0.2.17" 2918 | source = "registry+https://github.com/rust-lang/crates.io-index" 2919 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2920 | 2921 | [[package]] 2922 | name = "presser" 2923 | version = "0.3.1" 2924 | source = "registry+https://github.com/rust-lang/crates.io-index" 2925 | checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 2926 | 2927 | [[package]] 2928 | name = "pretty-type-name" 2929 | version = "1.0.1" 2930 | source = "registry+https://github.com/rust-lang/crates.io-index" 2931 | checksum = "f0f73cdaf19b52e6143685c3606206e114a4dfa969d6b14ec3894c88eb38bd4b" 2932 | 2933 | [[package]] 2934 | name = "proc-macro-crate" 2935 | version = "3.1.0" 2936 | source = "registry+https://github.com/rust-lang/crates.io-index" 2937 | checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" 2938 | dependencies = [ 2939 | "toml_edit", 2940 | ] 2941 | 2942 | [[package]] 2943 | name = "proc-macro-error" 2944 | version = "1.0.4" 2945 | source = "registry+https://github.com/rust-lang/crates.io-index" 2946 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2947 | dependencies = [ 2948 | "proc-macro-error-attr", 2949 | "proc-macro2", 2950 | "quote", 2951 | "syn 1.0.109", 2952 | "version_check", 2953 | ] 2954 | 2955 | [[package]] 2956 | name = "proc-macro-error-attr" 2957 | version = "1.0.4" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2960 | dependencies = [ 2961 | "proc-macro2", 2962 | "quote", 2963 | "version_check", 2964 | ] 2965 | 2966 | [[package]] 2967 | name = "proc-macro2" 2968 | version = "1.0.82" 2969 | source = "registry+https://github.com/rust-lang/crates.io-index" 2970 | checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" 2971 | dependencies = [ 2972 | "unicode-ident", 2973 | ] 2974 | 2975 | [[package]] 2976 | name = "profiling" 2977 | version = "1.0.15" 2978 | source = "registry+https://github.com/rust-lang/crates.io-index" 2979 | checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" 2980 | 2981 | [[package]] 2982 | name = "quote" 2983 | version = "1.0.36" 2984 | source = "registry+https://github.com/rust-lang/crates.io-index" 2985 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 2986 | dependencies = [ 2987 | "proc-macro2", 2988 | ] 2989 | 2990 | [[package]] 2991 | name = "radsort" 2992 | version = "0.1.0" 2993 | source = "registry+https://github.com/rust-lang/crates.io-index" 2994 | checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" 2995 | 2996 | [[package]] 2997 | name = "rand" 2998 | version = "0.8.5" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 3001 | dependencies = [ 3002 | "libc", 3003 | "rand_chacha", 3004 | "rand_core", 3005 | ] 3006 | 3007 | [[package]] 3008 | name = "rand_chacha" 3009 | version = "0.3.1" 3010 | source = "registry+https://github.com/rust-lang/crates.io-index" 3011 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 3012 | dependencies = [ 3013 | "ppv-lite86", 3014 | "rand_core", 3015 | ] 3016 | 3017 | [[package]] 3018 | name = "rand_core" 3019 | version = "0.6.4" 3020 | source = "registry+https://github.com/rust-lang/crates.io-index" 3021 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3022 | dependencies = [ 3023 | "getrandom", 3024 | ] 3025 | 3026 | [[package]] 3027 | name = "rand_distr" 3028 | version = "0.4.3" 3029 | source = "registry+https://github.com/rust-lang/crates.io-index" 3030 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 3031 | dependencies = [ 3032 | "num-traits", 3033 | "rand", 3034 | ] 3035 | 3036 | [[package]] 3037 | name = "rand_xoshiro" 3038 | version = "0.6.0" 3039 | source = "registry+https://github.com/rust-lang/crates.io-index" 3040 | checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" 3041 | dependencies = [ 3042 | "rand_core", 3043 | ] 3044 | 3045 | [[package]] 3046 | name = "range-alloc" 3047 | version = "0.1.3" 3048 | source = "registry+https://github.com/rust-lang/crates.io-index" 3049 | checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" 3050 | 3051 | [[package]] 3052 | name = "raw-window-handle" 3053 | version = "0.5.2" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" 3056 | 3057 | [[package]] 3058 | name = "raw-window-handle" 3059 | version = "0.6.1" 3060 | source = "registry+https://github.com/rust-lang/crates.io-index" 3061 | checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b" 3062 | 3063 | [[package]] 3064 | name = "rayon" 3065 | version = "1.10.0" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 3068 | dependencies = [ 3069 | "either", 3070 | "rayon-core", 3071 | ] 3072 | 3073 | [[package]] 3074 | name = "rayon-core" 3075 | version = "1.12.1" 3076 | source = "registry+https://github.com/rust-lang/crates.io-index" 3077 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 3078 | dependencies = [ 3079 | "crossbeam-deque", 3080 | "crossbeam-utils", 3081 | ] 3082 | 3083 | [[package]] 3084 | name = "rectangle-pack" 3085 | version = "0.4.2" 3086 | source = "registry+https://github.com/rust-lang/crates.io-index" 3087 | checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" 3088 | 3089 | [[package]] 3090 | name = "redox_syscall" 3091 | version = "0.3.5" 3092 | source = "registry+https://github.com/rust-lang/crates.io-index" 3093 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 3094 | dependencies = [ 3095 | "bitflags 1.3.2", 3096 | ] 3097 | 3098 | [[package]] 3099 | name = "redox_syscall" 3100 | version = "0.4.1" 3101 | source = "registry+https://github.com/rust-lang/crates.io-index" 3102 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 3103 | dependencies = [ 3104 | "bitflags 1.3.2", 3105 | ] 3106 | 3107 | [[package]] 3108 | name = "redox_syscall" 3109 | version = "0.5.1" 3110 | source = "registry+https://github.com/rust-lang/crates.io-index" 3111 | checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" 3112 | dependencies = [ 3113 | "bitflags 2.5.0", 3114 | ] 3115 | 3116 | [[package]] 3117 | name = "regex" 3118 | version = "1.10.4" 3119 | source = "registry+https://github.com/rust-lang/crates.io-index" 3120 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 3121 | dependencies = [ 3122 | "aho-corasick", 3123 | "memchr", 3124 | "regex-automata 0.4.6", 3125 | "regex-syntax 0.8.3", 3126 | ] 3127 | 3128 | [[package]] 3129 | name = "regex-automata" 3130 | version = "0.1.10" 3131 | source = "registry+https://github.com/rust-lang/crates.io-index" 3132 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 3133 | dependencies = [ 3134 | "regex-syntax 0.6.29", 3135 | ] 3136 | 3137 | [[package]] 3138 | name = "regex-automata" 3139 | version = "0.4.6" 3140 | source = "registry+https://github.com/rust-lang/crates.io-index" 3141 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 3142 | dependencies = [ 3143 | "aho-corasick", 3144 | "memchr", 3145 | "regex-syntax 0.8.3", 3146 | ] 3147 | 3148 | [[package]] 3149 | name = "regex-syntax" 3150 | version = "0.6.29" 3151 | source = "registry+https://github.com/rust-lang/crates.io-index" 3152 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 3153 | 3154 | [[package]] 3155 | name = "regex-syntax" 3156 | version = "0.8.3" 3157 | source = "registry+https://github.com/rust-lang/crates.io-index" 3158 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 3159 | 3160 | [[package]] 3161 | name = "relative-path" 3162 | version = "1.9.3" 3163 | source = "registry+https://github.com/rust-lang/crates.io-index" 3164 | checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" 3165 | 3166 | [[package]] 3167 | name = "renderdoc-sys" 3168 | version = "1.1.0" 3169 | source = "registry+https://github.com/rust-lang/crates.io-index" 3170 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 3171 | 3172 | [[package]] 3173 | name = "ron" 3174 | version = "0.8.1" 3175 | source = "registry+https://github.com/rust-lang/crates.io-index" 3176 | checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 3177 | dependencies = [ 3178 | "base64", 3179 | "bitflags 2.5.0", 3180 | "serde", 3181 | "serde_derive", 3182 | ] 3183 | 3184 | [[package]] 3185 | name = "rstest" 3186 | version = "0.18.2" 3187 | source = "registry+https://github.com/rust-lang/crates.io-index" 3188 | checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" 3189 | dependencies = [ 3190 | "futures", 3191 | "futures-timer", 3192 | "rstest_macros", 3193 | "rustc_version", 3194 | ] 3195 | 3196 | [[package]] 3197 | name = "rstest_macros" 3198 | version = "0.18.2" 3199 | source = "registry+https://github.com/rust-lang/crates.io-index" 3200 | checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" 3201 | dependencies = [ 3202 | "cfg-if", 3203 | "glob", 3204 | "proc-macro2", 3205 | "quote", 3206 | "regex", 3207 | "relative-path", 3208 | "rustc_version", 3209 | "syn 2.0.61", 3210 | "unicode-ident", 3211 | ] 3212 | 3213 | [[package]] 3214 | name = "rustc-hash" 3215 | version = "1.1.0" 3216 | source = "registry+https://github.com/rust-lang/crates.io-index" 3217 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 3218 | 3219 | [[package]] 3220 | name = "rustc_version" 3221 | version = "0.4.0" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 3224 | dependencies = [ 3225 | "semver", 3226 | ] 3227 | 3228 | [[package]] 3229 | name = "rustix" 3230 | version = "0.38.34" 3231 | source = "registry+https://github.com/rust-lang/crates.io-index" 3232 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 3233 | dependencies = [ 3234 | "bitflags 2.5.0", 3235 | "errno", 3236 | "libc", 3237 | "linux-raw-sys", 3238 | "windows-sys 0.52.0", 3239 | ] 3240 | 3241 | [[package]] 3242 | name = "same-file" 3243 | version = "1.0.6" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 3246 | dependencies = [ 3247 | "winapi-util", 3248 | ] 3249 | 3250 | [[package]] 3251 | name = "scopeguard" 3252 | version = "1.2.0" 3253 | source = "registry+https://github.com/rust-lang/crates.io-index" 3254 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3255 | 3256 | [[package]] 3257 | name = "semver" 3258 | version = "1.0.23" 3259 | source = "registry+https://github.com/rust-lang/crates.io-index" 3260 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 3261 | 3262 | [[package]] 3263 | name = "serde" 3264 | version = "1.0.200" 3265 | source = "registry+https://github.com/rust-lang/crates.io-index" 3266 | checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" 3267 | dependencies = [ 3268 | "serde_derive", 3269 | ] 3270 | 3271 | [[package]] 3272 | name = "serde_derive" 3273 | version = "1.0.200" 3274 | source = "registry+https://github.com/rust-lang/crates.io-index" 3275 | checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" 3276 | dependencies = [ 3277 | "proc-macro2", 3278 | "quote", 3279 | "syn 2.0.61", 3280 | ] 3281 | 3282 | [[package]] 3283 | name = "sharded-slab" 3284 | version = "0.1.7" 3285 | source = "registry+https://github.com/rust-lang/crates.io-index" 3286 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3287 | dependencies = [ 3288 | "lazy_static", 3289 | ] 3290 | 3291 | [[package]] 3292 | name = "simd-adler32" 3293 | version = "0.3.7" 3294 | source = "registry+https://github.com/rust-lang/crates.io-index" 3295 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 3296 | 3297 | [[package]] 3298 | name = "slab" 3299 | version = "0.4.9" 3300 | source = "registry+https://github.com/rust-lang/crates.io-index" 3301 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 3302 | dependencies = [ 3303 | "autocfg", 3304 | ] 3305 | 3306 | [[package]] 3307 | name = "slotmap" 3308 | version = "1.0.7" 3309 | source = "registry+https://github.com/rust-lang/crates.io-index" 3310 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 3311 | dependencies = [ 3312 | "version_check", 3313 | ] 3314 | 3315 | [[package]] 3316 | name = "smallvec" 3317 | version = "1.13.2" 3318 | source = "registry+https://github.com/rust-lang/crates.io-index" 3319 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 3320 | dependencies = [ 3321 | "serde", 3322 | ] 3323 | 3324 | [[package]] 3325 | name = "smol_str" 3326 | version = "0.2.1" 3327 | source = "registry+https://github.com/rust-lang/crates.io-index" 3328 | checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" 3329 | dependencies = [ 3330 | "serde", 3331 | ] 3332 | 3333 | [[package]] 3334 | name = "spirv" 3335 | version = "0.3.0+sdk-1.3.268.0" 3336 | source = "registry+https://github.com/rust-lang/crates.io-index" 3337 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 3338 | dependencies = [ 3339 | "bitflags 2.5.0", 3340 | ] 3341 | 3342 | [[package]] 3343 | name = "stable_deref_trait" 3344 | version = "1.2.0" 3345 | source = "registry+https://github.com/rust-lang/crates.io-index" 3346 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3347 | 3348 | [[package]] 3349 | name = "static_assertions" 3350 | version = "1.1.0" 3351 | source = "registry+https://github.com/rust-lang/crates.io-index" 3352 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3353 | 3354 | [[package]] 3355 | name = "svg_fmt" 3356 | version = "0.4.2" 3357 | source = "registry+https://github.com/rust-lang/crates.io-index" 3358 | checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499" 3359 | 3360 | [[package]] 3361 | name = "syn" 3362 | version = "1.0.109" 3363 | source = "registry+https://github.com/rust-lang/crates.io-index" 3364 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3365 | dependencies = [ 3366 | "proc-macro2", 3367 | "quote", 3368 | "unicode-ident", 3369 | ] 3370 | 3371 | [[package]] 3372 | name = "syn" 3373 | version = "2.0.61" 3374 | source = "registry+https://github.com/rust-lang/crates.io-index" 3375 | checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" 3376 | dependencies = [ 3377 | "proc-macro2", 3378 | "quote", 3379 | "unicode-ident", 3380 | ] 3381 | 3382 | [[package]] 3383 | name = "sysinfo" 3384 | version = "0.30.12" 3385 | source = "registry+https://github.com/rust-lang/crates.io-index" 3386 | checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" 3387 | dependencies = [ 3388 | "cfg-if", 3389 | "core-foundation-sys", 3390 | "libc", 3391 | "ntapi", 3392 | "once_cell", 3393 | "windows 0.52.0", 3394 | ] 3395 | 3396 | [[package]] 3397 | name = "taffy" 3398 | version = "0.3.19" 3399 | source = "registry+https://github.com/rust-lang/crates.io-index" 3400 | checksum = "b1315457ccd9c3def787a18fae91914e623e4dcff019b64ce39f5268ded53d3d" 3401 | dependencies = [ 3402 | "arrayvec", 3403 | "grid", 3404 | "num-traits", 3405 | "slotmap", 3406 | ] 3407 | 3408 | [[package]] 3409 | name = "termcolor" 3410 | version = "1.4.1" 3411 | source = "registry+https://github.com/rust-lang/crates.io-index" 3412 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 3413 | dependencies = [ 3414 | "winapi-util", 3415 | ] 3416 | 3417 | [[package]] 3418 | name = "thiserror" 3419 | version = "1.0.60" 3420 | source = "registry+https://github.com/rust-lang/crates.io-index" 3421 | checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" 3422 | dependencies = [ 3423 | "thiserror-impl", 3424 | ] 3425 | 3426 | [[package]] 3427 | name = "thiserror-impl" 3428 | version = "1.0.60" 3429 | source = "registry+https://github.com/rust-lang/crates.io-index" 3430 | checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" 3431 | dependencies = [ 3432 | "proc-macro2", 3433 | "quote", 3434 | "syn 2.0.61", 3435 | ] 3436 | 3437 | [[package]] 3438 | name = "thread_local" 3439 | version = "1.1.8" 3440 | source = "registry+https://github.com/rust-lang/crates.io-index" 3441 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 3442 | dependencies = [ 3443 | "cfg-if", 3444 | "once_cell", 3445 | ] 3446 | 3447 | [[package]] 3448 | name = "tiff" 3449 | version = "0.9.1" 3450 | source = "registry+https://github.com/rust-lang/crates.io-index" 3451 | checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 3452 | dependencies = [ 3453 | "flate2", 3454 | "jpeg-decoder", 3455 | "weezl", 3456 | ] 3457 | 3458 | [[package]] 3459 | name = "tinyvec" 3460 | version = "1.6.0" 3461 | source = "registry+https://github.com/rust-lang/crates.io-index" 3462 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3463 | dependencies = [ 3464 | "tinyvec_macros", 3465 | ] 3466 | 3467 | [[package]] 3468 | name = "tinyvec_macros" 3469 | version = "0.1.1" 3470 | source = "registry+https://github.com/rust-lang/crates.io-index" 3471 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3472 | 3473 | [[package]] 3474 | name = "toml_datetime" 3475 | version = "0.6.5" 3476 | source = "registry+https://github.com/rust-lang/crates.io-index" 3477 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 3478 | 3479 | [[package]] 3480 | name = "toml_edit" 3481 | version = "0.21.1" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" 3484 | dependencies = [ 3485 | "indexmap", 3486 | "toml_datetime", 3487 | "winnow", 3488 | ] 3489 | 3490 | [[package]] 3491 | name = "tracing" 3492 | version = "0.1.40" 3493 | source = "registry+https://github.com/rust-lang/crates.io-index" 3494 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 3495 | dependencies = [ 3496 | "pin-project-lite", 3497 | "tracing-attributes", 3498 | "tracing-core", 3499 | ] 3500 | 3501 | [[package]] 3502 | name = "tracing-attributes" 3503 | version = "0.1.27" 3504 | source = "registry+https://github.com/rust-lang/crates.io-index" 3505 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 3506 | dependencies = [ 3507 | "proc-macro2", 3508 | "quote", 3509 | "syn 2.0.61", 3510 | ] 3511 | 3512 | [[package]] 3513 | name = "tracing-core" 3514 | version = "0.1.32" 3515 | source = "registry+https://github.com/rust-lang/crates.io-index" 3516 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 3517 | dependencies = [ 3518 | "once_cell", 3519 | "valuable", 3520 | ] 3521 | 3522 | [[package]] 3523 | name = "tracing-log" 3524 | version = "0.1.4" 3525 | source = "registry+https://github.com/rust-lang/crates.io-index" 3526 | checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" 3527 | dependencies = [ 3528 | "log", 3529 | "once_cell", 3530 | "tracing-core", 3531 | ] 3532 | 3533 | [[package]] 3534 | name = "tracing-log" 3535 | version = "0.2.0" 3536 | source = "registry+https://github.com/rust-lang/crates.io-index" 3537 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3538 | dependencies = [ 3539 | "log", 3540 | "once_cell", 3541 | "tracing-core", 3542 | ] 3543 | 3544 | [[package]] 3545 | name = "tracing-subscriber" 3546 | version = "0.3.18" 3547 | source = "registry+https://github.com/rust-lang/crates.io-index" 3548 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 3549 | dependencies = [ 3550 | "matchers", 3551 | "nu-ansi-term", 3552 | "once_cell", 3553 | "regex", 3554 | "sharded-slab", 3555 | "smallvec", 3556 | "thread_local", 3557 | "tracing", 3558 | "tracing-core", 3559 | "tracing-log 0.2.0", 3560 | ] 3561 | 3562 | [[package]] 3563 | name = "tracing-wasm" 3564 | version = "0.2.1" 3565 | source = "registry+https://github.com/rust-lang/crates.io-index" 3566 | checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" 3567 | dependencies = [ 3568 | "tracing", 3569 | "tracing-subscriber", 3570 | "wasm-bindgen", 3571 | ] 3572 | 3573 | [[package]] 3574 | name = "ttf-parser" 3575 | version = "0.20.0" 3576 | source = "registry+https://github.com/rust-lang/crates.io-index" 3577 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 3578 | 3579 | [[package]] 3580 | name = "typenum" 3581 | version = "1.17.0" 3582 | source = "registry+https://github.com/rust-lang/crates.io-index" 3583 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3584 | 3585 | [[package]] 3586 | name = "unicode-bidi" 3587 | version = "0.3.15" 3588 | source = "registry+https://github.com/rust-lang/crates.io-index" 3589 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 3590 | 3591 | [[package]] 3592 | name = "unicode-ident" 3593 | version = "1.0.12" 3594 | source = "registry+https://github.com/rust-lang/crates.io-index" 3595 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 3596 | 3597 | [[package]] 3598 | name = "unicode-normalization" 3599 | version = "0.1.23" 3600 | source = "registry+https://github.com/rust-lang/crates.io-index" 3601 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 3602 | dependencies = [ 3603 | "tinyvec", 3604 | ] 3605 | 3606 | [[package]] 3607 | name = "unicode-segmentation" 3608 | version = "1.11.0" 3609 | source = "registry+https://github.com/rust-lang/crates.io-index" 3610 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 3611 | 3612 | [[package]] 3613 | name = "unicode-width" 3614 | version = "0.1.12" 3615 | source = "registry+https://github.com/rust-lang/crates.io-index" 3616 | checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" 3617 | 3618 | [[package]] 3619 | name = "unicode-xid" 3620 | version = "0.2.4" 3621 | source = "registry+https://github.com/rust-lang/crates.io-index" 3622 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 3623 | 3624 | [[package]] 3625 | name = "url" 3626 | version = "2.5.0" 3627 | source = "registry+https://github.com/rust-lang/crates.io-index" 3628 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 3629 | dependencies = [ 3630 | "form_urlencoded", 3631 | "idna", 3632 | "percent-encoding", 3633 | ] 3634 | 3635 | [[package]] 3636 | name = "uuid" 3637 | version = "1.8.0" 3638 | source = "registry+https://github.com/rust-lang/crates.io-index" 3639 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 3640 | dependencies = [ 3641 | "getrandom", 3642 | "serde", 3643 | ] 3644 | 3645 | [[package]] 3646 | name = "valuable" 3647 | version = "0.1.0" 3648 | source = "registry+https://github.com/rust-lang/crates.io-index" 3649 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3650 | 3651 | [[package]] 3652 | name = "version_check" 3653 | version = "0.9.4" 3654 | source = "registry+https://github.com/rust-lang/crates.io-index" 3655 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3656 | 3657 | [[package]] 3658 | name = "walkdir" 3659 | version = "2.5.0" 3660 | source = "registry+https://github.com/rust-lang/crates.io-index" 3661 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3662 | dependencies = [ 3663 | "same-file", 3664 | "winapi-util", 3665 | ] 3666 | 3667 | [[package]] 3668 | name = "wasi" 3669 | version = "0.11.0+wasi-snapshot-preview1" 3670 | source = "registry+https://github.com/rust-lang/crates.io-index" 3671 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3672 | 3673 | [[package]] 3674 | name = "wasm-bindgen" 3675 | version = "0.2.92" 3676 | source = "registry+https://github.com/rust-lang/crates.io-index" 3677 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 3678 | dependencies = [ 3679 | "cfg-if", 3680 | "wasm-bindgen-macro", 3681 | ] 3682 | 3683 | [[package]] 3684 | name = "wasm-bindgen-backend" 3685 | version = "0.2.92" 3686 | source = "registry+https://github.com/rust-lang/crates.io-index" 3687 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 3688 | dependencies = [ 3689 | "bumpalo", 3690 | "log", 3691 | "once_cell", 3692 | "proc-macro2", 3693 | "quote", 3694 | "syn 2.0.61", 3695 | "wasm-bindgen-shared", 3696 | ] 3697 | 3698 | [[package]] 3699 | name = "wasm-bindgen-futures" 3700 | version = "0.4.42" 3701 | source = "registry+https://github.com/rust-lang/crates.io-index" 3702 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 3703 | dependencies = [ 3704 | "cfg-if", 3705 | "js-sys", 3706 | "wasm-bindgen", 3707 | "web-sys", 3708 | ] 3709 | 3710 | [[package]] 3711 | name = "wasm-bindgen-macro" 3712 | version = "0.2.92" 3713 | source = "registry+https://github.com/rust-lang/crates.io-index" 3714 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 3715 | dependencies = [ 3716 | "quote", 3717 | "wasm-bindgen-macro-support", 3718 | ] 3719 | 3720 | [[package]] 3721 | name = "wasm-bindgen-macro-support" 3722 | version = "0.2.92" 3723 | source = "registry+https://github.com/rust-lang/crates.io-index" 3724 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 3725 | dependencies = [ 3726 | "proc-macro2", 3727 | "quote", 3728 | "syn 2.0.61", 3729 | "wasm-bindgen-backend", 3730 | "wasm-bindgen-shared", 3731 | ] 3732 | 3733 | [[package]] 3734 | name = "wasm-bindgen-shared" 3735 | version = "0.2.92" 3736 | source = "registry+https://github.com/rust-lang/crates.io-index" 3737 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 3738 | 3739 | [[package]] 3740 | name = "web-sys" 3741 | version = "0.3.69" 3742 | source = "registry+https://github.com/rust-lang/crates.io-index" 3743 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 3744 | dependencies = [ 3745 | "js-sys", 3746 | "wasm-bindgen", 3747 | ] 3748 | 3749 | [[package]] 3750 | name = "web-time" 3751 | version = "0.2.4" 3752 | source = "registry+https://github.com/rust-lang/crates.io-index" 3753 | checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" 3754 | dependencies = [ 3755 | "js-sys", 3756 | "wasm-bindgen", 3757 | ] 3758 | 3759 | [[package]] 3760 | name = "webbrowser" 3761 | version = "0.8.15" 3762 | source = "registry+https://github.com/rust-lang/crates.io-index" 3763 | checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" 3764 | dependencies = [ 3765 | "core-foundation", 3766 | "home", 3767 | "jni", 3768 | "log", 3769 | "ndk-context", 3770 | "objc", 3771 | "raw-window-handle 0.5.2", 3772 | "url", 3773 | "web-sys", 3774 | ] 3775 | 3776 | [[package]] 3777 | name = "weezl" 3778 | version = "0.1.8" 3779 | source = "registry+https://github.com/rust-lang/crates.io-index" 3780 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 3781 | 3782 | [[package]] 3783 | name = "wgpu" 3784 | version = "0.19.4" 3785 | source = "registry+https://github.com/rust-lang/crates.io-index" 3786 | checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" 3787 | dependencies = [ 3788 | "arrayvec", 3789 | "cfg-if", 3790 | "cfg_aliases", 3791 | "js-sys", 3792 | "log", 3793 | "naga", 3794 | "parking_lot", 3795 | "profiling", 3796 | "raw-window-handle 0.6.1", 3797 | "smallvec", 3798 | "static_assertions", 3799 | "wasm-bindgen", 3800 | "wasm-bindgen-futures", 3801 | "web-sys", 3802 | "wgpu-core", 3803 | "wgpu-hal", 3804 | "wgpu-types", 3805 | ] 3806 | 3807 | [[package]] 3808 | name = "wgpu-core" 3809 | version = "0.19.4" 3810 | source = "registry+https://github.com/rust-lang/crates.io-index" 3811 | checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" 3812 | dependencies = [ 3813 | "arrayvec", 3814 | "bit-vec", 3815 | "bitflags 2.5.0", 3816 | "cfg_aliases", 3817 | "codespan-reporting", 3818 | "indexmap", 3819 | "log", 3820 | "naga", 3821 | "once_cell", 3822 | "parking_lot", 3823 | "profiling", 3824 | "raw-window-handle 0.6.1", 3825 | "rustc-hash", 3826 | "smallvec", 3827 | "thiserror", 3828 | "web-sys", 3829 | "wgpu-hal", 3830 | "wgpu-types", 3831 | ] 3832 | 3833 | [[package]] 3834 | name = "wgpu-hal" 3835 | version = "0.19.4" 3836 | source = "registry+https://github.com/rust-lang/crates.io-index" 3837 | checksum = "fc1a4924366df7ab41a5d8546d6534f1f33231aa5b3f72b9930e300f254e39c3" 3838 | dependencies = [ 3839 | "android_system_properties", 3840 | "arrayvec", 3841 | "ash", 3842 | "bit-set", 3843 | "bitflags 2.5.0", 3844 | "block", 3845 | "cfg_aliases", 3846 | "core-graphics-types", 3847 | "d3d12", 3848 | "glow", 3849 | "glutin_wgl_sys", 3850 | "gpu-alloc", 3851 | "gpu-allocator", 3852 | "gpu-descriptor", 3853 | "hassle-rs", 3854 | "js-sys", 3855 | "khronos-egl", 3856 | "libc", 3857 | "libloading 0.8.3", 3858 | "log", 3859 | "metal", 3860 | "naga", 3861 | "ndk-sys", 3862 | "objc", 3863 | "once_cell", 3864 | "parking_lot", 3865 | "profiling", 3866 | "range-alloc", 3867 | "raw-window-handle 0.6.1", 3868 | "renderdoc-sys", 3869 | "rustc-hash", 3870 | "smallvec", 3871 | "thiserror", 3872 | "wasm-bindgen", 3873 | "web-sys", 3874 | "wgpu-types", 3875 | "winapi", 3876 | ] 3877 | 3878 | [[package]] 3879 | name = "wgpu-types" 3880 | version = "0.19.2" 3881 | source = "registry+https://github.com/rust-lang/crates.io-index" 3882 | checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" 3883 | dependencies = [ 3884 | "bitflags 2.5.0", 3885 | "js-sys", 3886 | "web-sys", 3887 | ] 3888 | 3889 | [[package]] 3890 | name = "widestring" 3891 | version = "1.1.0" 3892 | source = "registry+https://github.com/rust-lang/crates.io-index" 3893 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 3894 | 3895 | [[package]] 3896 | name = "winapi" 3897 | version = "0.3.9" 3898 | source = "registry+https://github.com/rust-lang/crates.io-index" 3899 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3900 | dependencies = [ 3901 | "winapi-i686-pc-windows-gnu", 3902 | "winapi-x86_64-pc-windows-gnu", 3903 | ] 3904 | 3905 | [[package]] 3906 | name = "winapi-i686-pc-windows-gnu" 3907 | version = "0.4.0" 3908 | source = "registry+https://github.com/rust-lang/crates.io-index" 3909 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3910 | 3911 | [[package]] 3912 | name = "winapi-util" 3913 | version = "0.1.8" 3914 | source = "registry+https://github.com/rust-lang/crates.io-index" 3915 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 3916 | dependencies = [ 3917 | "windows-sys 0.52.0", 3918 | ] 3919 | 3920 | [[package]] 3921 | name = "winapi-x86_64-pc-windows-gnu" 3922 | version = "0.4.0" 3923 | source = "registry+https://github.com/rust-lang/crates.io-index" 3924 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3925 | 3926 | [[package]] 3927 | name = "windows" 3928 | version = "0.48.0" 3929 | source = "registry+https://github.com/rust-lang/crates.io-index" 3930 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 3931 | dependencies = [ 3932 | "windows-implement", 3933 | "windows-interface", 3934 | "windows-targets 0.48.5", 3935 | ] 3936 | 3937 | [[package]] 3938 | name = "windows" 3939 | version = "0.52.0" 3940 | source = "registry+https://github.com/rust-lang/crates.io-index" 3941 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 3942 | dependencies = [ 3943 | "windows-core", 3944 | "windows-targets 0.52.5", 3945 | ] 3946 | 3947 | [[package]] 3948 | name = "windows-core" 3949 | version = "0.52.0" 3950 | source = "registry+https://github.com/rust-lang/crates.io-index" 3951 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 3952 | dependencies = [ 3953 | "windows-targets 0.52.5", 3954 | ] 3955 | 3956 | [[package]] 3957 | name = "windows-implement" 3958 | version = "0.48.0" 3959 | source = "registry+https://github.com/rust-lang/crates.io-index" 3960 | checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" 3961 | dependencies = [ 3962 | "proc-macro2", 3963 | "quote", 3964 | "syn 1.0.109", 3965 | ] 3966 | 3967 | [[package]] 3968 | name = "windows-interface" 3969 | version = "0.48.0" 3970 | source = "registry+https://github.com/rust-lang/crates.io-index" 3971 | checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" 3972 | dependencies = [ 3973 | "proc-macro2", 3974 | "quote", 3975 | "syn 1.0.109", 3976 | ] 3977 | 3978 | [[package]] 3979 | name = "windows-sys" 3980 | version = "0.45.0" 3981 | source = "registry+https://github.com/rust-lang/crates.io-index" 3982 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3983 | dependencies = [ 3984 | "windows-targets 0.42.2", 3985 | ] 3986 | 3987 | [[package]] 3988 | name = "windows-sys" 3989 | version = "0.48.0" 3990 | source = "registry+https://github.com/rust-lang/crates.io-index" 3991 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3992 | dependencies = [ 3993 | "windows-targets 0.48.5", 3994 | ] 3995 | 3996 | [[package]] 3997 | name = "windows-sys" 3998 | version = "0.52.0" 3999 | source = "registry+https://github.com/rust-lang/crates.io-index" 4000 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 4001 | dependencies = [ 4002 | "windows-targets 0.52.5", 4003 | ] 4004 | 4005 | [[package]] 4006 | name = "windows-targets" 4007 | version = "0.42.2" 4008 | source = "registry+https://github.com/rust-lang/crates.io-index" 4009 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 4010 | dependencies = [ 4011 | "windows_aarch64_gnullvm 0.42.2", 4012 | "windows_aarch64_msvc 0.42.2", 4013 | "windows_i686_gnu 0.42.2", 4014 | "windows_i686_msvc 0.42.2", 4015 | "windows_x86_64_gnu 0.42.2", 4016 | "windows_x86_64_gnullvm 0.42.2", 4017 | "windows_x86_64_msvc 0.42.2", 4018 | ] 4019 | 4020 | [[package]] 4021 | name = "windows-targets" 4022 | version = "0.48.5" 4023 | source = "registry+https://github.com/rust-lang/crates.io-index" 4024 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4025 | dependencies = [ 4026 | "windows_aarch64_gnullvm 0.48.5", 4027 | "windows_aarch64_msvc 0.48.5", 4028 | "windows_i686_gnu 0.48.5", 4029 | "windows_i686_msvc 0.48.5", 4030 | "windows_x86_64_gnu 0.48.5", 4031 | "windows_x86_64_gnullvm 0.48.5", 4032 | "windows_x86_64_msvc 0.48.5", 4033 | ] 4034 | 4035 | [[package]] 4036 | name = "windows-targets" 4037 | version = "0.52.5" 4038 | source = "registry+https://github.com/rust-lang/crates.io-index" 4039 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 4040 | dependencies = [ 4041 | "windows_aarch64_gnullvm 0.52.5", 4042 | "windows_aarch64_msvc 0.52.5", 4043 | "windows_i686_gnu 0.52.5", 4044 | "windows_i686_gnullvm", 4045 | "windows_i686_msvc 0.52.5", 4046 | "windows_x86_64_gnu 0.52.5", 4047 | "windows_x86_64_gnullvm 0.52.5", 4048 | "windows_x86_64_msvc 0.52.5", 4049 | ] 4050 | 4051 | [[package]] 4052 | name = "windows_aarch64_gnullvm" 4053 | version = "0.42.2" 4054 | source = "registry+https://github.com/rust-lang/crates.io-index" 4055 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 4056 | 4057 | [[package]] 4058 | name = "windows_aarch64_gnullvm" 4059 | version = "0.48.5" 4060 | source = "registry+https://github.com/rust-lang/crates.io-index" 4061 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4062 | 4063 | [[package]] 4064 | name = "windows_aarch64_gnullvm" 4065 | version = "0.52.5" 4066 | source = "registry+https://github.com/rust-lang/crates.io-index" 4067 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 4068 | 4069 | [[package]] 4070 | name = "windows_aarch64_msvc" 4071 | version = "0.42.2" 4072 | source = "registry+https://github.com/rust-lang/crates.io-index" 4073 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 4074 | 4075 | [[package]] 4076 | name = "windows_aarch64_msvc" 4077 | version = "0.48.5" 4078 | source = "registry+https://github.com/rust-lang/crates.io-index" 4079 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4080 | 4081 | [[package]] 4082 | name = "windows_aarch64_msvc" 4083 | version = "0.52.5" 4084 | source = "registry+https://github.com/rust-lang/crates.io-index" 4085 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 4086 | 4087 | [[package]] 4088 | name = "windows_i686_gnu" 4089 | version = "0.42.2" 4090 | source = "registry+https://github.com/rust-lang/crates.io-index" 4091 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 4092 | 4093 | [[package]] 4094 | name = "windows_i686_gnu" 4095 | version = "0.48.5" 4096 | source = "registry+https://github.com/rust-lang/crates.io-index" 4097 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4098 | 4099 | [[package]] 4100 | name = "windows_i686_gnu" 4101 | version = "0.52.5" 4102 | source = "registry+https://github.com/rust-lang/crates.io-index" 4103 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 4104 | 4105 | [[package]] 4106 | name = "windows_i686_gnullvm" 4107 | version = "0.52.5" 4108 | source = "registry+https://github.com/rust-lang/crates.io-index" 4109 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 4110 | 4111 | [[package]] 4112 | name = "windows_i686_msvc" 4113 | version = "0.42.2" 4114 | source = "registry+https://github.com/rust-lang/crates.io-index" 4115 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 4116 | 4117 | [[package]] 4118 | name = "windows_i686_msvc" 4119 | version = "0.48.5" 4120 | source = "registry+https://github.com/rust-lang/crates.io-index" 4121 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4122 | 4123 | [[package]] 4124 | name = "windows_i686_msvc" 4125 | version = "0.52.5" 4126 | source = "registry+https://github.com/rust-lang/crates.io-index" 4127 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 4128 | 4129 | [[package]] 4130 | name = "windows_x86_64_gnu" 4131 | version = "0.42.2" 4132 | source = "registry+https://github.com/rust-lang/crates.io-index" 4133 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 4134 | 4135 | [[package]] 4136 | name = "windows_x86_64_gnu" 4137 | version = "0.48.5" 4138 | source = "registry+https://github.com/rust-lang/crates.io-index" 4139 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4140 | 4141 | [[package]] 4142 | name = "windows_x86_64_gnu" 4143 | version = "0.52.5" 4144 | source = "registry+https://github.com/rust-lang/crates.io-index" 4145 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 4146 | 4147 | [[package]] 4148 | name = "windows_x86_64_gnullvm" 4149 | version = "0.42.2" 4150 | source = "registry+https://github.com/rust-lang/crates.io-index" 4151 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 4152 | 4153 | [[package]] 4154 | name = "windows_x86_64_gnullvm" 4155 | version = "0.48.5" 4156 | source = "registry+https://github.com/rust-lang/crates.io-index" 4157 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4158 | 4159 | [[package]] 4160 | name = "windows_x86_64_gnullvm" 4161 | version = "0.52.5" 4162 | source = "registry+https://github.com/rust-lang/crates.io-index" 4163 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 4164 | 4165 | [[package]] 4166 | name = "windows_x86_64_msvc" 4167 | version = "0.42.2" 4168 | source = "registry+https://github.com/rust-lang/crates.io-index" 4169 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 4170 | 4171 | [[package]] 4172 | name = "windows_x86_64_msvc" 4173 | version = "0.48.5" 4174 | source = "registry+https://github.com/rust-lang/crates.io-index" 4175 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4176 | 4177 | [[package]] 4178 | name = "windows_x86_64_msvc" 4179 | version = "0.52.5" 4180 | source = "registry+https://github.com/rust-lang/crates.io-index" 4181 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 4182 | 4183 | [[package]] 4184 | name = "winit" 4185 | version = "0.29.15" 4186 | source = "registry+https://github.com/rust-lang/crates.io-index" 4187 | checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" 4188 | dependencies = [ 4189 | "android-activity", 4190 | "atomic-waker", 4191 | "bitflags 2.5.0", 4192 | "bytemuck", 4193 | "calloop", 4194 | "cfg_aliases", 4195 | "core-foundation", 4196 | "core-graphics", 4197 | "cursor-icon", 4198 | "icrate", 4199 | "js-sys", 4200 | "libc", 4201 | "log", 4202 | "ndk", 4203 | "ndk-sys", 4204 | "objc2 0.4.1", 4205 | "once_cell", 4206 | "orbclient", 4207 | "percent-encoding", 4208 | "raw-window-handle 0.6.1", 4209 | "redox_syscall 0.3.5", 4210 | "rustix", 4211 | "smol_str", 4212 | "unicode-segmentation", 4213 | "wasm-bindgen", 4214 | "wasm-bindgen-futures", 4215 | "web-sys", 4216 | "web-time", 4217 | "windows-sys 0.48.0", 4218 | "x11-dl", 4219 | "x11rb", 4220 | "xkbcommon-dl", 4221 | ] 4222 | 4223 | [[package]] 4224 | name = "winnow" 4225 | version = "0.5.40" 4226 | source = "registry+https://github.com/rust-lang/crates.io-index" 4227 | checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 4228 | dependencies = [ 4229 | "memchr", 4230 | ] 4231 | 4232 | [[package]] 4233 | name = "x11-dl" 4234 | version = "2.21.0" 4235 | source = "registry+https://github.com/rust-lang/crates.io-index" 4236 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 4237 | dependencies = [ 4238 | "libc", 4239 | "once_cell", 4240 | "pkg-config", 4241 | ] 4242 | 4243 | [[package]] 4244 | name = "x11rb" 4245 | version = "0.13.1" 4246 | source = "registry+https://github.com/rust-lang/crates.io-index" 4247 | checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 4248 | dependencies = [ 4249 | "as-raw-xcb-connection", 4250 | "gethostname", 4251 | "libc", 4252 | "libloading 0.8.3", 4253 | "once_cell", 4254 | "rustix", 4255 | "x11rb-protocol", 4256 | ] 4257 | 4258 | [[package]] 4259 | name = "x11rb-protocol" 4260 | version = "0.13.1" 4261 | source = "registry+https://github.com/rust-lang/crates.io-index" 4262 | checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 4263 | 4264 | [[package]] 4265 | name = "xi-unicode" 4266 | version = "0.3.0" 4267 | source = "registry+https://github.com/rust-lang/crates.io-index" 4268 | checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" 4269 | 4270 | [[package]] 4271 | name = "xkbcommon-dl" 4272 | version = "0.4.2" 4273 | source = "registry+https://github.com/rust-lang/crates.io-index" 4274 | checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 4275 | dependencies = [ 4276 | "bitflags 2.5.0", 4277 | "dlib", 4278 | "log", 4279 | "once_cell", 4280 | "xkeysym", 4281 | ] 4282 | 4283 | [[package]] 4284 | name = "xkeysym" 4285 | version = "0.2.0" 4286 | source = "registry+https://github.com/rust-lang/crates.io-index" 4287 | checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" 4288 | 4289 | [[package]] 4290 | name = "xml-rs" 4291 | version = "0.8.20" 4292 | source = "registry+https://github.com/rust-lang/crates.io-index" 4293 | checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" 4294 | 4295 | [[package]] 4296 | name = "zerocopy" 4297 | version = "0.7.34" 4298 | source = "registry+https://github.com/rust-lang/crates.io-index" 4299 | checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" 4300 | dependencies = [ 4301 | "zerocopy-derive", 4302 | ] 4303 | 4304 | [[package]] 4305 | name = "zerocopy-derive" 4306 | version = "0.7.34" 4307 | source = "registry+https://github.com/rust-lang/crates.io-index" 4308 | checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" 4309 | dependencies = [ 4310 | "proc-macro2", 4311 | "quote", 4312 | "syn 2.0.61", 4313 | ] 4314 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = ["SET001 "] 3 | categories = ["game-development"] 4 | description = "Scroller plugin for Bevy" 5 | edition = "2021" 6 | exclude = ["assets", "examples"] 7 | keywords = ["bevy", "scroller"] 8 | license = "MIT OR Apache-2.0" 9 | name = "bevy_scroller" 10 | readme = "README.md" 11 | repository = "https://github.com/SET001/bevy_scroller" 12 | version = "0.4.0" 13 | 14 | [dependencies] 15 | bevy = { version = "0.13.2", default-features = false, features = [ 16 | "bevy_sprite", 17 | ] } 18 | bevy_editor_pls = { version = "0.8.1", optional = true } 19 | fast_poisson = { version = "1.0.0", features = [ 20 | "single_precision", 21 | ], optional = true } 22 | rand = "0.8.5" 23 | 24 | [features] 25 | dev = ["bevy/bevy_gizmos", "bevy/dynamic_linking", "dep:bevy_editor_pls"] 26 | poisson = ["dep:fast_poisson"] 27 | 28 | [dev-dependencies] 29 | iyes_perf_ui = {version="0.2.3"} 30 | rstest = "0.18.2" 31 | 32 | [profile.dev] 33 | incremental = true 34 | opt-level = 1 35 | 36 | [profile.dev.package."*"] 37 | opt-level = 3 38 | 39 | [[example]] 40 | name = "poisson" 41 | required-features = ["poisson"] 42 | path = "examples/poisson/rs" 43 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Konstantin Kostiuk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # `bevy_scroller` 4 | 5 | A small [Bevy](https://github.com/bevyengine/bevy) plugin to scroll things and create parallaxes. 6 | 7 | [![crates.io](https://img.shields.io/crates/v/bevy_scroller)](https://crates.io/crates/bevy_scroller) 8 | [![crates.io](https://img.shields.io/crates/d/bevy_scroller)](https://crates.io/crates/bevy_scroller) 9 | [![docs.rs](https://docs.rs/bevy_scroller/badge.svg)](https://docs.rs/bevy_scroller) 10 | [![Bevy tracking](https://img.shields.io/badge/Bevy%20tracking-released%20version-lightblue)](https://github.com/bevyengine/bevy/blob/main/docs/plugins_guidelines.md#main-branch-tracking) 11 | 12 | ![parallax](assets/examples/parallax.gif) 13 |
14 | 15 | ## About 16 | 17 | The idea is simple - you define an area for the scroller and select an item generator that will be responsible for generating items. Scroller will fill the area with items from this generator, update its position, track which items moved out of the area and need to be destroyed, and track when new items need to be generated. This plugin makes no assumptions as to what actually will be a scroller item. There are few predefined generators that implements common strategies to gerenerate sprites as scroller items. You can also [implement your own generators](#custom-generators) to scroll whatever you want ([tilemaps](#example_tilemap), animations, complex entity hierarchies, etc.). 18 | 19 | By creating mutliple scrollers with different z-index, sprite and speed, you can easily create parallaxes ([example](#example_parallax)). 20 | 21 | ## Features 22 | 23 | 1. Scroll directions 24 | 1. Different scroll item sizes in same scroller 25 | 1. Render to texture 26 | 1. Pre-build generators for sprite items: 27 | 1. Single - repeat single image 28 | 1. Sequence - repeat sequence of images 29 | 1. Random Sequence - scroller will consist of random images from sequence 30 | 1. Custom generators - define how exactly items should be generated and spawned 31 | 32 | ## Todo 33 | 34 | - [ ] make it work with spritesheets 35 | - [ ] scroller run conditions (when player moved, for instance) 36 | - [ ] change scroll direction on the go 37 | - [ ] some cases might be optimised with using shaders. 38 | 39 | ## Usage 40 | 41 | spawn a scroller-entity with: 42 | 1. ScrollerSize component 43 | 1. Scroller component 44 | 1. If you want any of pre-build generators, attach ScrollerGenerator component 45 | 46 | ```rust 47 | commands.spawn(( 48 | ScrollerGenerator::SpriteSingle("scroller_image.png".into()), 49 | ScrollerSize { 50 | size: Vec2::new(500., 300.), 51 | }, 52 | ScrollerBundle { 53 | scroller: Scroller { 54 | speed: 1., 55 | direction: ScrollerDirection::Forward, 56 | ..default() 57 | }, 58 | ..default() 59 | }, 60 | )); 61 | ``` 62 | 63 | ## Custom Generators 64 | 65 | Generating scroller item devied in 2 parts. First you describe how item will be generated. Second you describe how item should be spawned in the world. 66 | You will need 2 structs (item and generator component) and 2 funtions (generator and spawner). 67 | 68 | Define struct that will desribe generated item. This struct should implement `GeneratedItem` trait with `fn size(&self) -> Vec2` method so that item size is known. This struct will be passed to the spawner function so it has to contain all the information suffusion to spawn the item. 69 | 70 | ```rust 71 | #[derive(Clone, Reflect, Debug)] 72 | pub struct MyScrollerItem { 73 | pub size: Vec2, 74 | } 75 | 76 | impl GeneratedItem for MyScrollerItem { 77 | fn size(&self) -> Vec2 { self.size } 78 | } 79 | ``` 80 | 81 | Define generator component. It will mark your generator and contain generator configuration. 82 | 83 | ```rust 84 | #[derive(Component, Clone, Default)] 85 | pub struct MyGenerator {} 86 | ``` 87 | 88 | Implement `ScrollerGenerator` trait for this struct. This includes implementing `gen_item` function which should contain item generation logic and return that item. 89 | 90 | ```rust 91 | 92 | impl ScrollerGenerator for MySpriteGenerator { 93 | type I = MyScrollerItem; 94 | 95 | fn gen_item(&mut self) -> Self::I { 96 | Self::I {} 97 | } 98 | } 99 | ``` 100 | 101 | Finally write spawner function that will spawn previously generated item. This should be regular bevy system that will additionally receive `In)>>` so that you can know what actully to spawn. 102 | 103 | Then add this generator with spawner to your app: 104 | ```rust 105 | app.add_scroller_generator::(sprite_spawner) 106 | ``` 107 | 108 | Also see existing generators ([sprite](src/generators/sprite.rs), [poisson](src/generators/poisson.rs)) for example of how you can implement your own. 109 | 110 | ## Examples 111 | 112 | Run examples with 113 | 114 | ``` 115 | cargo run --example --features=bevy/default --release 116 | cargo run --example poisson --features=bevy/default,poisson --release 117 | ``` 118 | 119 | 120 | You can also add `dev` feature to add wireframes and `bevy_editor_pls` to examples. 121 | 122 | 123 | | example | preview | description | 124 | |----|-----|---------------| 125 | | [single](examples/parallax.rs) | | shows a basic usage | 126 | | [sequence](examples/sequence.rs) | | shows a usage of sequence generator. It also shows how to wait while all assets are loaded and retrieve sprite size | 127 | | [random_sequence](examples/random_sequence.rs) | | shows random sequence generator | 128 | | [multiple](examples/multiple.rs) | | example of muptiple scrollers | 129 | | [mirrors](examples/mirrors.rs) | ![parallax](assets/examples/mirrors.gif) | example of how you can render scroller to texture and then use that texture to show this same scroller in other parts of applications | 130 | | [parallax](examples/parallax.rs) | ![parallax](assets/examples/parallax.gif) | showing how you can set up a parallax with this plugin | 131 | | [poisson](examples/poisson.rs) | ![parallax](assets/examples/poisson.gif) | use of poisson generator to fill space with sprites and scroll them all. Set up radius to ensure that no entity generated closer than that radius. Run this example with additionall `poisson` feature | 132 | | [tilemaps](examples/tilemap.rs) | ![tilemap](assets/examples/tilemap.gif) | Show how to use scrollers with tilemaps. It uses custom generator to generate scroller items with tilemaps based on [bevy_ecs_tilemap](https://github.com/StarArawn/bevy_ecs_tilemap) | 133 | 134 | ## Bevy Compatibility 135 | 136 | | bevy | bevy_scroller | 137 | |-|- 138 | | 0.13.0 | 0.3.* | 139 | | 0.12.0 | 0.2.* | 140 | | 0.11.0 | 0.1.* | 141 | 142 | 143 | ## Credits 144 | 145 | - [gems](https://opengameart.org/content/gems-set-01) 146 | - [parallax](https://ansimuz.itch.io/mountain-dusk-parallax-background) 147 | - tilemap - [Cute Forest](https://aamatniekss.itch.io/free-pixelart-tileset-cute-forest) and [Ocean Background](https://opengameart.org/content/ocean-background) 148 | - sprite_sheet - generated with https://old-flick.itch.io/sprite-randomizer 149 | 150 | --- 151 | ### License 152 | 153 | Licensed under either of Apache License, Version 154 | 2.0 or MIT license at your option. 155 | 156 |
157 | 158 | Unless you explicitly state otherwise, any contribution intentionally submitted 159 | for inclusion in this crate by you, as defined in the Apache-2.0 license, shall 160 | be dual licensed as above, without any additional terms or conditions. 161 | 162 | -------------------------------------------------------------------------------- /assets/bevy_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/bevy_logo.png -------------------------------------------------------------------------------- /assets/examples/mirrors.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/examples/mirrors.gif -------------------------------------------------------------------------------- /assets/examples/parallax.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/examples/parallax.gif -------------------------------------------------------------------------------- /assets/examples/poisson.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/examples/poisson.gif -------------------------------------------------------------------------------- /assets/examples/tilemap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/examples/tilemap.gif -------------------------------------------------------------------------------- /assets/gems/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/1.png -------------------------------------------------------------------------------- /assets/gems/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/2.png -------------------------------------------------------------------------------- /assets/gems/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/3.png -------------------------------------------------------------------------------- /assets/gems/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/4.png -------------------------------------------------------------------------------- /assets/gems/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/5.png -------------------------------------------------------------------------------- /assets/gems/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/6.png -------------------------------------------------------------------------------- /assets/gems/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/gems/7.png -------------------------------------------------------------------------------- /assets/parallax/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/0.png -------------------------------------------------------------------------------- /assets/parallax/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/1.png -------------------------------------------------------------------------------- /assets/parallax/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/2.png -------------------------------------------------------------------------------- /assets/parallax/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/3.png -------------------------------------------------------------------------------- /assets/parallax/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/4.png -------------------------------------------------------------------------------- /assets/parallax/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/parallax/5.png -------------------------------------------------------------------------------- /assets/sprite_sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/sprite_sheet.png -------------------------------------------------------------------------------- /assets/tilemap/hills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/tilemap/hills.png -------------------------------------------------------------------------------- /assets/tilemap/ocean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/tilemap/ocean.png -------------------------------------------------------------------------------- /assets/tilemap/tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SET001/bevy_scroller/b376b447c4a0981aa655958ef95a4bd9c37d4ef6/assets/tilemap/tileset.png -------------------------------------------------------------------------------- /examples/mirrors.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{ecs::system::RunSystemOnce, prelude::*, window::PrimaryWindow}; 4 | use bevy_scroller::*; 5 | use shared::get_app; 6 | use std::f32::consts::PI; 7 | 8 | fn main() { 9 | get_app("mirrors".into()).add_systems(Startup, start).run(); 10 | } 11 | 12 | pub fn start(world: &mut World) { 13 | let mirrors = world.register_system(spawn_mirrors); 14 | let scroller_entity = world.run_system_once(spawn_scroller); 15 | world 16 | .entity_mut(scroller_entity) 17 | .insert(OnScrollerInit(mirrors)); 18 | } 19 | 20 | pub fn spawn_scroller( 21 | mut commands: Commands, 22 | windows: Query<&Window, With>, 23 | asset_server: Res, 24 | ) -> Entity { 25 | let window = windows.get_single().expect("no primary window"); 26 | let sprite_size = Vec2::new(128., 128.); 27 | commands.spawn(Camera2dBundle::default()); 28 | 29 | let items = (1..=7) 30 | .map(|i| { 31 | let path = format!("gems/{i}.png"); 32 | let _: Handle = asset_server.load(path.clone()); 33 | SpriteScrollerItem { 34 | path, 35 | size: Vec2 { x: 128., y: 128. }, 36 | } 37 | }) 38 | .collect::>(); 39 | 40 | commands 41 | .spawn(( 42 | ScrollerSize { 43 | size: Vec2::new(window.width(), sprite_size.y), 44 | }, 45 | ScrollerBundle { 46 | scroller: Scroller { 47 | speed: 5., 48 | render_layer: Some(1), 49 | ..default() 50 | }, 51 | generator: RandomSequenceSpriteGenerator { items }, 52 | spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new( 53 | 0., 54 | (sprite_size.y - window.height()) / 2., 55 | 10., 56 | ))), 57 | ..default() 58 | }, 59 | )) 60 | .id() 61 | } 62 | 63 | fn spawn_mirrors( 64 | In(scroller_entity): In, 65 | mut commands: Commands, 66 | windows: Query<&Window, With>, 67 | q_scroller: Query<&Scroller>, 68 | ) { 69 | let scroller = q_scroller.get(scroller_entity).unwrap(); 70 | let window = windows.get_single().expect("no primary window"); 71 | let sprite_size = Vec2::new(128., 128.); 72 | commands.spawn(( 73 | SpriteBundle { 74 | texture: scroller.texture_handle.clone(), 75 | transform: Transform { 76 | translation: Vec3::new(0., (window.height() - sprite_size.y) / 2., 10.), 77 | rotation: Quat::from_rotation_y(PI) * Quat::from_rotation_z(PI), 78 | ..default() 79 | }, 80 | ..default() 81 | }, 82 | Name::new("Scroller mirror top"), 83 | )); 84 | 85 | commands.spawn(( 86 | SpriteBundle { 87 | texture: scroller.texture_handle.clone(), 88 | transform: Transform { 89 | translation: Vec3::new((window.width() - sprite_size.x) / 2., 0., 00.), 90 | rotation: Quat::from_rotation_z(PI / 2.), 91 | ..default() 92 | }, 93 | ..default() 94 | }, 95 | Name::new("Scroller mirror right"), 96 | )); 97 | 98 | commands.spawn(( 99 | SpriteBundle { 100 | texture: scroller.texture_handle.clone(), 101 | transform: Transform { 102 | translation: Vec3::new((sprite_size.x - window.width()) / 2., 0., 0.), 103 | rotation: Quat::from_rotation_y(PI) * Quat::from_rotation_z(PI / 2.), 104 | ..default() 105 | }, 106 | ..default() 107 | }, 108 | Name::new("Scroller mirror left"), 109 | )); 110 | } 111 | -------------------------------------------------------------------------------- /examples/multiple.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{prelude::*, window::PrimaryWindow}; 4 | use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SingleSpriteGenerator}; 5 | use shared::get_app; 6 | use std::f32::consts::PI; 7 | 8 | fn main() { 9 | get_app("multiple".into()).add_systems(Startup, start).run(); 10 | } 11 | 12 | pub fn start(mut commands: Commands, windows: Query<&Window, With>) { 13 | let window = windows.get_single().expect("no primary window"); 14 | let sprite_size = Vec2::new(128., 128.); 15 | 16 | commands.spawn(Camera2dBundle::default()); 17 | 18 | commands.spawn(( 19 | ScrollerSize { 20 | size: Vec2::new(window.width(), sprite_size.y), 21 | }, 22 | ScrollerBundle { 23 | scroller: Scroller { 24 | speed: 5., 25 | ..default() 26 | }, 27 | generator: SingleSpriteGenerator { 28 | path: "gems/1.png".into(), 29 | size: sprite_size, 30 | }, 31 | spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new( 32 | 0., 33 | (sprite_size.y - window.height()) / 2., 34 | 0., 35 | ))), 36 | ..default() 37 | }, 38 | )); 39 | 40 | commands.spawn(( 41 | ScrollerSize { 42 | size: Vec2::new(window.width(), sprite_size.y), 43 | }, 44 | ScrollerBundle { 45 | scroller: Scroller { 46 | speed: 5., 47 | ..default() 48 | }, 49 | generator: SingleSpriteGenerator { 50 | path: "gems/2.png".into(), 51 | size: sprite_size, 52 | }, 53 | spatial: SpatialBundle::from_transform(Transform { 54 | translation: Vec3::new(0., (window.height() - sprite_size.y) / 2., 0.), 55 | rotation: Quat::from_rotation_z(PI), 56 | ..default() 57 | }), 58 | ..default() 59 | }, 60 | )); 61 | } 62 | -------------------------------------------------------------------------------- /examples/parallax.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | use std::collections::VecDeque; 3 | 4 | use bevy::{prelude::*, window::PrimaryWindow}; 5 | use bevy_scroller::{ 6 | Scroller, ScrollerBundle, ScrollerDirection, ScrollerSize, SingleSpriteGenerator, 7 | }; 8 | use shared::get_app; 9 | 10 | fn main() { 11 | get_app("parallax".into()).add_systems(Startup, start).run(); 12 | } 13 | 14 | fn start( 15 | mut commands: Commands, 16 | windows: Query<&Window, With>, 17 | asset_server: Res, 18 | ) { 19 | let item_height = 1980_f32; 20 | let direction = ScrollerDirection::Backward; 21 | let primary_window = windows.get_single().expect("no primary window"); 22 | let scroller_speed_min = 0.2; 23 | let scroller_speed_step = 0.2; 24 | commands.spawn(Camera2dBundle::default()); 25 | 26 | let images = (0..=5) 27 | .map(|i| format!("parallax/{i}.png")) 28 | .collect::>(); 29 | 30 | commands.spawn(SpriteBundle { 31 | texture: asset_server.load(images.get(0).unwrap()), 32 | ..default() 33 | }); 34 | let sizes = [ 35 | Vec2::new(320., 240.), 36 | Vec2::new(128., 240.), 37 | Vec2::new(144., 240.), 38 | Vec2::new(160., 240.), 39 | Vec2::new(320., 240.), 40 | Vec2::new(240., 240.), 41 | ]; 42 | 43 | sizes.into_iter().enumerate().for_each(|(i, size)| { 44 | commands.spawn(( 45 | ScrollerSize { 46 | size: Vec2::new(primary_window.width(), item_height), 47 | }, 48 | ScrollerBundle { 49 | scroller: Scroller { 50 | speed: scroller_speed_min + i as f32 * scroller_speed_step, 51 | direction: direction.clone(), 52 | render_layer: Some(1), 53 | ..default() 54 | }, 55 | generator: SingleSpriteGenerator { 56 | path: format!("parallax/{i}.png"), 57 | size, 58 | }, 59 | spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new( 60 | 0., 61 | 0., 62 | 1. + i as f32, 63 | ))), 64 | ..default() 65 | }, 66 | )); 67 | }); 68 | } 69 | -------------------------------------------------------------------------------- /examples/poisson.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{prelude::*, window::PrimaryWindow}; 4 | use bevy_scroller::{ 5 | PoissonSpriteGenerator, Scroller, ScrollerBundle, ScrollerPlugin, ScrollerSize, 6 | }; 7 | use shared::get_app; 8 | 9 | fn main() { 10 | get_app("poisson".into()).add_systems(Startup, start).run(); 11 | } 12 | 13 | fn start(mut commands: Commands, primary_window: Query<&Window, With>) { 14 | let window = primary_window.get_single().expect("no primary window"); 15 | 16 | commands.spawn(Camera2dBundle::default()); 17 | 18 | commands.spawn(( 19 | ScrollerSize { 20 | size: Vec2::new(window.width(), window.height()), 21 | }, 22 | ScrollerBundle { 23 | scroller: Scroller { 24 | speed: 5., 25 | ..Default::default() 26 | }, 27 | generator: PoissonSpriteGenerator { 28 | radius: 128. * 2., 29 | sprites: (1..8).map(|i| format!("gems/{i}.png")).collect(), 30 | item_size: Vec2::new(window.width(), window.height()), 31 | sub_item_size: Vec2::splat(128.), 32 | }, 33 | ..default() 34 | }, 35 | )); 36 | } 37 | -------------------------------------------------------------------------------- /examples/random_sequence.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{prelude::*, window::PrimaryWindow}; 4 | use bevy_scroller::*; 5 | use shared::get_app; 6 | 7 | fn main() { 8 | get_app("random sequence".into()) 9 | .add_systems(Startup, start) 10 | .run(); 11 | } 12 | 13 | pub fn start(mut commands: Commands, windows: Query<&Window, With>) { 14 | commands.spawn(Camera2dBundle::default()); 15 | let primary_window = windows.get_single().expect("no primary window"); 16 | 17 | let items = (1..=7) 18 | .map(|i| SpriteScrollerItem { 19 | path: format!("gems/{i}.png"), 20 | size: Vec2 { x: 128., y: 128. }, 21 | }) 22 | .collect::>(); 23 | 24 | commands.spawn(( 25 | ScrollerSize { 26 | size: Vec2::new(primary_window.width(), 128.), 27 | }, 28 | ScrollerBundle { 29 | scroller: Scroller { 30 | speed: 5., 31 | render_layer: Some(1), 32 | ..default() 33 | }, 34 | generator: RandomSequenceSpriteGenerator { items }, 35 | ..default() 36 | }, 37 | )); 38 | } 39 | -------------------------------------------------------------------------------- /examples/sequence.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{ 4 | asset::{LoadState, LoadedFolder}, 5 | prelude::*, 6 | window::PrimaryWindow, 7 | }; 8 | use bevy_scroller::*; 9 | use shared::get_app; 10 | use std::collections::VecDeque; 11 | 12 | #[derive(Resource)] 13 | pub struct ScrollerImages(Handle); 14 | 15 | #[derive(States, Default, Debug, Hash, Eq, PartialEq, Clone)] 16 | pub enum AppStates { 17 | #[default] 18 | Load, 19 | Run, 20 | } 21 | fn main() { 22 | get_app("sequence".into()) 23 | .add_systems(Startup, startup) 24 | .add_systems(Update, wait_for_load.run_if(in_state(AppStates::Load))) 25 | .add_systems(OnEnter(AppStates::Run), run) 26 | .init_state::() 27 | .run(); 28 | } 29 | 30 | pub fn startup(mut commands: Commands, asset_server: Res) { 31 | commands.spawn(Camera2dBundle::default()); 32 | commands.insert_resource(ScrollerImages(asset_server.load_folder("gems"))); 33 | } 34 | 35 | pub fn wait_for_load( 36 | scroller_images: Res, 37 | asset_server: Res, 38 | mut next_state: ResMut>, 39 | ) { 40 | if let Some(state) = asset_server.get_load_state(&scroller_images.0) { 41 | if state == LoadState::Loaded { 42 | *next_state = NextState(Some(AppStates::Run)); 43 | } 44 | } 45 | } 46 | 47 | pub fn run( 48 | mut commands: Commands, 49 | windows: Query<&Window, With>, 50 | asset_server: Res, 51 | images: Res>, 52 | ) { 53 | let items = (1..=7) 54 | .map(|i| { 55 | let path = format!("gems/{i}.png"); 56 | let handle = asset_server.get_handle(path.clone()).unwrap(); 57 | let image = images.get(handle).unwrap(); 58 | SpriteScrollerItem { 59 | path, 60 | size: image.size().as_vec2(), 61 | } 62 | }) 63 | .collect::>(); 64 | 65 | let primary_window = windows.get_single().expect("no primary window"); 66 | commands.spawn(( 67 | ScrollerSize { 68 | size: Vec2::new(primary_window.width(), 128.), 69 | }, 70 | ScrollerBundle { 71 | scroller: Scroller { 72 | speed: 5., 73 | ..default() 74 | }, 75 | generator: SequenceSpriteGenerator { items }, 76 | ..default() 77 | }, 78 | )); 79 | } 80 | -------------------------------------------------------------------------------- /examples/shared/mod.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use bevy_scroller::ScrollerPlugin; 3 | use iyes_perf_ui::*; 4 | 5 | pub fn get_app(title: String) -> App { 6 | let mut app = App::new(); 7 | app 8 | .add_plugins(( 9 | DefaultPlugins.set(WindowPlugin { 10 | primary_window: Some(Window { 11 | // present_mode: bevy::window::PresentMode::AutoNoVsync, 12 | title: format!("BEVY_SCROLLER example: {}", title), 13 | ..default() 14 | }), 15 | ..default() 16 | }), 17 | ScrollerPlugin, 18 | )) 19 | .add_plugins(bevy::diagnostic::FrameTimeDiagnosticsPlugin) 20 | .add_plugins(bevy::diagnostic::EntityCountDiagnosticsPlugin) 21 | .add_plugins(bevy::diagnostic::SystemInformationDiagnosticsPlugin) 22 | .add_plugins(PerfUiPlugin) 23 | .add_systems(Startup, default_start); 24 | #[cfg(feature = "dev")] 25 | { 26 | use bevy_editor_pls::EditorPlugin; 27 | app.add_plugins(EditorPlugin::default()) 28 | }; 29 | app 30 | } 31 | 32 | fn default_start(mut commands: Commands) { 33 | commands.spawn(PerfUiCompleteBundle::default()); 34 | } 35 | -------------------------------------------------------------------------------- /examples/single.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | 3 | use bevy::{prelude::*, window::PrimaryWindow}; 4 | use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SingleSpriteGenerator}; 5 | use shared::*; 6 | 7 | fn main() { 8 | get_app("single".into()).add_systems(Startup, start).run(); 9 | } 10 | 11 | pub fn start(mut commands: Commands, windows: Query<&Window, With>) { 12 | let primary_window = windows.get_single().expect("no primary window"); 13 | let sprite_size = Vec2::new(300., 300.); 14 | 15 | commands.spawn(Camera2dBundle::default()); 16 | 17 | commands.spawn(( 18 | ScrollerSize { 19 | size: Vec2::new(primary_window.width(), sprite_size.y), 20 | }, 21 | ScrollerBundle { 22 | scroller: Scroller { 23 | speed: 5., 24 | ..default() 25 | }, 26 | generator: SingleSpriteGenerator { 27 | path: "bevy_logo.png".into(), 28 | size: sprite_size, 29 | }, 30 | ..default() 31 | }, 32 | )); 33 | } 34 | -------------------------------------------------------------------------------- /examples/sprite_sheet.rs: -------------------------------------------------------------------------------- 1 | mod shared; 2 | use std::collections::VecDeque; 3 | 4 | use bevy::{prelude::*, window::PrimaryWindow}; 5 | use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SequenceSpriteSheetGenerator}; 6 | use shared::get_app; 7 | fn main() { 8 | get_app("sprite sheet".into()) 9 | .add_systems(Startup, startup) 10 | .run(); 11 | } 12 | 13 | fn startup( 14 | mut commands: Commands, 15 | asset_server: Res, 16 | mut texture_atlas_layouts: ResMut>, 17 | windows: Query<&Window, With>, 18 | ) { 19 | let primary_window = windows.get_single().expect("no primary window"); 20 | commands.spawn(Camera2dBundle::default()); 21 | 22 | let texture = asset_server.load("sprite_sheet.png"); 23 | let layout = texture_atlas_layouts.add(TextureAtlasLayout::from_grid( 24 | Vec2::splat(64.), 25 | 10, 26 | 10, 27 | None, 28 | None, 29 | )); 30 | let sprite_size = Vec2::new(64., 64.); 31 | 32 | commands.spawn(( 33 | ScrollerSize { 34 | size: Vec2::new(primary_window.width(), sprite_size.y * 2.), 35 | }, 36 | ScrollerBundle { 37 | scroller: Scroller { 38 | speed: 1., 39 | render_layer: Some(1), 40 | ..default() 41 | }, 42 | generator: SequenceSpriteSheetGenerator { 43 | sprites: VecDeque::from_iter(0..100), 44 | layout, 45 | texture, 46 | }, 47 | ..default() 48 | }, 49 | )); 50 | } 51 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces=2 -------------------------------------------------------------------------------- /src/generators/generator.rs: -------------------------------------------------------------------------------- 1 | use std::fmt::Debug; 2 | 3 | use bevy::prelude::*; 4 | 5 | use crate::Scroller; 6 | 7 | pub trait GeneratedItem: Debug { 8 | fn size(&self) -> Vec2; 9 | } 10 | pub trait ScrollerGenerator: Default { 11 | type I: GeneratedItem + Debug; 12 | fn gen_item(&mut self) -> Self::I; 13 | } 14 | 15 | pub type SpawnerInput = Vec<(Entity, Scroller, Box<::I>)>; 16 | 17 | const GENERATIONS_LIMIT: u32 = 300; 18 | 19 | pub fn pre_generator(mut q_scroller: Query<(Entity, &Scroller, &mut T)>) -> SpawnerInput 20 | where 21 | T: ScrollerGenerator + Component + Clone, 22 | { 23 | q_scroller 24 | .iter_mut() 25 | .flat_map(|(entity, scroller, mut generator)| { 26 | let mut length = scroller.get_free_space(); 27 | let mut generations = 0; 28 | let mut to_generate = vec![]; 29 | while length > 0. && generations <= GENERATIONS_LIMIT { 30 | let item = generator.gen_item(); 31 | debug!("generated item is: {:?}", item); 32 | length -= item.size().x; 33 | generations += 1; 34 | to_generate.push((entity, scroller.clone(), Box::new(item))); 35 | } 36 | if generations > GENERATIONS_LIMIT { 37 | panic!("Reached item generation limit"); 38 | } 39 | 40 | to_generate 41 | }) 42 | .collect() 43 | } 44 | -------------------------------------------------------------------------------- /src/generators/mod.rs: -------------------------------------------------------------------------------- 1 | mod generator; 2 | #[cfg(feature = "poisson")] 3 | mod poisson; 4 | mod sprite; 5 | mod sprite_sheet; 6 | 7 | pub use generator::{pre_generator, GeneratedItem, ScrollerGenerator, SpawnerInput}; 8 | #[cfg(feature = "poisson")] 9 | pub use poisson::*; 10 | pub use sprite::{ 11 | sprite_spawner, RandomSequenceSpriteGenerator, SequenceSpriteGenerator, SingleSpriteGenerator, 12 | SpriteScrollerItem, 13 | }; 14 | pub use sprite_sheet::*; 15 | -------------------------------------------------------------------------------- /src/generators/poisson.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use fast_poisson::Poisson2D; 3 | use rand::{seq::SliceRandom, thread_rng}; 4 | 5 | use crate::{GeneratedItem, Scroller, ScrollerGenerator, ScrollerItem}; 6 | 7 | #[derive(Component, Default, Reflect, Clone)] 8 | #[reflect(Component)] 9 | pub struct PoissonSpriteGenerator { 10 | pub radius: f32, 11 | pub sprites: Vec, 12 | pub item_size: Vec2, 13 | pub sub_item_size: Vec2, 14 | } 15 | 16 | #[derive(Debug)] 17 | struct ItemSprite { 18 | path: String, 19 | position: Vec2, 20 | } 21 | 22 | #[derive(Debug)] 23 | pub struct PoissonScrollerItem { 24 | sprites: Vec, 25 | size: Vec2, 26 | } 27 | 28 | impl GeneratedItem for PoissonScrollerItem { 29 | fn size(&self) -> Vec2 { 30 | self.size 31 | } 32 | } 33 | 34 | impl ScrollerGenerator for PoissonSpriteGenerator { 35 | type I = PoissonScrollerItem; 36 | 37 | fn gen_item(&mut self) -> Self::I { 38 | let mut rng = thread_rng(); 39 | 40 | Self::I { 41 | size: self.item_size, 42 | sprites: Poisson2D::new() 43 | .with_dimensions( 44 | [ 45 | self.item_size.x - self.sub_item_size.x, 46 | self.item_size.y - self.sub_item_size.y, 47 | ], 48 | self.radius, 49 | ) 50 | .iter() 51 | .map(|point| ItemSprite { 52 | path: self.sprites.choose(&mut rng).unwrap().clone(), 53 | position: Vec2::from(point) - (self.item_size - self.sub_item_size) / 2., 54 | }) 55 | .collect(), 56 | } 57 | } 58 | } 59 | 60 | pub fn poisson_generator( 61 | In(input): In)>>, 62 | mut commands: Commands, 63 | asset_server: Res, 64 | ) { 65 | for (entity, _, item) in input.iter() { 66 | commands 67 | .spawn(( 68 | ScrollerItem { 69 | size: item.size, 70 | parent: *entity, 71 | }, 72 | Name::new("scroller item"), 73 | SpatialBundle::default(), 74 | )) 75 | .with_children(|parent| { 76 | for subitem in item.sprites.iter() { 77 | let image_handle = asset_server.load(subitem.path.clone()); 78 | parent.spawn(SpriteBundle { 79 | texture: image_handle, 80 | transform: Transform::from_translation(subitem.position.extend(0.)), 81 | ..default() 82 | }); 83 | } 84 | }); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/generators/sprite.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use rand::{seq::SliceRandom, thread_rng}; 3 | use std::collections::VecDeque; 4 | 5 | use crate::{Scroller, ScrollerGenerator, ScrollerItem}; 6 | 7 | use super::generator::GeneratedItem; 8 | 9 | #[derive(Clone, Reflect, Debug)] 10 | pub struct SpriteScrollerItem { 11 | pub path: String, 12 | pub size: Vec2, 13 | } 14 | 15 | impl GeneratedItem for SpriteScrollerItem { 16 | fn size(&self) -> Vec2 { 17 | self.size 18 | } 19 | } 20 | 21 | #[derive(Component, Clone, Default, Reflect)] 22 | #[reflect(Component)] 23 | pub struct SingleSpriteGenerator { 24 | pub path: String, 25 | pub size: Vec2, 26 | } 27 | 28 | impl ScrollerGenerator for SingleSpriteGenerator { 29 | type I = SpriteScrollerItem; 30 | 31 | fn gen_item(&mut self) -> Self::I { 32 | Self::I { 33 | size: self.size, 34 | path: self.path.clone(), 35 | } 36 | } 37 | } 38 | 39 | #[derive(Component, Default, Reflect, Clone)] 40 | #[reflect(Component)] 41 | pub struct SequenceSpriteGenerator { 42 | pub items: VecDeque, 43 | } 44 | 45 | impl ScrollerGenerator for SequenceSpriteGenerator { 46 | type I = SpriteScrollerItem; 47 | 48 | fn gen_item(&mut self) -> Self::I { 49 | let item = self.items.pop_front().unwrap(); 50 | self.items.push_back(item.clone()); 51 | item 52 | } 53 | } 54 | 55 | #[derive(Component, Default, Reflect, Clone)] 56 | #[reflect(Component)] 57 | pub struct RandomSequenceSpriteGenerator { 58 | pub items: Vec, 59 | } 60 | 61 | impl ScrollerGenerator for RandomSequenceSpriteGenerator { 62 | type I = SpriteScrollerItem; 63 | 64 | fn gen_item(&mut self) -> Self::I { 65 | let mut rng = thread_rng(); 66 | self.items.choose(&mut rng).unwrap().clone() 67 | } 68 | } 69 | 70 | pub fn sprite_spawner( 71 | In(input): In)>>, 72 | mut commands: Commands, 73 | asset_server: Res, 74 | ) { 75 | input.into_iter().for_each(|(entity, _, item)| { 76 | let handle = asset_server.load(item.path.clone()); 77 | commands.spawn(( 78 | ScrollerItem { 79 | size: item.size(), 80 | parent: entity, 81 | }, 82 | SpriteBundle { 83 | texture: handle, 84 | visibility: Visibility::Hidden, 85 | ..default() 86 | }, 87 | )); 88 | }); 89 | } 90 | -------------------------------------------------------------------------------- /src/generators/sprite_sheet.rs: -------------------------------------------------------------------------------- 1 | use std::collections::VecDeque; 2 | 3 | use bevy::prelude::*; 4 | 5 | use crate::{GeneratedItem, Scroller, ScrollerGenerator, ScrollerItem}; 6 | 7 | #[derive(Debug)] 8 | pub struct SpriteSheetScrollerItem { 9 | sprite: u32, 10 | } 11 | 12 | impl GeneratedItem for SpriteSheetScrollerItem { 13 | fn size(&self) -> Vec2 { 14 | Vec2::new(64., 64.) * 2. 15 | } 16 | } 17 | 18 | #[derive(Default, Component, Clone, Reflect)] 19 | #[reflect(Component)] 20 | pub struct SequenceSpriteSheetGenerator { 21 | pub layout: Handle, 22 | pub texture: Handle, 23 | pub sprites: VecDeque, 24 | } 25 | 26 | impl ScrollerGenerator for SequenceSpriteSheetGenerator { 27 | type I = SpriteSheetScrollerItem; 28 | fn gen_item(&mut self) -> Self::I { 29 | self.sprites.rotate_left(1); 30 | 31 | SpriteSheetScrollerItem { 32 | sprite: *self.sprites.front().unwrap(), 33 | } 34 | } 35 | } 36 | pub fn spritesheet_spawner( 37 | In(input): In)>>, 38 | q_gen: Query<&SequenceSpriteSheetGenerator>, 39 | mut commands: Commands, 40 | ) { 41 | input.into_iter().for_each(|(entity, _, item)| { 42 | let generator = q_gen.get(entity).unwrap(); 43 | commands.spawn(( 44 | ScrollerItem { 45 | size: item.size(), 46 | parent: entity, 47 | }, 48 | SpriteSheetBundle { 49 | visibility: Visibility::Hidden, 50 | sprite: Sprite::default(), 51 | atlas: TextureAtlas { 52 | layout: generator.layout.clone(), 53 | index: item.sprite as usize, 54 | }, 55 | texture: generator.texture.clone(), 56 | transform: Transform::from_scale(Vec3::splat(2.0)), 57 | ..default() 58 | }, 59 | )); 60 | }) 61 | } 62 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::type_complexity)] 2 | 3 | mod generators; 4 | mod plugin; 5 | mod scroller; 6 | mod scroller_app; 7 | 8 | pub use generators::*; 9 | pub use plugin::ScrollerPlugin; 10 | pub use scroller::*; 11 | pub use scroller_app::*; 12 | -------------------------------------------------------------------------------- /src/plugin.rs: -------------------------------------------------------------------------------- 1 | pub struct ScrollerPlugin; 2 | 3 | use crate::{ 4 | scroller::*, sprite_spawner, spritesheet_spawner, RandomSequenceSpriteGenerator, ScrollerApp, 5 | SequenceSpriteGenerator, SequenceSpriteSheetGenerator, SingleSpriteGenerator, 6 | }; 7 | use bevy::prelude::*; 8 | 9 | #[cfg(feature = "dev")] 10 | use crate::scroller::scroller_debug; 11 | 12 | impl Plugin for ScrollerPlugin { 13 | fn build(&self, app: &mut App) { 14 | app 15 | .register_type::() 16 | .register_type::() 17 | .register_type::() 18 | .register_type::() 19 | .register_type::() 20 | .register_type::() 21 | .register_type::() 22 | .register_type::>() 23 | .register_type::>() 24 | .add_scroller_generator::(sprite_spawner) 25 | .add_scroller_generator::(sprite_spawner) 26 | .add_scroller_generator::(spritesheet_spawner) 27 | .add_scroller_generator::(sprite_spawner) 28 | .add_systems( 29 | Update, 30 | ( 31 | init, 32 | on_items_added, 33 | delete_items, 34 | update, 35 | #[cfg(feature = "dev")] 36 | scroller_debug, 37 | ) 38 | .chain(), 39 | ); 40 | #[cfg(feature = "poisson")] 41 | { 42 | use crate::{poisson_generator, PoissonSpriteGenerator}; 43 | app 44 | .register_type::() 45 | .add_scroller_generator::(poisson_generator); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/scroller.rs: -------------------------------------------------------------------------------- 1 | use bevy::{ 2 | ecs::system::SystemId, 3 | prelude::*, 4 | reflect::Reflect, 5 | render::{ 6 | camera::{RenderTarget, Viewport}, 7 | render_resource::{ 8 | Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, 9 | }, 10 | view::RenderLayers, 11 | }, 12 | }; 13 | 14 | use crate::ScrollerGenerator; 15 | 16 | #[derive(Reflect, Default, Debug, Clone)] 17 | pub enum ScrollerDirection { 18 | #[default] 19 | Forward, 20 | Backward, 21 | } 22 | 23 | impl ScrollerDirection { 24 | pub fn as_f32(&self) -> f32 { 25 | (*self).clone().into() 26 | } 27 | } 28 | 29 | impl From for f32 { 30 | fn from(value: ScrollerDirection) -> Self { 31 | match value { 32 | ScrollerDirection::Forward => 1., 33 | ScrollerDirection::Backward => -1., 34 | } 35 | } 36 | } 37 | #[derive(Copy, Clone, Component)] 38 | pub struct ScrollerItem { 39 | pub size: Vec2, 40 | pub parent: Entity, 41 | } 42 | 43 | #[derive(Component)] 44 | pub struct OnScrollerInit(pub SystemId); 45 | 46 | #[derive(Copy, Clone, Default, Component, Reflect)] 47 | pub struct ScrollerSize { 48 | pub size: Vec2, 49 | } 50 | 51 | #[derive(Default, Debug, Component, Clone, Reflect)] 52 | #[reflect(Component, Default)] 53 | pub struct Scroller { 54 | pub start: f32, 55 | pub end: f32, 56 | pub speed: f32, 57 | pub direction: ScrollerDirection, 58 | pub is_paused: bool, 59 | pub spawn_edge: f32, 60 | pub render_layer: Option, 61 | pub texture_handle: Handle, 62 | } 63 | 64 | impl Scroller { 65 | pub fn get_free_space(&self) -> f32 { 66 | (self.start - self.spawn_edge) * -self.direction.as_f32() 67 | } 68 | 69 | pub fn new_item_needed(&self) -> bool { 70 | self.get_free_space() > self.speed * 3. 71 | } 72 | 73 | pub fn get_next_item_position(&self, item: &ScrollerItem) -> Vec2 { 74 | Vec2 { 75 | x: self.spawn_edge - item.size.x / 2. * self.direction.as_f32(), 76 | ..default() 77 | } 78 | } 79 | } 80 | 81 | #[derive(Component, Debug)] 82 | pub struct NeedInitialFilling; 83 | #[derive(Bundle)] 84 | pub struct ScrollerBundle { 85 | pub scroller: Scroller, 86 | pub spatial: SpatialBundle, 87 | pub generator: G, 88 | } 89 | 90 | impl Default for ScrollerBundle { 91 | fn default() -> Self { 92 | Self { 93 | scroller: Scroller::default(), 94 | generator: G::default(), 95 | spatial: SpatialBundle { 96 | visibility: Visibility::Hidden, 97 | ..default() 98 | }, 99 | } 100 | } 101 | } 102 | 103 | pub struct UnnamedScrollerIndex(pub u32); 104 | impl Default for UnnamedScrollerIndex { 105 | fn default() -> Self { 106 | Self(1) 107 | } 108 | } 109 | 110 | pub fn init( 111 | mut scroller_index: Local, 112 | mut commands: Commands, 113 | mut q_added_scroller: Query< 114 | ( 115 | Entity, 116 | &mut Scroller, 117 | &ScrollerSize, 118 | Option<&Name>, 119 | &Transform, 120 | ), 121 | Added, 122 | >, 123 | mut images: ResMut>, 124 | ) { 125 | for (entity, mut scroller, scroller_size, maybe_name, transform) in q_added_scroller.iter_mut() { 126 | let name = match maybe_name { 127 | Some(name) => name.to_string(), 128 | None => { 129 | let name = format!("Scroller #{}", scroller_index.0); 130 | commands.entity(entity).insert(Name::new(name.clone())); 131 | scroller_index.0 += 1; 132 | name 133 | } 134 | }; 135 | commands.entity(entity).insert(SpatialBundle { 136 | transform: *transform, 137 | ..Default::default() 138 | }); 139 | 140 | debug!("Init scroller: {name}"); 141 | 142 | scroller.end = scroller_size.size.x / 2. * scroller.direction.as_f32(); 143 | scroller.start = -scroller.end; 144 | scroller.spawn_edge = scroller.end; 145 | commands.entity(entity).insert(NeedInitialFilling); 146 | 147 | if let Some(render_layer) = scroller.render_layer { 148 | let size = Extent3d { 149 | width: scroller_size.size.x as u32, 150 | height: scroller_size.size.y as u32, 151 | ..default() 152 | }; 153 | 154 | let mut image = Image { 155 | texture_descriptor: TextureDescriptor { 156 | label: None, 157 | size, 158 | dimension: TextureDimension::D2, 159 | format: TextureFormat::Bgra8UnormSrgb, 160 | mip_level_count: 1, 161 | sample_count: 1, 162 | usage: TextureUsages::TEXTURE_BINDING 163 | | TextureUsages::COPY_DST 164 | | TextureUsages::RENDER_ATTACHMENT, 165 | view_formats: &[], 166 | }, 167 | ..default() 168 | }; 169 | 170 | image.resize(size); 171 | let image_handle = images.add(image); // TODO: remove it on cleanup 172 | scroller.texture_handle = image_handle.clone(); 173 | 174 | commands.entity(entity).with_children(|parent| { 175 | parent.spawn(( 176 | Camera2dBundle { 177 | camera: Camera { 178 | viewport: Some(Viewport { 179 | physical_size: scroller_size.size.as_uvec2(), 180 | ..Default::default() 181 | }), 182 | order: -1, 183 | target: RenderTarget::Image(image_handle.clone()), 184 | ..default() 185 | }, 186 | ..default() 187 | }, 188 | RenderLayers::layer(render_layer), 189 | Name::new("Scroller Camera"), 190 | )); 191 | parent.spawn(( 192 | SpriteBundle { 193 | texture: image_handle, 194 | ..Default::default() 195 | }, 196 | Name::new("Scroller Camera texture"), 197 | )); 198 | }); 199 | } 200 | } 201 | } 202 | 203 | pub fn on_items_added( 204 | mut commands: Commands, 205 | mut q_added: Query<(&ScrollerItem, &mut Transform, &mut Visibility, Entity), Added>, 206 | mut q_scroller: Query<(&mut Scroller, Entity)>, 207 | ) { 208 | for (scroller_item, mut transform, mut visibility, scroller_item_entity) in q_added.iter_mut() { 209 | if let Ok((mut scroller, scroller_entity)) = q_scroller.get_mut(scroller_item.parent) { 210 | let translation = scroller.get_next_item_position(scroller_item).extend(0.); 211 | 212 | transform.translation = translation; 213 | *visibility = Visibility::Inherited; 214 | if let Some(render_layer) = scroller.render_layer { 215 | commands 216 | .entity(scroller_item_entity) 217 | .insert(RenderLayers::layer(render_layer)); 218 | } 219 | 220 | scroller.spawn_edge -= scroller_item.size.x * scroller.direction.as_f32(); 221 | 222 | commands 223 | .entity(scroller_entity) 224 | .add_child(scroller_item_entity); 225 | } 226 | } 227 | } 228 | 229 | #[cfg(feature = "dev")] 230 | pub fn scroller_debug( 231 | q_scroller_item: Query<(&GlobalTransform, &ScrollerItem, Option<&Visibility>)>, 232 | q_scroller: Query<(&GlobalTransform, &Scroller, &ScrollerSize)>, 233 | mut gizmos: Gizmos, 234 | ) { 235 | for (global_transform, item, visibility) in q_scroller_item.iter() { 236 | if let Some(visibility) = visibility { 237 | if visibility != Visibility::Hidden { 238 | let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); 239 | 240 | gizmos.rect_2d( 241 | translation.truncate(), 242 | rotation.to_axis_angle().1, 243 | item.size * scale.truncate(), 244 | Color::BLUE, 245 | ); 246 | } 247 | } 248 | } 249 | for (global_transform, scroller, scroller_size) in q_scroller.iter() { 250 | let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); 251 | 252 | gizmos.line_2d( 253 | Vec2::new(scroller.spawn_edge, scroller_size.size.y / -2. - 20.) * scale.truncate(), // TODO: take rotation into account 254 | Vec2::new(scroller.spawn_edge, scroller_size.size.y / 2. + 20.) * scale.truncate(), // TODO: take rotation into account 255 | Color::RED, 256 | ); 257 | gizmos.rect_2d( 258 | translation.truncate(), 259 | rotation.to_axis_angle().1, 260 | Vec2::new(scroller_size.size.x, scroller_size.size.y) * scale.truncate(), 261 | Color::GREEN, 262 | ); 263 | // gizmos.line_2d( 264 | // Vec2::new(position.x, scroller.rect.min.y), 265 | // Vec2::new(position.x, scroller.rect.max.y), 266 | // Color::WHITE, 267 | // ); 268 | } 269 | } 270 | 271 | pub fn update( 272 | mut commands: Commands, 273 | mut q_scroller: Query<( 274 | &mut Scroller, 275 | &mut Visibility, 276 | Option<&NeedInitialFilling>, 277 | Option<&OnScrollerInit>, 278 | Entity, 279 | )>, 280 | mut q_item: Query<(&mut Transform, Entity, &ScrollerItem)>, 281 | time_fixed: Res>, 282 | ) { 283 | let step: f32 = 1. / 60.; 284 | let delta = time_fixed.delta_seconds(); 285 | 286 | for (mut scroller, mut visibility, maybe_need_filling, maybe_on_init, scroller_entity) in 287 | q_scroller.iter_mut() 288 | { 289 | if maybe_need_filling.is_some() && !scroller.new_item_needed() { 290 | *visibility = Visibility::Inherited; 291 | commands 292 | .entity(scroller_entity) 293 | .remove::(); 294 | if let Some(on_init) = maybe_on_init { 295 | commands.run_system_with_input(on_init.0, scroller_entity); 296 | } 297 | } 298 | if !scroller.is_paused { 299 | let update_step = delta / step * scroller.speed * scroller.direction.as_f32(); 300 | 301 | scroller.spawn_edge += update_step; 302 | q_item 303 | .iter_mut() 304 | .filter(|(_, _, item)| item.parent == scroller_entity) 305 | .for_each(|(mut transform, _, _)| { 306 | transform.translation.x += update_step; 307 | }) 308 | } 309 | } 310 | } 311 | 312 | pub fn delete_items( 313 | mut commands: Commands, 314 | q_scroller_item: Query<(&ScrollerItem, Entity, &Transform)>, 315 | q_scroller: Query<&Scroller>, 316 | ) { 317 | for (scroller_item, entity, transform) in q_scroller_item.iter() { 318 | if let Ok(scroller) = q_scroller.get(scroller_item.parent) { 319 | if (scroller.end - transform.translation.x 320 | + scroller_item.size.x / 2. * scroller.direction.as_f32()) 321 | * scroller.direction.as_f32() 322 | < 0. 323 | { 324 | commands.entity(entity).despawn_recursive(); 325 | } 326 | } 327 | } 328 | } 329 | 330 | #[cfg(test)] 331 | mod test { 332 | // use crate::{Scroller, ScrollerItem}; 333 | // use bevy::prelude::*; 334 | // use rstest::rstest; 335 | 336 | // #[rstest] 337 | // #[case(0., 30., Vec2::new(-5.0, 0.))] 338 | // #[case(10., 0., Vec2::new(15.0, 0.))] 339 | // #[case(65., 0., Vec2::new(-40.0, 0.))] 340 | // // #[case(65., 30., Vec2::new(25.0, 0.))] 341 | // fn get_inserted_item_position_test( 342 | // #[case] end: f32, 343 | // #[case] scroll: f32, 344 | // #[case] expectation: Vec2, 345 | // ) { 346 | // let scroller = Scroller { 347 | // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), 348 | // scroll, 349 | // end, 350 | // ..default() 351 | // }; 352 | // // let position = scroller.get_next_item_position(&ScrollerItem { size: 30. }); 353 | // // assert_eq!(position, expectation); 354 | // } 355 | 356 | // #[rstest] 357 | // #[case(0., 30., true)] 358 | // #[case(10., 0., true)] 359 | // #[case(65., 0., true)] 360 | // fn should_add_new_item_test(#[case] end: f32, #[case] scroll: f32, #[case] expectation: bool) { 361 | // let scroller = Scroller { 362 | // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), 363 | // scroll, 364 | // end, 365 | // ..default() 366 | // }; 367 | // assert_eq!(scroller.should_insert_next_item(), expectation); 368 | // } 369 | } 370 | -------------------------------------------------------------------------------- /src/scroller_app.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | 3 | use crate::{pre_generator, ScrollerGenerator, SpawnerInput}; 4 | 5 | pub trait ScrollerApp { 6 | fn add_scroller_generator< 7 | T: ScrollerGenerator + Component + Clone, 8 | M, 9 | S: IntoSystem, (), M>, 10 | >( 11 | &mut self, 12 | system: S, 13 | ) -> &mut Self; 14 | } 15 | 16 | impl ScrollerApp for App { 17 | fn add_scroller_generator< 18 | T: ScrollerGenerator + Component + Clone, 19 | M, 20 | S: IntoSystem, (), M>, 21 | >( 22 | &mut self, 23 | system: S, 24 | ) -> &mut Self { 25 | self.add_systems(Update, pre_generator::.pipe(system)); 26 | self 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tests/scroller.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use bevy_scroller::{ 3 | GeneratedItem, ScrollerBundle, ScrollerGenerator, ScrollerItem, ScrollerPlugin, ScrollerSize, 4 | }; 5 | 6 | #[derive(Component, Clone, Default)] 7 | struct FooGenerator; 8 | #[derive(Debug)] 9 | struct FooItem; 10 | impl GeneratedItem for FooItem { 11 | fn size(&self) -> Vec2 { 12 | Vec2::new(100., 100.) 13 | } 14 | } 15 | impl ScrollerGenerator for FooGenerator { 16 | type I = FooItem; 17 | 18 | fn gen_item(&mut self) -> Self::I { 19 | Self::I {} 20 | } 21 | } 22 | 23 | fn get_app() -> App { 24 | let mut app = App::new(); 25 | app.add_plugins(( 26 | MinimalPlugins, 27 | ScrollerPlugin, 28 | AssetPlugin::default(), 29 | ImagePlugin::default(), 30 | )); 31 | app 32 | } 33 | 34 | fn get_app_with_empty_scroller() -> (App, Entity) { 35 | let mut app = get_app(); 36 | let scroller = app 37 | .world 38 | .spawn(( 39 | ScrollerBundle::::default(), 40 | ScrollerSize { 41 | size: Vec2::new(1000., 100.), 42 | }, 43 | )) 44 | .id(); 45 | (app, scroller) 46 | } 47 | 48 | fn get_app_with_full_scroller() -> App { 49 | let (mut app, scroller) = get_app_with_empty_scroller(); 50 | 51 | app.world.spawn(( 52 | ScrollerItem { 53 | parent: scroller, 54 | size: Vec2::new(2000., 100.), 55 | }, 56 | Transform::default(), 57 | Visibility::Hidden, 58 | )); 59 | app 60 | } 61 | 62 | mod init { 63 | use bevy::prelude::Name; 64 | use bevy_scroller::{ScrollerBundle, ScrollerSize}; 65 | 66 | use crate::{get_app, FooGenerator}; 67 | 68 | #[test] 69 | fn should_insert_name_component_if_it_does_not_exist() { 70 | let mut app = get_app(); 71 | app.world.spawn(( 72 | ScrollerBundle::::default(), 73 | ScrollerSize::default(), 74 | )); 75 | app.update(); 76 | 77 | let name = app.world.query::<&Name>().get_single(&app.world).unwrap(); 78 | assert_eq!(name.as_str(), "Scroller #1"); 79 | } 80 | 81 | #[test] 82 | fn should_increment_unnamed_index() { 83 | let mut app = get_app(); 84 | app.world.spawn(( 85 | ScrollerBundle::::default(), 86 | ScrollerSize::default(), 87 | )); 88 | 89 | app.world.spawn(( 90 | ScrollerBundle::::default(), 91 | ScrollerSize::default(), 92 | )); 93 | 94 | app.update(); 95 | 96 | let names = app 97 | .world 98 | .query::<&Name>() 99 | .iter(&app.world) 100 | .map(|name| name.as_str()) 101 | .collect::>(); 102 | 103 | assert_eq!(names[1], "Scroller #2"); 104 | } 105 | 106 | #[test] 107 | fn should_preserve_name_if_it_exist() { 108 | let mut app = get_app(); 109 | let name = "some name"; 110 | app.world.spawn(( 111 | ScrollerBundle::::default(), 112 | Name::new(name), 113 | ScrollerSize::default(), 114 | )); 115 | app.update(); 116 | 117 | let comp_name = app.world.query::<&Name>().get_single(&app.world).unwrap(); 118 | assert_eq!(comp_name.as_str(), name); 119 | } 120 | } 121 | 122 | mod pre_generator { 123 | use crate::{get_app, get_app_with_empty_scroller, get_app_with_full_scroller, FooGenerator}; 124 | use bevy::prelude::*; 125 | use bevy_scroller::{ScrollerApp, ScrollerBundle, ScrollerSize, SpawnerInput}; 126 | 127 | #[test] 128 | fn should_return_empty_vector_for_empty_world() { 129 | fn generator(In(input): In>) { 130 | assert_eq!(input.len(), 0); 131 | } 132 | let mut app = get_app(); 133 | app.add_scroller_generator::(generator); 134 | app.update(); 135 | } 136 | 137 | #[test] 138 | fn should_return_empty_vector_for_full_scroller() { 139 | fn generator(In(input): In>) { 140 | assert_eq!(input.len(), 0); 141 | } 142 | let mut app = get_app_with_full_scroller(); 143 | app.add_scroller_generator::(generator); 144 | app.update(); 145 | } 146 | 147 | #[test] 148 | fn should_return_vector_with_correct_size() { 149 | fn generator(In(input): In>) { 150 | assert_eq!(input.len(), 10); 151 | } 152 | let (mut app, _) = get_app_with_empty_scroller(); 153 | app.add_scroller_generator::(generator); 154 | app.update(); 155 | } 156 | 157 | #[test] 158 | #[should_panic = "Reached item generation limit"] 159 | fn should_panic_when_reaching_generation_limit() { 160 | let mut app = get_app(); 161 | fn generator(_: In>) {} 162 | app.world.spawn(( 163 | ScrollerBundle::::default(), 164 | ScrollerSize { 165 | size: Vec2::new(100000., 100.), 166 | }, 167 | )); 168 | 169 | app.add_scroller_generator::(generator); 170 | app.update(); 171 | } 172 | } 173 | 174 | mod update { 175 | use bevy::prelude::*; 176 | use bevy_scroller::{NeedInitialFilling, Scroller}; 177 | 178 | use crate::{get_app_with_empty_scroller, get_app_with_full_scroller}; 179 | 180 | // #[test] 181 | // fn should_not_update() {} 182 | // #[test] 183 | // fn should_update_transform() {} 184 | #[test] 185 | fn should_set_visible_after_initialization() { 186 | let mut app = get_app_with_full_scroller(); 187 | 188 | app.update(); 189 | 190 | let (_, visibility) = app 191 | .world 192 | .query::<(&Scroller, &Visibility)>() 193 | .get_single(&app.world) 194 | .unwrap(); 195 | assert_eq!(visibility, Visibility::Inherited); 196 | } 197 | 198 | #[test] 199 | fn should_not_override_visible_on_initialised_scrollers() { 200 | let mut app = get_app_with_full_scroller(); 201 | 202 | app.update(); 203 | 204 | let (_, mut visibility) = app 205 | .world 206 | .query::<(&Scroller, &mut Visibility)>() 207 | .get_single_mut(&mut app.world) 208 | .unwrap(); 209 | *visibility = Visibility::Hidden; 210 | 211 | app.update(); 212 | 213 | let (_, visibility) = app 214 | .world 215 | .query::<(&Scroller, &Visibility)>() 216 | .get_single(&app.world) 217 | .unwrap(); 218 | 219 | assert_eq!(visibility, Visibility::Hidden); 220 | } 221 | 222 | #[test] 223 | fn should_remove_init_marker_component_if_filled() { 224 | let mut app = get_app_with_full_scroller(); 225 | app.update(); 226 | 227 | let marker = app 228 | .world 229 | .query_filtered::<&NeedInitialFilling, With>() 230 | .get_single(&app.world); 231 | 232 | assert!(marker.is_err()); 233 | } 234 | 235 | #[test] 236 | fn should_not_remove_init_marker_component_if_not_filled() { 237 | let (mut app, _) = get_app_with_empty_scroller(); 238 | app.update(); 239 | 240 | let marker = app 241 | .world 242 | .query_filtered::<&NeedInitialFilling, With>() 243 | .get_single(&app.world); 244 | 245 | assert!(marker.is_ok()); 246 | } 247 | 248 | // #[test] 249 | // fn should_not_scroll_not_initialized_scrollers() {} 250 | 251 | // #[test] 252 | // fn should_scroller_initialized_scrollers() {} 253 | } 254 | // use rstest::rstest; 255 | // use scroller::{Scroller, ScrollerBundle, ScrollerItem, ScrollerPlugin}; 256 | 257 | // fn get_app() -> App { 258 | // let mut app = App::new(); 259 | // app 260 | // .init_resource::() 261 | // .add_plugins((MinimalPlugins, ScrollerPlugin)); 262 | // app 263 | // } 264 | 265 | // #[test] 266 | // fn scroller_add_items_test() { 267 | // let mut app = get_app(); 268 | 269 | // let mut scroller = Scroller { 270 | // direction: Vec2::new(-1., 0.), 271 | // speed: 0.5, 272 | // rect: Rect::from_corners(Vec2::new(-100., 50.), Vec2::new(100., -50.)), 273 | // ..default() 274 | // }; 275 | // for _ in 1..=10 { 276 | // let item = app.world.spawn(ScrollerItem { size: 100. }).id(); 277 | // scroller.items_queue.push_back(item); 278 | // } 279 | 280 | // let scroller_entity = app 281 | // .world 282 | // .spawn((scroller, SpatialBundle::default())) 283 | // .with_children(|parent| {}) 284 | // .id(); 285 | 286 | // app.update(); 287 | 288 | // let scroller = app 289 | // .world 290 | // .query::<&Scroller>() 291 | // .get(&app.world, scroller_entity) 292 | // .unwrap() 293 | // .clone(); 294 | // println!("scroller.queued_items: {}", scroller.items_queue.len()); 295 | // let mut items = app.world.query::<(&ScrollerItem, Option<&Visibility>)>(); 296 | // let visible_items_count = items 297 | // .iter(&app.world) 298 | // .filter_map(|(i, v)| Some((i, v?))) 299 | // .count(); 300 | // println!("scroller witdh: {:?}", scroller.rect.width()); 301 | // println!("scroller Items: {:?}", items.iter(&app.world).len()); 302 | // println!("scroller Items visible: {visible_items_count}",); 303 | // assert_eq!(visible_items_count, 30); 304 | // // println!("{:#?}", scroller); 305 | // // app.world.g 306 | // } 307 | 308 | // #[rstest] 309 | // #[case(Vec2::new(-1., 0.), 0.5, Vec2::new(-0.5, 0.))] 310 | // #[case(Vec2::new(-1., 0.), -0.5, Vec2::new(0.5, 0.))] 311 | // #[case(Vec2::new(1., 0.), 0.5, Vec2::new(0.5, 0.))] 312 | // #[case(Vec2::new(0., -1.), 0.5, Vec2::new(0., -0.5))] 313 | // #[case(Vec2::new(0., 1.), 0.5, Vec2::new(0., 0.5))] 314 | // #[case(Vec2::new(1., 1.), 0.5, Vec2::new(0.5, 0.5))] 315 | // fn scroller_update_items_test( 316 | // #[case] direction: Vec2, 317 | // #[case] speed: f32, 318 | // #[case] expectation: Vec2, 319 | // ) { 320 | // let mut app = get_app(); 321 | // let scroller_entity = app 322 | // .world 323 | // .spawn(( 324 | // Scroller { 325 | // direction, 326 | // speed, 327 | // rect: Rect::from_corners(Vec2::new(-100., 50.), Vec2::new(100., -50.)), 328 | // ..default() 329 | // }, 330 | // SpatialBundle::default(), 331 | // )) 332 | // .id(); 333 | 334 | // app.update(); 335 | 336 | // let scroller_transform = app 337 | // .world 338 | // .query_filtered::<&Transform, With>() 339 | // .get(&app.world, scroller_entity) 340 | // .unwrap(); 341 | 342 | // assert_eq!(scroller_transform.translation, expectation.extend(0.)); 343 | // } 344 | 345 | // #[test] 346 | // fn scroller_delete_items_test() {} 347 | --------------------------------------------------------------------------------