From 82419d165d4fe97738e4ca81ec3cee35a2aa3300 Mon Sep 17 00:00:00 2001 From: Piotr Siuszko Date: Tue, 7 Jan 2025 17:31:55 +0100 Subject: [PATCH] Overhaul of the program --- .github/workflows/itch.yml | 6 +- .github/workflows/pages.yml | 4 +- .github/workflows/rust.yml | 2 + .gitignore | 2 + Cargo.lock | 2218 ++++++++++++++++- Cargo.toml | 70 +- crates/bevy_rpack/Cargo.toml | 23 + crates/bevy_rpack/src/bevy.rs | 151 ++ crates/bevy_rpack/src/lib.rs | 28 + {.cargo => crates/rpack/.cargo}/config.toml | 0 crates/rpack/Cargo.toml | 45 + Trunk.toml => crates/rpack/Trunk.toml | 0 {assets => crates/rpack/assets}/favicon.ico | Bin {assets => crates/rpack/assets}/icon-1024.png | Bin {assets => crates/rpack/assets}/icon-256.png | Bin .../rpack/assets}/icon_ios_touch_192.png | Bin {assets => crates/rpack/assets}/manifest.json | 0 .../rpack/assets}/maskable_icon_x512.png | Bin {assets => crates/rpack/assets}/sw.js | 0 build.rs => crates/rpack/build.rs | 0 check.sh => crates/rpack/check.sh | 0 index.html => crates/rpack/index.html | 0 rust-toolchain => crates/rpack/rust-toolchain | 0 {src => crates/rpack/src}/app.rs | 261 +- {src => crates/rpack/src}/lib.rs | 0 {src => crates/rpack/src}/main.rs | 0 .../rpack/static}/JetBrainsMono-SemiBold.ttf | Bin .../rpack/static}/JetBrainsMonoNL-Regular.ttf | Bin crates/rpack_cli/Cargo.toml | 18 + crates/rpack_cli/src/lib.rs | 94 + crates/rpack_cli/src/main.rs | 66 + output.png | Bin 31844 -> 0 bytes 32 files changed, 2688 insertions(+), 300 deletions(-) create mode 100644 crates/bevy_rpack/Cargo.toml create mode 100644 crates/bevy_rpack/src/bevy.rs create mode 100644 crates/bevy_rpack/src/lib.rs rename {.cargo => crates/rpack/.cargo}/config.toml (100%) create mode 100644 crates/rpack/Cargo.toml rename Trunk.toml => crates/rpack/Trunk.toml (100%) rename {assets => crates/rpack/assets}/favicon.ico (100%) rename {assets => crates/rpack/assets}/icon-1024.png (100%) rename {assets => crates/rpack/assets}/icon-256.png (100%) rename {assets => crates/rpack/assets}/icon_ios_touch_192.png (100%) rename {assets => crates/rpack/assets}/manifest.json (100%) rename {assets => crates/rpack/assets}/maskable_icon_x512.png (100%) rename {assets => crates/rpack/assets}/sw.js (100%) rename build.rs => crates/rpack/build.rs (100%) rename check.sh => crates/rpack/check.sh (100%) rename index.html => crates/rpack/index.html (100%) rename rust-toolchain => crates/rpack/rust-toolchain (100%) rename {src => crates/rpack/src}/app.rs (68%) rename {src => crates/rpack/src}/lib.rs (100%) rename {src => crates/rpack/src}/main.rs (100%) rename {static => crates/rpack/static}/JetBrainsMono-SemiBold.ttf (100%) rename {static => crates/rpack/static}/JetBrainsMonoNL-Regular.ttf (100%) create mode 100644 crates/rpack_cli/Cargo.toml create mode 100644 crates/rpack_cli/src/lib.rs create mode 100644 crates/rpack_cli/src/main.rs delete mode 100644 output.png diff --git a/.github/workflows/itch.yml b/.github/workflows/itch.yml index a8092fc..7b9a067 100644 --- a/.github/workflows/itch.yml +++ b/.github/workflows/itch.yml @@ -31,17 +31,21 @@ jobs: - name: Rust Cache # cache the rust build artefacts uses: Swatinem/rust-cache@v2 - name: Download and install Trunk binary + working-directory: crates/rpack run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf- - name: Update file + working-directory: crates/rpack run: sed -i '15d' index.html - name: Build + working-directory: crates/rpack run: ./trunk build --release - name: Update result file + working-directory: crates/rpack run: sed -i 's|/rpack|./rpack|g' dist/index.html - name: Itch.io - Publish uses: KikimoraGames/itch-publish@v0.0.3 with: - gameData: ./dist + gameData: ./crates/rpack/dist itchUsername: mevlyshkin itchGameId: rpack buildChannel: wasm diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index d1176b0..2ac5f19 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -31,8 +31,10 @@ jobs: - name: Rust Cache # cache the rust build artefacts uses: Swatinem/rust-cache@v2 - name: Download and install Trunk binary + working-directory: crates/rpack run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf- - name: Build # build + working-directory: crates/rpack # "${GITHUB_REPOSITORY#*/}" evaluates into the name of the repository # using --public-url something will allow trunk to modify all the href paths like from favicon.ico to repo_name/favicon.ico . # this is necessary for github pages where the site is deployed to username.github.io/repo_name and all files must be requested @@ -42,7 +44,7 @@ jobs: - name: Deploy uses: JamesIves/github-pages-deploy-action@v4 with: - folder: dist + folder: crates/rpack/dist # this option will not maintain any history of your previous pages deployment # set to false if you want all page build to be committed to your gh-pages branch history single-commit: true diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index f54d231..0c095ae 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -101,6 +101,8 @@ jobs: target: wasm32-unknown-unknown override: true - name: Download and install Trunk binary + working-directory: crates/rpack run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf- - name: Build + working-directory: crates/rpack run: ./trunk build diff --git a/.gitignore b/.gitignore index 3567afd..e42b161 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /target +/crates/*/target +/crates/rpack/dist /dist skyline-packer-output.png result.png diff --git a/Cargo.lock b/Cargo.lock index 53391e0..9d6a945 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,7 @@ dependencies = [ "accesskit_consumer", "atspi-common", "serde", - "thiserror", + "thiserror 1.0.69", "zvariant 4.2.0", ] @@ -49,7 +49,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" dependencies = [ "accesskit", - "hashbrown", + "hashbrown 0.15.2", "immutable-chunkmap", ] @@ -61,7 +61,7 @@ checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.2", "objc2", "objc2-app-kit", "objc2-foundation", @@ -93,7 +93,7 @@ checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.2", "paste", "static_assertions", "windows", @@ -127,6 +127,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "const-random", + "getrandom", "once_cell", "serde", "version_check", @@ -142,6 +144,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-activity" version = "0.6.0" @@ -158,9 +172,9 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -169,6 +183,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" +[[package]] +name = "android_log-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.18" @@ -218,6 +247,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arboard" version = "3.4.1" @@ -233,6 +274,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -245,6 +297,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + [[package]] name = "ashpd" version = "0.10.2" @@ -267,13 +328,34 @@ dependencies = [ "zbus 5.2.0", ] +[[package]] +name = "assert_type_match" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + [[package]] name = "async-broadcast" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener", + "event-listener 5.3.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -340,7 +422,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -369,7 +451,7 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener", + "event-listener 5.3.1", "futures-lite", "rustix", "tracing", @@ -427,6 +509,12 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atomicow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467163b50876d3a4a44da5f4dbd417537e522fc059ede8d518d57941cfb3d745" + [[package]] name = "atspi" version = "0.22.0" @@ -484,6 +572,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.21.7" @@ -496,6 +607,730 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bevy" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2a21c9f3306676077a88700bb8f354be779cf9caba9c21e94da9e696751af4" +dependencies = [ + "bevy_internal", +] + +[[package]] +name = "bevy_a11y" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f96642402d2cd7c8e58c5994bbd14a2e44ca72dd7e460a2edad82aa3bf0348f9" +dependencies = [ + "accesskit", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_reflect", +] + +[[package]] +name = "bevy_app" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "454a8cfd134864dcdcba6ee56fb958531b981021bba6bb2037c9e3df6046603c" +dependencies = [ + "bevy_derive", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "console_error_panic_hook", + "ctrlc", + "derive_more", + "downcast-rs", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "bevy_asset" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d762dd4422fb6219fd904e514a4a5d1d451711a0a8e1d6495dea15a545f04f3" +dependencies = [ + "async-broadcast 0.5.1", + "async-fs", + "async-lock", + "atomicow", + "bevy_app", + "bevy_asset_macros", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "bitflags 2.6.0", + "blake3", + "crossbeam-channel", + "derive_more", + "disqualified", + "downcast-rs", + "either", + "futures-io", + "futures-lite", + "js-sys", + "parking_lot", + "ron", + "serde", + "stackfuture", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "bevy_asset_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8db6957e3f9649d415ee613901cf487898d0339455aa9c3a2525fc37facee920" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_color" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00aa2966c7ca0c7dd39f5ba8f3b1eaa5c2005a93ffdefb7a4090150d8327678" +dependencies = [ + "bevy_math", + "bevy_reflect", + "bytemuck", + "derive_more", + "encase", + "serde", + "wgpu-types", +] + +[[package]] +name = "bevy_core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ff28118f5ae3193f7f6cab30d4fd4246ba1802776910ab256dc7c20e8696381" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "uuid", +] + +[[package]] +name = "bevy_core_pipeline" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0c0eea548a55fd04acf01d351bd16da4d1198037cb9c7b98dea6519f5d7dade" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.6.0", + "derive_more", + "nonmax", + "radsort", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b962df2a1bef274ae76ec75279eb6f8ef0ffd85b5e4c43433f5d08ba57b3d071" +dependencies = [ + "bevy_macro_utils", + "quote", + "syn", +] + +[[package]] +name = "bevy_diagnostic" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21fe41b22fdf47bf11f0a3ca3e61975b003e86fa44d87e070f2dc7e752dd99f5" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_tasks", + "bevy_time", + "bevy_utils", + "const-fnv1a-hash", +] + +[[package]] +name = "bevy_ecs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b747210d7db09dfacc237707d4fd31c8b43d7744cd5e5829e2c4ca86b9e47baf" +dependencies = [ + "bevy_ecs_macros", + "bevy_ptr", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bitflags 2.6.0", + "concurrent-queue", + "derive_more", + "disqualified", + "fixedbitset 0.5.7", + "nonmax", + "petgraph", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_ecs_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d36ba5874ee278d20f17b8934d2969f8fbab90f3ea3fcf8d3583814b3661ada" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_encase_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46db3d4ebc2ab23045a7d32fa1afb4be78894ec3fbe2f52b28f6cd6e4011e400" +dependencies = [ + "bevy_macro_utils", + "encase_derive_impl", +] + +[[package]] +name = "bevy_gizmos" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca821905afffe1f3aaf33b496903a24a0c980e4c83fa7523fb41eac16892a57a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_gizmos_macros", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bytemuck", +] + +[[package]] +name = "bevy_gizmos_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19843a638c93364950ca54a879832f325be7fa9b89f226fced3b4105594afb70" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_hierarchy" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9aab2cd1684d30f2eedf953b6377a6416fd6b482f8145b6c05f4684bd60c3e" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "disqualified", + "smallvec", +] + +[[package]] +name = "bevy_image" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c5942a7d681b81aa9723bb1d918135c2f88e7871331f5676119c86c01984759" +dependencies = [ + "bevy_asset", + "bevy_color", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "bitflags 2.6.0", + "bytemuck", + "derive_more", + "futures-lite", + "image", + "serde", + "wgpu", +] + +[[package]] +name = "bevy_input" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9bbf39c1d2d33350e03354a67bebee5c21973c5203b1456a9a4b90a5e6f8e75" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "derive_more", + "smol_str", +] + +[[package]] +name = "bevy_internal" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7fc4db9a1793ee71f79abb15e7a8fcfe4e2081e5f18ed91b802bf6cf30e088" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_gizmos", + "bevy_hierarchy", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_picking", + "bevy_ptr", + "bevy_reflect", + "bevy_render", + "bevy_scene", + "bevy_sprite", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", +] + +[[package]] +name = "bevy_log" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774238dcf70a0ef4d82aa2860b24b1cffdd4633f3694d3bcbfbb05c4f17ae4fe" +dependencies = [ + "android_log-sys", + "bevy_app", + "bevy_ecs", + "bevy_utils", + "tracing-log", + "tracing-oslog", + "tracing-subscriber", + "tracing-wasm", +] + +[[package]] +name = "bevy_macro_utils" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bdb3a681c24abace65bf18ed467ad8befbedb42468b32e459811bfdb01e506c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "toml_edit", +] + +[[package]] +name = "bevy_math" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edec18d90e6bab27b5c6131ee03172ece75b7edd0abe4e482a26d6db906ec357" +dependencies = [ + "bevy_reflect", + "derive_more", + "glam", + "itertools 0.13.0", + "rand", + "rand_distr", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_mesh" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183abae7c6695a80d7408c860bd737410cd66d2a9f910dafc914485da06e43dc" +dependencies = [ + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mikktspace", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "bitflags 2.6.0", + "bytemuck", + "derive_more", + "hexasphere", + "serde", + "wgpu", +] + +[[package]] +name = "bevy_mikktspace" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b53f0cf879a0682280937f515ecf00ab2140f7224881d6a621f40093a36a2ef6" +dependencies = [ + "glam", +] + +[[package]] +name = "bevy_picking" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125e0c7327ec155c566c044c6eefd1a02e904134fa5dc0ba54665e06a35297b0" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "uuid", +] + +[[package]] +name = "bevy_ptr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa65df6a190b7dfc84d79f09cf02d47ae046fa86a613e202c31559e06d8d3710" + +[[package]] +name = "bevy_reflect" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab3264acc3b6f48bc23fbd09fdfea6e5d9b7bfec142e4f3333f532acf195bca" +dependencies = [ + "assert_type_match", + "bevy_ptr", + "bevy_reflect_derive", + "bevy_utils", + "derive_more", + "disqualified", + "downcast-rs", + "erased-serde", + "glam", + "serde", + "smallvec", + "smol_str", + "uuid", +] + +[[package]] +name = "bevy_reflect_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f83876a322130ab38a47d5dcf75258944bf76b3387d1acdb3750920fda63e2" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", + "uuid", +] + +[[package]] +name = "bevy_render" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b14d77d8ff589743237c98502c0e47fd31059cf348ab86a265c4f90bb5e2a22" +dependencies = [ + "async-channel", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_encase_derive", + "bevy_hierarchy", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_reflect", + "bevy_render_macros", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bytemuck", + "codespan-reporting", + "derive_more", + "downcast-rs", + "encase", + "futures-lite", + "image", + "js-sys", + "naga", + "naga_oil", + "nonmax", + "offset-allocator", + "send_wrapper", + "serde", + "smallvec", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_render_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "285769c193b832d67c5742a716c6063db573573d5df5ce0c41aa7584ef0e348e" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_rpack" +version = "0.1.0" +dependencies = [ + "bevy", + "serde", + "serde_json", + "thiserror 2.0.9", +] + +[[package]] +name = "bevy_scene" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd00a08d01a190a826a5f6ad0fcb3dbf7bd1bd4f64ebe6108c38384691a21111" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "derive_more", + "serde", + "uuid", +] + +[[package]] +name = "bevy_sprite" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c7d22da88e562fb2ae8fe7f8cc749d3024caa4dcb57a777d070ef9141577aa" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_picking", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.6.0", + "bytemuck", + "derive_more", + "fixedbitset 0.5.7", + "guillotiere", + "nonmax", + "radsort", + "rectangle-pack", +] + +[[package]] +name = "bevy_tasks" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c28f2db2619203aa82342dbbe77e49aeea4f933212c0b7a1f285e94c4008e5b" +dependencies = [ + "async-executor", + "futures-channel", + "futures-lite", + "pin-project", + "wasm-bindgen-futures", +] + +[[package]] +name = "bevy_time" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3108ed1ef864bc40bc859ba4c9c3844213c7be3674f982203cf5d87c656848" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "crossbeam-channel", +] + +[[package]] +name = "bevy_transform" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056fabcedbf0503417af69447d47a983e18c7cfb5e6b6728636be3ec285cbcfa" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "derive_more", +] + +[[package]] +name = "bevy_utils" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f01088c048960ea50ee847c3f668942ecf49ed26be12a1585a5e59b6a941d9a" +dependencies = [ + "ahash", + "bevy_utils_proc_macros", + "getrandom", + "hashbrown 0.14.5", + "thread_local", + "tracing", + "web-time", +] + +[[package]] +name = "bevy_utils_proc_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0c3244d543cc964545b7aa074f6fb18a915a7121cf3de5d7ed37a4aae8662d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_window" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36139955777cc9e7a40a97833ff3a95b7401ce525a3dbac05fc52557968b31a7" +dependencies = [ + "android-activity", + "bevy_a11y", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "raw-window-handle", + "smol_str", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bit_field" version = "0.10.2" @@ -517,6 +1352,31 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "blake3" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -548,6 +1408,12 @@ dependencies = [ "piper", ] +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -603,7 +1469,7 @@ dependencies = [ "polling", "rustix", "slab", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -635,12 +1501,37 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "cfg_aliases" version = "0.2.1" @@ -656,6 +1547,57 @@ dependencies = [ "libc", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "clipboard-win" version = "5.4.0" @@ -665,6 +1607,16 @@ dependencies = [ "error-code", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -696,6 +1648,69 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-fnv1a-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_panic" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53857514f72ee4a2b583de67401e3ff63a5472ca4acf289d09a9ea7636dfec17" + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "constgebra" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" +dependencies = [ + "const_soft_float", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -764,6 +1779,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -805,18 +1829,55 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + [[package]] name = "cursor-icon" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + [[package]] name = "data-url" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "digest" version = "0.10.7" @@ -844,6 +1905,12 @@ dependencies = [ "syn", ] +[[package]] +name = "disqualified" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd" + [[package]] name = "dlib" version = "0.5.2" @@ -897,11 +1964,11 @@ dependencies = [ "egui", "egui-winit", "egui_glow", - "glow", + "glow 0.16.0", "glutin", "glutin-winit", "home", - "image 0.25.5", + "image", "js-sys", "log", "objc2", @@ -970,7 +2037,7 @@ dependencies = [ "egui", "ehttp", "enum-map", - "image 0.25.5", + "image", "log", "mime_guess2", "profiling", @@ -986,7 +2053,7 @@ dependencies = [ "ahash", "bytemuck", "egui", - "glow", + "glow 0.16.0", "log", "memoffset", "profiling", @@ -1034,6 +2101,38 @@ dependencies = [ "serde", ] +[[package]] +name = "encase" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror 1.0.69", +] + +[[package]] +name = "encase_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "endi" version = "1.1.0" @@ -1147,6 +2246,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.10" @@ -1163,6 +2272,21 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "event-listener" version = "5.3.1" @@ -1180,7 +2304,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1214,6 +2338,18 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" version = "1.0.35" @@ -1373,8 +2509,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1398,6 +2536,35 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" +dependencies = [ + "bytemuck", + "rand", + "serde", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "glow" version = "0.16.0" @@ -1417,7 +2584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec69412a0bf07ea7607e638b415447857a808846c2b685a43c8aa18bc6d5e499" dependencies = [ "bitflags 2.6.0", - "cfg_aliases", + "cfg_aliases 0.2.1", "cgl", "core-foundation 0.9.4", "dispatch", @@ -1438,7 +2605,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" dependencies = [ - "cfg_aliases", + "cfg_aliases 0.2.1", "glutin", "raw-window-handle", "winit", @@ -1463,6 +2630,67 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.6.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +dependencies = [ + "bitflags 2.6.0", + "gpu-descriptor-types", + "hashbrown 0.15.2", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + [[package]] name = "half" version = "2.4.1" @@ -1473,6 +2701,17 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + [[package]] name = "hashbrown" version = "0.15.2" @@ -1482,6 +2721,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.4.0" @@ -1494,6 +2739,23 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hexasphere" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" +dependencies = [ + "constgebra", + "glam", + "tinyvec", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + [[package]] name = "home" version = "0.5.11" @@ -1648,24 +2910,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-traits", - "png", - "qoi", - "tiff", -] - [[package]] name = "image" version = "0.25.5" @@ -1675,9 +2919,28 @@ dependencies = [ "bytemuck", "byteorder-lite", "color_quant", + "exr", "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +dependencies = [ + "byteorder-lite", + "quick-error", ] [[package]] @@ -1686,6 +2949,12 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "immutable-chunkmap" version = "2.0.6" @@ -1702,7 +2971,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1711,6 +2991,24 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -1728,7 +3026,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -1753,9 +3051,6 @@ name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" @@ -1767,6 +3062,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + [[package]] name = "khronos_api" version = "3.1.0" @@ -1782,6 +3088,12 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "lebe" version = "0.5.2" @@ -1794,6 +3106,16 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libfuzzer-sys" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.6" @@ -1804,6 +3126,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libredox" version = "0.1.3" @@ -1849,6 +3177,43 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1873,6 +3238,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.17" @@ -1889,6 +3269,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.2" @@ -1899,6 +3285,48 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set 0.8.0", + "bitflags 2.6.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "pp-rs", + "rustc-hash", + "spirv", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "naga_oil" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ea1f080bb359927cd5404d0af1e5e6758f4f2d82ecfbebb0a0c434764e40f1" +dependencies = [ + "bit-set 0.5.3", + "codespan-reporting", + "data-encoding", + "indexmap", + "naga", + "once_cell", + "regex", + "regex-syntax 0.8.5", + "rustc-hash", + "thiserror 1.0.69", + "tracing", + "unicode-ident", +] + [[package]] name = "ndk" version = "0.9.0" @@ -1908,10 +3336,10 @@ dependencies = [ "bitflags 2.6.0", "jni-sys", "log", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", "raw-window-handle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1920,6 +3348,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -1929,6 +3366,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -1937,7 +3380,7 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.6.0", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.2.1", "libc", "memoffset", ] @@ -1948,6 +3391,79 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1955,6 +3471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1978,6 +3495,15 @@ dependencies = [ "syn", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + [[package]] name = "objc-sys" version = "0.3.5" @@ -2181,6 +3707,16 @@ dependencies = [ "objc2-foundation", ] +[[package]] +name = "offset-allocator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e234d535da3521eb95106f40f0b73483d80bfb3aacf27c40d7e2b72f1a3e00a2" +dependencies = [ + "log", + "nonmax", +] + [[package]] name = "once_cell" version = "1.20.2" @@ -2206,6 +3742,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "owned_ttf_parser" version = "0.25.0" @@ -2256,6 +3798,16 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -2345,6 +3897,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "pp-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" +dependencies = [ + "unicode-xid", +] + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2354,6 +3915,22 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -2377,6 +3954,19 @@ name = "profiling" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] [[package]] name = "qoi" @@ -2387,6 +3977,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.30.0" @@ -2415,6 +4011,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radsort" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" + [[package]] name = "rand" version = "0.8.5" @@ -2445,6 +4047,72 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -2477,6 +4145,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" +[[package]] +name = "rectangle-pack" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2503,8 +4177,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -2515,15 +4198,27 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + [[package]] name = "resvg" version = "0.37.0" @@ -2613,10 +4308,11 @@ dependencies = [ "egui_extras", "egui_json_tree", "env_logger", - "image 0.24.9", + "image", "js-sys", "log", "rfd", + "rpack_cli", "serde", "serde_json", "texture_packer", @@ -2625,6 +4321,25 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rpack_cli" +version = "0.0.0" +dependencies = [ + "bevy_rpack", + "clap", + "glob", + "image", + "serde", + "serde_json", + "texture_packer", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustix" version = "0.38.42" @@ -2697,6 +4412,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" version = "1.0.217" @@ -2740,6 +4461,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2751,6 +4481,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2772,6 +4511,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simplecss" version = "0.2.2" @@ -2825,7 +4573,7 @@ dependencies = [ "log", "memmap2", "rustix", - "thiserror", + "thiserror 1.0.69", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -2862,12 +4610,27 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stackfuture" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2883,12 +4646,24 @@ dependencies = [ "float-cmp", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "svg_fmt" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" + [[package]] name = "svgtypes" version = "0.13.0" @@ -2921,6 +4696,25 @@ dependencies = [ "syn", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.15.0" @@ -2936,12 +4730,21 @@ dependencies = [ ] [[package]] -name = "texture_packer" -version = "0.27.0" +name = "termcolor" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c482ad3cce686643fd76c82255947382fbf8aa859e9f09a653811ebb86dadcb9" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ - "image 0.24.9", + "winapi-util", +] + +[[package]] +name = "texture_packer" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd18766b2465d3a40ca28d9f62446ae872624ba0fdc060b24f11ee6b7e70d59" +dependencies = [ + "image", ] [[package]] @@ -2950,7 +4753,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -2964,6 +4776,27 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.9.1" @@ -2975,6 +4808,15 @@ dependencies = [ "weezl", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -3011,11 +4853,41 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3024,6 +4896,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3057,6 +4931,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-oslog" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" +dependencies = [ + "bindgen", + "cc", + "cfg-if", + "once_cell", + "parking_lot", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", ] [[package]] @@ -3065,6 +4995,12 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + [[package]] name = "typenum" version = "1.17.0" @@ -3100,6 +5036,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -3202,6 +5150,39 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -3440,6 +5421,112 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec 0.8.0", + "bitflags 2.6.0", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror 1.0.69", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set 0.8.0", + "bitflags 2.6.0", + "block", + "bytemuck", + "cfg_aliases 0.1.1", + "core-graphics-types", + "glow 0.14.2", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows", + "windows-core", +] + +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.6.0", + "js-sys", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" @@ -3751,7 +5838,7 @@ dependencies = [ "bitflags 2.6.0", "block2", "calloop", - "cfg_aliases", + "cfg_aliases 0.2.1", "concurrent-queue", "core-foundation 0.9.4", "core-graphics", @@ -3895,7 +5982,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ - "async-broadcast", + "async-broadcast 0.7.2", "async-executor", "async-fs", "async-io", @@ -3906,7 +5993,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener", + "event-listener 5.3.1", "futures-core", "futures-sink", "futures-util", @@ -3933,7 +6020,7 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb67eadba43784b6fb14857eba0d8fc518686d3ee537066eb6086dc318e2c8a1" dependencies = [ - "async-broadcast", + "async-broadcast 0.7.2", "async-executor", "async-fs", "async-io", @@ -3944,7 +6031,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener", + "event-listener 5.3.1", "futures-core", "futures-util", "hex", @@ -4121,6 +6208,12 @@ dependencies = [ "syn", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -4130,6 +6223,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.2.0" diff --git a/Cargo.toml b/Cargo.toml index 6ee5b62..ad77eb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,64 +1,18 @@ -[package] -name = "rpack" -version = "0.1.0" -authors = ["Piotr Siuszko "] -edition = "2021" -rust-version = "1.81" -repository = "https://github.com/Leinnan/rpack.git" -homepage = "https://github.com/Leinnan/rpack" - - -[dependencies] -egui = "0.30" -eframe = { version = "0.30", default-features = false, features = [ - "accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies. - "default_fonts", # Embed the default egui fonts. - "glow", # Use the glow rendering backend. Alternative: "wgpu". - "persistence", # Enable restoring app state when restarting the app. -] } -log = "0.4" -serde_json = "1" -egui_json_tree = "0.10" - -# You only need serde if you want app persistence: -serde = { version = "1", features = ["derive"] } -texture_packer = { version = "0.27.0", features = ["common"] } -image = { version = "0.24", features = ["jpeg", "png"] } -egui_extras = { version = "*", features = ["all_loaders"] } -rfd = { version = "0.15", features = [] } -wasm-bindgen-futures = "0.4" - -# native: -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -env_logger = "0.11" - -# web: -[target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen-futures = "0.4" -wasm-bindgen = "0.2" -web-sys = { version = "0.3", features = [ - "Url", - "HtmlAnchorElement", - "Blob", - "BlobPropertyBag", -] } -js-sys = "0.3" - +[workspace] +resolver = "2" +members = [ + "crates/bevy_rpack", + "crates/rpack", + "crates/rpack_cli", +] [profile.release] -opt-level = 2 # fast and small wasm +opt-level = 'z' +panic = 'abort' +lto = true +strip = true + # Optimize all dependencies even in debug builds: [profile.dev.package."*"] opt-level = 2 - - -[patch.crates-io] - -# If you want to use the bleeding edge version of egui and eframe: -# egui = { git = "https://github.com/emilk/egui", branch = "master" } -# eframe = { git = "https://github.com/emilk/egui", branch = "master" } - -# If you fork https://github.com/emilk/egui you can test with: -# egui = { path = "../egui/crates/egui" } -# eframe = { path = "../egui/crates/eframe" } diff --git a/crates/bevy_rpack/Cargo.toml b/crates/bevy_rpack/Cargo.toml new file mode 100644 index 0000000..07da8ed --- /dev/null +++ b/crates/bevy_rpack/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "bevy_rpack" +description = "Bevy plugin with rpack atlas support" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Leinnan/rpack" +authors = ["Piotr Siuszko "] +license = "MIT OR Apache-2.0" +keywords = ["bevy", "2d", "plugin"] + +[features] +default = ["bevy"] +bevy = ["dep:bevy"] + +[dependencies] +bevy = { version = "0.15", optional = true, default-features = false, features = [ + "bevy_asset", + "bevy_sprite", + "bevy_image", +] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "2.0" \ No newline at end of file diff --git a/crates/bevy_rpack/src/bevy.rs b/crates/bevy_rpack/src/bevy.rs new file mode 100644 index 0000000..e8845f5 --- /dev/null +++ b/crates/bevy_rpack/src/bevy.rs @@ -0,0 +1,151 @@ +use crate::{AtlasAsset, SerializableRect}; +use bevy::asset::{AssetLoader, AsyncReadExt}; +use bevy::image::ImageSampler; +use bevy::{prelude::*, utils::HashMap}; +use thiserror::Error; + +/// This is an asset containing the texture atlas image, the texture atlas layout, and a map of the original file names to their corresponding indices in the texture atlas. +#[derive(Asset, Debug, Reflect)] +pub struct RpackAtlasAsset { + /// The texture atlas image. + pub image: Handle, + /// The texture atlas layout. + pub atlas: Handle, + /// The map of the original file names to indices of the texture atlas. + pub files: HashMap, +} + +impl From for URect { + fn from(val: SerializableRect) -> Self { + URect { + min: UVec2 { x: val.x, y: val.y }, + max: UVec2 { + x: val.x + val.w, + y: val.y + val.h, + }, + } + } +} + +impl RpackAtlasAsset { + // When atlas contains the given key returns a copy of TextureAtlas and Image + pub fn get_atlas_data>(&self, key: T) -> Option<(TextureAtlas, Handle)> { + self.files.get(key.as_ref()).map(|s| { + ( + TextureAtlas { + index: *s, + layout: self.atlas.clone(), + }, + self.image.clone(), + ) + }) + } + // When atlas contains the given key creates a Sprite component + pub fn make_sprite>(&self, key: T) -> Option { + if let Some((atlas, image)) = self.get_atlas_data(key) { + Some(Sprite { + image, + texture_atlas: Some(atlas), + ..Default::default() + }) + } else { + None + } + } +} + +pub struct RpackAssetPlugin; + +impl Plugin for RpackAssetPlugin { + fn build(&self, app: &mut App) { + app.register_type::(); + app.init_asset::(); + app.init_asset_loader::(); + } +} + +#[non_exhaustive] +#[derive(Debug, Error)] +pub enum RpackAtlasAssetError { + /// An [IO](std::io) Error that occured + /// during parsing of a `.rpack.json` file. + #[error("could not load asset: {0}")] + Io(#[from] std::io::Error), + #[error("could not parse asset: {0}")] + ParsinError(#[from] serde_json::Error), + /// A Bevy [`LoadDirectError`](bevy::asset::LoadDirectError) that occured + /// while loading a [`RpackAtlasAsset::image`](crate::RpackAtlasAsset::image). + #[error("could not load asset: {0}")] + LoadDirect(Box), + /// An error that can occur if there is + /// trouble loading the image asset of + /// an atlas. + #[error("missing image asset: {0}")] + LoadingImageAsset(String), +} + +impl From for RpackAtlasAssetError { + fn from(value: bevy::asset::LoadDirectError) -> Self { + Self::LoadDirect(Box::new(value)) + } +} + +#[derive(Default)] +pub struct RpackAtlasAssetLoader; + +impl AssetLoader for RpackAtlasAssetLoader { + type Asset = RpackAtlasAsset; + type Settings = (); + type Error = RpackAtlasAssetError; + + fn extensions(&self) -> &[&str] { + &["rpack.json"] + } + + async fn load( + &self, + reader: &mut dyn bevy::asset::io::Reader, + _settings: &(), + load_context: &mut bevy::asset::LoadContext<'_>, + ) -> Result { + let mut file = String::new(); + reader.read_to_string(&mut file).await?; + let asset: AtlasAsset = serde_json::from_str(&file)?; + + let path = load_context + .asset_path() + .path() + .parent() + .unwrap_or(&std::path::Path::new("")) + .join(asset.name); + + let mut image: Image = load_context + .loader() + .immediate() + .with_unknown_type() + .load(path) + .await? + .take() + .ok_or(RpackAtlasAssetError::LoadingImageAsset( + "failed to load image asset, does it exist".to_string(), + ))?; + image.sampler = ImageSampler::nearest(); + + let mut layout = TextureAtlasLayout::new_empty(UVec2::new(asset.size[0], asset.size[1])); + let mut files = HashMap::new(); + + for frame in asset.frames { + let id = layout.add_texture(frame.frame.into()); + files.insert(frame.key, id); + } + + let atlas = load_context.add_labeled_asset("atlas_layout".into(), layout); + let image = load_context.add_labeled_asset("atlas_texture".into(), image); + + Ok(RpackAtlasAsset { + image, + atlas, + files, + }) + } +} diff --git a/crates/bevy_rpack/src/lib.rs b/crates/bevy_rpack/src/lib.rs new file mode 100644 index 0000000..9ae8a7b --- /dev/null +++ b/crates/bevy_rpack/src/lib.rs @@ -0,0 +1,28 @@ +#[cfg(feature = "bevy")] +pub mod bevy; + +/// Defines a rectangle in pixels with the origin at the top-left of the texture atlas. +#[derive(Copy, Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct SerializableRect { + /// Horizontal position the rectangle begins at. + pub x: u32, + /// Vertical position the rectangle begins at. + pub y: u32, + /// Width of the rectangle. + pub w: u32, + /// Height of the rectangle. + pub h: u32, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct AtlasFrame { + pub key: String, + pub frame: SerializableRect, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct AtlasAsset { + pub size: [u32; 2], + pub name: String, + pub frames: Vec, +} diff --git a/.cargo/config.toml b/crates/rpack/.cargo/config.toml similarity index 100% rename from .cargo/config.toml rename to crates/rpack/.cargo/config.toml diff --git a/crates/rpack/Cargo.toml b/crates/rpack/Cargo.toml new file mode 100644 index 0000000..120efc9 --- /dev/null +++ b/crates/rpack/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "rpack" +version = "0.1.0" +authors = ["Piotr Siuszko "] +edition = "2021" +rust-version = "1.81" +repository = "https://github.com/Leinnan/rpack.git" +homepage = "https://github.com/Leinnan/rpack" + +[dependencies] +egui = "0.30" +eframe = { version = "0.30", default-features = false, features = [ + "accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies. + "default_fonts", # Embed the default egui fonts. + "glow", # Use the glow rendering backend. Alternative: "wgpu". + "persistence", # Enable restoring app state when restarting the app. +] } +log = "0.4" +egui_json_tree = "0.10" +rpack_cli = { default-features = false, path = "../rpack_cli" } + +# You only need serde if you want app persistence: +serde = { version = "1", features = ["derive"] } +serde_json = "1" +texture_packer = { version = "0.29", features = ["common"] } +image = { version = "0.25", features = ["jpeg", "png"] } +egui_extras = { version = "*", features = ["all_loaders"] } +rfd = { version = "0.15", features = [] } +wasm-bindgen-futures = "0.4" + +# native: +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +env_logger = "0.11" + +# web: +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm-bindgen-futures = "0.4" +wasm-bindgen = "0.2" +web-sys = { version = "0.3", features = [ + "Url", + "HtmlAnchorElement", + "Blob", + "BlobPropertyBag", +] } +js-sys = "0.3" diff --git a/Trunk.toml b/crates/rpack/Trunk.toml similarity index 100% rename from Trunk.toml rename to crates/rpack/Trunk.toml diff --git a/assets/favicon.ico b/crates/rpack/assets/favicon.ico similarity index 100% rename from assets/favicon.ico rename to crates/rpack/assets/favicon.ico diff --git a/assets/icon-1024.png b/crates/rpack/assets/icon-1024.png similarity index 100% rename from assets/icon-1024.png rename to crates/rpack/assets/icon-1024.png diff --git a/assets/icon-256.png b/crates/rpack/assets/icon-256.png similarity index 100% rename from assets/icon-256.png rename to crates/rpack/assets/icon-256.png diff --git a/assets/icon_ios_touch_192.png b/crates/rpack/assets/icon_ios_touch_192.png similarity index 100% rename from assets/icon_ios_touch_192.png rename to crates/rpack/assets/icon_ios_touch_192.png diff --git a/assets/manifest.json b/crates/rpack/assets/manifest.json similarity index 100% rename from assets/manifest.json rename to crates/rpack/assets/manifest.json diff --git a/assets/maskable_icon_x512.png b/crates/rpack/assets/maskable_icon_x512.png similarity index 100% rename from assets/maskable_icon_x512.png rename to crates/rpack/assets/maskable_icon_x512.png diff --git a/assets/sw.js b/crates/rpack/assets/sw.js similarity index 100% rename from assets/sw.js rename to crates/rpack/assets/sw.js diff --git a/build.rs b/crates/rpack/build.rs similarity index 100% rename from build.rs rename to crates/rpack/build.rs diff --git a/check.sh b/crates/rpack/check.sh similarity index 100% rename from check.sh rename to crates/rpack/check.sh diff --git a/index.html b/crates/rpack/index.html similarity index 100% rename from index.html rename to crates/rpack/index.html diff --git a/rust-toolchain b/crates/rpack/rust-toolchain similarity index 100% rename from rust-toolchain rename to crates/rpack/rust-toolchain diff --git a/src/app.rs b/crates/rpack/src/app.rs similarity index 68% rename from src/app.rs rename to crates/rpack/src/app.rs index 31e80f3..b0b692f 100644 --- a/src/app.rs +++ b/crates/rpack/src/app.rs @@ -1,103 +1,13 @@ -use std::{collections::HashMap, io::Cursor}; - use egui::{CollapsingHeader, Color32, DroppedFile, FontFamily, FontId, Image, RichText, Vec2}; use image::DynamicImage; -use serde_json::Value; -use texture_packer::{importer::ImageImporter, TexturePacker, TexturePackerConfig}; +use rpack_cli::{ImageFile, Spritesheet}; +use texture_packer::{importer::ImageImporter, TexturePackerConfig}; pub const MY_ACCENT_COLOR32: Color32 = Color32::from_rgb(230, 102, 1); pub const TOP_SIDE_MARGIN: f32 = 10.0; pub const HEADER_HEIGHT: f32 = 45.0; pub const TOP_BUTTON_WIDTH: f32 = 150.0; pub const GIT_HASH: &str = env!("GIT_HASH"); -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct AtlasFrame { - pub key: String, - pub frame: SerializableRect, -} - -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct AtlasAsset { - pub size: [u32; 2], - pub name: String, - pub frames: Vec, -} - -#[derive(Clone)] -pub struct Spritesheet { - pub data: Vec, - pub frames: HashMap>, - pub atlas_asset_json: Value, - pub size: (u32, u32), -} - -/// Boundaries and properties of a packed texture. -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct SerializableFrame { - /// Key used to uniquely identify this frame. - pub key: String, - /// Rectangle describing the texture coordinates and size. - pub frame: SerializableRect, - /// True if the texture was rotated during packing. - /// If it was rotated, it was rotated 90 degrees clockwise. - pub rotated: bool, - /// True if the texture was trimmed during packing. - pub trimmed: bool, - - // (x, y) is the trimmed frame position at original image - // (w, h) is original image size - // - // w - // +--------------+ - // | (x, y) | - // | ^ | - // | | | - // | ********* | - // | * * | h - // | * * | - // | ********* | - // | | - // +--------------+ - /// Source texture size before any trimming. - pub source: SerializableRect, -} - -impl From> for SerializableFrame { - fn from(value: texture_packer::Frame) -> Self { - SerializableFrame { - key: value.key, - frame: value.frame.into(), - rotated: value.rotated, - trimmed: value.trimmed, - source: value.source.into(), - } - } -} - -/// Defines a rectangle in pixels with the origin at the top-left of the texture atlas. -#[derive(Copy, Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct SerializableRect { - /// Horizontal position the rectangle begins at. - pub x: u32, - /// Vertical position the rectangle begins at. - pub y: u32, - /// Width of the rectangle. - pub w: u32, - /// Height of the rectangle. - pub h: u32, -} - -impl From for SerializableRect { - fn from(value: texture_packer::Rect) -> Self { - SerializableRect { - h: value.h, - w: value.w, - x: value.x, - y: value.y, - } - } -} - /// We derive Deserialize/Serialize so we can persist app state on shutdown. #[derive(serde::Deserialize, serde::Serialize)] #[serde(default)] // if we add new fields, give them default values when deserializing old state @@ -106,15 +16,14 @@ pub struct TemplateApp { dropped_files: Vec, #[serde(skip)] config: TexturePackerConfig, - #[serde(skip)] image: Option>, #[serde(skip)] + name: String, + #[serde(skip)] counter: i32, #[serde(skip)] - data: Option, - #[serde(skip)] - error: Option, + data: Option>, } impl Default for TemplateApp { @@ -132,7 +41,7 @@ impl Default for TemplateApp { counter: 0, image: None, data: None, - error: None, + name: String::from("Tilemap"), } } } @@ -171,103 +80,78 @@ impl TemplateApp { prefix } + pub fn image_from_dropped_file

