├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── assets ├── promo.png └── texmod.png ├── examples └── sprite_atlas.rs ├── readme.md └── src ├── computed_text_mode_slices.rs ├── lib.rs ├── plugin.rs ├── text_mode_sprite.wgsl └── text_mode_texture_atlas.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | .idea/ 4 | 5 | assets/MRMOTEXT.png 6 | 7 | *.ttf -------------------------------------------------------------------------------- /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.23" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" 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.14.0" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "6cf780eb737f2d4a49ffbd512324d53ad089070f813f7be7f99dbd5123a7f448" 26 | 27 | [[package]] 28 | name = "accesskit_consumer" 29 | version = "0.22.0" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "3bdfa1638ddd6eb9c752def95568df8b3ad832df252e9156d2eb783b201ca8a9" 32 | dependencies = [ 33 | "accesskit", 34 | "immutable-chunkmap", 35 | ] 36 | 37 | [[package]] 38 | name = "accesskit_macos" 39 | version = "0.15.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "c236a84ff1111defc280cee755eaa953d0b24398786851b9d28322c6d3bb1ebd" 42 | dependencies = [ 43 | "accesskit", 44 | "accesskit_consumer", 45 | "objc2", 46 | "objc2-app-kit", 47 | "objc2-foundation", 48 | "once_cell", 49 | ] 50 | 51 | [[package]] 52 | name = "accesskit_windows" 53 | version = "0.20.0" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "5d7f43d24b16b3e76bef248124fbfd2493c3a9860edb5aae1010c890e826de5e" 56 | dependencies = [ 57 | "accesskit", 58 | "accesskit_consumer", 59 | "paste", 60 | "static_assertions", 61 | "windows 0.54.0", 62 | ] 63 | 64 | [[package]] 65 | name = "accesskit_winit" 66 | version = "0.20.4" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "755535e6bf711a42dac28b888b884b10fc00ff4010d9d3bd871c5f5beae5aa78" 69 | dependencies = [ 70 | "accesskit", 71 | "accesskit_macos", 72 | "accesskit_windows", 73 | "raw-window-handle", 74 | "winit", 75 | ] 76 | 77 | [[package]] 78 | name = "adler" 79 | version = "1.0.2" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 82 | 83 | [[package]] 84 | name = "ahash" 85 | version = "0.8.11" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 88 | dependencies = [ 89 | "cfg-if", 90 | "getrandom", 91 | "once_cell", 92 | "version_check", 93 | "zerocopy", 94 | ] 95 | 96 | [[package]] 97 | name = "aho-corasick" 98 | version = "1.1.3" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 101 | dependencies = [ 102 | "memchr", 103 | ] 104 | 105 | [[package]] 106 | name = "allocator-api2" 107 | version = "0.2.16" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 110 | 111 | [[package]] 112 | name = "alsa" 113 | version = "0.9.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" 116 | dependencies = [ 117 | "alsa-sys", 118 | "bitflags 2.5.0", 119 | "libc", 120 | ] 121 | 122 | [[package]] 123 | name = "alsa-sys" 124 | version = "0.3.1" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 127 | dependencies = [ 128 | "libc", 129 | "pkg-config", 130 | ] 131 | 132 | [[package]] 133 | name = "android-activity" 134 | version = "0.6.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 137 | dependencies = [ 138 | "android-properties", 139 | "bitflags 2.5.0", 140 | "cc", 141 | "cesu8", 142 | "jni", 143 | "jni-sys", 144 | "libc", 145 | "log", 146 | "ndk 0.9.0", 147 | "ndk-context", 148 | "ndk-sys 0.6.0+11769913", 149 | "num_enum", 150 | "thiserror", 151 | ] 152 | 153 | [[package]] 154 | name = "android-properties" 155 | version = "0.2.2" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 158 | 159 | [[package]] 160 | name = "android_log-sys" 161 | version = "0.3.1" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" 164 | 165 | [[package]] 166 | name = "android_system_properties" 167 | version = "0.1.5" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 170 | dependencies = [ 171 | "libc", 172 | ] 173 | 174 | [[package]] 175 | name = "approx" 176 | version = "0.5.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" 179 | dependencies = [ 180 | "num-traits", 181 | ] 182 | 183 | [[package]] 184 | name = "arrayref" 185 | version = "0.3.7" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" 188 | 189 | [[package]] 190 | name = "arrayvec" 191 | version = "0.7.4" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 194 | 195 | [[package]] 196 | name = "as-raw-xcb-connection" 197 | version = "1.0.1" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 200 | 201 | [[package]] 202 | name = "ash" 203 | version = "0.37.3+1.3.251" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" 206 | dependencies = [ 207 | "libloading 0.7.4", 208 | ] 209 | 210 | [[package]] 211 | name = "async-broadcast" 212 | version = "0.5.1" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" 215 | dependencies = [ 216 | "event-listener 2.5.3", 217 | "futures-core", 218 | ] 219 | 220 | [[package]] 221 | name = "async-channel" 222 | version = "2.2.0" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" 225 | dependencies = [ 226 | "concurrent-queue", 227 | "event-listener 5.2.0", 228 | "event-listener-strategy 0.5.0", 229 | "futures-core", 230 | "pin-project-lite", 231 | ] 232 | 233 | [[package]] 234 | name = "async-executor" 235 | version = "1.11.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" 238 | dependencies = [ 239 | "async-task", 240 | "concurrent-queue", 241 | "fastrand", 242 | "futures-lite", 243 | "slab", 244 | ] 245 | 246 | [[package]] 247 | name = "async-fs" 248 | version = "2.1.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1" 251 | dependencies = [ 252 | "async-lock", 253 | "blocking", 254 | "futures-lite", 255 | ] 256 | 257 | [[package]] 258 | name = "async-lock" 259 | version = "3.3.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" 262 | dependencies = [ 263 | "event-listener 4.0.3", 264 | "event-listener-strategy 0.4.0", 265 | "pin-project-lite", 266 | ] 267 | 268 | [[package]] 269 | name = "async-task" 270 | version = "4.7.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" 273 | 274 | [[package]] 275 | name = "atomic-waker" 276 | version = "1.1.2" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 279 | 280 | [[package]] 281 | name = "autocfg" 282 | version = "1.1.0" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 285 | 286 | [[package]] 287 | name = "base64" 288 | version = "0.21.7" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 291 | 292 | [[package]] 293 | name = "base64" 294 | version = "0.22.1" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 297 | 298 | [[package]] 299 | name = "bevy" 300 | version = "0.14.0" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "8e938630e9f472b1899c78ef84aa907081b23bad8333140e2295c620485b6ee7" 303 | dependencies = [ 304 | "bevy_internal", 305 | ] 306 | 307 | [[package]] 308 | name = "bevy_a11y" 309 | version = "0.14.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "3e613f0e7d5a92637e59744f7185e374c9a59654ecc6d7575adcec9581db1363" 312 | dependencies = [ 313 | "accesskit", 314 | "bevy_app", 315 | "bevy_derive", 316 | "bevy_ecs", 317 | ] 318 | 319 | [[package]] 320 | name = "bevy_animation" 321 | version = "0.14.0" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "23aa4141df149b743e69c90244261c6372bafb70d9f115885de48a75fc28fd9b" 324 | dependencies = [ 325 | "bevy_app", 326 | "bevy_asset", 327 | "bevy_color", 328 | "bevy_core", 329 | "bevy_derive", 330 | "bevy_ecs", 331 | "bevy_hierarchy", 332 | "bevy_log", 333 | "bevy_math", 334 | "bevy_reflect", 335 | "bevy_render", 336 | "bevy_time", 337 | "bevy_transform", 338 | "bevy_utils", 339 | "blake3", 340 | "fixedbitset 0.5.7", 341 | "petgraph", 342 | "ron", 343 | "serde", 344 | "thiserror", 345 | "thread_local", 346 | "uuid", 347 | ] 348 | 349 | [[package]] 350 | name = "bevy_app" 351 | version = "0.14.0" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "6f548e9dab7d10c5f99e3b504c758c4bf87aa67df9bcb9cc8b317a0271770e72" 354 | dependencies = [ 355 | "bevy_derive", 356 | "bevy_ecs", 357 | "bevy_reflect", 358 | "bevy_tasks", 359 | "bevy_utils", 360 | "console_error_panic_hook", 361 | "downcast-rs", 362 | "thiserror", 363 | "wasm-bindgen", 364 | "web-sys", 365 | ] 366 | 367 | [[package]] 368 | name = "bevy_asset" 369 | version = "0.14.0" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "f9d198e4c3419215de2ad981d4e734bbfab46469b7575e3b7150c912b9ec5175" 372 | dependencies = [ 373 | "async-broadcast", 374 | "async-fs", 375 | "async-lock", 376 | "bevy_app", 377 | "bevy_asset_macros", 378 | "bevy_ecs", 379 | "bevy_reflect", 380 | "bevy_tasks", 381 | "bevy_utils", 382 | "bevy_winit", 383 | "blake3", 384 | "crossbeam-channel", 385 | "downcast-rs", 386 | "futures-io", 387 | "futures-lite", 388 | "js-sys", 389 | "parking_lot", 390 | "ron", 391 | "serde", 392 | "thiserror", 393 | "uuid", 394 | "wasm-bindgen", 395 | "wasm-bindgen-futures", 396 | "web-sys", 397 | ] 398 | 399 | [[package]] 400 | name = "bevy_asset_macros" 401 | version = "0.14.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "11b2cbeba287a4b44e116c33dbaf37dce80a9d84477b2bb35ff459999d6c9e1b" 404 | dependencies = [ 405 | "bevy_macro_utils", 406 | "proc-macro2", 407 | "quote", 408 | "syn 2.0.53", 409 | ] 410 | 411 | [[package]] 412 | name = "bevy_audio" 413 | version = "0.14.0" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "e41ecf15d0aae31bdb6d2b5cc590f966451e9736ddfee634c8f1ca5af1ac4342" 416 | dependencies = [ 417 | "bevy_app", 418 | "bevy_asset", 419 | "bevy_derive", 420 | "bevy_ecs", 421 | "bevy_hierarchy", 422 | "bevy_math", 423 | "bevy_reflect", 424 | "bevy_transform", 425 | "bevy_utils", 426 | "cpal", 427 | "rodio", 428 | ] 429 | 430 | [[package]] 431 | name = "bevy_color" 432 | version = "0.14.1" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "5a933306f5c7dc9568209180f482b28b5f40d2f8d5b361bc1b270c0a588752c0" 435 | dependencies = [ 436 | "bevy_math", 437 | "bevy_reflect", 438 | "bytemuck", 439 | "encase", 440 | "serde", 441 | "thiserror", 442 | "wgpu-types", 443 | ] 444 | 445 | [[package]] 446 | name = "bevy_core" 447 | version = "0.14.0" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "6ddeed5ebf2fa75a4d4f32e2da9c60f11037e36252695059a151c6685cd3d72b" 450 | dependencies = [ 451 | "bevy_app", 452 | "bevy_ecs", 453 | "bevy_reflect", 454 | "bevy_tasks", 455 | "bevy_utils", 456 | "uuid", 457 | ] 458 | 459 | [[package]] 460 | name = "bevy_core_pipeline" 461 | version = "0.14.0" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "1b978220b5edc98f2c5cbbd14c118c74b3ec7216e5416d3c187c1097279b009b" 464 | dependencies = [ 465 | "bevy_app", 466 | "bevy_asset", 467 | "bevy_color", 468 | "bevy_core", 469 | "bevy_derive", 470 | "bevy_ecs", 471 | "bevy_math", 472 | "bevy_reflect", 473 | "bevy_render", 474 | "bevy_transform", 475 | "bevy_utils", 476 | "bitflags 2.5.0", 477 | "nonmax", 478 | "radsort", 479 | "serde", 480 | "smallvec", 481 | "thiserror", 482 | ] 483 | 484 | [[package]] 485 | name = "bevy_derive" 486 | version = "0.14.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "c8a8173bad3ed53fa158806b1beda147263337d6ef71a093780dd141b74386b1" 489 | dependencies = [ 490 | "bevy_macro_utils", 491 | "quote", 492 | "syn 2.0.53", 493 | ] 494 | 495 | [[package]] 496 | name = "bevy_diagnostic" 497 | version = "0.14.0" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "0b7f82011fd70048be282526a99756d54bf00e874edafa9664ba0dc247678f03" 500 | dependencies = [ 501 | "bevy_app", 502 | "bevy_core", 503 | "bevy_ecs", 504 | "bevy_tasks", 505 | "bevy_time", 506 | "bevy_utils", 507 | "const-fnv1a-hash", 508 | "sysinfo", 509 | ] 510 | 511 | [[package]] 512 | name = "bevy_ecs" 513 | version = "0.14.0" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "2c77fdc3a7230eff2fcebe4bd17c155bd238c660a0089d0f98c39ba0d461b923" 516 | dependencies = [ 517 | "arrayvec", 518 | "bevy_ecs_macros", 519 | "bevy_ptr", 520 | "bevy_reflect", 521 | "bevy_tasks", 522 | "bevy_utils", 523 | "bitflags 2.5.0", 524 | "concurrent-queue", 525 | "fixedbitset 0.5.7", 526 | "nonmax", 527 | "petgraph", 528 | "serde", 529 | "thiserror", 530 | ] 531 | 532 | [[package]] 533 | name = "bevy_ecs_macros" 534 | version = "0.14.0" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "9272b511958525306cd141726d3ca59740f79fc0707c439b55a007bcc3497308" 537 | dependencies = [ 538 | "bevy_macro_utils", 539 | "proc-macro2", 540 | "quote", 541 | "syn 2.0.53", 542 | ] 543 | 544 | [[package]] 545 | name = "bevy_encase_derive" 546 | version = "0.14.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "f0452d8254c8bfae4bff6caca2a8be3b0c1b2e1a72b93e9b9f6a21c8dff807e0" 549 | dependencies = [ 550 | "bevy_macro_utils", 551 | "encase_derive_impl", 552 | ] 553 | 554 | [[package]] 555 | name = "bevy_gilrs" 556 | version = "0.14.0" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "fbad8e59470c3d5cf25aa8c48462c4cf6f0c6314538c68ab2f5cf393146f0fc2" 559 | dependencies = [ 560 | "bevy_app", 561 | "bevy_ecs", 562 | "bevy_input", 563 | "bevy_time", 564 | "bevy_utils", 565 | "gilrs", 566 | "thiserror", 567 | ] 568 | 569 | [[package]] 570 | name = "bevy_gizmos" 571 | version = "0.14.0" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "bdbb0556f0c6e45f4a17aef9c708c06ebf15ae1bed4533d7eddb493409f9f025" 574 | dependencies = [ 575 | "bevy_app", 576 | "bevy_asset", 577 | "bevy_color", 578 | "bevy_core_pipeline", 579 | "bevy_ecs", 580 | "bevy_gizmos_macros", 581 | "bevy_math", 582 | "bevy_pbr", 583 | "bevy_reflect", 584 | "bevy_render", 585 | "bevy_sprite", 586 | "bevy_time", 587 | "bevy_transform", 588 | "bevy_utils", 589 | "bytemuck", 590 | ] 591 | 592 | [[package]] 593 | name = "bevy_gizmos_macros" 594 | version = "0.14.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "8ef351a4b6498c197d1317c62f46ba84b69fbde3dbeb57beb2e744bbe5b7c3e0" 597 | dependencies = [ 598 | "bevy_macro_utils", 599 | "proc-macro2", 600 | "quote", 601 | "syn 2.0.53", 602 | ] 603 | 604 | [[package]] 605 | name = "bevy_gltf" 606 | version = "0.14.0" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "cfd7abeaf3f28afd1f8999c2169aa17b40a37ad11253cf7dd05017024b65adc6" 609 | dependencies = [ 610 | "base64 0.22.1", 611 | "bevy_animation", 612 | "bevy_app", 613 | "bevy_asset", 614 | "bevy_color", 615 | "bevy_core", 616 | "bevy_core_pipeline", 617 | "bevy_ecs", 618 | "bevy_hierarchy", 619 | "bevy_math", 620 | "bevy_pbr", 621 | "bevy_reflect", 622 | "bevy_render", 623 | "bevy_scene", 624 | "bevy_tasks", 625 | "bevy_transform", 626 | "bevy_utils", 627 | "gltf", 628 | "percent-encoding", 629 | "serde", 630 | "serde_json", 631 | "smallvec", 632 | "thiserror", 633 | ] 634 | 635 | [[package]] 636 | name = "bevy_hierarchy" 637 | version = "0.14.0" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "802eca6f341d19ade790ccfaba7044be4d823b708087eb5ac4c1f74e4ea0916a" 640 | dependencies = [ 641 | "bevy_app", 642 | "bevy_core", 643 | "bevy_ecs", 644 | "bevy_reflect", 645 | "bevy_utils", 646 | "smallvec", 647 | ] 648 | 649 | [[package]] 650 | name = "bevy_input" 651 | version = "0.14.0" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "2d050f1433f48ca23f1ea078734ebff119a3f76eb7d221725ab0f1fd9f81230b" 654 | dependencies = [ 655 | "bevy_app", 656 | "bevy_ecs", 657 | "bevy_math", 658 | "bevy_reflect", 659 | "bevy_utils", 660 | "smol_str", 661 | "thiserror", 662 | ] 663 | 664 | [[package]] 665 | name = "bevy_internal" 666 | version = "0.14.0" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "8ddd2b23e44d3a1f8ae547cbee5b6661f8135cc456c5de206e8648789944e7a1" 669 | dependencies = [ 670 | "bevy_a11y", 671 | "bevy_animation", 672 | "bevy_app", 673 | "bevy_asset", 674 | "bevy_audio", 675 | "bevy_color", 676 | "bevy_core", 677 | "bevy_core_pipeline", 678 | "bevy_derive", 679 | "bevy_diagnostic", 680 | "bevy_ecs", 681 | "bevy_gilrs", 682 | "bevy_gizmos", 683 | "bevy_gltf", 684 | "bevy_hierarchy", 685 | "bevy_input", 686 | "bevy_log", 687 | "bevy_math", 688 | "bevy_pbr", 689 | "bevy_ptr", 690 | "bevy_reflect", 691 | "bevy_render", 692 | "bevy_scene", 693 | "bevy_sprite", 694 | "bevy_state", 695 | "bevy_tasks", 696 | "bevy_text", 697 | "bevy_time", 698 | "bevy_transform", 699 | "bevy_ui", 700 | "bevy_utils", 701 | "bevy_window", 702 | "bevy_winit", 703 | ] 704 | 705 | [[package]] 706 | name = "bevy_log" 707 | version = "0.14.0" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "bab641fd0de254915ab746165a07677465b2d89b72f5b49367d73b9197548a35" 710 | dependencies = [ 711 | "android_log-sys", 712 | "bevy_app", 713 | "bevy_ecs", 714 | "bevy_utils", 715 | "tracing-log", 716 | "tracing-subscriber", 717 | "tracing-wasm", 718 | ] 719 | 720 | [[package]] 721 | name = "bevy_macro_utils" 722 | version = "0.14.0" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "c3ad860d35d74b35d4d6ae7f656d163b6f475aa2e64fc293ee86ac901977ddb7" 725 | dependencies = [ 726 | "proc-macro2", 727 | "quote", 728 | "syn 2.0.53", 729 | "toml_edit 0.22.14", 730 | ] 731 | 732 | [[package]] 733 | name = "bevy_math" 734 | version = "0.14.0" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "51bd6ce2174d3237d30e0ab5b2508480cc7593ca4d96ffb3a3095f9fc6bbc34c" 737 | dependencies = [ 738 | "bevy_reflect", 739 | "glam", 740 | "rand", 741 | "smallvec", 742 | "thiserror", 743 | ] 744 | 745 | [[package]] 746 | name = "bevy_mikktspace" 747 | version = "0.14.0" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "b7ce4266293629a2d10459cc112dffe3b3e9229a4f2b8a4d20061b8dd53316d0" 750 | dependencies = [ 751 | "glam", 752 | ] 753 | 754 | [[package]] 755 | name = "bevy_pbr" 756 | version = "0.14.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "3effe8ff28899f14d250d0649ca9868dbe68b389d0f2b7af086759b8e16c6e3d" 759 | dependencies = [ 760 | "bevy_app", 761 | "bevy_asset", 762 | "bevy_color", 763 | "bevy_core_pipeline", 764 | "bevy_derive", 765 | "bevy_ecs", 766 | "bevy_math", 767 | "bevy_reflect", 768 | "bevy_render", 769 | "bevy_transform", 770 | "bevy_utils", 771 | "bevy_window", 772 | "bitflags 2.5.0", 773 | "bytemuck", 774 | "fixedbitset 0.5.7", 775 | "nonmax", 776 | "radsort", 777 | "smallvec", 778 | "static_assertions", 779 | ] 780 | 781 | [[package]] 782 | name = "bevy_ptr" 783 | version = "0.14.0" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "c115c97a5c8a263bd0aa7001b999772c744ac5ba797d07c86f25734ce381ea69" 786 | 787 | [[package]] 788 | name = "bevy_reflect" 789 | version = "0.14.0" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "406ea0fce267169c2320c7302d97d09f605105686346762562c5f65960b5ca2f" 792 | dependencies = [ 793 | "bevy_ptr", 794 | "bevy_reflect_derive", 795 | "bevy_utils", 796 | "downcast-rs", 797 | "erased-serde", 798 | "glam", 799 | "petgraph", 800 | "serde", 801 | "smallvec", 802 | "smol_str", 803 | "thiserror", 804 | "uuid", 805 | ] 806 | 807 | [[package]] 808 | name = "bevy_reflect_derive" 809 | version = "0.14.0" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "0427fdb4425fc72cc96d45e550df83ace6347f0503840de116c76a40843ba751" 812 | dependencies = [ 813 | "bevy_macro_utils", 814 | "proc-macro2", 815 | "quote", 816 | "syn 2.0.53", 817 | "uuid", 818 | ] 819 | 820 | [[package]] 821 | name = "bevy_render" 822 | version = "0.14.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "4c48acf1ff4267c231def4cbf573248d42ac60c9952108822d505019460bf36d" 825 | dependencies = [ 826 | "async-channel", 827 | "bevy_app", 828 | "bevy_asset", 829 | "bevy_color", 830 | "bevy_core", 831 | "bevy_derive", 832 | "bevy_diagnostic", 833 | "bevy_ecs", 834 | "bevy_encase_derive", 835 | "bevy_hierarchy", 836 | "bevy_math", 837 | "bevy_mikktspace", 838 | "bevy_reflect", 839 | "bevy_render_macros", 840 | "bevy_tasks", 841 | "bevy_time", 842 | "bevy_transform", 843 | "bevy_utils", 844 | "bevy_window", 845 | "bitflags 2.5.0", 846 | "bytemuck", 847 | "codespan-reporting", 848 | "downcast-rs", 849 | "encase", 850 | "futures-lite", 851 | "hexasphere", 852 | "image", 853 | "js-sys", 854 | "ktx2", 855 | "naga", 856 | "naga_oil", 857 | "nonmax", 858 | "ruzstd", 859 | "send_wrapper", 860 | "serde", 861 | "smallvec", 862 | "thiserror", 863 | "wasm-bindgen", 864 | "web-sys", 865 | "wgpu", 866 | ] 867 | 868 | [[package]] 869 | name = "bevy_render_macros" 870 | version = "0.14.0" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "72ddf4a96d71519c8eca3d74dabcb89a9c0d50ab5d9230638cb004145f46e9ed" 873 | dependencies = [ 874 | "bevy_macro_utils", 875 | "proc-macro2", 876 | "quote", 877 | "syn 2.0.53", 878 | ] 879 | 880 | [[package]] 881 | name = "bevy_scene" 882 | version = "0.14.0" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "b7a9f0388612a116f02ab6187aeab66e52c9e91abbc21f919b8b50230c4d83e7" 885 | dependencies = [ 886 | "bevy_app", 887 | "bevy_asset", 888 | "bevy_derive", 889 | "bevy_ecs", 890 | "bevy_hierarchy", 891 | "bevy_reflect", 892 | "bevy_render", 893 | "bevy_transform", 894 | "bevy_utils", 895 | "serde", 896 | "thiserror", 897 | "uuid", 898 | ] 899 | 900 | [[package]] 901 | name = "bevy_sprite" 902 | version = "0.14.0" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "d837e33ed27b9f2e5212eca4bdd5655a9ee64c52914112e6189c043cb25dd1ec" 905 | dependencies = [ 906 | "bevy_app", 907 | "bevy_asset", 908 | "bevy_color", 909 | "bevy_core_pipeline", 910 | "bevy_derive", 911 | "bevy_ecs", 912 | "bevy_math", 913 | "bevy_reflect", 914 | "bevy_render", 915 | "bevy_transform", 916 | "bevy_utils", 917 | "bitflags 2.5.0", 918 | "bytemuck", 919 | "fixedbitset 0.5.7", 920 | "guillotiere", 921 | "radsort", 922 | "rectangle-pack", 923 | "thiserror", 924 | ] 925 | 926 | [[package]] 927 | name = "bevy_state" 928 | version = "0.14.0" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "0959984092d56885fd3b320ea84fb816821bad6bfa3040b9d4ee850d3273233d" 931 | dependencies = [ 932 | "bevy_app", 933 | "bevy_ecs", 934 | "bevy_hierarchy", 935 | "bevy_reflect", 936 | "bevy_state_macros", 937 | "bevy_utils", 938 | ] 939 | 940 | [[package]] 941 | name = "bevy_state_macros" 942 | version = "0.14.0" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "887a98bfa268258377cd073f5bb839518d3a1cd6b96ed81418145485b69378e6" 945 | dependencies = [ 946 | "bevy_macro_utils", 947 | "proc-macro2", 948 | "quote", 949 | "syn 2.0.53", 950 | ] 951 | 952 | [[package]] 953 | name = "bevy_tasks" 954 | version = "0.14.0" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "5a8bfb8d484bdb1e9bec3789c75202adc5e608c4244347152e50fb31668a54f9" 957 | dependencies = [ 958 | "async-channel", 959 | "async-executor", 960 | "concurrent-queue", 961 | "futures-lite", 962 | "wasm-bindgen-futures", 963 | ] 964 | 965 | [[package]] 966 | name = "bevy_text" 967 | version = "0.14.0" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "454fd29b7828244356b2e0ce782e6d0a6f26b47f521456accde3a7191b121727" 970 | dependencies = [ 971 | "ab_glyph", 972 | "bevy_app", 973 | "bevy_asset", 974 | "bevy_color", 975 | "bevy_ecs", 976 | "bevy_math", 977 | "bevy_reflect", 978 | "bevy_render", 979 | "bevy_sprite", 980 | "bevy_transform", 981 | "bevy_utils", 982 | "bevy_window", 983 | "glyph_brush_layout", 984 | "serde", 985 | "thiserror", 986 | ] 987 | 988 | [[package]] 989 | name = "bevy_text_mode" 990 | version = "0.4.0" 991 | dependencies = [ 992 | "bevy", 993 | "bevy_sprite", 994 | "bitflags 2.5.0", 995 | "bytemuck", 996 | "fixedbitset 0.4.2", 997 | ] 998 | 999 | [[package]] 1000 | name = "bevy_time" 1001 | version = "0.14.0" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "a6c3d3d14ee8b0dbe4819fd516cc75509b61946134d78e0ee89ad3d1835ffe6c" 1004 | dependencies = [ 1005 | "bevy_app", 1006 | "bevy_ecs", 1007 | "bevy_reflect", 1008 | "bevy_utils", 1009 | "crossbeam-channel", 1010 | "thiserror", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "bevy_transform" 1015 | version = "0.14.0" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "97e8aa6b16be573277c6ceda30aebf1d78af7c6ede19b448dcb052fb8601d815" 1018 | dependencies = [ 1019 | "bevy_app", 1020 | "bevy_ecs", 1021 | "bevy_hierarchy", 1022 | "bevy_math", 1023 | "bevy_reflect", 1024 | "thiserror", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "bevy_ui" 1029 | version = "0.14.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "38d9f864c646f3742ff77f67bcd89a13a7ab024b68ca2f1bfbab8245bcb1c06c" 1032 | dependencies = [ 1033 | "bevy_a11y", 1034 | "bevy_app", 1035 | "bevy_asset", 1036 | "bevy_color", 1037 | "bevy_core_pipeline", 1038 | "bevy_derive", 1039 | "bevy_ecs", 1040 | "bevy_hierarchy", 1041 | "bevy_input", 1042 | "bevy_math", 1043 | "bevy_reflect", 1044 | "bevy_render", 1045 | "bevy_sprite", 1046 | "bevy_text", 1047 | "bevy_transform", 1048 | "bevy_utils", 1049 | "bevy_window", 1050 | "bytemuck", 1051 | "nonmax", 1052 | "smallvec", 1053 | "taffy", 1054 | "thiserror", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "bevy_utils" 1059 | version = "0.14.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "7fab364910e8f5839578aba9cfda00a8388e9ebe352ceb8491a742ce6af9ec6e" 1062 | dependencies = [ 1063 | "ahash", 1064 | "bevy_utils_proc_macros", 1065 | "getrandom", 1066 | "hashbrown", 1067 | "thread_local", 1068 | "tracing", 1069 | "web-time", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "bevy_utils_proc_macros" 1074 | version = "0.14.0" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "ad9db261ab33a046e1f54b35f885a44f21fcc80aa2bc9050319466b88fe58fe3" 1077 | dependencies = [ 1078 | "proc-macro2", 1079 | "quote", 1080 | "syn 2.0.53", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "bevy_window" 1085 | version = "0.14.0" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "c9ea5777f933bf7ecaeb3af1a30845720ec730e007972ca7d4aba2d3512abe24" 1088 | dependencies = [ 1089 | "bevy_a11y", 1090 | "bevy_app", 1091 | "bevy_ecs", 1092 | "bevy_math", 1093 | "bevy_reflect", 1094 | "bevy_utils", 1095 | "raw-window-handle", 1096 | "smol_str", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "bevy_winit" 1101 | version = "0.14.0" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "f8c2213bbf14debe819ec8ad4913f233c596002d087bc6f1f20d533e2ebaf8c6" 1104 | dependencies = [ 1105 | "accesskit_winit", 1106 | "approx", 1107 | "bevy_a11y", 1108 | "bevy_app", 1109 | "bevy_derive", 1110 | "bevy_ecs", 1111 | "bevy_hierarchy", 1112 | "bevy_input", 1113 | "bevy_log", 1114 | "bevy_math", 1115 | "bevy_reflect", 1116 | "bevy_tasks", 1117 | "bevy_utils", 1118 | "bevy_window", 1119 | "cfg-if", 1120 | "crossbeam-channel", 1121 | "raw-window-handle", 1122 | "wasm-bindgen", 1123 | "web-sys", 1124 | "winit", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "bindgen" 1129 | version = "0.69.4" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" 1132 | dependencies = [ 1133 | "bitflags 2.5.0", 1134 | "cexpr", 1135 | "clang-sys", 1136 | "itertools", 1137 | "lazy_static", 1138 | "lazycell", 1139 | "proc-macro2", 1140 | "quote", 1141 | "regex", 1142 | "rustc-hash", 1143 | "shlex", 1144 | "syn 2.0.53", 1145 | ] 1146 | 1147 | [[package]] 1148 | name = "bit-set" 1149 | version = "0.5.3" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 1152 | dependencies = [ 1153 | "bit-vec", 1154 | ] 1155 | 1156 | [[package]] 1157 | name = "bit-vec" 1158 | version = "0.6.3" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 1161 | 1162 | [[package]] 1163 | name = "bitflags" 1164 | version = "1.3.2" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 1167 | 1168 | [[package]] 1169 | name = "bitflags" 1170 | version = "2.5.0" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 1173 | dependencies = [ 1174 | "serde", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "blake3" 1179 | version = "1.5.1" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" 1182 | dependencies = [ 1183 | "arrayref", 1184 | "arrayvec", 1185 | "cc", 1186 | "cfg-if", 1187 | "constant_time_eq", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "block" 1192 | version = "0.1.6" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 1195 | 1196 | [[package]] 1197 | name = "block2" 1198 | version = "0.5.1" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 1201 | dependencies = [ 1202 | "objc2", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "blocking" 1207 | version = "1.5.1" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" 1210 | dependencies = [ 1211 | "async-channel", 1212 | "async-lock", 1213 | "async-task", 1214 | "fastrand", 1215 | "futures-io", 1216 | "futures-lite", 1217 | "piper", 1218 | "tracing", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "bumpalo" 1223 | version = "3.15.4" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" 1226 | 1227 | [[package]] 1228 | name = "bytemuck" 1229 | version = "1.15.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" 1232 | dependencies = [ 1233 | "bytemuck_derive", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "bytemuck_derive" 1238 | version = "1.6.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" 1241 | dependencies = [ 1242 | "proc-macro2", 1243 | "quote", 1244 | "syn 2.0.53", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "byteorder" 1249 | version = "1.5.0" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 1252 | 1253 | [[package]] 1254 | name = "bytes" 1255 | version = "1.5.0" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 1258 | 1259 | [[package]] 1260 | name = "calloop" 1261 | version = "0.12.4" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" 1264 | dependencies = [ 1265 | "bitflags 2.5.0", 1266 | "log", 1267 | "polling", 1268 | "rustix", 1269 | "slab", 1270 | "thiserror", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "cc" 1275 | version = "1.0.90" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" 1278 | dependencies = [ 1279 | "jobserver", 1280 | "libc", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "cesu8" 1285 | version = "1.1.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 1288 | 1289 | [[package]] 1290 | name = "cexpr" 1291 | version = "0.6.0" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 1294 | dependencies = [ 1295 | "nom", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "cfg-if" 1300 | version = "1.0.0" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 1303 | 1304 | [[package]] 1305 | name = "cfg_aliases" 1306 | version = "0.1.1" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 1309 | 1310 | [[package]] 1311 | name = "cfg_aliases" 1312 | version = "0.2.1" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 1315 | 1316 | [[package]] 1317 | name = "clang-sys" 1318 | version = "1.7.0" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" 1321 | dependencies = [ 1322 | "glob", 1323 | "libc", 1324 | "libloading 0.8.3", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "codespan-reporting" 1329 | version = "0.11.1" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 1332 | dependencies = [ 1333 | "termcolor", 1334 | "unicode-width", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "com" 1339 | version = "0.6.0" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" 1342 | dependencies = [ 1343 | "com_macros", 1344 | ] 1345 | 1346 | [[package]] 1347 | name = "com_macros" 1348 | version = "0.6.0" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" 1351 | dependencies = [ 1352 | "com_macros_support", 1353 | "proc-macro2", 1354 | "syn 1.0.109", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "com_macros_support" 1359 | version = "0.6.0" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" 1362 | dependencies = [ 1363 | "proc-macro2", 1364 | "quote", 1365 | "syn 1.0.109", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "combine" 1370 | version = "4.6.6" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 1373 | dependencies = [ 1374 | "bytes", 1375 | "memchr", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "concurrent-queue" 1380 | version = "2.4.0" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" 1383 | dependencies = [ 1384 | "crossbeam-utils", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "console_error_panic_hook" 1389 | version = "0.1.7" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 1392 | dependencies = [ 1393 | "cfg-if", 1394 | "wasm-bindgen", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "const-fnv1a-hash" 1399 | version = "1.1.0" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" 1402 | 1403 | [[package]] 1404 | name = "const_panic" 1405 | version = "0.2.8" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" 1408 | 1409 | [[package]] 1410 | name = "const_soft_float" 1411 | version = "0.1.4" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" 1414 | 1415 | [[package]] 1416 | name = "constant_time_eq" 1417 | version = "0.3.0" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" 1420 | 1421 | [[package]] 1422 | name = "constgebra" 1423 | version = "0.1.4" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" 1426 | dependencies = [ 1427 | "const_soft_float", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "core-foundation" 1432 | version = "0.9.4" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 1435 | dependencies = [ 1436 | "core-foundation-sys", 1437 | "libc", 1438 | ] 1439 | 1440 | [[package]] 1441 | name = "core-foundation-sys" 1442 | version = "0.8.6" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 1445 | 1446 | [[package]] 1447 | name = "core-graphics" 1448 | version = "0.23.1" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" 1451 | dependencies = [ 1452 | "bitflags 1.3.2", 1453 | "core-foundation", 1454 | "core-graphics-types", 1455 | "foreign-types", 1456 | "libc", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "core-graphics-types" 1461 | version = "0.1.3" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 1464 | dependencies = [ 1465 | "bitflags 1.3.2", 1466 | "core-foundation", 1467 | "libc", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "coreaudio-rs" 1472 | version = "0.11.3" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 1475 | dependencies = [ 1476 | "bitflags 1.3.2", 1477 | "core-foundation-sys", 1478 | "coreaudio-sys", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "coreaudio-sys" 1483 | version = "0.2.15" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" 1486 | dependencies = [ 1487 | "bindgen", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "cpal" 1492 | version = "0.15.3" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 1495 | dependencies = [ 1496 | "alsa", 1497 | "core-foundation-sys", 1498 | "coreaudio-rs", 1499 | "dasp_sample", 1500 | "jni", 1501 | "js-sys", 1502 | "libc", 1503 | "mach2", 1504 | "ndk 0.8.0", 1505 | "ndk-context", 1506 | "oboe", 1507 | "wasm-bindgen", 1508 | "wasm-bindgen-futures", 1509 | "web-sys", 1510 | "windows 0.54.0", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "crc32fast" 1515 | version = "1.4.0" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 1518 | dependencies = [ 1519 | "cfg-if", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "crossbeam-channel" 1524 | version = "0.5.12" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" 1527 | dependencies = [ 1528 | "crossbeam-utils", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "crossbeam-utils" 1533 | version = "0.8.19" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 1536 | 1537 | [[package]] 1538 | name = "cursor-icon" 1539 | version = "1.1.0" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 1542 | 1543 | [[package]] 1544 | name = "d3d12" 1545 | version = "0.20.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "b28bfe653d79bd16c77f659305b195b82bb5ce0c0eb2a4846b82ddbd77586813" 1548 | dependencies = [ 1549 | "bitflags 2.5.0", 1550 | "libloading 0.8.3", 1551 | "winapi", 1552 | ] 1553 | 1554 | [[package]] 1555 | name = "dasp_sample" 1556 | version = "0.11.0" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 1559 | 1560 | [[package]] 1561 | name = "data-encoding" 1562 | version = "2.5.0" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" 1565 | 1566 | [[package]] 1567 | name = "dispatch" 1568 | version = "0.2.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 1571 | 1572 | [[package]] 1573 | name = "dlib" 1574 | version = "0.5.2" 1575 | source = "registry+https://github.com/rust-lang/crates.io-index" 1576 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 1577 | dependencies = [ 1578 | "libloading 0.8.3", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "document-features" 1583 | version = "0.2.8" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" 1586 | dependencies = [ 1587 | "litrs", 1588 | ] 1589 | 1590 | [[package]] 1591 | name = "downcast-rs" 1592 | version = "1.2.0" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" 1595 | 1596 | [[package]] 1597 | name = "dpi" 1598 | version = "0.1.1" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" 1601 | 1602 | [[package]] 1603 | name = "either" 1604 | version = "1.10.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" 1607 | 1608 | [[package]] 1609 | name = "encase" 1610 | version = "0.8.0" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "5a9299a95fa5671ddf29ecc22b00e121843a65cb9ff24911e394b4ae556baf36" 1613 | dependencies = [ 1614 | "const_panic", 1615 | "encase_derive", 1616 | "glam", 1617 | "thiserror", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "encase_derive" 1622 | version = "0.8.0" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "07e09decb3beb1fe2db6940f598957b2e1f7df6206a804d438ff6cb2a9cddc10" 1625 | dependencies = [ 1626 | "encase_derive_impl", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "encase_derive_impl" 1631 | version = "0.8.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "fd31dbbd9743684d339f907a87fe212cb7b51d75b9e8e74181fe363199ee9b47" 1634 | dependencies = [ 1635 | "proc-macro2", 1636 | "quote", 1637 | "syn 2.0.53", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "equivalent" 1642 | version = "1.0.1" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1645 | 1646 | [[package]] 1647 | name = "erased-serde" 1648 | version = "0.4.4" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" 1651 | dependencies = [ 1652 | "serde", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "errno" 1657 | version = "0.3.8" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 1660 | dependencies = [ 1661 | "libc", 1662 | "windows-sys 0.52.0", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "euclid" 1667 | version = "0.22.9" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" 1670 | dependencies = [ 1671 | "num-traits", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "event-listener" 1676 | version = "2.5.3" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 1679 | 1680 | [[package]] 1681 | name = "event-listener" 1682 | version = "4.0.3" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" 1685 | dependencies = [ 1686 | "concurrent-queue", 1687 | "parking", 1688 | "pin-project-lite", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "event-listener" 1693 | version = "5.2.0" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" 1696 | dependencies = [ 1697 | "concurrent-queue", 1698 | "parking", 1699 | "pin-project-lite", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "event-listener-strategy" 1704 | version = "0.4.0" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" 1707 | dependencies = [ 1708 | "event-listener 4.0.3", 1709 | "pin-project-lite", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "event-listener-strategy" 1714 | version = "0.5.0" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" 1717 | dependencies = [ 1718 | "event-listener 5.2.0", 1719 | "pin-project-lite", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "fastrand" 1724 | version = "2.0.1" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 1727 | 1728 | [[package]] 1729 | name = "fdeflate" 1730 | version = "0.3.4" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" 1733 | dependencies = [ 1734 | "simd-adler32", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "fixedbitset" 1739 | version = "0.4.2" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 1742 | 1743 | [[package]] 1744 | name = "fixedbitset" 1745 | version = "0.5.7" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 1748 | 1749 | [[package]] 1750 | name = "flate2" 1751 | version = "1.0.28" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" 1754 | dependencies = [ 1755 | "crc32fast", 1756 | "miniz_oxide", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "fnv" 1761 | version = "1.0.7" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1764 | 1765 | [[package]] 1766 | name = "foreign-types" 1767 | version = "0.5.0" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1770 | dependencies = [ 1771 | "foreign-types-macros", 1772 | "foreign-types-shared", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "foreign-types-macros" 1777 | version = "0.2.3" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1780 | dependencies = [ 1781 | "proc-macro2", 1782 | "quote", 1783 | "syn 2.0.53", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "foreign-types-shared" 1788 | version = "0.3.1" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1791 | 1792 | [[package]] 1793 | name = "futures-core" 1794 | version = "0.3.30" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 1797 | 1798 | [[package]] 1799 | name = "futures-io" 1800 | version = "0.3.30" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 1803 | 1804 | [[package]] 1805 | name = "futures-lite" 1806 | version = "2.3.0" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" 1809 | dependencies = [ 1810 | "fastrand", 1811 | "futures-core", 1812 | "futures-io", 1813 | "parking", 1814 | "pin-project-lite", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "gethostname" 1819 | version = "0.4.3" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 1822 | dependencies = [ 1823 | "libc", 1824 | "windows-targets 0.48.5", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "getrandom" 1829 | version = "0.2.12" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 1832 | dependencies = [ 1833 | "cfg-if", 1834 | "js-sys", 1835 | "libc", 1836 | "wasi", 1837 | "wasm-bindgen", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "gilrs" 1842 | version = "0.10.6" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "499067aa54af19f88732dc418f61f23d5912de1518665bb0eca034ca0d07574c" 1845 | dependencies = [ 1846 | "fnv", 1847 | "gilrs-core", 1848 | "log", 1849 | "uuid", 1850 | "vec_map", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "gilrs-core" 1855 | version = "0.5.11" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "85c132270a155f2548e67d66e731075c336c39098afc555752f3df8f882c720e" 1858 | dependencies = [ 1859 | "core-foundation", 1860 | "inotify", 1861 | "io-kit-sys", 1862 | "js-sys", 1863 | "libc", 1864 | "libudev-sys", 1865 | "log", 1866 | "nix", 1867 | "uuid", 1868 | "vec_map", 1869 | "wasm-bindgen", 1870 | "web-sys", 1871 | "windows 0.54.0", 1872 | ] 1873 | 1874 | [[package]] 1875 | name = "gl_generator" 1876 | version = "0.14.0" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 1879 | dependencies = [ 1880 | "khronos_api", 1881 | "log", 1882 | "xml-rs", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "glam" 1887 | version = "0.27.0" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" 1890 | dependencies = [ 1891 | "bytemuck", 1892 | "rand", 1893 | "serde", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "glob" 1898 | version = "0.3.1" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 1901 | 1902 | [[package]] 1903 | name = "glow" 1904 | version = "0.13.1" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" 1907 | dependencies = [ 1908 | "js-sys", 1909 | "slotmap", 1910 | "wasm-bindgen", 1911 | "web-sys", 1912 | ] 1913 | 1914 | [[package]] 1915 | name = "gltf" 1916 | version = "1.4.0" 1917 | source = "registry+https://github.com/rust-lang/crates.io-index" 1918 | checksum = "3b78f069cf941075835822953c345b9e1edd67ae347b81ace3aea9de38c2ef33" 1919 | dependencies = [ 1920 | "byteorder", 1921 | "gltf-json", 1922 | "lazy_static", 1923 | "serde_json", 1924 | ] 1925 | 1926 | [[package]] 1927 | name = "gltf-derive" 1928 | version = "1.4.0" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "438ffe1a5540d75403feaf23636b164e816e93f6f03131674722b3886ce32a57" 1931 | dependencies = [ 1932 | "inflections", 1933 | "proc-macro2", 1934 | "quote", 1935 | "syn 2.0.53", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "gltf-json" 1940 | version = "1.4.0" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "655951ba557f2bc69ea4b0799446bae281fa78efae6319968bdd2c3e9a06d8e1" 1943 | dependencies = [ 1944 | "gltf-derive", 1945 | "serde", 1946 | "serde_derive", 1947 | "serde_json", 1948 | ] 1949 | 1950 | [[package]] 1951 | name = "glutin_wgl_sys" 1952 | version = "0.5.0" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" 1955 | dependencies = [ 1956 | "gl_generator", 1957 | ] 1958 | 1959 | [[package]] 1960 | name = "glyph_brush_layout" 1961 | version = "0.2.3" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" 1964 | dependencies = [ 1965 | "ab_glyph", 1966 | "approx", 1967 | "xi-unicode", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "gpu-alloc" 1972 | version = "0.6.0" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 1975 | dependencies = [ 1976 | "bitflags 2.5.0", 1977 | "gpu-alloc-types", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "gpu-alloc-types" 1982 | version = "0.3.0" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 1985 | dependencies = [ 1986 | "bitflags 2.5.0", 1987 | ] 1988 | 1989 | [[package]] 1990 | name = "gpu-allocator" 1991 | version = "0.25.0" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" 1994 | dependencies = [ 1995 | "log", 1996 | "presser", 1997 | "thiserror", 1998 | "winapi", 1999 | "windows 0.52.0", 2000 | ] 2001 | 2002 | [[package]] 2003 | name = "gpu-descriptor" 2004 | version = "0.3.0" 2005 | source = "registry+https://github.com/rust-lang/crates.io-index" 2006 | checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" 2007 | dependencies = [ 2008 | "bitflags 2.5.0", 2009 | "gpu-descriptor-types", 2010 | "hashbrown", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "gpu-descriptor-types" 2015 | version = "0.2.0" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 2018 | dependencies = [ 2019 | "bitflags 2.5.0", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "grid" 2024 | version = "0.14.0" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "be136d9dacc2a13cc70bb6c8f902b414fb2641f8db1314637c6b7933411a8f82" 2027 | 2028 | [[package]] 2029 | name = "guillotiere" 2030 | version = "0.6.2" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" 2033 | dependencies = [ 2034 | "euclid", 2035 | "svg_fmt", 2036 | ] 2037 | 2038 | [[package]] 2039 | name = "hashbrown" 2040 | version = "0.14.3" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 2043 | dependencies = [ 2044 | "ahash", 2045 | "allocator-api2", 2046 | "serde", 2047 | ] 2048 | 2049 | [[package]] 2050 | name = "hassle-rs" 2051 | version = "0.11.0" 2052 | source = "registry+https://github.com/rust-lang/crates.io-index" 2053 | checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" 2054 | dependencies = [ 2055 | "bitflags 2.5.0", 2056 | "com", 2057 | "libc", 2058 | "libloading 0.8.3", 2059 | "thiserror", 2060 | "widestring", 2061 | "winapi", 2062 | ] 2063 | 2064 | [[package]] 2065 | name = "hexasphere" 2066 | version = "12.0.0" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | checksum = "edd6b038160f086b0a7496edae34169ae22f328793cbe2b627a5a3d8373748ec" 2069 | dependencies = [ 2070 | "constgebra", 2071 | "glam", 2072 | ] 2073 | 2074 | [[package]] 2075 | name = "hexf-parse" 2076 | version = "0.2.1" 2077 | source = "registry+https://github.com/rust-lang/crates.io-index" 2078 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 2079 | 2080 | [[package]] 2081 | name = "image" 2082 | version = "0.25.1" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" 2085 | dependencies = [ 2086 | "bytemuck", 2087 | "byteorder", 2088 | "num-traits", 2089 | "png", 2090 | ] 2091 | 2092 | [[package]] 2093 | name = "immutable-chunkmap" 2094 | version = "2.0.5" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "4419f022e55cc63d5bbd6b44b71e1d226b9c9480a47824c706e9d54e5c40c5eb" 2097 | dependencies = [ 2098 | "arrayvec", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "indexmap" 2103 | version = "2.2.5" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" 2106 | dependencies = [ 2107 | "equivalent", 2108 | "hashbrown", 2109 | ] 2110 | 2111 | [[package]] 2112 | name = "inflections" 2113 | version = "1.1.1" 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" 2115 | checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" 2116 | 2117 | [[package]] 2118 | name = "inotify" 2119 | version = "0.10.2" 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" 2121 | checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" 2122 | dependencies = [ 2123 | "bitflags 1.3.2", 2124 | "inotify-sys", 2125 | "libc", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "inotify-sys" 2130 | version = "0.1.5" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 2133 | dependencies = [ 2134 | "libc", 2135 | ] 2136 | 2137 | [[package]] 2138 | name = "io-kit-sys" 2139 | version = "0.4.1" 2140 | source = "registry+https://github.com/rust-lang/crates.io-index" 2141 | checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" 2142 | dependencies = [ 2143 | "core-foundation-sys", 2144 | "mach2", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "itertools" 2149 | version = "0.12.1" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 2152 | dependencies = [ 2153 | "either", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "itoa" 2158 | version = "1.0.10" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 2161 | 2162 | [[package]] 2163 | name = "jni" 2164 | version = "0.21.1" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 2167 | dependencies = [ 2168 | "cesu8", 2169 | "cfg-if", 2170 | "combine", 2171 | "jni-sys", 2172 | "log", 2173 | "thiserror", 2174 | "walkdir", 2175 | "windows-sys 0.45.0", 2176 | ] 2177 | 2178 | [[package]] 2179 | name = "jni-sys" 2180 | version = "0.3.0" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 2183 | 2184 | [[package]] 2185 | name = "jobserver" 2186 | version = "0.1.28" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" 2189 | dependencies = [ 2190 | "libc", 2191 | ] 2192 | 2193 | [[package]] 2194 | name = "js-sys" 2195 | version = "0.3.69" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 2198 | dependencies = [ 2199 | "wasm-bindgen", 2200 | ] 2201 | 2202 | [[package]] 2203 | name = "khronos-egl" 2204 | version = "6.0.0" 2205 | source = "registry+https://github.com/rust-lang/crates.io-index" 2206 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 2207 | dependencies = [ 2208 | "libc", 2209 | "libloading 0.8.3", 2210 | "pkg-config", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "khronos_api" 2215 | version = "3.1.0" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 2218 | 2219 | [[package]] 2220 | name = "ktx2" 2221 | version = "0.3.0" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" 2224 | dependencies = [ 2225 | "bitflags 1.3.2", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "lazy_static" 2230 | version = "1.4.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 2233 | 2234 | [[package]] 2235 | name = "lazycell" 2236 | version = "1.3.0" 2237 | source = "registry+https://github.com/rust-lang/crates.io-index" 2238 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 2239 | 2240 | [[package]] 2241 | name = "lewton" 2242 | version = "0.10.2" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 2245 | dependencies = [ 2246 | "byteorder", 2247 | "ogg", 2248 | "tinyvec", 2249 | ] 2250 | 2251 | [[package]] 2252 | name = "libc" 2253 | version = "0.2.153" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 2256 | 2257 | [[package]] 2258 | name = "libloading" 2259 | version = "0.7.4" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" 2262 | dependencies = [ 2263 | "cfg-if", 2264 | "winapi", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "libloading" 2269 | version = "0.8.3" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" 2272 | dependencies = [ 2273 | "cfg-if", 2274 | "windows-targets 0.52.4", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "libredox" 2279 | version = "0.0.2" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" 2282 | dependencies = [ 2283 | "bitflags 2.5.0", 2284 | "libc", 2285 | "redox_syscall", 2286 | ] 2287 | 2288 | [[package]] 2289 | name = "libudev-sys" 2290 | version = "0.1.4" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" 2293 | dependencies = [ 2294 | "libc", 2295 | "pkg-config", 2296 | ] 2297 | 2298 | [[package]] 2299 | name = "linux-raw-sys" 2300 | version = "0.4.13" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 2303 | 2304 | [[package]] 2305 | name = "litrs" 2306 | version = "0.4.1" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 2309 | 2310 | [[package]] 2311 | name = "lock_api" 2312 | version = "0.4.11" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 2315 | dependencies = [ 2316 | "autocfg", 2317 | "scopeguard", 2318 | ] 2319 | 2320 | [[package]] 2321 | name = "log" 2322 | version = "0.4.21" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 2325 | 2326 | [[package]] 2327 | name = "mach2" 2328 | version = "0.4.2" 2329 | source = "registry+https://github.com/rust-lang/crates.io-index" 2330 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 2331 | dependencies = [ 2332 | "libc", 2333 | ] 2334 | 2335 | [[package]] 2336 | name = "malloc_buf" 2337 | version = "0.0.6" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 2340 | dependencies = [ 2341 | "libc", 2342 | ] 2343 | 2344 | [[package]] 2345 | name = "matchers" 2346 | version = "0.1.0" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 2349 | dependencies = [ 2350 | "regex-automata 0.1.10", 2351 | ] 2352 | 2353 | [[package]] 2354 | name = "memchr" 2355 | version = "2.7.1" 2356 | source = "registry+https://github.com/rust-lang/crates.io-index" 2357 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 2358 | 2359 | [[package]] 2360 | name = "metal" 2361 | version = "0.28.0" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "5637e166ea14be6063a3f8ba5ccb9a4159df7d8f6d61c02fc3d480b1f90dcfcb" 2364 | dependencies = [ 2365 | "bitflags 2.5.0", 2366 | "block", 2367 | "core-graphics-types", 2368 | "foreign-types", 2369 | "log", 2370 | "objc", 2371 | "paste", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "minimal-lexical" 2376 | version = "0.2.1" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2379 | 2380 | [[package]] 2381 | name = "miniz_oxide" 2382 | version = "0.7.2" 2383 | source = "registry+https://github.com/rust-lang/crates.io-index" 2384 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 2385 | dependencies = [ 2386 | "adler", 2387 | "simd-adler32", 2388 | ] 2389 | 2390 | [[package]] 2391 | name = "naga" 2392 | version = "0.20.0" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "e536ae46fcab0876853bd4a632ede5df4b1c2527a58f6c5a4150fe86be858231" 2395 | dependencies = [ 2396 | "arrayvec", 2397 | "bit-set", 2398 | "bitflags 2.5.0", 2399 | "codespan-reporting", 2400 | "hexf-parse", 2401 | "indexmap", 2402 | "log", 2403 | "num-traits", 2404 | "pp-rs", 2405 | "rustc-hash", 2406 | "spirv", 2407 | "termcolor", 2408 | "thiserror", 2409 | "unicode-xid", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "naga_oil" 2414 | version = "0.14.0" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "275d9720a7338eedac966141089232514c84d76a246a58ef501af88c5edf402f" 2417 | dependencies = [ 2418 | "bit-set", 2419 | "codespan-reporting", 2420 | "data-encoding", 2421 | "indexmap", 2422 | "naga", 2423 | "once_cell", 2424 | "regex", 2425 | "regex-syntax 0.8.2", 2426 | "rustc-hash", 2427 | "thiserror", 2428 | "tracing", 2429 | "unicode-ident", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "ndk" 2434 | version = "0.8.0" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 2437 | dependencies = [ 2438 | "bitflags 2.5.0", 2439 | "jni-sys", 2440 | "log", 2441 | "ndk-sys 0.5.0+25.2.9519653", 2442 | "num_enum", 2443 | "thiserror", 2444 | ] 2445 | 2446 | [[package]] 2447 | name = "ndk" 2448 | version = "0.9.0" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2451 | dependencies = [ 2452 | "bitflags 2.5.0", 2453 | "jni-sys", 2454 | "log", 2455 | "ndk-sys 0.6.0+11769913", 2456 | "num_enum", 2457 | "raw-window-handle", 2458 | "thiserror", 2459 | ] 2460 | 2461 | [[package]] 2462 | name = "ndk-context" 2463 | version = "0.1.1" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 2466 | 2467 | [[package]] 2468 | name = "ndk-sys" 2469 | version = "0.5.0+25.2.9519653" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 2472 | dependencies = [ 2473 | "jni-sys", 2474 | ] 2475 | 2476 | [[package]] 2477 | name = "ndk-sys" 2478 | version = "0.6.0+11769913" 2479 | source = "registry+https://github.com/rust-lang/crates.io-index" 2480 | checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 2481 | dependencies = [ 2482 | "jni-sys", 2483 | ] 2484 | 2485 | [[package]] 2486 | name = "nix" 2487 | version = "0.28.0" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" 2490 | dependencies = [ 2491 | "bitflags 2.5.0", 2492 | "cfg-if", 2493 | "cfg_aliases 0.1.1", 2494 | "libc", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "nom" 2499 | version = "7.1.3" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2502 | dependencies = [ 2503 | "memchr", 2504 | "minimal-lexical", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "nonmax" 2509 | version = "0.5.5" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" 2512 | 2513 | [[package]] 2514 | name = "ntapi" 2515 | version = "0.4.1" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 2518 | dependencies = [ 2519 | "winapi", 2520 | ] 2521 | 2522 | [[package]] 2523 | name = "nu-ansi-term" 2524 | version = "0.46.0" 2525 | source = "registry+https://github.com/rust-lang/crates.io-index" 2526 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 2527 | dependencies = [ 2528 | "overload", 2529 | "winapi", 2530 | ] 2531 | 2532 | [[package]] 2533 | name = "num-derive" 2534 | version = "0.4.2" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 2537 | dependencies = [ 2538 | "proc-macro2", 2539 | "quote", 2540 | "syn 2.0.53", 2541 | ] 2542 | 2543 | [[package]] 2544 | name = "num-traits" 2545 | version = "0.2.18" 2546 | source = "registry+https://github.com/rust-lang/crates.io-index" 2547 | checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 2548 | dependencies = [ 2549 | "autocfg", 2550 | ] 2551 | 2552 | [[package]] 2553 | name = "num_enum" 2554 | version = "0.7.2" 2555 | source = "registry+https://github.com/rust-lang/crates.io-index" 2556 | checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" 2557 | dependencies = [ 2558 | "num_enum_derive", 2559 | ] 2560 | 2561 | [[package]] 2562 | name = "num_enum_derive" 2563 | version = "0.7.2" 2564 | source = "registry+https://github.com/rust-lang/crates.io-index" 2565 | checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" 2566 | dependencies = [ 2567 | "proc-macro-crate", 2568 | "proc-macro2", 2569 | "quote", 2570 | "syn 2.0.53", 2571 | ] 2572 | 2573 | [[package]] 2574 | name = "objc" 2575 | version = "0.2.7" 2576 | source = "registry+https://github.com/rust-lang/crates.io-index" 2577 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 2578 | dependencies = [ 2579 | "malloc_buf", 2580 | ] 2581 | 2582 | [[package]] 2583 | name = "objc-sys" 2584 | version = "0.3.5" 2585 | source = "registry+https://github.com/rust-lang/crates.io-index" 2586 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 2587 | 2588 | [[package]] 2589 | name = "objc2" 2590 | version = "0.5.2" 2591 | source = "registry+https://github.com/rust-lang/crates.io-index" 2592 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 2593 | dependencies = [ 2594 | "objc-sys", 2595 | "objc2-encode", 2596 | ] 2597 | 2598 | [[package]] 2599 | name = "objc2-app-kit" 2600 | version = "0.2.2" 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" 2602 | checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 2603 | dependencies = [ 2604 | "bitflags 2.5.0", 2605 | "block2", 2606 | "libc", 2607 | "objc2", 2608 | "objc2-core-data", 2609 | "objc2-core-image", 2610 | "objc2-foundation", 2611 | "objc2-quartz-core", 2612 | ] 2613 | 2614 | [[package]] 2615 | name = "objc2-cloud-kit" 2616 | version = "0.2.2" 2617 | source = "registry+https://github.com/rust-lang/crates.io-index" 2618 | checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 2619 | dependencies = [ 2620 | "bitflags 2.5.0", 2621 | "block2", 2622 | "objc2", 2623 | "objc2-core-location", 2624 | "objc2-foundation", 2625 | ] 2626 | 2627 | [[package]] 2628 | name = "objc2-contacts" 2629 | version = "0.2.2" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 2632 | dependencies = [ 2633 | "block2", 2634 | "objc2", 2635 | "objc2-foundation", 2636 | ] 2637 | 2638 | [[package]] 2639 | name = "objc2-core-data" 2640 | version = "0.2.2" 2641 | source = "registry+https://github.com/rust-lang/crates.io-index" 2642 | checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 2643 | dependencies = [ 2644 | "bitflags 2.5.0", 2645 | "block2", 2646 | "objc2", 2647 | "objc2-foundation", 2648 | ] 2649 | 2650 | [[package]] 2651 | name = "objc2-core-image" 2652 | version = "0.2.2" 2653 | source = "registry+https://github.com/rust-lang/crates.io-index" 2654 | checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 2655 | dependencies = [ 2656 | "block2", 2657 | "objc2", 2658 | "objc2-foundation", 2659 | "objc2-metal", 2660 | ] 2661 | 2662 | [[package]] 2663 | name = "objc2-core-location" 2664 | version = "0.2.2" 2665 | source = "registry+https://github.com/rust-lang/crates.io-index" 2666 | checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 2667 | dependencies = [ 2668 | "block2", 2669 | "objc2", 2670 | "objc2-contacts", 2671 | "objc2-foundation", 2672 | ] 2673 | 2674 | [[package]] 2675 | name = "objc2-encode" 2676 | version = "4.0.3" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" 2679 | 2680 | [[package]] 2681 | name = "objc2-foundation" 2682 | version = "0.2.2" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2685 | dependencies = [ 2686 | "bitflags 2.5.0", 2687 | "block2", 2688 | "dispatch", 2689 | "libc", 2690 | "objc2", 2691 | ] 2692 | 2693 | [[package]] 2694 | name = "objc2-link-presentation" 2695 | version = "0.2.2" 2696 | source = "registry+https://github.com/rust-lang/crates.io-index" 2697 | checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 2698 | dependencies = [ 2699 | "block2", 2700 | "objc2", 2701 | "objc2-app-kit", 2702 | "objc2-foundation", 2703 | ] 2704 | 2705 | [[package]] 2706 | name = "objc2-metal" 2707 | version = "0.2.2" 2708 | source = "registry+https://github.com/rust-lang/crates.io-index" 2709 | checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2710 | dependencies = [ 2711 | "bitflags 2.5.0", 2712 | "block2", 2713 | "objc2", 2714 | "objc2-foundation", 2715 | ] 2716 | 2717 | [[package]] 2718 | name = "objc2-quartz-core" 2719 | version = "0.2.2" 2720 | source = "registry+https://github.com/rust-lang/crates.io-index" 2721 | checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2722 | dependencies = [ 2723 | "bitflags 2.5.0", 2724 | "block2", 2725 | "objc2", 2726 | "objc2-foundation", 2727 | "objc2-metal", 2728 | ] 2729 | 2730 | [[package]] 2731 | name = "objc2-symbols" 2732 | version = "0.2.2" 2733 | source = "registry+https://github.com/rust-lang/crates.io-index" 2734 | checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 2735 | dependencies = [ 2736 | "objc2", 2737 | "objc2-foundation", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "objc2-ui-kit" 2742 | version = "0.2.2" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 2745 | dependencies = [ 2746 | "bitflags 2.5.0", 2747 | "block2", 2748 | "objc2", 2749 | "objc2-cloud-kit", 2750 | "objc2-core-data", 2751 | "objc2-core-image", 2752 | "objc2-core-location", 2753 | "objc2-foundation", 2754 | "objc2-link-presentation", 2755 | "objc2-quartz-core", 2756 | "objc2-symbols", 2757 | "objc2-uniform-type-identifiers", 2758 | "objc2-user-notifications", 2759 | ] 2760 | 2761 | [[package]] 2762 | name = "objc2-uniform-type-identifiers" 2763 | version = "0.2.2" 2764 | source = "registry+https://github.com/rust-lang/crates.io-index" 2765 | checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 2766 | dependencies = [ 2767 | "block2", 2768 | "objc2", 2769 | "objc2-foundation", 2770 | ] 2771 | 2772 | [[package]] 2773 | name = "objc2-user-notifications" 2774 | version = "0.2.2" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 2777 | dependencies = [ 2778 | "bitflags 2.5.0", 2779 | "block2", 2780 | "objc2", 2781 | "objc2-core-location", 2782 | "objc2-foundation", 2783 | ] 2784 | 2785 | [[package]] 2786 | name = "oboe" 2787 | version = "0.6.1" 2788 | source = "registry+https://github.com/rust-lang/crates.io-index" 2789 | checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 2790 | dependencies = [ 2791 | "jni", 2792 | "ndk 0.8.0", 2793 | "ndk-context", 2794 | "num-derive", 2795 | "num-traits", 2796 | "oboe-sys", 2797 | ] 2798 | 2799 | [[package]] 2800 | name = "oboe-sys" 2801 | version = "0.6.1" 2802 | source = "registry+https://github.com/rust-lang/crates.io-index" 2803 | checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 2804 | dependencies = [ 2805 | "cc", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "ogg" 2810 | version = "0.8.0" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 2813 | dependencies = [ 2814 | "byteorder", 2815 | ] 2816 | 2817 | [[package]] 2818 | name = "once_cell" 2819 | version = "1.19.0" 2820 | source = "registry+https://github.com/rust-lang/crates.io-index" 2821 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 2822 | 2823 | [[package]] 2824 | name = "orbclient" 2825 | version = "0.3.47" 2826 | source = "registry+https://github.com/rust-lang/crates.io-index" 2827 | checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" 2828 | dependencies = [ 2829 | "libredox", 2830 | ] 2831 | 2832 | [[package]] 2833 | name = "overload" 2834 | version = "0.1.1" 2835 | source = "registry+https://github.com/rust-lang/crates.io-index" 2836 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2837 | 2838 | [[package]] 2839 | name = "owned_ttf_parser" 2840 | version = "0.20.0" 2841 | source = "registry+https://github.com/rust-lang/crates.io-index" 2842 | checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" 2843 | dependencies = [ 2844 | "ttf-parser", 2845 | ] 2846 | 2847 | [[package]] 2848 | name = "parking" 2849 | version = "2.2.0" 2850 | source = "registry+https://github.com/rust-lang/crates.io-index" 2851 | checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" 2852 | 2853 | [[package]] 2854 | name = "parking_lot" 2855 | version = "0.12.1" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 2858 | dependencies = [ 2859 | "lock_api", 2860 | "parking_lot_core", 2861 | ] 2862 | 2863 | [[package]] 2864 | name = "parking_lot_core" 2865 | version = "0.9.9" 2866 | source = "registry+https://github.com/rust-lang/crates.io-index" 2867 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 2868 | dependencies = [ 2869 | "cfg-if", 2870 | "libc", 2871 | "redox_syscall", 2872 | "smallvec", 2873 | "windows-targets 0.48.5", 2874 | ] 2875 | 2876 | [[package]] 2877 | name = "paste" 2878 | version = "1.0.14" 2879 | source = "registry+https://github.com/rust-lang/crates.io-index" 2880 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 2881 | 2882 | [[package]] 2883 | name = "percent-encoding" 2884 | version = "2.3.1" 2885 | source = "registry+https://github.com/rust-lang/crates.io-index" 2886 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2887 | 2888 | [[package]] 2889 | name = "petgraph" 2890 | version = "0.6.4" 2891 | source = "registry+https://github.com/rust-lang/crates.io-index" 2892 | checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" 2893 | dependencies = [ 2894 | "fixedbitset 0.4.2", 2895 | "indexmap", 2896 | "serde", 2897 | "serde_derive", 2898 | ] 2899 | 2900 | [[package]] 2901 | name = "pin-project" 2902 | version = "1.1.5" 2903 | source = "registry+https://github.com/rust-lang/crates.io-index" 2904 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 2905 | dependencies = [ 2906 | "pin-project-internal", 2907 | ] 2908 | 2909 | [[package]] 2910 | name = "pin-project-internal" 2911 | version = "1.1.5" 2912 | source = "registry+https://github.com/rust-lang/crates.io-index" 2913 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 2914 | dependencies = [ 2915 | "proc-macro2", 2916 | "quote", 2917 | "syn 2.0.53", 2918 | ] 2919 | 2920 | [[package]] 2921 | name = "pin-project-lite" 2922 | version = "0.2.13" 2923 | source = "registry+https://github.com/rust-lang/crates.io-index" 2924 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 2925 | 2926 | [[package]] 2927 | name = "piper" 2928 | version = "0.2.1" 2929 | source = "registry+https://github.com/rust-lang/crates.io-index" 2930 | checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" 2931 | dependencies = [ 2932 | "atomic-waker", 2933 | "fastrand", 2934 | "futures-io", 2935 | ] 2936 | 2937 | [[package]] 2938 | name = "pkg-config" 2939 | version = "0.3.30" 2940 | source = "registry+https://github.com/rust-lang/crates.io-index" 2941 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 2942 | 2943 | [[package]] 2944 | name = "png" 2945 | version = "0.17.13" 2946 | source = "registry+https://github.com/rust-lang/crates.io-index" 2947 | checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" 2948 | dependencies = [ 2949 | "bitflags 1.3.2", 2950 | "crc32fast", 2951 | "fdeflate", 2952 | "flate2", 2953 | "miniz_oxide", 2954 | ] 2955 | 2956 | [[package]] 2957 | name = "polling" 2958 | version = "3.5.0" 2959 | source = "registry+https://github.com/rust-lang/crates.io-index" 2960 | checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" 2961 | dependencies = [ 2962 | "cfg-if", 2963 | "concurrent-queue", 2964 | "pin-project-lite", 2965 | "rustix", 2966 | "tracing", 2967 | "windows-sys 0.52.0", 2968 | ] 2969 | 2970 | [[package]] 2971 | name = "pp-rs" 2972 | version = "0.2.1" 2973 | source = "registry+https://github.com/rust-lang/crates.io-index" 2974 | checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" 2975 | dependencies = [ 2976 | "unicode-xid", 2977 | ] 2978 | 2979 | [[package]] 2980 | name = "presser" 2981 | version = "0.3.1" 2982 | source = "registry+https://github.com/rust-lang/crates.io-index" 2983 | checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 2984 | 2985 | [[package]] 2986 | name = "proc-macro-crate" 2987 | version = "3.1.0" 2988 | source = "registry+https://github.com/rust-lang/crates.io-index" 2989 | checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" 2990 | dependencies = [ 2991 | "toml_edit 0.21.1", 2992 | ] 2993 | 2994 | [[package]] 2995 | name = "proc-macro2" 2996 | version = "1.0.79" 2997 | source = "registry+https://github.com/rust-lang/crates.io-index" 2998 | checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" 2999 | dependencies = [ 3000 | "unicode-ident", 3001 | ] 3002 | 3003 | [[package]] 3004 | name = "profiling" 3005 | version = "1.0.15" 3006 | source = "registry+https://github.com/rust-lang/crates.io-index" 3007 | checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" 3008 | 3009 | [[package]] 3010 | name = "quote" 3011 | version = "1.0.35" 3012 | source = "registry+https://github.com/rust-lang/crates.io-index" 3013 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 3014 | dependencies = [ 3015 | "proc-macro2", 3016 | ] 3017 | 3018 | [[package]] 3019 | name = "radsort" 3020 | version = "0.1.0" 3021 | source = "registry+https://github.com/rust-lang/crates.io-index" 3022 | checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" 3023 | 3024 | [[package]] 3025 | name = "rand" 3026 | version = "0.8.5" 3027 | source = "registry+https://github.com/rust-lang/crates.io-index" 3028 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 3029 | dependencies = [ 3030 | "rand_core", 3031 | ] 3032 | 3033 | [[package]] 3034 | name = "rand_core" 3035 | version = "0.6.4" 3036 | source = "registry+https://github.com/rust-lang/crates.io-index" 3037 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3038 | 3039 | [[package]] 3040 | name = "range-alloc" 3041 | version = "0.1.3" 3042 | source = "registry+https://github.com/rust-lang/crates.io-index" 3043 | checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" 3044 | 3045 | [[package]] 3046 | name = "raw-window-handle" 3047 | version = "0.6.0" 3048 | source = "registry+https://github.com/rust-lang/crates.io-index" 3049 | checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" 3050 | 3051 | [[package]] 3052 | name = "rectangle-pack" 3053 | version = "0.4.2" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" 3056 | 3057 | [[package]] 3058 | name = "redox_syscall" 3059 | version = "0.4.1" 3060 | source = "registry+https://github.com/rust-lang/crates.io-index" 3061 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 3062 | dependencies = [ 3063 | "bitflags 1.3.2", 3064 | ] 3065 | 3066 | [[package]] 3067 | name = "regex" 3068 | version = "1.10.3" 3069 | source = "registry+https://github.com/rust-lang/crates.io-index" 3070 | checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" 3071 | dependencies = [ 3072 | "aho-corasick", 3073 | "memchr", 3074 | "regex-automata 0.4.6", 3075 | "regex-syntax 0.8.2", 3076 | ] 3077 | 3078 | [[package]] 3079 | name = "regex-automata" 3080 | version = "0.1.10" 3081 | source = "registry+https://github.com/rust-lang/crates.io-index" 3082 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 3083 | dependencies = [ 3084 | "regex-syntax 0.6.29", 3085 | ] 3086 | 3087 | [[package]] 3088 | name = "regex-automata" 3089 | version = "0.4.6" 3090 | source = "registry+https://github.com/rust-lang/crates.io-index" 3091 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 3092 | dependencies = [ 3093 | "aho-corasick", 3094 | "memchr", 3095 | "regex-syntax 0.8.2", 3096 | ] 3097 | 3098 | [[package]] 3099 | name = "regex-syntax" 3100 | version = "0.6.29" 3101 | source = "registry+https://github.com/rust-lang/crates.io-index" 3102 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 3103 | 3104 | [[package]] 3105 | name = "regex-syntax" 3106 | version = "0.8.2" 3107 | source = "registry+https://github.com/rust-lang/crates.io-index" 3108 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 3109 | 3110 | [[package]] 3111 | name = "renderdoc-sys" 3112 | version = "1.1.0" 3113 | source = "registry+https://github.com/rust-lang/crates.io-index" 3114 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 3115 | 3116 | [[package]] 3117 | name = "rodio" 3118 | version = "0.18.1" 3119 | source = "registry+https://github.com/rust-lang/crates.io-index" 3120 | checksum = "d1fceb9d127d515af1586d8d0cc601e1245bdb0af38e75c865a156290184f5b3" 3121 | dependencies = [ 3122 | "cpal", 3123 | "lewton", 3124 | "thiserror", 3125 | ] 3126 | 3127 | [[package]] 3128 | name = "ron" 3129 | version = "0.8.1" 3130 | source = "registry+https://github.com/rust-lang/crates.io-index" 3131 | checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 3132 | dependencies = [ 3133 | "base64 0.21.7", 3134 | "bitflags 2.5.0", 3135 | "serde", 3136 | "serde_derive", 3137 | ] 3138 | 3139 | [[package]] 3140 | name = "rustc-hash" 3141 | version = "1.1.0" 3142 | source = "registry+https://github.com/rust-lang/crates.io-index" 3143 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 3144 | 3145 | [[package]] 3146 | name = "rustix" 3147 | version = "0.38.32" 3148 | source = "registry+https://github.com/rust-lang/crates.io-index" 3149 | checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" 3150 | dependencies = [ 3151 | "bitflags 2.5.0", 3152 | "errno", 3153 | "libc", 3154 | "linux-raw-sys", 3155 | "windows-sys 0.52.0", 3156 | ] 3157 | 3158 | [[package]] 3159 | name = "ruzstd" 3160 | version = "0.7.0" 3161 | source = "registry+https://github.com/rust-lang/crates.io-index" 3162 | checksum = "5022b253619b1ba797f243056276bed8ed1a73b0f5a7ce7225d524067644bf8f" 3163 | dependencies = [ 3164 | "byteorder", 3165 | "twox-hash", 3166 | ] 3167 | 3168 | [[package]] 3169 | name = "ryu" 3170 | version = "1.0.17" 3171 | source = "registry+https://github.com/rust-lang/crates.io-index" 3172 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 3173 | 3174 | [[package]] 3175 | name = "same-file" 3176 | version = "1.0.6" 3177 | source = "registry+https://github.com/rust-lang/crates.io-index" 3178 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 3179 | dependencies = [ 3180 | "winapi-util", 3181 | ] 3182 | 3183 | [[package]] 3184 | name = "scopeguard" 3185 | version = "1.2.0" 3186 | source = "registry+https://github.com/rust-lang/crates.io-index" 3187 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3188 | 3189 | [[package]] 3190 | name = "send_wrapper" 3191 | version = "0.6.0" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 3194 | 3195 | [[package]] 3196 | name = "serde" 3197 | version = "1.0.197" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 3200 | dependencies = [ 3201 | "serde_derive", 3202 | ] 3203 | 3204 | [[package]] 3205 | name = "serde_derive" 3206 | version = "1.0.197" 3207 | source = "registry+https://github.com/rust-lang/crates.io-index" 3208 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 3209 | dependencies = [ 3210 | "proc-macro2", 3211 | "quote", 3212 | "syn 2.0.53", 3213 | ] 3214 | 3215 | [[package]] 3216 | name = "serde_json" 3217 | version = "1.0.114" 3218 | source = "registry+https://github.com/rust-lang/crates.io-index" 3219 | checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" 3220 | dependencies = [ 3221 | "itoa", 3222 | "ryu", 3223 | "serde", 3224 | ] 3225 | 3226 | [[package]] 3227 | name = "sharded-slab" 3228 | version = "0.1.7" 3229 | source = "registry+https://github.com/rust-lang/crates.io-index" 3230 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3231 | dependencies = [ 3232 | "lazy_static", 3233 | ] 3234 | 3235 | [[package]] 3236 | name = "shlex" 3237 | version = "1.3.0" 3238 | source = "registry+https://github.com/rust-lang/crates.io-index" 3239 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3240 | 3241 | [[package]] 3242 | name = "simd-adler32" 3243 | version = "0.3.7" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 3246 | 3247 | [[package]] 3248 | name = "slab" 3249 | version = "0.4.9" 3250 | source = "registry+https://github.com/rust-lang/crates.io-index" 3251 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 3252 | dependencies = [ 3253 | "autocfg", 3254 | ] 3255 | 3256 | [[package]] 3257 | name = "slotmap" 3258 | version = "1.0.7" 3259 | source = "registry+https://github.com/rust-lang/crates.io-index" 3260 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 3261 | dependencies = [ 3262 | "version_check", 3263 | ] 3264 | 3265 | [[package]] 3266 | name = "smallvec" 3267 | version = "1.13.1" 3268 | source = "registry+https://github.com/rust-lang/crates.io-index" 3269 | checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" 3270 | 3271 | [[package]] 3272 | name = "smol_str" 3273 | version = "0.2.1" 3274 | source = "registry+https://github.com/rust-lang/crates.io-index" 3275 | checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" 3276 | dependencies = [ 3277 | "serde", 3278 | ] 3279 | 3280 | [[package]] 3281 | name = "spirv" 3282 | version = "0.3.0+sdk-1.3.268.0" 3283 | source = "registry+https://github.com/rust-lang/crates.io-index" 3284 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 3285 | dependencies = [ 3286 | "bitflags 2.5.0", 3287 | ] 3288 | 3289 | [[package]] 3290 | name = "static_assertions" 3291 | version = "1.1.0" 3292 | source = "registry+https://github.com/rust-lang/crates.io-index" 3293 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3294 | 3295 | [[package]] 3296 | name = "svg_fmt" 3297 | version = "0.4.2" 3298 | source = "registry+https://github.com/rust-lang/crates.io-index" 3299 | checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499" 3300 | 3301 | [[package]] 3302 | name = "syn" 3303 | version = "1.0.109" 3304 | source = "registry+https://github.com/rust-lang/crates.io-index" 3305 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3306 | dependencies = [ 3307 | "proc-macro2", 3308 | "quote", 3309 | "unicode-ident", 3310 | ] 3311 | 3312 | [[package]] 3313 | name = "syn" 3314 | version = "2.0.53" 3315 | source = "registry+https://github.com/rust-lang/crates.io-index" 3316 | checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" 3317 | dependencies = [ 3318 | "proc-macro2", 3319 | "quote", 3320 | "unicode-ident", 3321 | ] 3322 | 3323 | [[package]] 3324 | name = "sysinfo" 3325 | version = "0.30.7" 3326 | source = "registry+https://github.com/rust-lang/crates.io-index" 3327 | checksum = "0c385888ef380a852a16209afc8cfad22795dd8873d69c9a14d2e2088f118d18" 3328 | dependencies = [ 3329 | "cfg-if", 3330 | "core-foundation-sys", 3331 | "libc", 3332 | "ntapi", 3333 | "once_cell", 3334 | "windows 0.52.0", 3335 | ] 3336 | 3337 | [[package]] 3338 | name = "taffy" 3339 | version = "0.5.1" 3340 | source = "registry+https://github.com/rust-lang/crates.io-index" 3341 | checksum = "e8b61630cba2afd2c851821add2e1bb1b7851a2436e839ab73b56558b009035e" 3342 | dependencies = [ 3343 | "arrayvec", 3344 | "grid", 3345 | "num-traits", 3346 | "serde", 3347 | "slotmap", 3348 | ] 3349 | 3350 | [[package]] 3351 | name = "termcolor" 3352 | version = "1.4.1" 3353 | source = "registry+https://github.com/rust-lang/crates.io-index" 3354 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 3355 | dependencies = [ 3356 | "winapi-util", 3357 | ] 3358 | 3359 | [[package]] 3360 | name = "thiserror" 3361 | version = "1.0.61" 3362 | source = "registry+https://github.com/rust-lang/crates.io-index" 3363 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 3364 | dependencies = [ 3365 | "thiserror-impl", 3366 | ] 3367 | 3368 | [[package]] 3369 | name = "thiserror-impl" 3370 | version = "1.0.61" 3371 | source = "registry+https://github.com/rust-lang/crates.io-index" 3372 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 3373 | dependencies = [ 3374 | "proc-macro2", 3375 | "quote", 3376 | "syn 2.0.53", 3377 | ] 3378 | 3379 | [[package]] 3380 | name = "thread_local" 3381 | version = "1.1.8" 3382 | source = "registry+https://github.com/rust-lang/crates.io-index" 3383 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 3384 | dependencies = [ 3385 | "cfg-if", 3386 | "once_cell", 3387 | ] 3388 | 3389 | [[package]] 3390 | name = "tinyvec" 3391 | version = "1.6.0" 3392 | source = "registry+https://github.com/rust-lang/crates.io-index" 3393 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3394 | dependencies = [ 3395 | "tinyvec_macros", 3396 | ] 3397 | 3398 | [[package]] 3399 | name = "tinyvec_macros" 3400 | version = "0.1.1" 3401 | source = "registry+https://github.com/rust-lang/crates.io-index" 3402 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3403 | 3404 | [[package]] 3405 | name = "toml_datetime" 3406 | version = "0.6.6" 3407 | source = "registry+https://github.com/rust-lang/crates.io-index" 3408 | checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" 3409 | 3410 | [[package]] 3411 | name = "toml_edit" 3412 | version = "0.21.1" 3413 | source = "registry+https://github.com/rust-lang/crates.io-index" 3414 | checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" 3415 | dependencies = [ 3416 | "indexmap", 3417 | "toml_datetime", 3418 | "winnow 0.5.40", 3419 | ] 3420 | 3421 | [[package]] 3422 | name = "toml_edit" 3423 | version = "0.22.14" 3424 | source = "registry+https://github.com/rust-lang/crates.io-index" 3425 | checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" 3426 | dependencies = [ 3427 | "indexmap", 3428 | "toml_datetime", 3429 | "winnow 0.6.13", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "tracing" 3434 | version = "0.1.40" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 3437 | dependencies = [ 3438 | "pin-project-lite", 3439 | "tracing-attributes", 3440 | "tracing-core", 3441 | ] 3442 | 3443 | [[package]] 3444 | name = "tracing-attributes" 3445 | version = "0.1.27" 3446 | source = "registry+https://github.com/rust-lang/crates.io-index" 3447 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 3448 | dependencies = [ 3449 | "proc-macro2", 3450 | "quote", 3451 | "syn 2.0.53", 3452 | ] 3453 | 3454 | [[package]] 3455 | name = "tracing-core" 3456 | version = "0.1.32" 3457 | source = "registry+https://github.com/rust-lang/crates.io-index" 3458 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 3459 | dependencies = [ 3460 | "once_cell", 3461 | "valuable", 3462 | ] 3463 | 3464 | [[package]] 3465 | name = "tracing-log" 3466 | version = "0.2.0" 3467 | source = "registry+https://github.com/rust-lang/crates.io-index" 3468 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3469 | dependencies = [ 3470 | "log", 3471 | "once_cell", 3472 | "tracing-core", 3473 | ] 3474 | 3475 | [[package]] 3476 | name = "tracing-subscriber" 3477 | version = "0.3.18" 3478 | source = "registry+https://github.com/rust-lang/crates.io-index" 3479 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 3480 | dependencies = [ 3481 | "matchers", 3482 | "nu-ansi-term", 3483 | "once_cell", 3484 | "regex", 3485 | "sharded-slab", 3486 | "smallvec", 3487 | "thread_local", 3488 | "tracing", 3489 | "tracing-core", 3490 | "tracing-log", 3491 | ] 3492 | 3493 | [[package]] 3494 | name = "tracing-wasm" 3495 | version = "0.2.1" 3496 | source = "registry+https://github.com/rust-lang/crates.io-index" 3497 | checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" 3498 | dependencies = [ 3499 | "tracing", 3500 | "tracing-subscriber", 3501 | "wasm-bindgen", 3502 | ] 3503 | 3504 | [[package]] 3505 | name = "ttf-parser" 3506 | version = "0.20.0" 3507 | source = "registry+https://github.com/rust-lang/crates.io-index" 3508 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 3509 | 3510 | [[package]] 3511 | name = "twox-hash" 3512 | version = "1.6.3" 3513 | source = "registry+https://github.com/rust-lang/crates.io-index" 3514 | checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" 3515 | dependencies = [ 3516 | "cfg-if", 3517 | "static_assertions", 3518 | ] 3519 | 3520 | [[package]] 3521 | name = "unicode-ident" 3522 | version = "1.0.12" 3523 | source = "registry+https://github.com/rust-lang/crates.io-index" 3524 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 3525 | 3526 | [[package]] 3527 | name = "unicode-segmentation" 3528 | version = "1.11.0" 3529 | source = "registry+https://github.com/rust-lang/crates.io-index" 3530 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 3531 | 3532 | [[package]] 3533 | name = "unicode-width" 3534 | version = "0.1.11" 3535 | source = "registry+https://github.com/rust-lang/crates.io-index" 3536 | checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" 3537 | 3538 | [[package]] 3539 | name = "unicode-xid" 3540 | version = "0.2.4" 3541 | source = "registry+https://github.com/rust-lang/crates.io-index" 3542 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 3543 | 3544 | [[package]] 3545 | name = "uuid" 3546 | version = "1.8.0" 3547 | source = "registry+https://github.com/rust-lang/crates.io-index" 3548 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 3549 | dependencies = [ 3550 | "getrandom", 3551 | "serde", 3552 | ] 3553 | 3554 | [[package]] 3555 | name = "valuable" 3556 | version = "0.1.0" 3557 | source = "registry+https://github.com/rust-lang/crates.io-index" 3558 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3559 | 3560 | [[package]] 3561 | name = "vec_map" 3562 | version = "0.8.2" 3563 | source = "registry+https://github.com/rust-lang/crates.io-index" 3564 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 3565 | 3566 | [[package]] 3567 | name = "version_check" 3568 | version = "0.9.4" 3569 | source = "registry+https://github.com/rust-lang/crates.io-index" 3570 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3571 | 3572 | [[package]] 3573 | name = "walkdir" 3574 | version = "2.5.0" 3575 | source = "registry+https://github.com/rust-lang/crates.io-index" 3576 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3577 | dependencies = [ 3578 | "same-file", 3579 | "winapi-util", 3580 | ] 3581 | 3582 | [[package]] 3583 | name = "wasi" 3584 | version = "0.11.0+wasi-snapshot-preview1" 3585 | source = "registry+https://github.com/rust-lang/crates.io-index" 3586 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3587 | 3588 | [[package]] 3589 | name = "wasm-bindgen" 3590 | version = "0.2.92" 3591 | source = "registry+https://github.com/rust-lang/crates.io-index" 3592 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 3593 | dependencies = [ 3594 | "cfg-if", 3595 | "wasm-bindgen-macro", 3596 | ] 3597 | 3598 | [[package]] 3599 | name = "wasm-bindgen-backend" 3600 | version = "0.2.92" 3601 | source = "registry+https://github.com/rust-lang/crates.io-index" 3602 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 3603 | dependencies = [ 3604 | "bumpalo", 3605 | "log", 3606 | "once_cell", 3607 | "proc-macro2", 3608 | "quote", 3609 | "syn 2.0.53", 3610 | "wasm-bindgen-shared", 3611 | ] 3612 | 3613 | [[package]] 3614 | name = "wasm-bindgen-futures" 3615 | version = "0.4.42" 3616 | source = "registry+https://github.com/rust-lang/crates.io-index" 3617 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 3618 | dependencies = [ 3619 | "cfg-if", 3620 | "js-sys", 3621 | "wasm-bindgen", 3622 | "web-sys", 3623 | ] 3624 | 3625 | [[package]] 3626 | name = "wasm-bindgen-macro" 3627 | version = "0.2.92" 3628 | source = "registry+https://github.com/rust-lang/crates.io-index" 3629 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 3630 | dependencies = [ 3631 | "quote", 3632 | "wasm-bindgen-macro-support", 3633 | ] 3634 | 3635 | [[package]] 3636 | name = "wasm-bindgen-macro-support" 3637 | version = "0.2.92" 3638 | source = "registry+https://github.com/rust-lang/crates.io-index" 3639 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 3640 | dependencies = [ 3641 | "proc-macro2", 3642 | "quote", 3643 | "syn 2.0.53", 3644 | "wasm-bindgen-backend", 3645 | "wasm-bindgen-shared", 3646 | ] 3647 | 3648 | [[package]] 3649 | name = "wasm-bindgen-shared" 3650 | version = "0.2.92" 3651 | source = "registry+https://github.com/rust-lang/crates.io-index" 3652 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 3653 | 3654 | [[package]] 3655 | name = "web-sys" 3656 | version = "0.3.69" 3657 | source = "registry+https://github.com/rust-lang/crates.io-index" 3658 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 3659 | dependencies = [ 3660 | "js-sys", 3661 | "wasm-bindgen", 3662 | ] 3663 | 3664 | [[package]] 3665 | name = "web-time" 3666 | version = "1.1.0" 3667 | source = "registry+https://github.com/rust-lang/crates.io-index" 3668 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3669 | dependencies = [ 3670 | "js-sys", 3671 | "wasm-bindgen", 3672 | ] 3673 | 3674 | [[package]] 3675 | name = "wgpu" 3676 | version = "0.20.1" 3677 | source = "registry+https://github.com/rust-lang/crates.io-index" 3678 | checksum = "90e37c7b9921b75dfd26dd973fdcbce36f13dfa6e2dc82aece584e0ed48c355c" 3679 | dependencies = [ 3680 | "arrayvec", 3681 | "cfg-if", 3682 | "cfg_aliases 0.1.1", 3683 | "document-features", 3684 | "js-sys", 3685 | "log", 3686 | "naga", 3687 | "parking_lot", 3688 | "profiling", 3689 | "raw-window-handle", 3690 | "smallvec", 3691 | "static_assertions", 3692 | "wasm-bindgen", 3693 | "wasm-bindgen-futures", 3694 | "web-sys", 3695 | "wgpu-core", 3696 | "wgpu-hal", 3697 | "wgpu-types", 3698 | ] 3699 | 3700 | [[package]] 3701 | name = "wgpu-core" 3702 | version = "0.21.1" 3703 | source = "registry+https://github.com/rust-lang/crates.io-index" 3704 | checksum = "d50819ab545b867d8a454d1d756b90cd5f15da1f2943334ca314af10583c9d39" 3705 | dependencies = [ 3706 | "arrayvec", 3707 | "bit-vec", 3708 | "bitflags 2.5.0", 3709 | "cfg_aliases 0.1.1", 3710 | "codespan-reporting", 3711 | "document-features", 3712 | "indexmap", 3713 | "log", 3714 | "naga", 3715 | "once_cell", 3716 | "parking_lot", 3717 | "profiling", 3718 | "raw-window-handle", 3719 | "rustc-hash", 3720 | "smallvec", 3721 | "thiserror", 3722 | "web-sys", 3723 | "wgpu-hal", 3724 | "wgpu-types", 3725 | ] 3726 | 3727 | [[package]] 3728 | name = "wgpu-hal" 3729 | version = "0.21.1" 3730 | source = "registry+https://github.com/rust-lang/crates.io-index" 3731 | checksum = "172e490a87295564f3fcc0f165798d87386f6231b04d4548bca458cbbfd63222" 3732 | dependencies = [ 3733 | "android_system_properties", 3734 | "arrayvec", 3735 | "ash", 3736 | "bit-set", 3737 | "bitflags 2.5.0", 3738 | "block", 3739 | "cfg_aliases 0.1.1", 3740 | "core-graphics-types", 3741 | "d3d12", 3742 | "glow", 3743 | "glutin_wgl_sys", 3744 | "gpu-alloc", 3745 | "gpu-allocator", 3746 | "gpu-descriptor", 3747 | "hassle-rs", 3748 | "js-sys", 3749 | "khronos-egl", 3750 | "libc", 3751 | "libloading 0.8.3", 3752 | "log", 3753 | "metal", 3754 | "naga", 3755 | "ndk-sys 0.5.0+25.2.9519653", 3756 | "objc", 3757 | "once_cell", 3758 | "parking_lot", 3759 | "profiling", 3760 | "range-alloc", 3761 | "raw-window-handle", 3762 | "renderdoc-sys", 3763 | "rustc-hash", 3764 | "smallvec", 3765 | "thiserror", 3766 | "wasm-bindgen", 3767 | "web-sys", 3768 | "wgpu-types", 3769 | "winapi", 3770 | ] 3771 | 3772 | [[package]] 3773 | name = "wgpu-types" 3774 | version = "0.20.0" 3775 | source = "registry+https://github.com/rust-lang/crates.io-index" 3776 | checksum = "1353d9a46bff7f955a680577f34c69122628cc2076e1d6f3a9be6ef00ae793ef" 3777 | dependencies = [ 3778 | "bitflags 2.5.0", 3779 | "js-sys", 3780 | "web-sys", 3781 | ] 3782 | 3783 | [[package]] 3784 | name = "widestring" 3785 | version = "1.0.2" 3786 | source = "registry+https://github.com/rust-lang/crates.io-index" 3787 | checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" 3788 | 3789 | [[package]] 3790 | name = "winapi" 3791 | version = "0.3.9" 3792 | source = "registry+https://github.com/rust-lang/crates.io-index" 3793 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3794 | dependencies = [ 3795 | "winapi-i686-pc-windows-gnu", 3796 | "winapi-x86_64-pc-windows-gnu", 3797 | ] 3798 | 3799 | [[package]] 3800 | name = "winapi-i686-pc-windows-gnu" 3801 | version = "0.4.0" 3802 | source = "registry+https://github.com/rust-lang/crates.io-index" 3803 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3804 | 3805 | [[package]] 3806 | name = "winapi-util" 3807 | version = "0.1.6" 3808 | source = "registry+https://github.com/rust-lang/crates.io-index" 3809 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 3810 | dependencies = [ 3811 | "winapi", 3812 | ] 3813 | 3814 | [[package]] 3815 | name = "winapi-x86_64-pc-windows-gnu" 3816 | version = "0.4.0" 3817 | source = "registry+https://github.com/rust-lang/crates.io-index" 3818 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3819 | 3820 | [[package]] 3821 | name = "windows" 3822 | version = "0.52.0" 3823 | source = "registry+https://github.com/rust-lang/crates.io-index" 3824 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 3825 | dependencies = [ 3826 | "windows-core 0.52.0", 3827 | "windows-targets 0.52.4", 3828 | ] 3829 | 3830 | [[package]] 3831 | name = "windows" 3832 | version = "0.54.0" 3833 | source = "registry+https://github.com/rust-lang/crates.io-index" 3834 | checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 3835 | dependencies = [ 3836 | "windows-core 0.54.0", 3837 | "windows-implement", 3838 | "windows-interface", 3839 | "windows-targets 0.52.4", 3840 | ] 3841 | 3842 | [[package]] 3843 | name = "windows-core" 3844 | version = "0.52.0" 3845 | source = "registry+https://github.com/rust-lang/crates.io-index" 3846 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 3847 | dependencies = [ 3848 | "windows-targets 0.52.4", 3849 | ] 3850 | 3851 | [[package]] 3852 | name = "windows-core" 3853 | version = "0.54.0" 3854 | source = "registry+https://github.com/rust-lang/crates.io-index" 3855 | checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 3856 | dependencies = [ 3857 | "windows-result", 3858 | "windows-targets 0.52.4", 3859 | ] 3860 | 3861 | [[package]] 3862 | name = "windows-implement" 3863 | version = "0.53.0" 3864 | source = "registry+https://github.com/rust-lang/crates.io-index" 3865 | checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" 3866 | dependencies = [ 3867 | "proc-macro2", 3868 | "quote", 3869 | "syn 2.0.53", 3870 | ] 3871 | 3872 | [[package]] 3873 | name = "windows-interface" 3874 | version = "0.53.0" 3875 | source = "registry+https://github.com/rust-lang/crates.io-index" 3876 | checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" 3877 | dependencies = [ 3878 | "proc-macro2", 3879 | "quote", 3880 | "syn 2.0.53", 3881 | ] 3882 | 3883 | [[package]] 3884 | name = "windows-result" 3885 | version = "0.1.0" 3886 | source = "registry+https://github.com/rust-lang/crates.io-index" 3887 | checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64" 3888 | dependencies = [ 3889 | "windows-targets 0.52.4", 3890 | ] 3891 | 3892 | [[package]] 3893 | name = "windows-sys" 3894 | version = "0.45.0" 3895 | source = "registry+https://github.com/rust-lang/crates.io-index" 3896 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3897 | dependencies = [ 3898 | "windows-targets 0.42.2", 3899 | ] 3900 | 3901 | [[package]] 3902 | name = "windows-sys" 3903 | version = "0.52.0" 3904 | source = "registry+https://github.com/rust-lang/crates.io-index" 3905 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3906 | dependencies = [ 3907 | "windows-targets 0.52.4", 3908 | ] 3909 | 3910 | [[package]] 3911 | name = "windows-targets" 3912 | version = "0.42.2" 3913 | source = "registry+https://github.com/rust-lang/crates.io-index" 3914 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 3915 | dependencies = [ 3916 | "windows_aarch64_gnullvm 0.42.2", 3917 | "windows_aarch64_msvc 0.42.2", 3918 | "windows_i686_gnu 0.42.2", 3919 | "windows_i686_msvc 0.42.2", 3920 | "windows_x86_64_gnu 0.42.2", 3921 | "windows_x86_64_gnullvm 0.42.2", 3922 | "windows_x86_64_msvc 0.42.2", 3923 | ] 3924 | 3925 | [[package]] 3926 | name = "windows-targets" 3927 | version = "0.48.5" 3928 | source = "registry+https://github.com/rust-lang/crates.io-index" 3929 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3930 | dependencies = [ 3931 | "windows_aarch64_gnullvm 0.48.5", 3932 | "windows_aarch64_msvc 0.48.5", 3933 | "windows_i686_gnu 0.48.5", 3934 | "windows_i686_msvc 0.48.5", 3935 | "windows_x86_64_gnu 0.48.5", 3936 | "windows_x86_64_gnullvm 0.48.5", 3937 | "windows_x86_64_msvc 0.48.5", 3938 | ] 3939 | 3940 | [[package]] 3941 | name = "windows-targets" 3942 | version = "0.52.4" 3943 | source = "registry+https://github.com/rust-lang/crates.io-index" 3944 | checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" 3945 | dependencies = [ 3946 | "windows_aarch64_gnullvm 0.52.4", 3947 | "windows_aarch64_msvc 0.52.4", 3948 | "windows_i686_gnu 0.52.4", 3949 | "windows_i686_msvc 0.52.4", 3950 | "windows_x86_64_gnu 0.52.4", 3951 | "windows_x86_64_gnullvm 0.52.4", 3952 | "windows_x86_64_msvc 0.52.4", 3953 | ] 3954 | 3955 | [[package]] 3956 | name = "windows_aarch64_gnullvm" 3957 | version = "0.42.2" 3958 | source = "registry+https://github.com/rust-lang/crates.io-index" 3959 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3960 | 3961 | [[package]] 3962 | name = "windows_aarch64_gnullvm" 3963 | version = "0.48.5" 3964 | source = "registry+https://github.com/rust-lang/crates.io-index" 3965 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3966 | 3967 | [[package]] 3968 | name = "windows_aarch64_gnullvm" 3969 | version = "0.52.4" 3970 | source = "registry+https://github.com/rust-lang/crates.io-index" 3971 | checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" 3972 | 3973 | [[package]] 3974 | name = "windows_aarch64_msvc" 3975 | version = "0.42.2" 3976 | source = "registry+https://github.com/rust-lang/crates.io-index" 3977 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3978 | 3979 | [[package]] 3980 | name = "windows_aarch64_msvc" 3981 | version = "0.48.5" 3982 | source = "registry+https://github.com/rust-lang/crates.io-index" 3983 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3984 | 3985 | [[package]] 3986 | name = "windows_aarch64_msvc" 3987 | version = "0.52.4" 3988 | source = "registry+https://github.com/rust-lang/crates.io-index" 3989 | checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" 3990 | 3991 | [[package]] 3992 | name = "windows_i686_gnu" 3993 | version = "0.42.2" 3994 | source = "registry+https://github.com/rust-lang/crates.io-index" 3995 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3996 | 3997 | [[package]] 3998 | name = "windows_i686_gnu" 3999 | version = "0.48.5" 4000 | source = "registry+https://github.com/rust-lang/crates.io-index" 4001 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4002 | 4003 | [[package]] 4004 | name = "windows_i686_gnu" 4005 | version = "0.52.4" 4006 | source = "registry+https://github.com/rust-lang/crates.io-index" 4007 | checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" 4008 | 4009 | [[package]] 4010 | name = "windows_i686_msvc" 4011 | version = "0.42.2" 4012 | source = "registry+https://github.com/rust-lang/crates.io-index" 4013 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 4014 | 4015 | [[package]] 4016 | name = "windows_i686_msvc" 4017 | version = "0.48.5" 4018 | source = "registry+https://github.com/rust-lang/crates.io-index" 4019 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4020 | 4021 | [[package]] 4022 | name = "windows_i686_msvc" 4023 | version = "0.52.4" 4024 | source = "registry+https://github.com/rust-lang/crates.io-index" 4025 | checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" 4026 | 4027 | [[package]] 4028 | name = "windows_x86_64_gnu" 4029 | version = "0.42.2" 4030 | source = "registry+https://github.com/rust-lang/crates.io-index" 4031 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 4032 | 4033 | [[package]] 4034 | name = "windows_x86_64_gnu" 4035 | version = "0.48.5" 4036 | source = "registry+https://github.com/rust-lang/crates.io-index" 4037 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4038 | 4039 | [[package]] 4040 | name = "windows_x86_64_gnu" 4041 | version = "0.52.4" 4042 | source = "registry+https://github.com/rust-lang/crates.io-index" 4043 | checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" 4044 | 4045 | [[package]] 4046 | name = "windows_x86_64_gnullvm" 4047 | version = "0.42.2" 4048 | source = "registry+https://github.com/rust-lang/crates.io-index" 4049 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 4050 | 4051 | [[package]] 4052 | name = "windows_x86_64_gnullvm" 4053 | version = "0.48.5" 4054 | source = "registry+https://github.com/rust-lang/crates.io-index" 4055 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4056 | 4057 | [[package]] 4058 | name = "windows_x86_64_gnullvm" 4059 | version = "0.52.4" 4060 | source = "registry+https://github.com/rust-lang/crates.io-index" 4061 | checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" 4062 | 4063 | [[package]] 4064 | name = "windows_x86_64_msvc" 4065 | version = "0.42.2" 4066 | source = "registry+https://github.com/rust-lang/crates.io-index" 4067 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 4068 | 4069 | [[package]] 4070 | name = "windows_x86_64_msvc" 4071 | version = "0.48.5" 4072 | source = "registry+https://github.com/rust-lang/crates.io-index" 4073 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4074 | 4075 | [[package]] 4076 | name = "windows_x86_64_msvc" 4077 | version = "0.52.4" 4078 | source = "registry+https://github.com/rust-lang/crates.io-index" 4079 | checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" 4080 | 4081 | [[package]] 4082 | name = "winit" 4083 | version = "0.30.3" 4084 | source = "registry+https://github.com/rust-lang/crates.io-index" 4085 | checksum = "49f45a7b7e2de6af35448d7718dab6d95acec466eb3bb7a56f4d31d1af754004" 4086 | dependencies = [ 4087 | "android-activity", 4088 | "atomic-waker", 4089 | "bitflags 2.5.0", 4090 | "block2", 4091 | "bytemuck", 4092 | "calloop", 4093 | "cfg_aliases 0.2.1", 4094 | "concurrent-queue", 4095 | "core-foundation", 4096 | "core-graphics", 4097 | "cursor-icon", 4098 | "dpi", 4099 | "js-sys", 4100 | "libc", 4101 | "ndk 0.9.0", 4102 | "objc2", 4103 | "objc2-app-kit", 4104 | "objc2-foundation", 4105 | "objc2-ui-kit", 4106 | "orbclient", 4107 | "percent-encoding", 4108 | "pin-project", 4109 | "raw-window-handle", 4110 | "redox_syscall", 4111 | "rustix", 4112 | "smol_str", 4113 | "tracing", 4114 | "unicode-segmentation", 4115 | "wasm-bindgen", 4116 | "wasm-bindgen-futures", 4117 | "web-sys", 4118 | "web-time", 4119 | "windows-sys 0.52.0", 4120 | "x11-dl", 4121 | "x11rb", 4122 | "xkbcommon-dl", 4123 | ] 4124 | 4125 | [[package]] 4126 | name = "winnow" 4127 | version = "0.5.40" 4128 | source = "registry+https://github.com/rust-lang/crates.io-index" 4129 | checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 4130 | dependencies = [ 4131 | "memchr", 4132 | ] 4133 | 4134 | [[package]] 4135 | name = "winnow" 4136 | version = "0.6.13" 4137 | source = "registry+https://github.com/rust-lang/crates.io-index" 4138 | checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" 4139 | dependencies = [ 4140 | "memchr", 4141 | ] 4142 | 4143 | [[package]] 4144 | name = "x11-dl" 4145 | version = "2.21.0" 4146 | source = "registry+https://github.com/rust-lang/crates.io-index" 4147 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 4148 | dependencies = [ 4149 | "libc", 4150 | "once_cell", 4151 | "pkg-config", 4152 | ] 4153 | 4154 | [[package]] 4155 | name = "x11rb" 4156 | version = "0.13.0" 4157 | source = "registry+https://github.com/rust-lang/crates.io-index" 4158 | checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" 4159 | dependencies = [ 4160 | "as-raw-xcb-connection", 4161 | "gethostname", 4162 | "libc", 4163 | "libloading 0.8.3", 4164 | "once_cell", 4165 | "rustix", 4166 | "x11rb-protocol", 4167 | ] 4168 | 4169 | [[package]] 4170 | name = "x11rb-protocol" 4171 | version = "0.13.0" 4172 | source = "registry+https://github.com/rust-lang/crates.io-index" 4173 | checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" 4174 | 4175 | [[package]] 4176 | name = "xi-unicode" 4177 | version = "0.3.0" 4178 | source = "registry+https://github.com/rust-lang/crates.io-index" 4179 | checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" 4180 | 4181 | [[package]] 4182 | name = "xkbcommon-dl" 4183 | version = "0.4.2" 4184 | source = "registry+https://github.com/rust-lang/crates.io-index" 4185 | checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 4186 | dependencies = [ 4187 | "bitflags 2.5.0", 4188 | "dlib", 4189 | "log", 4190 | "once_cell", 4191 | "xkeysym", 4192 | ] 4193 | 4194 | [[package]] 4195 | name = "xkeysym" 4196 | version = "0.2.0" 4197 | source = "registry+https://github.com/rust-lang/crates.io-index" 4198 | checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" 4199 | 4200 | [[package]] 4201 | name = "xml-rs" 4202 | version = "0.8.19" 4203 | source = "registry+https://github.com/rust-lang/crates.io-index" 4204 | checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" 4205 | 4206 | [[package]] 4207 | name = "zerocopy" 4208 | version = "0.7.32" 4209 | source = "registry+https://github.com/rust-lang/crates.io-index" 4210 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 4211 | dependencies = [ 4212 | "zerocopy-derive", 4213 | ] 4214 | 4215 | [[package]] 4216 | name = "zerocopy-derive" 4217 | version = "0.7.32" 4218 | source = "registry+https://github.com/rust-lang/crates.io-index" 4219 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 4220 | dependencies = [ 4221 | "proc-macro2", 4222 | "quote", 4223 | "syn 2.0.53", 4224 | ] 4225 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [dependencies.bevy] 2 | version = "0.14" 3 | 4 | [dependencies.bitflags] 5 | version = "2.3" 6 | 7 | [dependencies.bytemuck] 8 | version = "1.5" 9 | features = ["derive"] 10 | 11 | [dependencies.fixedbitset] 12 | version = "0.4" 13 | 14 | [dependencies.bevy_sprite] 15 | version = "0.14" 16 | 17 | [package] 18 | authors = ["yopox yopoxdev@gmail.com"] 19 | description = "Bevy plugin adding a texture atlas sprite with configurable background and foreground colors." 20 | edition = "2021" 21 | exclude = ["assets/", "examples/"] 22 | homepage = "https://github.com/yopox/bevy_text_mode" 23 | keywords = ["bevy", "graphics", "textmode", "palette"] 24 | license = "Apache-2.0" 25 | name = "bevy_text_mode" 26 | readme = "readme.md" 27 | repository = "https://github.com/yopox/bevy_text_mode" 28 | version = "0.4.0" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /assets/promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yopox/bevy_text_mode/3ffc782472b3e2b20919fc04badfc15f232cf9df/assets/promo.png -------------------------------------------------------------------------------- /assets/texmod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yopox/bevy_text_mode/3ffc782472b3e2b20919fc04badfc15f232cf9df/assets/texmod.png -------------------------------------------------------------------------------- /examples/sprite_atlas.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use bevy::sprite::Anchor; 3 | 4 | use bevy_text_mode::{TextModePlugin, TextModeSprite, TextModeSpriteBundle}; 5 | 6 | const WIDTH: f32 = 8. * 8. * 8.; 7 | const HEIGHT: f32 = 7. * 8. * 8.; 8 | 9 | fn main() { 10 | App::new() 11 | .add_plugins(DefaultPlugins 12 | .set(ImagePlugin::default_nearest()) 13 | .set(WindowPlugin { 14 | primary_window: Some(Window { 15 | resolution: (WIDTH, HEIGHT).into(), 16 | title: "bevy_text_mode".into(), 17 | ..default() 18 | }), 19 | ..default() 20 | }) 21 | ) 22 | .insert_resource(ClearColor(Color::BLACK)) 23 | .add_plugins(TextModePlugin) 24 | .add_systems(Startup, init) 25 | .run(); 26 | } 27 | 28 | enum Dark { 29 | BLACK, 30 | BLUE, 31 | GREEN, 32 | ORANGE, 33 | PINK, 34 | } 35 | 36 | impl Into for Dark { 37 | fn into(self) -> LinearRgba { 38 | match self { 39 | Dark::BLACK => LinearRgba::from(Srgba::BLACK), 40 | Dark::BLUE => LinearRgba::from(Srgba::hex("305182").unwrap()), 41 | Dark::GREEN => LinearRgba::from(Srgba::hex("386900").unwrap()), 42 | Dark::ORANGE => LinearRgba::from(Srgba::hex("a23000").unwrap()), 43 | Dark::PINK => LinearRgba::from(Srgba::hex("9a2079").unwrap()), 44 | } 45 | } 46 | } 47 | 48 | enum Light { 49 | WHITE, 50 | BLUE, 51 | GREEN, 52 | ORANGE, 53 | PINK, 54 | } 55 | 56 | impl Into for Light { 57 | fn into(self) -> LinearRgba { 58 | match self { 59 | Light::WHITE => LinearRgba::from(Srgba::WHITE), 60 | Light::BLUE => LinearRgba::from(Srgba::hex("a2fff3").unwrap()), 61 | Light::GREEN => LinearRgba::from(Srgba::hex("cbf382").unwrap()), 62 | Light::ORANGE => LinearRgba::from(Srgba::hex("ffcbba").unwrap()), 63 | Light::PINK => LinearRgba::from(Srgba::hex("e3b2ff").unwrap()), 64 | } 65 | } 66 | } 67 | 68 | fn init( 69 | mut commands: Commands, 70 | server: Res, 71 | mut texture_atlas_layouts: ResMut>, 72 | ) { 73 | let tileset: Handle = server.load("texmod.png"); 74 | let layout = TextureAtlasLayout::from_grid(UVec2::new(8, 8), 7, 1, None, None); 75 | let handle = texture_atlas_layouts.add(layout); 76 | 77 | commands.spawn(Camera2dBundle { 78 | transform: Transform { 79 | translation: Vec3::new(WIDTH / 8. / 2., -HEIGHT / 8. / 2., 0.), 80 | scale: Vec3::new(1. / 8., 1. / 8., 1.), 81 | ..default() 82 | }, 83 | ..default() 84 | }); 85 | 86 | for (x, y, i, bg, fg) in [ 87 | (1, 1, 0, Light::WHITE.into(), Dark::BLUE.into()), 88 | (2, 1, 1, Light::GREEN.into(), Dark::GREEN.into()), 89 | (3, 1, 2, Light::WHITE.into(), Dark::ORANGE.into()), 90 | (4, 1, 0, Light::PINK.into(), Dark::PINK.into()), 91 | 92 | (3, 2, 3, Light::BLUE.into(), Dark::BLUE.into()), 93 | (4, 2, 4, Light::WHITE.into(), Dark::GREEN.into()), 94 | (5, 2, 5, Light::ORANGE.into(), Dark::ORANGE.into()), 95 | (6, 2, 1, Light::WHITE.into(), Dark::PINK.into()), 96 | ] { 97 | commands.spawn(TextModeSpriteBundle { 98 | sprite: TextModeSprite { 99 | bg, 100 | fg, 101 | anchor: Anchor::TopLeft, 102 | ..default() 103 | }, 104 | atlas: TextureAtlas { 105 | layout: handle.clone(), 106 | index: i, 107 | }, 108 | texture: tileset.clone(), 109 | transform: Transform::from_xyz(8. * x as f32, -8. * y as f32, 0.), 110 | ..default() 111 | }); 112 | } 113 | 114 | for (x, y, i, flip_x, flip_y, rotation) in [ 115 | (1, 4, 6, false, false, 0), 116 | (2, 4, 6, false, false, 1), 117 | (3, 4, 6, false, false, 2), 118 | (4, 4, 6, false, false, 3), 119 | 120 | (3, 5, 6, false, false, 0), 121 | (4, 5, 6, true, false, 0), 122 | (5, 5, 6, false, true, 0), 123 | (6, 5, 6, true, true, 0), 124 | ] { 125 | commands.spawn(TextModeSpriteBundle { 126 | sprite: TextModeSprite { 127 | bg: Light::WHITE.into(), 128 | fg: Dark::BLACK.into(), 129 | flip_x, 130 | flip_y, 131 | rotation, 132 | anchor: Anchor::TopLeft, 133 | ..default() 134 | }, 135 | atlas: TextureAtlas { 136 | layout: handle.clone(), 137 | index: i, 138 | }, 139 | texture: tileset.clone(), 140 | transform: Transform::from_xyz(8. * x as f32, -8. * y as f32, 0.), 141 | ..default() 142 | }); 143 | } 144 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # bevy_text_mode 2 | 3 | [![bevy](https://img.shields.io/badge/bevy-v0.14.0-blue.svg)](https://github.com/bevyengine/bevy) 4 | 5 |

6 | 7 |

8 | 9 | > `bevy_text_mode` adds a `TextModeSprite` component with configurable background and foreground colors. 10 | It makes it easy to use text mode tilesets such as [MRMOTEXT](https://mrmotarius.itch.io/mrmotext). 11 | 12 | ```rust 13 | pub struct TextModeSprite { 14 | pub bg: LinearRgba, 15 | pub fg: LinearRgba, 16 | pub alpha: f32, 17 | pub flip_x: bool, 18 | pub flip_y: bool, 19 | pub rotation: u8, 20 | pub custom_size: Option, 21 | pub rect: Option, 22 | pub anchor: Anchor, 23 | } 24 | ``` 25 | 26 | ## Usage 27 | 28 | Spawn a `TextModeSpriteBundle` with the desired background and foreground colors. 29 | 30 | ## Compatible Bevy versions 31 | 32 | | `bevy_text_mode` | `bevy` | 33 | |:----------------:|:------:| 34 | | 0.4.0 | 0.14 | 35 | | 0.3.0 | 0.13 | 36 | | 0.2.0 | 0.11 | 37 | | 0.1.1 | 0.10 | 38 | -------------------------------------------------------------------------------- /src/computed_text_mode_slices.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use bevy::utils::HashSet; 3 | use bevy_sprite::ImageScaleMode; 4 | 5 | use crate::plugin::TextModeExtractedSprite; 6 | use crate::TextModeSprite; 7 | 8 | /// Component storing texture slices for sprite entities with a [`ImageScaleMode`] 9 | /// 10 | /// This component is automatically inserted and updated 11 | /// See [bevy_sprite::ComputedTextureSlices] 12 | #[derive(Debug, Clone, Component)] 13 | pub struct ComputedTextModeTextureSlices(Vec); 14 | 15 | impl ComputedTextModeTextureSlices { 16 | /// Computes [`TextModeExtractedSprite`] iterator from the sprite slices 17 | /// 18 | /// # Arguments 19 | /// 20 | /// * `transform` - the sprite entity global transform 21 | /// * `original_entity` - the sprite entity 22 | /// * `sprite` - The sprite component 23 | /// * `handle` - The sprite texture handle 24 | #[must_use] 25 | pub(crate) fn extract_text_mode_sprites<'a>( 26 | &'a self, 27 | transform: &'a GlobalTransform, 28 | original_entity: Entity, 29 | sprite: &'a TextModeSprite, 30 | handle: &'a Handle, 31 | ) -> impl ExactSizeIterator + 'a { 32 | let mut flip = Vec2::ONE; 33 | let [mut flip_x, mut flip_y] = [false; 2]; 34 | if sprite.flip_x { 35 | flip.x *= -1.0; 36 | flip_x = true; 37 | } 38 | if sprite.flip_y { 39 | flip.y *= -1.0; 40 | flip_y = true; 41 | } 42 | self.0.iter().map(move |slice| { 43 | let offset = (slice.offset * flip).extend(0.0); 44 | let transform = transform.mul_transform(Transform::from_translation(offset)); 45 | TextModeExtractedSprite { 46 | original_entity: Some(original_entity), 47 | bg: sprite.bg, 48 | fg: sprite.fg, 49 | alpha: sprite.alpha, 50 | transform, 51 | rect: Some(slice.texture_rect), 52 | custom_size: Some(slice.draw_size), 53 | flip_x, 54 | flip_y, 55 | rotation: sprite.rotation, 56 | image_handle_id: handle.id(), 57 | anchor: Self::redepend_anchor_from_sprite_to_slice(sprite, slice), 58 | } 59 | }) 60 | } 61 | 62 | fn redepend_anchor_from_sprite_to_slice(sprite: &TextModeSprite, slice: &TextureSlice) -> Vec2 { 63 | let sprite_size = sprite 64 | .custom_size 65 | .unwrap_or(sprite.rect.unwrap_or_default().size()); 66 | if sprite_size == Vec2::ZERO { 67 | sprite.anchor.as_vec() 68 | } else { 69 | sprite.anchor.as_vec() * sprite_size / slice.draw_size 70 | } 71 | } 72 | } 73 | 74 | /// Generates sprite slices for a `sprite` given a `scale_mode`. The slices 75 | /// will be computed according to the `image_handle` dimensions or the sprite rect. 76 | /// 77 | /// Returns `None` if the image asset is not loaded 78 | /// 79 | /// # Arguments 80 | /// 81 | /// * `sprite` - The text mode sprite component, will be used to find the draw area size 82 | /// * `scale_mode` - The image scaling component 83 | /// * `image_handle` - The texture to slice or tile 84 | /// * `images` - The image assets, use to retrieve the image dimensions 85 | /// * `atlas` - Optional texture atlas, if set the slicing will happen on the matching sub section 86 | /// of the texture 87 | /// * `atlas_layouts` - The atlas layout assets, used to retrieve the texture atlas section rect 88 | #[must_use] 89 | fn compute_text_mode_sprite_slices( 90 | sprite: &TextModeSprite, 91 | scale_mode: &ImageScaleMode, 92 | image_handle: &Handle, 93 | images: &Assets, 94 | atlas: Option<&TextureAtlas>, 95 | atlas_layouts: &Assets, 96 | ) -> Option { 97 | let (image_size, texture_rect) = match atlas { 98 | Some(a) => { 99 | let layout = atlas_layouts.get(&a.layout)?; 100 | ( 101 | layout.size.as_vec2(), 102 | layout.textures.get(a.index)?.as_rect(), 103 | ) 104 | } 105 | None => { 106 | let image = images.get(image_handle)?; 107 | let size = Vec2::new( 108 | image.texture_descriptor.size.width as f32, 109 | image.texture_descriptor.size.height as f32, 110 | ); 111 | let rect = sprite.rect.unwrap_or(Rect { 112 | min: Vec2::ZERO, 113 | max: size, 114 | }); 115 | (size, rect) 116 | } 117 | }; 118 | let slices = match scale_mode { 119 | ImageScaleMode::Sliced(slicer) => slicer.compute_slices(texture_rect, sprite.custom_size), 120 | ImageScaleMode::Tiled { 121 | tile_x, 122 | tile_y, 123 | stretch_value, 124 | } => { 125 | let slice = TextureSlice { 126 | texture_rect, 127 | draw_size: sprite.custom_size.unwrap_or(image_size), 128 | offset: Vec2::ZERO, 129 | }; 130 | slice.tiled(*stretch_value, (*tile_x, *tile_y)) 131 | } 132 | }; 133 | Some(ComputedTextModeTextureSlices(slices)) 134 | } 135 | 136 | /// System reacting to added or modified [`Image`] handles, and recompute sprite slices 137 | /// on matching sprite entities with a [`ImageScaleMode`] component 138 | pub(crate) fn compute_text_mode_slices_on_asset_event( 139 | mut commands: Commands, 140 | mut events: EventReader>, 141 | images: Res>, 142 | atlas_layouts: Res>, 143 | sprites: Query<( 144 | Entity, 145 | &ImageScaleMode, 146 | &TextModeSprite, 147 | &Handle, 148 | Option<&TextureAtlas>, 149 | )>, 150 | ) { 151 | // We store the asset ids of added/modified image assets 152 | let added_handles: HashSet<_> = events 153 | .read() 154 | .filter_map(|e| match e { 155 | AssetEvent::Added { id } | AssetEvent::Modified { id } => Some(*id), 156 | _ => None, 157 | }) 158 | .collect(); 159 | if added_handles.is_empty() { 160 | return; 161 | } 162 | // We recompute the sprite slices for sprite entities with a matching asset handle id 163 | for (entity, scale_mode, sprite, image_handle, atlas) in &sprites { 164 | if !added_handles.contains(&image_handle.id()) { 165 | continue; 166 | } 167 | if let Some(slices) = compute_text_mode_sprite_slices( 168 | sprite, 169 | scale_mode, 170 | image_handle, 171 | &images, 172 | atlas, 173 | &atlas_layouts, 174 | ) { 175 | commands.entity(entity).insert(slices); 176 | } 177 | } 178 | } 179 | 180 | /// System reacting to changes on relevant sprite bundle components to compute the sprite slices 181 | /// on matching sprite entities with a [`ImageScaleMode`] component 182 | pub(crate) fn compute_text_mode_slices_on_sprite_change( 183 | mut commands: Commands, 184 | images: Res>, 185 | atlas_layouts: Res>, 186 | changed_sprites: Query< 187 | ( 188 | Entity, 189 | &ImageScaleMode, 190 | &TextModeSprite, 191 | &Handle, 192 | Option<&TextureAtlas>, 193 | ), 194 | Or<( 195 | Changed, 196 | Changed>, 197 | Changed, 198 | Changed, 199 | )>, 200 | >, 201 | ) { 202 | for (entity, scale_mode, sprite, image_handle, atlas) in &changed_sprites { 203 | if let Some(slices) = compute_text_mode_sprite_slices( 204 | sprite, 205 | scale_mode, 206 | image_handle, 207 | &images, 208 | atlas, 209 | &atlas_layouts, 210 | ) { 211 | commands.entity(entity).insert(slices); 212 | } 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub use plugin::TextModePlugin; 2 | pub use text_mode_texture_atlas::TextModeSprite; 3 | pub use text_mode_texture_atlas::TextModeSpriteBundle; 4 | 5 | mod plugin; 6 | mod text_mode_texture_atlas; 7 | mod computed_text_mode_slices; 8 | 9 | -------------------------------------------------------------------------------- /src/plugin.rs: -------------------------------------------------------------------------------- 1 | use std::f32::consts::PI; 2 | use std::ops::Range; 3 | 4 | use bevy::asset::load_internal_asset; 5 | use bevy::core_pipeline::core_2d::Transparent2d; 6 | use bevy::core_pipeline::tonemapping::{DebandDither, get_lut_bind_group_layout_entries, get_lut_bindings, Tonemapping, TonemappingLuts}; 7 | use bevy::ecs::entity::EntityHashMap; 8 | use bevy::ecs::query::ROQueryItem; 9 | use bevy::ecs::system::{SystemParamItem, SystemState}; 10 | use bevy::ecs::system::lifetimeless::{Read, SRes}; 11 | use bevy::math::{Affine3A, FloatOrd}; 12 | use bevy::prelude::*; 13 | use bevy::render::{Extract, Render, RenderApp, RenderSet}; 14 | use bevy::render::mesh::PrimitiveTopology; 15 | use bevy::render::render_asset::RenderAssets; 16 | use bevy::render::render_phase::*; 17 | use bevy::render::render_resource::{BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutDescriptor, BindGroupLayoutEntries, BindGroupLayoutEntry, BindingType, BlendState, BufferBindingType, BufferUsages, BufferVec, ColorTargetState, ColorWrites, FragmentState, FrontFace, ImageCopyTexture, ImageDataLayout, IndexFormat, MultisampleState, Origin3d, PipelineCache, PolygonMode, PrimitiveState, RawBufferVec, RenderPipelineDescriptor, SamplerBindingType, ShaderDefVal, ShaderStages, ShaderType, SpecializedRenderPipeline, SpecializedRenderPipelines, TextureAspect, TextureFormat, TextureSampleType, TextureViewDescriptor, TextureViewDimension, VertexAttribute, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode}; 18 | use bevy::render::render_resource::binding_types::{sampler, texture_2d, uniform_buffer}; 19 | use bevy::render::render_resource::VertexFormat::Float32; 20 | use bevy::render::renderer::{RenderDevice, RenderQueue}; 21 | use bevy::render::texture::{BevyDefault, DefaultImageSampler, FallbackImage, GpuImage, ImageSampler, TextureFormatPixelInfo}; 22 | use bevy::render::view::{check_visibility, ExtractedView, ViewTarget, ViewUniform, ViewUniformOffset, ViewUniforms, VisibilitySystems, VisibleEntities}; 23 | use bevy::sprite::{queue_material2d_meshes, SpriteAssetEvents, SpriteSystem}; 24 | use bevy::utils::HashMap; 25 | use bevy_sprite::{calculate_bounds_2d, SpriteSource, SpriteViewBindGroup, WithMesh2d, WithSprite}; 26 | use bytemuck::{Pod, Zeroable}; 27 | use fixedbitset::FixedBitSet; 28 | 29 | use crate::computed_text_mode_slices::{compute_text_mode_slices_on_asset_event, compute_text_mode_slices_on_sprite_change, ComputedTextModeTextureSlices}; 30 | use crate::TextModeSprite; 31 | 32 | const SPRITE_SHADER_HANDLE: Handle = Handle::weak_from_u128(1354325909327402345); 33 | 34 | pub struct TextModePlugin; 35 | 36 | impl Plugin for TextModePlugin { 37 | fn build(&self, app: &mut App) { 38 | load_internal_asset!( 39 | app, 40 | SPRITE_SHADER_HANDLE, 41 | "text_mode_sprite.wgsl", 42 | Shader::from_wgsl 43 | ); 44 | 45 | if let Some(render_app) = app.get_sub_app_mut(RenderApp) { 46 | render_app 47 | .init_resource::() 48 | .init_resource::>() 49 | .init_resource::() 50 | .init_resource::() 51 | .init_resource::() 52 | .add_render_command::() 53 | .add_systems( 54 | ExtractSchedule, 55 | ( 56 | extract_text_mode_sprites.in_set(SpriteSystem::ExtractSprites), 57 | extract_text_mode_sprite_events, 58 | ), 59 | ) 60 | .add_systems( 61 | Render, 62 | ( 63 | queue_text_mode_sprites 64 | .in_set(RenderSet::Queue) 65 | .ambiguous_with(queue_material2d_meshes::), 66 | prepare_text_mode_sprite_image_bind_groups.in_set(RenderSet::PrepareBindGroups), 67 | prepare_text_mode_sprite_view_bind_groups.in_set(RenderSet::PrepareBindGroups), 68 | ), 69 | ); 70 | }; 71 | 72 | app 73 | .add_systems( 74 | PostUpdate, 75 | ( 76 | calculate_bounds_2d.in_set(VisibilitySystems::CalculateBounds), 77 | check_visibility::>.in_set(VisibilitySystems::CheckVisibility), 78 | ( 79 | compute_text_mode_slices_on_asset_event, 80 | compute_text_mode_slices_on_sprite_change, 81 | ) 82 | .in_set(SpriteSystem::ComputeSlices), 83 | ), 84 | ); 85 | } 86 | 87 | fn finish(&self, app: &mut App) { 88 | if let Some(render_app) = app.get_sub_app_mut(RenderApp) { 89 | render_app.init_resource::(); 90 | } 91 | } 92 | } 93 | 94 | #[derive(Resource)] 95 | pub struct TextModeSpritePipeline { 96 | view_layout: BindGroupLayout, 97 | material_layout: BindGroupLayout, 98 | pub dummy_white_gpu_image: GpuImage, 99 | } 100 | 101 | impl FromWorld for TextModeSpritePipeline { 102 | fn from_world(world: &mut World) -> Self { 103 | let mut system_state: SystemState<( 104 | Res, 105 | Res, 106 | Res, 107 | )> = SystemState::new(world); 108 | let (render_device, default_sampler, render_queue) = system_state.get_mut(world); 109 | 110 | let tonemapping_lut_entries = get_lut_bind_group_layout_entries(); 111 | let view_layout = render_device.create_bind_group_layout( 112 | "sprite_view_layout", 113 | &BindGroupLayoutEntries::with_indices( 114 | ShaderStages::VERTEX_FRAGMENT, 115 | ( 116 | (0, uniform_buffer::(true)), 117 | ( 118 | 1, 119 | tonemapping_lut_entries[0].visibility(ShaderStages::FRAGMENT), 120 | ), 121 | ( 122 | 2, 123 | tonemapping_lut_entries[1].visibility(ShaderStages::FRAGMENT), 124 | ), 125 | ), 126 | ), 127 | ); 128 | 129 | let material_layout = render_device.create_bind_group_layout( 130 | "text_sprite_material_layout", 131 | &BindGroupLayoutEntries::sequential( 132 | ShaderStages::FRAGMENT, 133 | ( 134 | texture_2d(TextureSampleType::Float { filterable: true }), 135 | sampler(SamplerBindingType::Filtering), 136 | ), 137 | ), 138 | ); 139 | let dummy_white_gpu_image = { 140 | let image = Image::default(); 141 | let texture = render_device.create_texture(&image.texture_descriptor); 142 | let sampler = match image.sampler { 143 | ImageSampler::Default => (**default_sampler).clone(), 144 | ImageSampler::Descriptor(ref descriptor) => { 145 | render_device.create_sampler(&descriptor.as_wgpu()) 146 | } 147 | }; 148 | 149 | let format_size = image.texture_descriptor.format.pixel_size(); 150 | render_queue.write_texture( 151 | texture.as_image_copy(), 152 | &image.data, 153 | ImageDataLayout { 154 | offset: 0, 155 | bytes_per_row: Some(image.width() * format_size as u32), 156 | rows_per_image: None, 157 | }, 158 | image.texture_descriptor.size, 159 | ); 160 | let texture_view = texture.create_view(&TextureViewDescriptor::default()); 161 | GpuImage { 162 | texture, 163 | texture_view, 164 | texture_format: image.texture_descriptor.format, 165 | sampler, 166 | size: image.size(), 167 | mip_level_count: image.texture_descriptor.mip_level_count, 168 | } 169 | }; 170 | 171 | TextModeSpritePipeline { 172 | view_layout, 173 | material_layout, 174 | dummy_white_gpu_image, 175 | } 176 | } 177 | } 178 | 179 | bitflags::bitflags! { 180 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] 181 | #[repr(transparent)] 182 | pub struct TextModeSpritePipelineKey: u32 { 183 | const NONE = 0; 184 | const COLORED = 1 << 0; 185 | const HDR = 1 << 1; 186 | const TONEMAP_IN_SHADER = 1 << 2; 187 | const DEBAND_DITHER = 1 << 3; 188 | const MSAA_RESERVED_BITS = Self::MSAA_MASK_BITS << Self::MSAA_SHIFT_BITS; 189 | const TONEMAP_METHOD_RESERVED_BITS = Self::TONEMAP_METHOD_MASK_BITS << Self::TONEMAP_METHOD_SHIFT_BITS; 190 | const TONEMAP_METHOD_NONE = 0 << Self::TONEMAP_METHOD_SHIFT_BITS; 191 | const TONEMAP_METHOD_REINHARD = 1 << Self::TONEMAP_METHOD_SHIFT_BITS; 192 | const TONEMAP_METHOD_REINHARD_LUMINANCE = 2 << Self::TONEMAP_METHOD_SHIFT_BITS; 193 | const TONEMAP_METHOD_ACES_FITTED = 3 << Self::TONEMAP_METHOD_SHIFT_BITS; 194 | const TONEMAP_METHOD_AGX = 4 << Self::TONEMAP_METHOD_SHIFT_BITS; 195 | const TONEMAP_METHOD_SOMEWHAT_BORING_DISPLAY_TRANSFORM = 5 << Self::TONEMAP_METHOD_SHIFT_BITS; 196 | const TONEMAP_METHOD_TONY_MC_MAPFACE = 6 << Self::TONEMAP_METHOD_SHIFT_BITS; 197 | const TONEMAP_METHOD_BLENDER_FILMIC = 7 << Self::TONEMAP_METHOD_SHIFT_BITS; 198 | } 199 | } 200 | 201 | impl TextModeSpritePipelineKey { 202 | const MSAA_MASK_BITS: u32 = 0b111; 203 | const MSAA_SHIFT_BITS: u32 = 32 - Self::MSAA_MASK_BITS.count_ones(); 204 | const TONEMAP_METHOD_MASK_BITS: u32 = 0b111; 205 | const TONEMAP_METHOD_SHIFT_BITS: u32 = 206 | Self::MSAA_SHIFT_BITS - Self::TONEMAP_METHOD_MASK_BITS.count_ones(); 207 | 208 | #[inline] 209 | pub const fn from_msaa_samples(msaa_samples: u32) -> Self { 210 | let msaa_bits = 211 | (msaa_samples.trailing_zeros() & Self::MSAA_MASK_BITS) << Self::MSAA_SHIFT_BITS; 212 | Self::from_bits_retain(msaa_bits) 213 | } 214 | 215 | #[inline] 216 | pub const fn msaa_samples(&self) -> u32 { 217 | 1 << ((self.bits() >> Self::MSAA_SHIFT_BITS) & Self::MSAA_MASK_BITS) 218 | } 219 | 220 | #[inline] 221 | pub const fn from_hdr(hdr: bool) -> Self { 222 | if hdr { 223 | TextModeSpritePipelineKey::HDR 224 | } else { 225 | TextModeSpritePipelineKey::NONE 226 | } 227 | } 228 | } 229 | 230 | impl SpecializedRenderPipeline for TextModeSpritePipeline { 231 | type Key = TextModeSpritePipelineKey; 232 | 233 | fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor { 234 | let mut shader_defs = Vec::new(); 235 | 236 | if key.contains(TextModeSpritePipelineKey::TONEMAP_IN_SHADER) { 237 | shader_defs.push("TONEMAP_IN_SHADER".into()); 238 | shader_defs.push(ShaderDefVal::UInt( 239 | "TONEMAPPING_LUT_TEXTURE_BINDING_INDEX".into(), 240 | 1, 241 | )); 242 | shader_defs.push(ShaderDefVal::UInt( 243 | "TONEMAPPING_LUT_SAMPLER_BINDING_INDEX".into(), 244 | 2, 245 | )); 246 | 247 | let method = key.intersection(TextModeSpritePipelineKey::TONEMAP_METHOD_RESERVED_BITS); 248 | 249 | if method == TextModeSpritePipelineKey::TONEMAP_METHOD_NONE { 250 | shader_defs.push("TONEMAP_METHOD_NONE".into()); 251 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_REINHARD { 252 | shader_defs.push("TONEMAP_METHOD_REINHARD".into()); 253 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_REINHARD_LUMINANCE { 254 | shader_defs.push("TONEMAP_METHOD_REINHARD_LUMINANCE".into()); 255 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_ACES_FITTED { 256 | shader_defs.push("TONEMAP_METHOD_ACES_FITTED".into()); 257 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_AGX { 258 | shader_defs.push("TONEMAP_METHOD_AGX".into()); 259 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_SOMEWHAT_BORING_DISPLAY_TRANSFORM 260 | { 261 | shader_defs.push("TONEMAP_METHOD_SOMEWHAT_BORING_DISPLAY_TRANSFORM".into()); 262 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_BLENDER_FILMIC { 263 | shader_defs.push("TONEMAP_METHOD_BLENDER_FILMIC".into()); 264 | } else if method == TextModeSpritePipelineKey::TONEMAP_METHOD_TONY_MC_MAPFACE { 265 | shader_defs.push("TONEMAP_METHOD_TONY_MC_MAPFACE".into()); 266 | } 267 | 268 | // Debanding is tied to tonemapping in the shader, cannot run without it. 269 | if key.contains(TextModeSpritePipelineKey::DEBAND_DITHER) { 270 | shader_defs.push("DEBAND_DITHER".into()); 271 | } 272 | } 273 | 274 | let format = match key.contains(TextModeSpritePipelineKey::HDR) { 275 | true => ViewTarget::TEXTURE_FORMAT_HDR, 276 | false => TextureFormat::bevy_default(), 277 | }; 278 | 279 | let instance_rate_vertex_buffer_layout = VertexBufferLayout { 280 | array_stride: 112, 281 | step_mode: VertexStepMode::Instance, 282 | attributes: vec![ 283 | // @location(0) i_model_transpose_col0: vec4, 284 | VertexAttribute { 285 | format: VertexFormat::Float32x4, 286 | offset: 0, 287 | shader_location: 0, 288 | }, 289 | // @location(1) i_model_transpose_col1: vec4, 290 | VertexAttribute { 291 | format: VertexFormat::Float32x4, 292 | offset: 16, 293 | shader_location: 1, 294 | }, 295 | // @location(2) i_model_transpose_col2: vec4, 296 | VertexAttribute { 297 | format: VertexFormat::Float32x4, 298 | offset: 32, 299 | shader_location: 2, 300 | }, 301 | // @location(3) i_bg: vec4, 302 | VertexAttribute { 303 | format: VertexFormat::Float32x4, 304 | offset: 48, 305 | shader_location: 3, 306 | }, 307 | // @location(4) i_fg: vec4, 308 | VertexAttribute { 309 | format: VertexFormat::Float32x4, 310 | offset: 64, 311 | shader_location: 4, 312 | }, 313 | // @location(5) i_alpha: f32, 314 | VertexAttribute { 315 | format: VertexFormat::Float32, 316 | offset: 80, 317 | shader_location: 5, 318 | }, 319 | // @location(6) i_uv_offset_scale: vec4, 320 | VertexAttribute { 321 | format: VertexFormat::Float32x4, 322 | offset: 84, 323 | shader_location: 6, 324 | }, 325 | // @location(7) i_pad: vec3, 326 | VertexAttribute { 327 | format: VertexFormat::Float32x3, 328 | offset: 100, 329 | shader_location: 7, 330 | }, 331 | ], 332 | }; 333 | 334 | RenderPipelineDescriptor { 335 | vertex: VertexState { 336 | shader: SPRITE_SHADER_HANDLE, 337 | entry_point: "vertex".into(), 338 | shader_defs: shader_defs.clone(), 339 | buffers: vec![instance_rate_vertex_buffer_layout], 340 | }, 341 | fragment: Some(FragmentState { 342 | shader: SPRITE_SHADER_HANDLE, 343 | shader_defs, 344 | entry_point: "fragment".into(), 345 | targets: vec![Some(ColorTargetState { 346 | format, 347 | blend: Some(BlendState::ALPHA_BLENDING), 348 | write_mask: ColorWrites::ALL, 349 | })], 350 | }), 351 | layout: vec![self.view_layout.clone(), self.material_layout.clone()], 352 | primitive: PrimitiveState { 353 | front_face: FrontFace::Ccw, 354 | cull_mode: None, 355 | unclipped_depth: false, 356 | polygon_mode: PolygonMode::Fill, 357 | conservative: false, 358 | topology: PrimitiveTopology::TriangleList, 359 | strip_index_format: None, 360 | }, 361 | depth_stencil: None, 362 | multisample: MultisampleState { 363 | count: key.msaa_samples(), 364 | mask: !0, 365 | alpha_to_coverage_enabled: false, 366 | }, 367 | label: Some("text_mode_sprite_pipeline".into()), 368 | push_constant_ranges: Vec::new(), 369 | } 370 | } 371 | } 372 | 373 | /// See [bevy::sprite::ExtractedSprite] 374 | pub struct TextModeExtractedSprite { 375 | pub transform: GlobalTransform, 376 | pub bg: LinearRgba, 377 | pub fg: LinearRgba, 378 | pub alpha: f32, 379 | pub custom_size: Option, 380 | pub rect: Option, 381 | pub image_handle_id: AssetId, 382 | pub flip_x: bool, 383 | pub flip_y: bool, 384 | pub rotation: u8, 385 | pub anchor: Vec2, 386 | pub original_entity: Option, 387 | } 388 | 389 | #[derive(Resource, Default)] 390 | pub struct ExtractedTextModeSprites { 391 | pub sprites: EntityHashMap, 392 | } 393 | 394 | #[derive(Resource, Default)] 395 | pub struct TextModeSpriteAssetEvents { 396 | pub images: Vec>, 397 | } 398 | 399 | pub fn extract_text_mode_sprite_events( 400 | mut events: ResMut, 401 | mut image_events: Extract>>, 402 | ) { 403 | let TextModeSpriteAssetEvents { ref mut images } = *events; 404 | images.clear(); 405 | 406 | for event in image_events.read() { 407 | images.push(*event); 408 | } 409 | } 410 | 411 | /// See [bevy::sprite::extract_sprites] 412 | pub fn extract_text_mode_sprites( 413 | mut commands: Commands, 414 | mut extracted_sprites: ResMut, 415 | texture_atlases: Extract>>, 416 | sprite_query: Extract< 417 | Query<( 418 | Entity, 419 | &ViewVisibility, 420 | &TextModeSprite, 421 | &GlobalTransform, 422 | &Handle, 423 | Option<&TextureAtlas>, 424 | Option<&ComputedTextModeTextureSlices>, 425 | )>, 426 | >, 427 | ) { 428 | extracted_sprites.sprites.clear(); 429 | for (entity, view_visibility, sprite, transform, handle, sheet, slices) in sprite_query.iter() { 430 | if !view_visibility.get() { 431 | continue; 432 | } 433 | 434 | if let Some(slices) = slices { 435 | extracted_sprites.sprites.extend( 436 | slices 437 | .extract_text_mode_sprites(transform, entity, sprite, handle) 438 | .map(|e| (commands.spawn_empty().id(), e)) 439 | ); 440 | } else { 441 | let atlas_rect = sheet.and_then(|s| s.texture_rect(&texture_atlases)); 442 | let rect = match (atlas_rect, sprite.rect) { 443 | (None, None) => None, 444 | (None, Some(sprite_rect)) => Some(sprite_rect), 445 | (Some(atlas_rect), None) => Some(atlas_rect.as_rect()), 446 | (Some(atlas_rect), Some(mut sprite_rect)) => { 447 | sprite_rect.min += atlas_rect.min.as_vec2(); 448 | sprite_rect.max += atlas_rect.min.as_vec2(); 449 | 450 | Some(sprite_rect) 451 | } 452 | }; 453 | 454 | extracted_sprites.sprites.insert( 455 | entity, 456 | TextModeExtractedSprite { 457 | bg: sprite.bg, 458 | fg: sprite.fg, 459 | alpha: sprite.alpha, 460 | transform: *transform, 461 | // Select the area in the texture atlas 462 | rect, 463 | // Pass the custom size 464 | custom_size: sprite.custom_size, 465 | flip_x: sprite.flip_x, 466 | flip_y: sprite.flip_y, 467 | rotation: sprite.rotation, 468 | image_handle_id: handle.id(), 469 | anchor: sprite.anchor.as_vec(), 470 | original_entity: None, 471 | }, 472 | ); 473 | } 474 | } 475 | } 476 | 477 | #[repr(C)] 478 | #[derive(Copy, Clone, Pod, Zeroable)] 479 | struct TextModeSpriteInstance { 480 | pub i_model_transpose: [Vec4; 3], 481 | pub i_bg: [f32; 4], 482 | pub i_fg: [f32; 4], 483 | pub i_alpha: f32, 484 | pub i_uv: [f32; 4], 485 | pub i_pad: [f32; 3], 486 | } 487 | 488 | impl TextModeSpriteInstance { 489 | #[inline] 490 | fn from(transform: &Affine3A, bg: &LinearRgba, fg: &LinearRgba, alpha: f32, uv_offset_scale: &Vec4) -> Self { 491 | let transpose_model_3x3 = transform.matrix3.transpose(); 492 | Self { 493 | i_model_transpose: [ 494 | transpose_model_3x3.x_axis.extend(transform.translation.x), 495 | transpose_model_3x3.y_axis.extend(transform.translation.y), 496 | transpose_model_3x3.z_axis.extend(transform.translation.z), 497 | ], 498 | i_bg: bg.to_f32_array(), 499 | i_fg: fg.to_f32_array(), 500 | i_alpha: alpha, 501 | i_uv: uv_offset_scale.to_array(), 502 | i_pad: [0., 0., 0.], 503 | } 504 | } 505 | } 506 | 507 | /// See [bevy::sprite::SpriteMeta] 508 | #[derive(Resource)] 509 | pub struct TextModeSpriteMeta { 510 | sprite_index_buffer: RawBufferVec, 511 | sprite_instance_buffer: RawBufferVec, 512 | } 513 | 514 | impl Default for TextModeSpriteMeta { 515 | fn default() -> Self { 516 | Self { 517 | sprite_index_buffer: RawBufferVec::::new(BufferUsages::INDEX), 518 | sprite_instance_buffer: RawBufferVec::::new(BufferUsages::VERTEX), 519 | } 520 | } 521 | } 522 | 523 | #[derive(Component)] 524 | pub struct TextModeSpriteViewBindGroup { 525 | pub value: BindGroup, 526 | } 527 | 528 | #[derive(Component, PartialEq, Eq, Clone)] 529 | pub struct TextModeSpriteBatch { 530 | image_handle_id: AssetId, 531 | range: Range, 532 | } 533 | 534 | #[derive(Resource, Default)] 535 | pub struct TextModeImageBindGroups { 536 | values: HashMap, BindGroup>, 537 | } 538 | 539 | /// See [bevy::sprite::queue_sprites] 540 | #[allow(clippy::too_many_arguments)] 541 | pub fn queue_text_mode_sprites( 542 | mut view_entities: Local, 543 | draw_functions: Res>, 544 | sprite_pipeline: Res, 545 | mut pipelines: ResMut>, 546 | pipeline_cache: Res, 547 | msaa: Res, 548 | extracted_sprites: Res, 549 | mut transparent_render_phases: ResMut>, 550 | mut views: Query<( 551 | Entity, 552 | &VisibleEntities, 553 | &ExtractedView, 554 | Option<&Tonemapping>, 555 | Option<&DebandDither>, 556 | )>, 557 | ) { 558 | let msaa_key = TextModeSpritePipelineKey::from_msaa_samples(msaa.samples()); 559 | 560 | let draw_sprite_function = draw_functions.read().id::(); 561 | 562 | for (view_entity, visible_entities, view, tonemapping, dither) in &mut views { 563 | let Some(transparent_phase) = transparent_render_phases.get_mut(&view_entity) else { 564 | continue; 565 | }; 566 | 567 | let mut view_key = TextModeSpritePipelineKey::from_hdr(view.hdr) | msaa_key; 568 | 569 | if !view.hdr { 570 | if let Some(tonemapping) = tonemapping { 571 | view_key |= TextModeSpritePipelineKey::TONEMAP_IN_SHADER; 572 | view_key |= match tonemapping { 573 | Tonemapping::None => TextModeSpritePipelineKey::TONEMAP_METHOD_NONE, 574 | Tonemapping::Reinhard => TextModeSpritePipelineKey::TONEMAP_METHOD_REINHARD, 575 | Tonemapping::ReinhardLuminance => { 576 | TextModeSpritePipelineKey::TONEMAP_METHOD_REINHARD_LUMINANCE 577 | } 578 | Tonemapping::AcesFitted => TextModeSpritePipelineKey::TONEMAP_METHOD_ACES_FITTED, 579 | Tonemapping::AgX => TextModeSpritePipelineKey::TONEMAP_METHOD_AGX, 580 | Tonemapping::SomewhatBoringDisplayTransform => { 581 | TextModeSpritePipelineKey::TONEMAP_METHOD_SOMEWHAT_BORING_DISPLAY_TRANSFORM 582 | } 583 | Tonemapping::TonyMcMapface => TextModeSpritePipelineKey::TONEMAP_METHOD_TONY_MC_MAPFACE, 584 | Tonemapping::BlenderFilmic => TextModeSpritePipelineKey::TONEMAP_METHOD_BLENDER_FILMIC, 585 | }; 586 | } 587 | if let Some(DebandDither::Enabled) = dither { 588 | view_key |= TextModeSpritePipelineKey::DEBAND_DITHER; 589 | } 590 | } 591 | 592 | let pipeline = pipelines.specialize(&pipeline_cache, &sprite_pipeline, view_key,); 593 | 594 | view_entities.clear(); 595 | view_entities.extend( 596 | visible_entities 597 | .iter::>() 598 | .map(|e| e.index() as usize), 599 | ); 600 | 601 | transparent_phase 602 | .items 603 | .reserve(extracted_sprites.sprites.len()); 604 | 605 | for (entity, extracted_sprite) in extracted_sprites.sprites.iter() { 606 | let index = extracted_sprite.original_entity.unwrap_or(*entity).index(); 607 | 608 | if !view_entities.contains(index as usize) { 609 | continue; 610 | } 611 | 612 | // These items will be sorted by depth with other phase items 613 | let sort_key = FloatOrd(extracted_sprite.transform.translation().z); 614 | 615 | // Add the item to the render phase 616 | transparent_phase.add(Transparent2d { 617 | draw_function: draw_sprite_function, 618 | pipeline, 619 | entity: *entity, 620 | sort_key, 621 | // batch_range and dynamic_offset will be calculated in prepare_sprites 622 | batch_range: 0..0, 623 | extra_index: PhaseItemExtraIndex::NONE, 624 | }); 625 | } 626 | } 627 | } 628 | 629 | #[allow(clippy::too_many_arguments)] 630 | pub fn prepare_text_mode_sprite_view_bind_groups( 631 | mut commands: Commands, 632 | render_device: Res, 633 | sprite_pipeline: Res, 634 | view_uniforms: Res, 635 | views: Query<(Entity, &Tonemapping), With>, 636 | tonemapping_luts: Res, 637 | images: Res>, 638 | fallback_image: Res, 639 | ) { 640 | let Some(view_binding) = view_uniforms.uniforms.binding() else { 641 | return; 642 | }; 643 | 644 | for (entity, tonemapping) in &views { 645 | let lut_bindings = 646 | get_lut_bindings(&images, &tonemapping_luts, tonemapping, &fallback_image); 647 | let view_bind_group = render_device.create_bind_group( 648 | "mesh2d_view_bind_group", 649 | &sprite_pipeline.view_layout, 650 | &BindGroupEntries::with_indices(( 651 | (0, view_binding.clone()), 652 | (1, lut_bindings.0), 653 | (2, lut_bindings.1), 654 | )), 655 | ); 656 | 657 | commands.entity(entity).insert(TextModeSpriteViewBindGroup { 658 | value: view_bind_group, 659 | }); 660 | } 661 | } 662 | 663 | #[allow(clippy::too_many_arguments)] 664 | pub fn prepare_text_mode_sprite_image_bind_groups( 665 | mut commands: Commands, 666 | mut previous_len: Local, 667 | render_device: Res, 668 | render_queue: Res, 669 | mut sprite_meta: ResMut, 670 | sprite_pipeline: Res, 671 | mut image_bind_groups: ResMut, 672 | gpu_images: Res>, 673 | extracted_sprites: Res, 674 | mut phases: ResMut>, 675 | events: Res, 676 | ) { 677 | // If an image has changed, the GpuImage has (probably) changed 678 | for event in &events.images { 679 | match event { 680 | AssetEvent::Added { .. } | 681 | AssetEvent::LoadedWithDependencies { .. } => {} 682 | AssetEvent::Unused { id } | AssetEvent::Modified { id } | AssetEvent::Removed { id } => { 683 | image_bind_groups.values.remove(id); 684 | } 685 | }; 686 | } 687 | 688 | let mut batches: Vec<(Entity, TextModeSpriteBatch)> = Vec::with_capacity(*previous_len); 689 | 690 | // Clear the sprite instances 691 | sprite_meta.sprite_instance_buffer.clear(); 692 | 693 | // Index buffer indices 694 | let mut index = 0; 695 | 696 | let image_bind_groups = &mut *image_bind_groups; 697 | 698 | for transparent_phase in phases.values_mut() { 699 | let mut batch_item_index = 0; 700 | let mut batch_image_size = Vec2::ZERO; 701 | let mut batch_image_handle = AssetId::invalid(); 702 | 703 | for item_index in 0..transparent_phase.items.len() { 704 | let item = &transparent_phase.items[item_index]; 705 | let Some(extracted_sprite) = extracted_sprites.sprites.get(&item.entity) else { 706 | batch_image_handle = AssetId::invalid(); 707 | continue; 708 | }; 709 | 710 | let batch_image_changed = batch_image_handle != extracted_sprite.image_handle_id; 711 | if batch_image_changed { 712 | let Some(gpu_image) = gpu_images.get(extracted_sprite.image_handle_id) else { 713 | continue; 714 | }; 715 | 716 | batch_image_size = gpu_image.size.as_vec2(); 717 | batch_image_handle = extracted_sprite.image_handle_id; 718 | image_bind_groups 719 | .values 720 | .entry(batch_image_handle) 721 | .or_insert_with(|| { 722 | render_device.create_bind_group( 723 | "text_mode_sprite_material_bind_group", 724 | &sprite_pipeline.material_layout, 725 | &BindGroupEntries::sequential(( 726 | &gpu_image.texture_view, 727 | &gpu_image.sampler, 728 | )), 729 | ) 730 | }); 731 | } 732 | 733 | // By default, the size of the quad is the size of the texture 734 | let mut quad_size = batch_image_size; 735 | 736 | // Calculate vertex data for this item 737 | let mut uv_offset_scale: Vec4; 738 | 739 | // If a rect is specified, adjust UVs and the size of the quad 740 | if let Some(rect) = extracted_sprite.rect { 741 | let rect_size = rect.size(); 742 | uv_offset_scale = Vec4::new( 743 | rect.min.x / batch_image_size.x, 744 | rect.max.y / batch_image_size.y, 745 | rect_size.x / batch_image_size.x, 746 | -rect_size.y / batch_image_size.y, 747 | ); 748 | quad_size = rect_size; 749 | } else { 750 | uv_offset_scale = Vec4::new(0.0, 1.0, 1.0, -1.0); 751 | } 752 | 753 | if extracted_sprite.flip_x { 754 | uv_offset_scale.x += uv_offset_scale.z; 755 | uv_offset_scale.z *= -1.0; 756 | } 757 | if extracted_sprite.flip_y { 758 | uv_offset_scale.y += uv_offset_scale.w; 759 | uv_offset_scale.w *= -1.0; 760 | } 761 | 762 | // Override the size if a custom one is specified 763 | if let Some(custom_size) = extracted_sprite.custom_size { 764 | quad_size = custom_size; 765 | } 766 | 767 | let translation = quad_size * (-extracted_sprite.anchor - Vec2::splat(0.5)); 768 | let scale = quad_size.extend(1.0); 769 | 770 | let rotation = extracted_sprite.rotation % 4; 771 | let rotation_affine = if rotation == 0 { Affine3A::IDENTITY } else { 772 | Affine3A::from_translation((quad_size * Vec2::new(0.5, 0.5)).extend(0.0)) 773 | * Affine3A::from_rotation_z(PI / 2.0 * f32::from(rotation)) 774 | * Affine3A::from_translation((quad_size * Vec2::new(-0.5, -0.5)).extend(0.0)) 775 | }; 776 | 777 | let transform = 778 | extracted_sprite.transform.affine() 779 | * Affine3A::from_translation(translation.extend(0.0)) 780 | * rotation_affine 781 | * Affine3A::from_scale(scale) 782 | ; 783 | 784 | // Store the vertex data and add the item to the render phase 785 | sprite_meta 786 | .sprite_instance_buffer 787 | .push(TextModeSpriteInstance::from( 788 | &transform, 789 | &extracted_sprite.bg, 790 | &extracted_sprite.fg, 791 | extracted_sprite.alpha, 792 | &uv_offset_scale, 793 | )); 794 | 795 | if batch_image_changed { 796 | batch_item_index = item_index; 797 | 798 | batches.push(( 799 | item.entity, 800 | TextModeSpriteBatch { 801 | image_handle_id: batch_image_handle, 802 | range: index..index, 803 | }, 804 | )); 805 | } 806 | 807 | transparent_phase.items[batch_item_index] 808 | .batch_range_mut() 809 | .end += 1; 810 | batches.last_mut().unwrap().1.range.end += 1; 811 | index += 1; 812 | } 813 | } 814 | sprite_meta 815 | .sprite_instance_buffer 816 | .write_buffer(&render_device, &render_queue); 817 | 818 | if sprite_meta.sprite_index_buffer.len() != 6 { 819 | sprite_meta.sprite_index_buffer.clear(); 820 | 821 | // NOTE: This code is creating 6 indices pointing to 4 vertices. 822 | // The vertices form the corners of a quad based on their two least significant bits. 823 | // 10 11 824 | // 825 | // 00 01 826 | // The sprite shader can then use the two least significant bits as the vertex index. 827 | // The rest of the properties to transform the vertex positions and UVs (which are 828 | // implicit) are baked into the instance transform, and UV offset and scale. 829 | // See bevy_sprite/src/render/sprite.wgsl for the details. 830 | sprite_meta.sprite_index_buffer.push(2); 831 | sprite_meta.sprite_index_buffer.push(0); 832 | sprite_meta.sprite_index_buffer.push(1); 833 | sprite_meta.sprite_index_buffer.push(1); 834 | sprite_meta.sprite_index_buffer.push(3); 835 | sprite_meta.sprite_index_buffer.push(2); 836 | 837 | sprite_meta 838 | .sprite_index_buffer 839 | .write_buffer(&render_device, &render_queue); 840 | } 841 | 842 | *previous_len = batches.len(); 843 | commands.insert_or_spawn_batch(batches); 844 | } 845 | 846 | pub type DrawTextModeSprite = ( 847 | SetItemPipeline, 848 | SetTextModeSpriteViewBindGroup<0>, 849 | SetTextModeSpriteTextureBindGroup<1>, 850 | DrawTextModeSpriteBatch, 851 | ); 852 | 853 | pub struct SetTextModeSpriteViewBindGroup; 854 | impl RenderCommand

for SetTextModeSpriteViewBindGroup { 855 | type Param = (); 856 | type ViewQuery = (Read, Read); 857 | type ItemQuery = (); 858 | 859 | fn render<'w>( 860 | _item: &P, 861 | (view_uniform, sprite_view_bind_group): ROQueryItem<'w, Self::ViewQuery>, 862 | _entity: Option<()>, 863 | _param: SystemParamItem<'w, '_, Self::Param>, 864 | pass: &mut TrackedRenderPass<'w>, 865 | ) -> RenderCommandResult { 866 | pass.set_bind_group(I, &sprite_view_bind_group.value, &[view_uniform.offset]); 867 | RenderCommandResult::Success 868 | } 869 | } 870 | pub struct SetTextModeSpriteTextureBindGroup; 871 | impl RenderCommand

for SetTextModeSpriteTextureBindGroup { 872 | type Param = SRes; 873 | type ViewQuery = (); 874 | type ItemQuery = Read; 875 | 876 | fn render<'w>( 877 | _item: &P, 878 | _view: (), 879 | batch: Option<&'_ TextModeSpriteBatch>, 880 | image_bind_groups: SystemParamItem<'w, '_, Self::Param>, 881 | pass: &mut TrackedRenderPass<'w>, 882 | ) -> RenderCommandResult { 883 | let image_bind_groups = image_bind_groups.into_inner(); 884 | let Some(batch) = batch else { 885 | return RenderCommandResult::Failure; 886 | }; 887 | 888 | pass.set_bind_group( 889 | I, 890 | image_bind_groups 891 | .values 892 | .get(&batch.image_handle_id) 893 | .unwrap(), 894 | &[], 895 | ); 896 | RenderCommandResult::Success 897 | } 898 | } 899 | 900 | pub struct DrawTextModeSpriteBatch; 901 | impl RenderCommand

for DrawTextModeSpriteBatch { 902 | type Param = SRes; 903 | type ViewQuery = (); 904 | type ItemQuery = Read; 905 | 906 | fn render<'w>( 907 | _item: &P, 908 | _view: (), 909 | batch: Option<&'_ TextModeSpriteBatch>, 910 | sprite_meta: SystemParamItem<'w, '_, Self::Param>, 911 | pass: &mut TrackedRenderPass<'w>, 912 | ) -> RenderCommandResult { 913 | let sprite_meta = sprite_meta.into_inner(); 914 | let Some(batch) = batch else { 915 | return RenderCommandResult::Failure; 916 | }; 917 | 918 | pass.set_index_buffer( 919 | sprite_meta.sprite_index_buffer.buffer().unwrap().slice(..), 920 | 0, 921 | IndexFormat::Uint32, 922 | ); 923 | pass.set_vertex_buffer( 924 | 0, 925 | sprite_meta 926 | .sprite_instance_buffer 927 | .buffer() 928 | .unwrap() 929 | .slice(..), 930 | ); 931 | pass.draw_indexed(0..6, 0, batch.range.clone()); 932 | RenderCommandResult::Success 933 | } 934 | } 935 | -------------------------------------------------------------------------------- /src/text_mode_sprite.wgsl: -------------------------------------------------------------------------------- 1 | #ifdef TONEMAP_IN_SHADER 2 | #import bevy_core_pipeline::tonemapping 3 | #endif 4 | 5 | #import bevy_render::{ 6 | maths::affine3_to_square, 7 | view::View, 8 | } 9 | 10 | @group(0) @binding(0) var view: View; 11 | 12 | @group(0) @binding(1) var dt_lut_texture: texture_3d; 13 | @group(0) @binding(2) var dt_lut_sampler: sampler; 14 | 15 | 16 | struct VertexInput { 17 | @builtin(vertex_index) index: u32, 18 | @location(0) i_model_transpose_col0: vec4, 19 | @location(1) i_model_transpose_col1: vec4, 20 | @location(2) i_model_transpose_col2: vec4, 21 | @location(3) i_bg: vec4, 22 | @location(4) i_fg: vec4, 23 | @location(5) i_alpha: f32, 24 | @location(6) i_uv_offset_scale: vec4, 25 | } 26 | 27 | struct VertexOutput { 28 | @builtin(position) clip_position: vec4, 29 | @location(0) uv: vec2, 30 | @location(1) @interpolate(flat) bg: vec4, 31 | @location(2) @interpolate(flat) fg: vec4, 32 | @location(3) alpha: f32, 33 | }; 34 | 35 | @vertex 36 | fn vertex(in: VertexInput) -> VertexOutput { 37 | var out: VertexOutput; 38 | 39 | let vertex_position = vec3( 40 | f32(in.index & 0x1u), 41 | f32((in.index & 0x2u) >> 1u), 42 | 0.0 43 | ); 44 | 45 | out.clip_position = view.clip_from_world * affine3_to_square(mat3x4( 46 | in.i_model_transpose_col0, 47 | in.i_model_transpose_col1, 48 | in.i_model_transpose_col2, 49 | )) * vec4(vertex_position, 1.0); 50 | out.uv = vec2(vertex_position.xy) * in.i_uv_offset_scale.zw + in.i_uv_offset_scale.xy; 51 | out.bg = in.i_bg; 52 | out.fg = in.i_fg; 53 | out.alpha = in.i_alpha; 54 | 55 | return out; 56 | } 57 | 58 | @group(1) @binding(0) var sprite_texture: texture_2d; 59 | @group(1) @binding(1) var sprite_sampler: sampler; 60 | 61 | @fragment 62 | fn fragment(in: VertexOutput) -> @location(0) vec4 { 63 | var color = textureSample(sprite_texture, sprite_sampler, in.uv); 64 | 65 | if (color[0] == 0.0) { 66 | color = in.bg; 67 | color[3] = in.alpha * in.bg[3]; 68 | } else { 69 | color = in.fg; 70 | color[3] = in.alpha * in.fg[3]; 71 | } 72 | 73 | #ifdef TONEMAP_IN_SHADER 74 | color = tonemapping::tone_mapping(color, view.color_grading); 75 | #endif 76 | 77 | return color; 78 | } -------------------------------------------------------------------------------- /src/text_mode_texture_atlas.rs: -------------------------------------------------------------------------------- 1 | use bevy::prelude::*; 2 | use bevy::sprite::Anchor; 3 | 4 | #[derive(Component, Debug, Clone, Reflect)] 5 | pub struct TextModeSprite { 6 | pub bg: LinearRgba, 7 | pub fg: LinearRgba, 8 | pub alpha: f32, 9 | pub flip_x: bool, 10 | pub flip_y: bool, 11 | pub rotation: u8, 12 | pub custom_size: Option, 13 | pub rect: Option, 14 | pub anchor: Anchor, 15 | } 16 | 17 | impl Default for TextModeSprite { 18 | fn default() -> Self { 19 | Self { 20 | bg: Color::WHITE.to_linear(), 21 | fg: Color::BLACK.to_linear(), 22 | alpha: 1.0, 23 | flip_x: false, 24 | flip_y: false, 25 | rotation: 0, 26 | custom_size: None, 27 | rect: None, 28 | anchor: Anchor::default(), 29 | } 30 | } 31 | } 32 | 33 | #[derive(Bundle, Clone, Default)] 34 | pub struct TextModeSpriteBundle { 35 | pub sprite: TextModeSprite, 36 | pub transform: Transform, 37 | pub global_transform: GlobalTransform, 38 | pub texture: Handle, 39 | pub atlas: TextureAtlas, 40 | pub visibility: Visibility, 41 | pub inherited_visibility: InheritedVisibility, 42 | pub view_visibility: ViewVisibility, 43 | } --------------------------------------------------------------------------------