(file: &DroppedFile, prefix: P) -> Option + where + P: AsRef, + { + let id; + #[cfg(not(target_arch = "wasm32"))] + { + let path = file.path.as_ref().unwrap().clone(); + id = path.to_str().unwrap().to_owned(); + } + #[cfg(target_arch = "wasm32")] + { + id = file.name.clone(); + } + let base_id = id.replace(".png", ""); + + let id = base_id + .strip_prefix(prefix.as_ref()) + .unwrap_or(&base_id) + .to_owned() + .replace("\\", "/"); + + let Some(image) = dynamic_image_from_file(file) else { + return None; + }; + Some(ImageFile { id, image }) + } fn build_atlas(&mut self, ctx: &egui::Context) { - self.error = None; - let mut packer = TexturePacker::new_skyline(self.config); let prefix = Self::get_common_prefix(&self.dropped_files); println!("Prefix: {}", prefix); - for file in &self.dropped_files { - let base_id = file_path(file); - let id = base_id - .strip_prefix(&prefix) - .unwrap_or(&base_id) - .to_owned() - .replace("\\", "/"); - println!("Base id: {}, ID: {}", &base_id, &id); - let texture = dynamic_image_from_file(file); - let can_pack = packer.can_pack(&texture); + let images: Vec = self + .dropped_files + .iter() + .flat_map(|f| Self::image_from_dropped_file(f, &prefix)) + .collect(); - if can_pack { - packer.pack_own(id, texture).unwrap(); - } else { - self.error = Some(format!( - "Consider making atlas bigger. Could not make atlas, failed on: {}", - id - )); - return; - } + self.data = Some(Spritesheet::build( + self.config, + &images, + "name".to_owned(), + )); + if let Some(Ok(data)) = &self.data { + ctx.include_bytes("bytes://output.png", data.image_data.clone()); + self.image = + Some(Image::from_uri("bytes://output.png").max_size(Vec2::new(256.0, 256.0))); } - for (name, frame) in packer.get_frames() { - println!(" {:7} : {:?}", name, frame.frame); - } - let mut out_vec = vec![]; - let exported_image = texture_packer::exporter::ImageExporter::export(&packer).unwrap(); - let mut img = image::DynamicImage::new_rgba8(self.config.max_width, self.config.max_height); - image::imageops::overlay(&mut img, &exported_image, 0, 0); - - img.write_to(&mut Cursor::new(&mut out_vec), image::ImageFormat::Png) - .unwrap(); - let atlas = AtlasAsset { - size: [img.width(), img.height()], - name: "Atlas".to_owned(), - frames: packer - .get_frames() - .values() - .map(|v| -> AtlasFrame { - AtlasFrame { - key: v.key.clone(), - frame: SerializableRect { - x: v.frame.x, - y: v.frame.y, - w: v.frame.w, - h: v.frame.h, - }, - } - }) - .collect(), - }; - let frames_string = serde_json::to_string_pretty(&atlas).unwrap(); - - let atlas_asset_json = serde_json::from_str(&frames_string).unwrap(); - self.data = Some(Spritesheet { - data: out_vec.clone(), - frames: packer.get_frames().clone(), - size: (img.width(), img.height()), - atlas_asset_json, - }); - let id = format!("bytes://output_{}.png", self.counter); - self.image = None; - ctx.forget_image(&id); - self.counter += 1; - - let id = format!("bytes://output_{}.png", self.counter); - ctx.include_bytes(id.clone(), out_vec.clone()); - self.image = Some(Image::from_uri(id.clone()).max_size(Vec2::new(256.0, 256.0))); ctx.request_repaint(); } fn save_atlas(&mut self) { - if self.data.is_none() { + let Some(Ok(data)) = &self.data else { return; - } + }; + let data = data.image_data.clone(); + let filename = format!("{}.png", self.name); #[cfg(not(target_arch = "wasm32"))] { - let data = self.data.clone().unwrap().data; use std::io::Write; let path_buf = rfd::FileDialog::new() .set_directory(".") .add_filter("Image", &["png"]) - .set_file_name("output.png") + .set_file_name(filename) .save_file(); if let Some(path) = path_buf { let mut file = std::fs::File::create(path).unwrap(); let write_result = file.write_all(&data); if write_result.is_err() { - self.error = Some(format!( + self.data = Some(Err(format!( "Could not make atlas, error: {:?}", write_result.unwrap_err() - )); + ))); } else { println!("Output texture stored in {:?}", file); } @@ -275,11 +159,10 @@ impl TemplateApp { } #[cfg(target_arch = "wasm32")] { - let data = self.data.clone().unwrap().data; wasm_bindgen_futures::spawn_local(async move { let file = rfd::AsyncFileDialog::new() .set_directory(".") - .set_file_name("output.png") + .set_file_name(filename) .save_file() .await; match file { @@ -378,6 +261,8 @@ impl eframe::App for TemplateApp { ) .clicked() { + self.image = None; + ctx.forget_image("bytes://output.png"); self.build_atlas(ctx); } }); @@ -398,7 +283,7 @@ impl eframe::App for TemplateApp { }); egui::CentralPanel::default().show(ctx, |ui| { - if let Some(error) = &self.error { + if let Some(Err(error)) = &self.data { let text = egui::RichText::new(format!("Error: {}",&error)) .font(FontId::new(20.0, FontFamily::Name("semibold".into()))) .color(Color32::RED) @@ -413,6 +298,8 @@ impl eframe::App for TemplateApp { CollapsingHeader::new("Settings") .default_open(false) .show(ui, |ui| { + ui.label("Tilemap id"); + ui.text_edit_singleline(&mut self.name); ui.add( egui::Slider::new(&mut self.config.max_width, 64..=4096).text("Width"), ); @@ -435,9 +322,9 @@ impl eframe::App for TemplateApp { ui.with_layout(egui::Layout::top_down_justified(egui::Align::Min), |ui|{ egui::ScrollArea::vertical().auto_shrink(false).show(ui, |ui| { - if let Some(data) = &self.data { + if let Some(Ok(data)) = &self.data { ui.horizontal_top(|ui|{ - ui.label(format!("{} frames, size: {}x{}",data.frames.len(),data.size.0,data.size.1)); + ui.label(format!("{} frames, size: {}x{}",data.atlas_asset.frames.len(),data.atlas_asset.size[0],data.atlas_asset.size[1])); }); ui.label(RichText::new("Frames JSON").strong()); egui_json_tree::JsonTree::new("simple-tree", &data.atlas_asset_json).show(ui); @@ -506,20 +393,30 @@ fn file_path(file: &DroppedFile) -> String { id.replace(".png", "") } -fn dynamic_image_from_file(file: &DroppedFile) -> DynamicImage { +fn dynamic_image_from_file(file: &DroppedFile) -> Option { #[cfg(target_arch = "wasm32")] { - let bytes = file.bytes.as_ref().clone(); + let Some(bytes) = file.bytes.as_ref().clone() else { + return None; + }; - ImageImporter::import_from_memory(&bytes.unwrap()) - .expect("Unable to import file. Run this example with --features=\"png\"") + if let Ok(r) = ImageImporter::import_from_memory(&bytes.unwrap()) { + Some(r.into()) + } else { + None + } } #[cfg(not(target_arch = "wasm32"))] { - let path = file.path.as_ref().unwrap().clone(); + let Some(path) = file.path.as_ref() else { + return None; + }; - ImageImporter::import_from_file(&path) - .expect("Unable to import file. Run this example with --features=\"png\"") + if let Ok(r) = ImageImporter::import_from_file(path) { + Some(r) + } else { + None + } } } diff --git a/src/lib.rs b/crates/rpack/src/lib.rs similarity index 100% rename from src/lib.rs rename to crates/rpack/src/lib.rs diff --git a/src/main.rs b/crates/rpack/src/main.rs similarity index 100% rename from src/main.rs rename to crates/rpack/src/main.rs diff --git a/static/JetBrainsMono-SemiBold.ttf b/crates/rpack/static/JetBrainsMono-SemiBold.ttf similarity index 100% rename from static/JetBrainsMono-SemiBold.ttf rename to crates/rpack/static/JetBrainsMono-SemiBold.ttf diff --git a/static/JetBrainsMonoNL-Regular.ttf b/crates/rpack/static/JetBrainsMonoNL-Regular.ttf similarity index 100% rename from static/JetBrainsMonoNL-Regular.ttf rename to crates/rpack/static/JetBrainsMonoNL-Regular.ttf diff --git a/crates/rpack_cli/Cargo.toml b/crates/rpack_cli/Cargo.toml new file mode 100644 index 0000000..d706550 --- /dev/null +++ b/crates/rpack_cli/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "rpack_cli" +authors = ["Piotr Siuszko "] +license = "MIT" +edition = "2021" + +[features] +default = ["cli"] +cli = ["dep:clap", "dep:glob"] + +[dependencies] +clap = { version = "4", features = ["derive"], optional = true} +bevy_rpack = { default-features = false, path = "../bevy_rpack" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +texture_packer = { version = "0.29", features = ["common"] } +image = { version = "0.25", features = ["jpeg", "png"] } +glob = {version = "0.3", optional = true} diff --git a/crates/rpack_cli/src/lib.rs b/crates/rpack_cli/src/lib.rs new file mode 100644 index 0000000..971efe9 --- /dev/null +++ b/crates/rpack_cli/src/lib.rs @@ -0,0 +1,94 @@ +use bevy_rpack::{AtlasFrame, SerializableRect}; +use image::DynamicImage; +use serde_json::Value; +use std::{io::Cursor, path::PathBuf}; +use texture_packer::{importer::ImageImporter, TexturePacker, TexturePackerConfig}; + +#[derive(Clone)] +pub struct Spritesheet { + pub image_data: Vec, + pub atlas_asset: bevy_rpack::AtlasAsset, + pub atlas_asset_json: Value, +} + +#[derive(Clone)] +pub struct ImageFile { + pub id: String, + pub image: DynamicImage, +} + +impl ImageFile { + pub fn at_path

(path: &PathBuf, id: P) -> Option + where + P: AsRef, + { + if let Ok(image) = ImageImporter::import_from_file(&path) { + Some(ImageFile { + image, + id: id.as_ref().to_owned().replace("\\", "/"), + }) + } else { + None + } + } +} + +impl Spritesheet { + pub fn build( + config: TexturePackerConfig, + images: &[ImageFile], + name: String, + ) -> Result { + let mut packer = TexturePacker::new_skyline(config); + for image in images.iter() { + if !packer.can_pack(&image.image) { + return Err(format!( + "Consider making atlas bigger. Could not make atlas, failed on: {}", + image.id + )); + } + if let Err(err) = packer.pack_own(&image.id, image.image.clone()) { + return Err(format!( + "Could not make atlas, failed on: {}, {:?}", + image.id, err + )); + } + } + let mut out_vec = vec![]; + let exported_image = + texture_packer::exporter::ImageExporter::export(&packer, None).unwrap(); + let mut img = image::DynamicImage::new_rgba8(config.max_width, config.max_height); + image::imageops::overlay(&mut img, &exported_image, 0, 0); + + img.write_to(&mut Cursor::new(&mut out_vec), image::ImageFormat::Png) + .unwrap(); + let atlas_asset = bevy_rpack::AtlasAsset { + size: [img.width(), img.height()], + name, + frames: packer + .get_frames() + .values() + .map(|v| -> AtlasFrame { + AtlasFrame { + key: v.key.clone(), + frame: SerializableRect { + x: v.frame.x, + y: v.frame.y, + w: v.frame.w, + h: v.frame.h, + }, + } + }) + .collect(), + }; + let Ok(atlas_asset_json) = serde_json::to_value(&atlas_asset) else { + return Err("Failed to deserialize".to_owned()); + }; + + Ok(Spritesheet { + image_data: out_vec.clone(), + atlas_asset, + atlas_asset_json, + }) + } +} diff --git a/crates/rpack_cli/src/main.rs b/crates/rpack_cli/src/main.rs new file mode 100644 index 0000000..d979bc3 --- /dev/null +++ b/crates/rpack_cli/src/main.rs @@ -0,0 +1,66 @@ +use std::io::Write; + +use clap::Parser; +use rpack_cli::{ImageFile, Spritesheet}; + +/// Build rpack tilemaps with ease +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Name of the tilemap to build, when no value is provided uses 'tilemap' + #[arg(short, long)] + name: Option, + /// size of the tilemap, default: 512 + #[arg(long)] + size: Option, +} + +fn main() { + let args = Args::parse(); + let name = args.name.unwrap_or("tilemap".to_owned()); + let size = args.size.unwrap_or(512); + + let images: Vec = glob::glob("**/*png") + .expect("Failed to find the png files") + .flatten() + .flat_map(|f| ImageFile::at_path(&f, f.to_str().unwrap_or_default())) + .collect(); + let spritesheet = Spritesheet::build( + texture_packer::TexturePackerConfig { + max_width: size, + max_height: size, + allow_rotation: false, + force_max_dimensions: true, + border_padding: 2, + texture_padding: 2, + texture_extrusion: 2, + trim: false, + texture_outlines: false, + }, + &images, + name.clone(), + ) + .expect("Failed to build spritesheet"); + + let mut file = std::fs::File::create(format!("{}.png", name)).unwrap(); + let write_result = file.write_all(&spritesheet.image_data); + if write_result.is_err() { + eprintln!( + "Could not make atlas, error: {:?}", + write_result.unwrap_err() + ); + } else { + println!("Output texture stored in {:?}", file); + } + let json = serde_json::to_string_pretty(&spritesheet.atlas_asset_json).unwrap(); + let mut file = std::fs::File::create(format!("{}.rpack.json", name)).unwrap(); + let write_result = file.write_all(&json.as_bytes()); + if write_result.is_err() { + eprintln!( + "Could not make atlas, error: {:?}", + write_result.unwrap_err() + ); + } else { + println!("Output data stored in {:?}", file); + } +} diff --git a/output.png b/output.png deleted file mode 100644 index 91a5637da9b20d94995c597feb9b6e2413d2614b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31844 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